From 28925304aaeeedb4484d7c041281b616b402cd25 Mon Sep 17 00:00:00 2001
From: fiss <2657262686@qq.com>
Date: Tue, 21 Mar 2023 08:55:35 +0000
Subject: [PATCH] makefile优化

---
 src/Makefile                       |  12 ++++++------
 src/demo/Makefile                  |  38 ++++++++++++++++++++------------------
 src/demo/Makefile.dvpp             |  72 ++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
 src/demo/Makefile.o.nvdec          |  87 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
 src/demo/main_dvpp.cpp             | 337 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/demo/main_dvpp.cpp1            | 337 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 src/demo/main_nvdec.cpp            | 456 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 src/demo/main_nvdec.cpp1           | 456 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/dvpp/Makefile                  |   6 +++---
 src/interface/FFNvDecoderManager.h |   2 +-
 src/nvdec/Makefile                 |   8 ++++----
 11 files changed, 931 insertions(+), 880 deletions(-)
 create mode 100644 src/demo/main_dvpp.cpp
 delete mode 100644 src/demo/main_dvpp.cpp1
 delete mode 100644 src/demo/main_nvdec.cpp
 create mode 100644 src/demo/main_nvdec.cpp1

diff --git a/src/Makefile b/src/Makefile
index 95539c0..decdbdf 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -7,7 +7,7 @@ BUILD_DIR:=$(TOP_DIR)/build
 BIN_DIR:=$(BUILD_DIR)/bin
 export BUILD_DIR
 
-PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder
+PROJECT_ROOT= /home/huchunming/FFNvDecoder
 THIRDPARTY_ROOT = $(PROJECT_ROOT)/3rdparty
 export PROJECT_ROOT THIRDPARTY_ROOT
 
@@ -24,16 +24,16 @@ INCS:=-I $(TOP_DIR) \
 		-I $(SPDLOG_ROOT)/include \
 		-I $(FFMPEG_DIR)/include \
 
-MACROS:=
-
 # 链接器
-LIBS:= -L $(SPDLOG_ROOT) -l:libspdlog.a \
+LIBS:= -L $(SPDLOG_ROOT)/lib -l:libspdlog.a \
 		-L $(FFMPEG_DIR)/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice \
 
 export CXX INCS MACROS LIBS
 
+MACROS:= -DUSE_DVPP
+
 # 各个模块
-MODULES:= nvdec gb28181 interface demo
+MODULES:= dvpp interface demo
 
 # 各个模块对应的库
 # MODULE_LIBS:=$(BUILD_DIR)/nvdec/lib/nvdec.a\
@@ -50,7 +50,7 @@ all:$(TARGET)
 # 最终目标依赖关系
 $(TARGET):FORCE | $(BIN_DIR)
 	@for n in $(MODULES); do make -s -f $(TOP_DIR)/$$n/Makefile MODULE=$$n || exit "$$?"; done
-	@echo -e "\e[32m""Linking executable $(TARGET)""\e[0m"
+# @echo -e "\e[32m""Linking executable $(TARGET)""\e[0m"
 #@$(LD) $(LDFLAGS) -o $@ $(MODULE_LIBS) $(LIBS)
 
 # 若没有bin目录则自动生成
diff --git a/src/demo/Makefile b/src/demo/Makefile
index 91b0cac..a456115 100644
--- a/src/demo/Makefile
+++ b/src/demo/Makefile
@@ -12,30 +12,32 @@ DEPS:=$(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d,a $(SRCS)))
 # 自动生成头文件依赖选项
 DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
 
+DEFS = -DENABLE_DVPP_INTERFACE
+
 # 最终目标文件
-TARGET:=/mnt/data/cmhu/FFNvDecoder/bin/lib/demo
+TARGET:=$(BUILD_DIR)/bin/demo
+
 
+include_dir=-I/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/runtime/include
 
-JRTP_ROOT = $(THIRDPARTY_ROOT)/jrtp_export
+lib_dir=-L/usr/lib \
+		-L/usr/local/lib \
+		-L/usr/local/Ascend/driver/lib64 \
+		-L/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/atc/lib64\
+		-L/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/runtime/lib64 \
+		-L/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/runtime/lib64/stub \
+		-L/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/lib64 \
+		-L/usr/local/Ascend/driver/lib64/driver
+		
+lib=-lacl_dvpp -lascendcl -lmmpa -lglog -lgflags -lpthread -lz -lacl_dvpp_mpi -lruntime -lascendalog -lc_sec -lmsprofiler -lgert -lge_executor -lge_common \
+	-lgraph -lascend_protobuf -lprofapi -lerror_manager -lexe_graph -lregister -lplatform
 
 INCLUDE= -I $(TOP_DIR)/interface \
-		-I $(TOP_DIR)/nvdec \
-		-I $(TOP_DIR)/gb28181 \
-		-I $(CUDA_ROOT)/include \
-		-I $(TOP_DIR)/common/inc \
-		-I $(TOP_DIR)/common/UtilNPP \
-		-I $(TOP_DIR)/ \
-		-I $(JRTP_ROOT)/jrtplib/include/jrtplib3 \
-		-I $(JRTP_ROOT)/jthread/include/jthread
 
 LIBSPATH= -L $(BUILD_DIR)/interface/lib -l:interface.a \
-		-L $(BUILD_DIR)/nvdec/lib -l:nvdec.a \
-		-L $(BUILD_DIR)/gb28181/lib -l:gb28181.a \
-		-L $(CUDA_ROOT)/lib64 -lcuda -lcudart -lnvcuvid -lcurand -lcublas -lnvjpeg \
-		-L $(JRTP_ROOT)/jthread/lib -l:libjthread.a \
-		-L $(JRTP_ROOT)/jrtplib/lib -l:libjrtp.a
+			-L $(BUILD_DIR)/dvpp/lib -l:dvpp.a
 
-CXXFLAGS= -g -O0 -fPIC $(INCLUDE) $(LIBSPATH) $(INCS) $(LIBS) $(MACROS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl -Wwrite-strings
+CXXFLAGS= -g -O0 -fPIC $(INCLUDE) $(include_dir) $(LIBSPATH) $(INCS) $(LIBS) $(lib_dir) $(lib) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl
 	# -DUNICODE -D_UNICODE
 
 # 默认最终目标
@@ -45,8 +47,8 @@ all:$(TARGET)
 # 生成最终目标
 $(TARGET): $(OBJS) | $(LIB_DIR)
 	@echo -e "\e[32m""Linking static library $(TARGET)""\e[0m"
-	@echo -e "$(CXX) -o $@ $^ $(DEPFLAGS) $(CXXFLAGS) $(LIBSPATH) $(MACROS)"
-	$(CXX) -o $@ $^ $(DEPFLAGS) $(CXXFLAGS) $(LIBSPATH) $(MACROS)
+	@echo -e "$(CXX) -o $@ $^ $(DEPFLAGS) $(CXXFLAGS) $(MACROS)"
+	$(CXX) -o $@ $^ $(DEPFLAGS) $(CXXFLAGS) $(MACROS)
 
 # 若没有lib目录则自动生成
 $(LIB_DIR):
diff --git a/src/demo/Makefile.dvpp b/src/demo/Makefile.dvpp
index d369b20..a456115 100644
--- a/src/demo/Makefile.dvpp
+++ b/src/demo/Makefile.dvpp
@@ -1,14 +1,22 @@
-XX = g++
+# 各项目录
+LIB_DIR:=$(BUILD_DIR)/$(MODULE)/lib
+DEP_DIR:=$(BUILD_DIR)/$(MODULE)/.dep
+OBJ_DIR:=$(BUILD_DIR)/$(MODULE)/obj
+SRC_DIR:=$(TOP_DIR)/$(MODULE)
 
+# 源文件以及中间目标文件和依赖文件
+SRCS:=$(notdir $(wildcard $(SRC_DIR)/*.cpp))
+OBJS:=$(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(SRCS)))
+DEPS:=$(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d,a $(SRCS)))
 
-PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder
-
-SRC_ROOT = $(PROJECT_ROOT)/src
-
-TARGET= $(PROJECT_ROOT)/src/build/bin/demo
+# 自动生成头文件依赖选项
+DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
 
 DEFS = -DENABLE_DVPP_INTERFACE
 
+# 最终目标文件
+TARGET:=$(BUILD_DIR)/bin/demo
+
 
 include_dir=-I/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/runtime/include
 
@@ -23,26 +31,50 @@ lib_dir=-L/usr/lib \
 		
 lib=-lacl_dvpp -lascendcl -lmmpa -lglog -lgflags -lpthread -lz -lacl_dvpp_mpi -lruntime -lascendalog -lc_sec -lmsprofiler -lgert -lge_executor -lge_common \
 	-lgraph -lascend_protobuf -lprofapi -lerror_manager -lexe_graph -lregister -lplatform
-LIBS= -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice
-CXXFLAGS= -g -O0 -fPIC $(INCLUDE) $(include_dir) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl
 
-SRCS:=$(wildcard $(SRC_ROOT)/demo/*.cpp)
-OBJS = $(patsubst %.cpp, %.o, $(notdir $(SRCS)))
+INCLUDE= -I $(TOP_DIR)/interface \
+
+LIBSPATH= -L $(BUILD_DIR)/interface/lib -l:interface.a \
+			-L $(BUILD_DIR)/dvpp/lib -l:dvpp.a
 
-OBJ_ROOT = $(PROJECT_ROOT)/src/build
-DVPP_SRCS:=$(wildcard $(OBJ_ROOT)/dvpp/obj/*.o)
-INTEFACE_SRCS:=$(wildcard $(OBJ_ROOT)/interface/obj/*.o)
+CXXFLAGS= -g -O0 -fPIC $(INCLUDE) $(include_dir) $(LIBSPATH) $(INCS) $(LIBS) $(lib_dir) $(lib) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl
+	# -DUNICODE -D_UNICODE
 
+# 默认最终目标
+.PHONY:all
+all:$(TARGET)
 
-$(TARGET):$(OBJS) $(INTEFACE_SRCS) $(NVDECODER_SRCS) $(GB28181_SRCS)
-	rm -f $(TARGET)
+# 生成最终目标
+$(TARGET): $(OBJS) | $(LIB_DIR)
+	@echo -e "\e[32m""Linking static library $(TARGET)""\e[0m"
+	@echo -e "$(CXX) -o $@ $^ $(DEPFLAGS) $(CXXFLAGS) $(MACROS)"
+	$(CXX) -o $@ $^ $(DEPFLAGS) $(CXXFLAGS) $(MACROS)
+
+# 若没有lib目录则自动生成
+$(LIB_DIR):
+	@mkdir -p $@
+
+# 生成中间目标文件
+$(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR)
 	@echo -e "\e[33m""Building object $@""\e[0m"
-	$(XX) -o $@ $^ $(CXXFLAGS) $(LIBS) $(lib_dir) $(lib) -Wwrite-strings
-	rm -f *.o
+	@echo -e "$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) -o $@ $<"
+	$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) -o $@ $<
+
+# 若没有obj目录则自动生成
+$(OBJ_DIR):
+	@mkdir -p $@
+
+# 若没有.dep目录则自动生成
+$(DEP_DIR):
+	@mkdir -p $@
 
-%.o:$(SRC_ROOT)/demo/%.cpp
-	$(XX) $(CXXFLAGS) -c $<
+# 依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错
+$(DEPS):
 
+# 引入中间目标文件头文件依赖关系
+include $(wildcard $(DEPS))
 
+# 直接删除组件build目录
+.PHONY:clean
 clean:
-	rm -f *.o $(TARGET)
\ No newline at end of file
+	@rm -rf $(BUILD_DIR)/$(MODULE)
diff --git a/src/demo/Makefile.o.nvdec b/src/demo/Makefile.o.nvdec
index a40488b..91b0cac 100644
--- a/src/demo/Makefile.o.nvdec
+++ b/src/demo/Makefile.o.nvdec
@@ -1,61 +1,78 @@
-XX = g++
+# 各项目录
+LIB_DIR:=$(BUILD_DIR)/$(MODULE)/lib
+DEP_DIR:=$(BUILD_DIR)/$(MODULE)/.dep
+OBJ_DIR:=$(BUILD_DIR)/$(MODULE)/obj
+SRC_DIR:=$(TOP_DIR)/$(MODULE)
 
+# 源文件以及中间目标文件和依赖文件
+SRCS:=$(notdir $(wildcard $(SRC_DIR)/*.cpp))
+OBJS:=$(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(SRCS)))
+DEPS:=$(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d,a $(SRCS)))
 
-PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder
+# 自动生成头文件依赖选项
+DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
 
-CUDA_ROOT = /usr/local/cuda-11.1
+# 最终目标文件
+TARGET:=/mnt/data/cmhu/FFNvDecoder/bin/lib/demo
 
-DEPEND_DIR = $(PROJECT_ROOT)/bin
-THIRDPARTY_ROOT = $(PROJECT_ROOT)/3rdparty
-SPDLOG_ROOT = $(THIRDPARTY_ROOT)/spdlog-1.9.2/release
-JRTP_ROOT = $(THIRDPARTY_ROOT)/jrtp_export
-
-SRC_ROOT = $(PROJECT_ROOT)/src
 
-TARGET= $(PROJECT_ROOT)/bin/lib/demo
-
-DEFS = -DENABLE_DVPP_INTERFACE
+JRTP_ROOT = $(THIRDPARTY_ROOT)/jrtp_export
 
-INCLUDE= -I $(SRC_ROOT)/interface \
-		-I $(SRC_ROOT)/dvpp \
-		-I $(SRC_ROOT)/gb28181 \
-		-I $(SRC_ROOT)/nvdec \
-		-I $(DEPEND_DIR)/include \
+INCLUDE= -I $(TOP_DIR)/interface \
+		-I $(TOP_DIR)/nvdec \
+		-I $(TOP_DIR)/gb28181 \
 		-I $(CUDA_ROOT)/include \
 		-I $(TOP_DIR)/common/inc \
 		-I $(TOP_DIR)/common/UtilNPP \
 		-I $(TOP_DIR)/ \
-		-I $(SPDLOG_ROOT)/include \
 		-I $(JRTP_ROOT)/jrtplib/include/jrtplib3 \
 		-I $(JRTP_ROOT)/jthread/include/jthread
 
-LIBSPATH= -L $(DEPEND_DIR)/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice \
+LIBSPATH= -L $(BUILD_DIR)/interface/lib -l:interface.a \
+		-L $(BUILD_DIR)/nvdec/lib -l:nvdec.a \
+		-L $(BUILD_DIR)/gb28181/lib -l:gb28181.a \
 		-L $(CUDA_ROOT)/lib64 -lcuda -lcudart -lnvcuvid -lcurand -lcublas -lnvjpeg \
-		-L $(SPDLOG_ROOT) -l:libspdlog.a \
 		-L $(JRTP_ROOT)/jthread/lib -l:libjthread.a \
 		-L $(JRTP_ROOT)/jrtplib/lib -l:libjrtp.a
 
+CXXFLAGS= -g -O0 -fPIC $(INCLUDE) $(LIBSPATH) $(INCS) $(LIBS) $(MACROS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl -Wwrite-strings
+	# -DUNICODE -D_UNICODE
 
-CXXFLAGS= -g -O0 -fPIC $(INCLUDE) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl
+# 默认最终目标
+.PHONY:all
+all:$(TARGET)
 
-SRCS:=$(wildcard $(SRC_ROOT)/demo/*.cpp)
-OBJS = $(patsubst %.cpp, %.o, $(notdir $(SRCS)))
+# 生成最终目标
+$(TARGET): $(OBJS) | $(LIB_DIR)
+	@echo -e "\e[32m""Linking static library $(TARGET)""\e[0m"
+	@echo -e "$(CXX) -o $@ $^ $(DEPFLAGS) $(CXXFLAGS) $(LIBSPATH) $(MACROS)"
+	$(CXX) -o $@ $^ $(DEPFLAGS) $(CXXFLAGS) $(LIBSPATH) $(MACROS)
 
-OBJ_ROOT = $(PROJECT_ROOT)/src/build
-INTEFACE_SRCS:=$(wildcard $(OBJ_ROOT)/interface/obj/*.o)
-NVDECODER_SRCS:=$(wildcard $(OBJ_ROOT)/nvdec/obj/*.o)
-GB28181_SRCS:=$(wildcard $(OBJ_ROOT)/gb28181/obj/*.o)
+# 若没有lib目录则自动生成
+$(LIB_DIR):
+	@mkdir -p $@
 
-
-$(TARGET):$(OBJS) $(INTEFACE_SRCS) $(NVDECODER_SRCS) $(GB28181_SRCS)
-	rm -f $(TARGET)
+# 生成中间目标文件
+$(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR)
 	@echo -e "\e[33m""Building object $@""\e[0m"
-	$(XX) -o $@ $^ $(CXXFLAGS) $(LIBSPATH) -Wwrite-strings
-	rm -f *.o
+	@echo -e "$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) -o $@ $<"
+	$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) -o $@ $<
+
+# 若没有obj目录则自动生成
+$(OBJ_DIR):
+	@mkdir -p $@
+
+# 若没有.dep目录则自动生成
+$(DEP_DIR):
+	@mkdir -p $@
 
-%.o:$(SRC_ROOT)/demo/%.cpp
-	$(XX) $(CXXFLAGS) -c $<
+# 依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错
+$(DEPS):
 
+# 引入中间目标文件头文件依赖关系
+include $(wildcard $(DEPS))
 
+# 直接删除组件build目录
+.PHONY:clean
 clean:
-	rm -f *.o $(TARGET)
\ No newline at end of file
+	@rm -rf $(BUILD_DIR)/$(MODULE)
diff --git a/src/demo/main_dvpp.cpp b/src/demo/main_dvpp.cpp
new file mode 100644
index 0000000..602a170
--- /dev/null
+++ b/src/demo/main_dvpp.cpp
@@ -0,0 +1,337 @@
+#include <iostream>
+#include <pthread.h>
+#include <thread>
+#include <chrono>
+#include <unistd.h>
+
+
+#ifdef _WIN32
+#include "Winsock2.h"
+#pragma comment(lib, "ws2_32.lib")
+#endif
+
+#ifdef __linux__
+#include "arpa/inet.h"
+#endif
+
+#include "../interface/FFNvDecoderManager.h"
+#include "../interface/utiltools.hpp"
+
+#define MIN_RTP_PORT		10000
+#define MAX_RTP_PORT		60000
+
+// ȡ MIN_RTP_PORT(10000)~MAX_RTP_PORT(60000)֮�������˿�(ż���������������˿ڿ���)
+int allocRtpPort() {
+
+	static int s_rtpPort = MIN_RTP_PORT;
+	if (MIN_RTP_PORT == s_rtpPort)
+	{
+		srand((unsigned int)time(NULL));
+		s_rtpPort = MIN_RTP_PORT + (rand() % MIN_RTP_PORT);
+	}
+
+	if (s_rtpPort % 2)
+		++s_rtpPort;
+
+	while (true)
+	{
+		s_rtpPort += 2;
+		s_rtpPort = s_rtpPort >= MAX_RTP_PORT ? MIN_RTP_PORT : s_rtpPort;
+
+		int i = 0;
+		for (; i < 2; i++)
+		{
+			sockaddr_in sRecvAddr;
+			int s = socket(AF_INET, SOCK_DGRAM, 0);
+
+			sRecvAddr.sin_family = AF_INET;        
+			sRecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);    
+			sRecvAddr.sin_port = htons(s_rtpPort + i); 
+
+			int nResult = bind(s, (sockaddr *)&sRecvAddr, sizeof(sRecvAddr));
+			if (nResult != 0)
+			{
+				break;
+			}
+
+			nResult = close(s);
+			if (nResult != 0)
+			{
+				printf("closesocket failed:%d\n", nResult);
+				break;
+			}
+		}
+
+		if (i == 2)
+			break;
+	}
+
+	return s_rtpPort;
+}
+
+
+
+
+
+unsigned char *pHwRgb[2] = {nullptr, nullptr};
+
+int sum1 = 0;
+int sum2 = 0;
+
+
+string data_home = "/mnt/data/cmhu/tmp/";
+
+
+
+
+/**
+ * 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况
+ * */
+void postDecoded(const void * userPtr, DeviceRgbMemory* devFrame){
+    AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
+    if (decoder!= nullptr)
+    {
+    }
+
+    if(devFrame){
+        delete devFrame;
+        devFrame = nullptr;
+    }
+}
+
+long start_time = 0;
+long end_time = 0;
+bool count_flag = false;
+int count = 0;
+int count_std = 100;
+
+
+static int sum = 0;
+unsigned char *pHwData = nullptr;
+
+void postDecoded0(const void * userPtr, DeviceRgbMemory* devFrame){
+    // std::this_thread::sleep_for(std::chrono::milliseconds(30000));
+
+    AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
+    if (decoder!= nullptr)
+    {
+        // cout << "decode name: " << decoder->getName() << endl;
+        if (decoder->getName() == "dec")
+        {
+            if (! count_flag)
+            {
+                count_flag = true;
+                count = 0;
+                end_time = start_time = UtilTools::get_cur_time_ms();
+            }
+            count++;
+            sum ++ ;
+            if (count >= count_std)
+            {
+                // end_time = UtilTools::get_cur_time_ms();
+                // long time_using = end_time - start_time;
+                // double time_per_frame = double(time_using)/count_std ;
+                // cout << count_std << "帧用时:" << time_using << "ms 每帧用时:" << time_per_frame << "ms" << endl;
+                cout << decoder->getName() << " keyframe: " << devFrame->isKeyFrame() << " width: " << devFrame->getWidth() << " height: "<< devFrame->getHeight() << endl;
+                // cout << gpuFrame->pts << endl;
+
+                count_flag = false;
+            }
+            // cout << "帧数:" << sum << endl;
+        }
+    }
+}
+
+void decode_finished_cbk(const void* userPtr){
+    cout << "当前时间戳: " << UtilTools::get_cur_time_ms() << endl;
+}
+
+bool decode_request_stream_cbk(const char* deviceId){
+    cout << "需在此请求流" << endl;
+    return true;
+}
+
+// string test_uri = "rtmp://192.168.10.56:1935/objecteye/1";
+// string test_uri = "/home/cmhu/data/output_800x480.mp4";
+// string test_uri = "/home/cmhu/data/output_1920x1080.mp4";
+// string test_uri = "rtsp://176.10.0.2:8554/stream";
+// string test_uri = "/mnt/f/fiss/test_data/h265.mp4";
+// string test_uri = "rtsp://176.10.0.4:8554/stream";
+// string test_uri = "rtsp://admin:admin@123456@192.168.60.176:554/cam/realmonitor?channel=1&subtype=0";
+string test_uri = "/home/huchunming/data/woyikewangh265.mp4";
+
+void createDecode(int index, const char* gpu_id){
+    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
+    MgrDecConfig config;
+    config.name = "dec" + to_string(index);
+    config.cfg.uri = test_uri;
+    config.cfg.post_decoded_cbk = postDecoded;
+    config.cfg.decode_finished_cbk = decode_finished_cbk;
+    config.cfg.force_tcp = true;
+    config.dec_type = DECODER_TYPE_FFMPEG;
+
+    config.cfg.gpuid = gpu_id;
+    // if (index % 2 == 0)
+    // {
+    //     config.cfg.gpuid = "0";
+    // }
+    // else
+    // {
+    //     config.cfg.gpuid = "0";
+    // }
+    
+    AbstractDecoder* decoder = pDecManager->createDecoder(config);
+    if (!decoder)
+    {
+        return ;
+    }
+    pDecManager->setPostDecArg(config.name, decoder);
+    pDecManager->setFinishedDecArg(config.name, decoder);
+    pDecManager->startDecodeByName(config.name);
+}
+
+void createGB28181Decode(int index, char* gpu_id, int port){
+    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
+    MgrDecConfig config;
+    config.name = "dec" + to_string(index);
+    config.cfg.uri = config.name;
+    config.cfg.post_decoded_cbk = postDecoded;
+    config.cfg.decode_finished_cbk = decode_finished_cbk;
+    config.cfg.request_stream_cbk = decode_request_stream_cbk;
+    config.cfg.force_tcp = true;
+
+    config.dec_type = DECODER_TYPE_GB28181;
+    config.cfg.port = port;//allocRtpPort();
+
+    config.cfg.gpuid = gpu_id;
+    
+    AbstractDecoder* decoder = pDecManager->createDecoder(config);
+    if (!decoder)
+    {
+        return ;
+    }
+    pDecManager->setPostDecArg(config.name, decoder);
+    pDecManager->setFinishedDecArg(config.name, decoder);
+    pDecManager->startDecodeByName(config.name);
+}
+
+void createDvppDecoder(int index, char* devId, int channelId){
+    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
+    MgrDecConfig config;
+    config.name = "dec" + to_string(index);
+    config.cfg.uri = test_uri;
+    config.cfg.post_decoded_cbk = postDecoded;
+    config.cfg.decode_finished_cbk = decode_finished_cbk;
+    config.cfg.force_tcp = true;
+    config.dec_type = DECODER_TYPE_DVPP;
+
+    config.cfg.gpuid = devId;
+    
+    AbstractDecoder* decoder = pDecManager->createDecoder(config);
+    if (!decoder)
+    {
+        cout << "创建解码器失败" << endl;
+        return ;
+    }
+    pDecManager->setPostDecArg(config.name, decoder);
+    pDecManager->setFinishedDecArg(config.name, decoder);
+    pDecManager->startDecodeByName(config.name);
+}
+
+void logFF(void *, int level, const char *fmt, va_list ap)
+{
+    vfprintf(stdout, fmt, ap);
+}
+
+
+int main(int argc, char* argv[]){
+
+    // test_uri = argv[1];
+    char* gpuid = argv[2];
+    int port = atoi(argv[3]);
+    cout << test_uri << "   gpu_id:" << gpuid << "   port:" << port << endl;
+
+    // av_log_set_callback(&logFF);
+
+    // CheckCUDAProperty(atoi(gpuid));
+
+    pthread_t m_decode_thread;
+    pthread_create(&m_decode_thread,0,
+        [](void* arg)
+        {
+            // cudaSetDevice(atoi(gpuid));
+            while (true)
+            {
+                std::this_thread::sleep_for(std::chrono::seconds(10));
+                FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
+                int count = pDecManager->count();
+                cout << "当前时间:" << UtilTools::get_cur_time_ms() << "  当前运行路数: " << pDecManager->count() << endl;
+            }  
+
+            return (void*)0;
+        }
+    ,nullptr);
+
+
+    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
+    int i = 0;
+
+    while (true)
+    {
+        int ch = getchar();
+        if (ch == 'q')
+        {
+            break;
+        }
+
+        switch (ch)
+        {
+        case 'f':
+        case 'F':
+            createDecode(i, gpuid);
+            i++;
+            break;
+        case 'g':
+        case 'G':
+            createGB28181Decode(i, gpuid, port);
+            i++;
+            break;
+        case 'd':
+        case 'D':
+            createDvppDecoder(i, gpuid, 0);
+            i++;
+            break;
+        case 'r':
+        case 'R':
+            pDecManager->resumeDecoder("dec0");
+            break;
+        case 'p':
+        case 'P':
+            pDecManager->pauseDecoder("dec0");
+            break;
+
+        case 'c':
+        case 'C':
+            i--;
+            pDecManager->closeDecoderByName("dec" + to_string(i));
+            break;
+
+        case 'i':
+        case 'I':
+        {
+            int w,h;
+            pDecManager->getResolution("dec0", w,h);
+            printf( "%s : %dx%d\n", "dec0" , w,h );
+        }
+            break;
+
+        default:
+            break;
+        }
+
+        /* code */
+    }
+
+    cout << "总共帧数:" << sum << endl;
+    pDecManager->closeAllDecoder();
+}
\ No newline at end of file
diff --git a/src/demo/main_dvpp.cpp1 b/src/demo/main_dvpp.cpp1
deleted file mode 100644
index 602a170..0000000
--- a/src/demo/main_dvpp.cpp1
+++ /dev/null
@@ -1,337 +0,0 @@
-#include <iostream>
-#include <pthread.h>
-#include <thread>
-#include <chrono>
-#include <unistd.h>
-
-
-#ifdef _WIN32
-#include "Winsock2.h"
-#pragma comment(lib, "ws2_32.lib")
-#endif
-
-#ifdef __linux__
-#include "arpa/inet.h"
-#endif
-
-#include "../interface/FFNvDecoderManager.h"
-#include "../interface/utiltools.hpp"
-
-#define MIN_RTP_PORT		10000
-#define MAX_RTP_PORT		60000
-
-// ȡ MIN_RTP_PORT(10000)~MAX_RTP_PORT(60000)֮�������˿�(ż���������������˿ڿ���)
-int allocRtpPort() {
-
-	static int s_rtpPort = MIN_RTP_PORT;
-	if (MIN_RTP_PORT == s_rtpPort)
-	{
-		srand((unsigned int)time(NULL));
-		s_rtpPort = MIN_RTP_PORT + (rand() % MIN_RTP_PORT);
-	}
-
-	if (s_rtpPort % 2)
-		++s_rtpPort;
-
-	while (true)
-	{
-		s_rtpPort += 2;
-		s_rtpPort = s_rtpPort >= MAX_RTP_PORT ? MIN_RTP_PORT : s_rtpPort;
-
-		int i = 0;
-		for (; i < 2; i++)
-		{
-			sockaddr_in sRecvAddr;
-			int s = socket(AF_INET, SOCK_DGRAM, 0);
-
-			sRecvAddr.sin_family = AF_INET;        
-			sRecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);    
-			sRecvAddr.sin_port = htons(s_rtpPort + i); 
-
-			int nResult = bind(s, (sockaddr *)&sRecvAddr, sizeof(sRecvAddr));
-			if (nResult != 0)
-			{
-				break;
-			}
-
-			nResult = close(s);
-			if (nResult != 0)
-			{
-				printf("closesocket failed:%d\n", nResult);
-				break;
-			}
-		}
-
-		if (i == 2)
-			break;
-	}
-
-	return s_rtpPort;
-}
-
-
-
-
-
-unsigned char *pHwRgb[2] = {nullptr, nullptr};
-
-int sum1 = 0;
-int sum2 = 0;
-
-
-string data_home = "/mnt/data/cmhu/tmp/";
-
-
-
-
-/**
- * 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况
- * */
-void postDecoded(const void * userPtr, DeviceRgbMemory* devFrame){
-    AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
-    if (decoder!= nullptr)
-    {
-    }
-
-    if(devFrame){
-        delete devFrame;
-        devFrame = nullptr;
-    }
-}
-
-long start_time = 0;
-long end_time = 0;
-bool count_flag = false;
-int count = 0;
-int count_std = 100;
-
-
-static int sum = 0;
-unsigned char *pHwData = nullptr;
-
-void postDecoded0(const void * userPtr, DeviceRgbMemory* devFrame){
-    // std::this_thread::sleep_for(std::chrono::milliseconds(30000));
-
-    AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
-    if (decoder!= nullptr)
-    {
-        // cout << "decode name: " << decoder->getName() << endl;
-        if (decoder->getName() == "dec")
-        {
-            if (! count_flag)
-            {
-                count_flag = true;
-                count = 0;
-                end_time = start_time = UtilTools::get_cur_time_ms();
-            }
-            count++;
-            sum ++ ;
-            if (count >= count_std)
-            {
-                // end_time = UtilTools::get_cur_time_ms();
-                // long time_using = end_time - start_time;
-                // double time_per_frame = double(time_using)/count_std ;
-                // cout << count_std << "帧用时:" << time_using << "ms 每帧用时:" << time_per_frame << "ms" << endl;
-                cout << decoder->getName() << " keyframe: " << devFrame->isKeyFrame() << " width: " << devFrame->getWidth() << " height: "<< devFrame->getHeight() << endl;
-                // cout << gpuFrame->pts << endl;
-
-                count_flag = false;
-            }
-            // cout << "帧数:" << sum << endl;
-        }
-    }
-}
-
-void decode_finished_cbk(const void* userPtr){
-    cout << "当前时间戳: " << UtilTools::get_cur_time_ms() << endl;
-}
-
-bool decode_request_stream_cbk(const char* deviceId){
-    cout << "需在此请求流" << endl;
-    return true;
-}
-
-// string test_uri = "rtmp://192.168.10.56:1935/objecteye/1";
-// string test_uri = "/home/cmhu/data/output_800x480.mp4";
-// string test_uri = "/home/cmhu/data/output_1920x1080.mp4";
-// string test_uri = "rtsp://176.10.0.2:8554/stream";
-// string test_uri = "/mnt/f/fiss/test_data/h265.mp4";
-// string test_uri = "rtsp://176.10.0.4:8554/stream";
-// string test_uri = "rtsp://admin:admin@123456@192.168.60.176:554/cam/realmonitor?channel=1&subtype=0";
-string test_uri = "/home/huchunming/data/woyikewangh265.mp4";
-
-void createDecode(int index, const char* gpu_id){
-    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
-    MgrDecConfig config;
-    config.name = "dec" + to_string(index);
-    config.cfg.uri = test_uri;
-    config.cfg.post_decoded_cbk = postDecoded;
-    config.cfg.decode_finished_cbk = decode_finished_cbk;
-    config.cfg.force_tcp = true;
-    config.dec_type = DECODER_TYPE_FFMPEG;
-
-    config.cfg.gpuid = gpu_id;
-    // if (index % 2 == 0)
-    // {
-    //     config.cfg.gpuid = "0";
-    // }
-    // else
-    // {
-    //     config.cfg.gpuid = "0";
-    // }
-    
-    AbstractDecoder* decoder = pDecManager->createDecoder(config);
-    if (!decoder)
-    {
-        return ;
-    }
-    pDecManager->setPostDecArg(config.name, decoder);
-    pDecManager->setFinishedDecArg(config.name, decoder);
-    pDecManager->startDecodeByName(config.name);
-}
-
-void createGB28181Decode(int index, char* gpu_id, int port){
-    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
-    MgrDecConfig config;
-    config.name = "dec" + to_string(index);
-    config.cfg.uri = config.name;
-    config.cfg.post_decoded_cbk = postDecoded;
-    config.cfg.decode_finished_cbk = decode_finished_cbk;
-    config.cfg.request_stream_cbk = decode_request_stream_cbk;
-    config.cfg.force_tcp = true;
-
-    config.dec_type = DECODER_TYPE_GB28181;
-    config.cfg.port = port;//allocRtpPort();
-
-    config.cfg.gpuid = gpu_id;
-    
-    AbstractDecoder* decoder = pDecManager->createDecoder(config);
-    if (!decoder)
-    {
-        return ;
-    }
-    pDecManager->setPostDecArg(config.name, decoder);
-    pDecManager->setFinishedDecArg(config.name, decoder);
-    pDecManager->startDecodeByName(config.name);
-}
-
-void createDvppDecoder(int index, char* devId, int channelId){
-    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
-    MgrDecConfig config;
-    config.name = "dec" + to_string(index);
-    config.cfg.uri = test_uri;
-    config.cfg.post_decoded_cbk = postDecoded;
-    config.cfg.decode_finished_cbk = decode_finished_cbk;
-    config.cfg.force_tcp = true;
-    config.dec_type = DECODER_TYPE_DVPP;
-
-    config.cfg.gpuid = devId;
-    
-    AbstractDecoder* decoder = pDecManager->createDecoder(config);
-    if (!decoder)
-    {
-        cout << "创建解码器失败" << endl;
-        return ;
-    }
-    pDecManager->setPostDecArg(config.name, decoder);
-    pDecManager->setFinishedDecArg(config.name, decoder);
-    pDecManager->startDecodeByName(config.name);
-}
-
-void logFF(void *, int level, const char *fmt, va_list ap)
-{
-    vfprintf(stdout, fmt, ap);
-}
-
-
-int main(int argc, char* argv[]){
-
-    // test_uri = argv[1];
-    char* gpuid = argv[2];
-    int port = atoi(argv[3]);
-    cout << test_uri << "   gpu_id:" << gpuid << "   port:" << port << endl;
-
-    // av_log_set_callback(&logFF);
-
-    // CheckCUDAProperty(atoi(gpuid));
-
-    pthread_t m_decode_thread;
-    pthread_create(&m_decode_thread,0,
-        [](void* arg)
-        {
-            // cudaSetDevice(atoi(gpuid));
-            while (true)
-            {
-                std::this_thread::sleep_for(std::chrono::seconds(10));
-                FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
-                int count = pDecManager->count();
-                cout << "当前时间:" << UtilTools::get_cur_time_ms() << "  当前运行路数: " << pDecManager->count() << endl;
-            }  
-
-            return (void*)0;
-        }
-    ,nullptr);
-
-
-    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
-    int i = 0;
-
-    while (true)
-    {
-        int ch = getchar();
-        if (ch == 'q')
-        {
-            break;
-        }
-
-        switch (ch)
-        {
-        case 'f':
-        case 'F':
-            createDecode(i, gpuid);
-            i++;
-            break;
-        case 'g':
-        case 'G':
-            createGB28181Decode(i, gpuid, port);
-            i++;
-            break;
-        case 'd':
-        case 'D':
-            createDvppDecoder(i, gpuid, 0);
-            i++;
-            break;
-        case 'r':
-        case 'R':
-            pDecManager->resumeDecoder("dec0");
-            break;
-        case 'p':
-        case 'P':
-            pDecManager->pauseDecoder("dec0");
-            break;
-
-        case 'c':
-        case 'C':
-            i--;
-            pDecManager->closeDecoderByName("dec" + to_string(i));
-            break;
-
-        case 'i':
-        case 'I':
-        {
-            int w,h;
-            pDecManager->getResolution("dec0", w,h);
-            printf( "%s : %dx%d\n", "dec0" , w,h );
-        }
-            break;
-
-        default:
-            break;
-        }
-
-        /* code */
-    }
-
-    cout << "总共帧数:" << sum << endl;
-    pDecManager->closeAllDecoder();
-}
\ No newline at end of file
diff --git a/src/demo/main_nvdec.cpp b/src/demo/main_nvdec.cpp
deleted file mode 100644
index 227bc8a..0000000
--- a/src/demo/main_nvdec.cpp
+++ /dev/null
@@ -1,456 +0,0 @@
-#include "FFNvDecoderManager.h"
-#include <iostream>
-
-// #include "cuda_kernels.h"
-// #include "NvJpegEncoder.h"
-
-#include <pthread.h>
-#include <thread>
-
-#include <chrono>
-
-#include <unistd.h>
-
-
-#ifdef _WIN32
-#include "Winsock2.h"
-#pragma comment(lib, "ws2_32.lib")
-#endif
-
-#ifdef __linux__
-#include "arpa/inet.h"
-#endif
-
-#include "utiltools.hpp"
-
-#define MIN_RTP_PORT		10000
-#define MAX_RTP_PORT		60000
-
-// ȡ MIN_RTP_PORT(10000)~MAX_RTP_PORT(60000)֮�������˿�(ż���������������˿ڿ���)
-int allocRtpPort() {
-
-	static int s_rtpPort = MIN_RTP_PORT;
-	if (MIN_RTP_PORT == s_rtpPort)
-	{
-		srand((unsigned int)time(NULL));
-		s_rtpPort = MIN_RTP_PORT + (rand() % MIN_RTP_PORT);
-	}
-
-	if (s_rtpPort % 2)
-		++s_rtpPort;
-
-	while (true)
-	{
-		s_rtpPort += 2;
-		s_rtpPort = s_rtpPort >= MAX_RTP_PORT ? MIN_RTP_PORT : s_rtpPort;
-
-		int i = 0;
-		for (; i < 2; i++)
-		{
-			sockaddr_in sRecvAddr;
-			int s = socket(AF_INET, SOCK_DGRAM, 0);
-
-			sRecvAddr.sin_family = AF_INET;        
-			sRecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);    
-			sRecvAddr.sin_port = htons(s_rtpPort + i); 
-
-			int nResult = bind(s, (sockaddr *)&sRecvAddr, sizeof(sRecvAddr));
-			if (nResult != 0)
-			{
-				break;
-			}
-
-			nResult = close(s);
-			if (nResult != 0)
-			{
-				printf("closesocket failed:%d\n", nResult);
-				break;
-			}
-		}
-
-		if (i == 2)
-			break;
-	}
-
-	return s_rtpPort;
-}
-
-
-
-
-
-unsigned char *pHwRgb[2] = {nullptr, nullptr};
-
-int sum1 = 0;
-int sum2 = 0;
-
-// cudaStream_t stream[2];
-
-string data_home = "/mnt/data/cmhu/tmp/";
-
-
-// #define checkCudaErrors(S) do {CUresult  status; \
-//         status = S; \
-//         if (status != CUDA_SUCCESS ) std::cout << __LINE__ <<" checkCudaErrors - status = " << status << std::endl; \
-//         } while (false)
-
-
-// static void gpu_helper(int gpuid)
-// {
-//     cudaSetDevice(gpuid);
-
-//     // int *dn;
-//     // cudaMalloc((void **)&dn, 1 * sizeof(int));
-
-// 	size_t free_byte;
-// 	size_t total_byte;
-
-// 	CUresult cuda_status = cuMemGetInfo(&free_byte, &total_byte);
-
-// 	const char *pStr = nullptr;
-// 	if (CUDA_SUCCESS != cuda_status) {
-// 		cuGetErrorString(cuda_status, &pStr);
-// 		printf("Error: cudaMemGetInfo fails, %s \n", pStr);
-// 		return;
-// 	}
-
-// 	double free_db = (double)free_byte;
-// 	double total_db = (double)total_byte;
-// 	double used_db_1 = (total_db - free_db) / 1024.0 / 1024.0;
-
-// 	std::cout <<"显存已使用 " << used_db_1 << " MB\n";
-
-//     // cudaFree(dn);
-// }
-
-// int CheckCUDAProperty( int devId )
-// {
-//     cuInit(0);
-
-// 	CUdevice dev = devId;
-// 	size_t memSize = 0;
-// 	char devName[256] = {0};
-// 	int major = 0, minor = 0;
-// 	CUresult rlt = CUDA_SUCCESS;
-
-//     rlt = cuDeviceGetAttribute(&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, dev);
-//     checkCudaErrors( rlt );
-
-//     rlt = cuDeviceGetAttribute(&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, dev);
-// 	checkCudaErrors( rlt );
-
-// 	rlt = cuDeviceGetName( devName, sizeof( devName ), dev );
-// 	checkCudaErrors( rlt );
-
-// 	printf( "Using GPU Device %d: %s has SM %d.%d compute capability\n",
-// 		    dev, devName, major, minor );
-
-// 	rlt = cuDeviceTotalMem( &memSize, dev );
-// 	checkCudaErrors( rlt );
-
-// 	printf( "Total amount of global memory:   %4.4f MB\n",
-// 		   (float)memSize / ( 1024 * 1024 ) );
-
-// 	return 0;
-// }
-
-/**
- * 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况
- * */
-static long lastpts = 0;
-void postDecoded(const void * userPtr, DeviceRgbMemory * gpuFrame){
-    AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
-    if (decoder!= nullptr)
-    {
-        long curpts = UtilTools::get_cur_time_ms();
-        cout <<  decoder->getName() << "  " << gpuFrame->getWidth() << "x" << gpuFrame->getHeight() << "  " << curpts - lastpts << endl;
-        lastpts = curpts;
-        delete gpuFrame;
-        gpuFrame = nullptr;
-
-            // const char* gpu_pixfmt = av_get_pix_fmt_name((AVPixelFormat)gpuFrame->format);
-            // cout << "pixfmt: " << gpu_pixfmt << endl;
-            // cout << "keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;
-            // cout << "decode successed ✿✿ヽ(°▽°)ノ✿ " << endl;
-
-            // int sum = sum1;
-            // if (decoder->getName() == "dec0")
-            // {
-            //     sum1 ++ ;
-            //     sum = sum1;
-
-            //     if (gpuFrame->format == AV_PIX_FMT_CUDA)
-            //     {   
-            //         // cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl;
-            //         cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
-            //         cudaError_t cudaStatus;
-            //         if(pHwRgb[0] == nullptr){
-            //             // cudaStreamCreate(&stream[0]);
-            //             cuda_common::setColorSpace( ITU_709, 0 );
-            //             cudaStatus = cudaMalloc((void **)&pHwRgb[0], 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
-            //         }
-            //         cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwRgb[0], gpuFrame->width, gpuFrame->height);
-            //         cudaDeviceSynchronize();
-            //         if (cudaStatus != cudaSuccess) {
-            //             cout << "CUDAToBGR failed !!!" << endl;
-            //             return;
-            //         }
-
-            //         string path = data_home + decoder->getName() + ".jpg";
-            //         saveJpeg(path.c_str(), pHwRgb[0], gpuFrame->width, gpuFrame->height, stream[0]);  // 验证 CUDAToRGB 
-            //     }
-            // } else if (decoder->getName() == "dec2") 
-            // {
-            //     sum2 ++ ;
-            //     sum = sum2;
-
-            //     if (gpuFrame->format == AV_PIX_FMT_CUDA)
-            //     {   
-            //         // cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl;
-            //         cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
-            //         cudaError_t cudaStatus;
-            //         if(pHwRgb[1] == nullptr){
-            //             // cudaStreamCreate(&stream[1]);
-            //             cuda_common::setColorSpace( ITU_709, 0 );
-            //             cudaStatus = cudaMalloc((void **)&pHwRgb[1], 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
-            //         }
-            //         cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwRgb[1], gpuFrame->width, gpuFrame->height);
-            //         cudaDeviceSynchronize();
-            //         if (cudaStatus != cudaSuccess) {
-            //             cout << "CUDAToBGR failed !!!" << endl;
-            //             return;
-            //         }
-
-            //         string path = data_home + decoder->getName() + ".jpg";
-            //         saveJpeg(path.c_str(), pHwRgb[1], gpuFrame->width, gpuFrame->height, stream[1]);  // 验证 CUDAToRGB 
-            //     }
-            // }
-    }
-}
-
-long start_time = 0;
-long end_time = 0;
-bool count_flag = false;
-int count = 0;
-int count_std = 100;
-
-
-static int sum = 0;
-unsigned char *pHwData = nullptr;
-
-void postDecoded0(const void * userPtr, DeviceRgbMemory* gpuFrame){
-    // std::this_thread::sleep_for(std::chrono::milliseconds(30000));
-
-    AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
-    if (decoder!= nullptr)
-    {
-        // cout << "decode name: " << decoder->getName() << endl;
-        // if (decoder->getName() == "dec")
-        // {
-        //     if (! count_flag)
-        //     {
-        //         count_flag = true;
-        //         count = 0;
-        //         end_time = start_time = UtilTools::get_cur_time_ms();
-        //     }
-        //     count++;
-        //     sum ++ ;
-        //     if (count >= count_std)
-        //     {
-        //         // end_time = UtilTools::get_cur_time_ms();
-        //         // long time_using = end_time - start_time;
-        //         // double time_per_frame = double(time_using)/count_std ;
-        //         // cout << count_std << "帧用时:" << time_using << "ms 每帧用时:" << time_per_frame << "ms" << endl;
-        //         cout << decoder->getName() << " keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;
-        //         // cout << gpuFrame->pts << endl;
-
-        //         count_flag = false;
-        //     }
-        //     // cout << "帧数:" << sum << endl;
-
-        //     if (gpuFrame->format == AV_PIX_FMT_CUDA)
-        //     {   
-        //         cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
-        //         // cout << "gpu id : " << decoder->m_cfg.gpuid.c_str() << endl;
-        //         cudaError_t cudaStatus;
-        //         if(pHwData == nullptr){
-        //             cuda_common::setColorSpace( ITU_709, 0 );
-        //             cudaStatus = cudaMalloc((void **)&pHwData, 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
-        //         }
-        //         cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwData, gpuFrame->width, gpuFrame->height);
-        //         cudaDeviceSynchronize();
-        //         if (cudaStatus != cudaSuccess) {
-        //             cout << "CUDAToBGR failed !!!" << endl;
-        //             return;
-        //         }
-
-        //         string path = data_home + decoder->getName() + ".jpg";
-        //         saveJpeg(path.c_str(), pHwData, gpuFrame->width, gpuFrame->height, nullptr);  // 验证 CUDAToRGB 
-        //     }
-        // }
-    }
-}
-
-void decode_finished_cbk(const void* userPtr){
-    cout << "当前时间戳: " << UtilTools::get_cur_time_ms() << endl;
-}
-
-bool decode_request_stream_cbk(const char* deviceId){
-    cout << "需在此请求流" << endl;
-    return true;
-}
-
-// string test_uri = "rtmp://192.168.10.56:1935/objecteye/1";
-// string test_uri = "/home/cmhu/data/output_800x480.mp4";
-// string test_uri = "/home/cmhu/data/output_1920x1080.mp4";
-// string test_uri = "rtsp://176.10.0.2:8554/stream";
-// string test_uri = "/mnt/f/fiss/test_data/h265.mp4";
-string test_uri = "rtsp://176.10.0.4:8554/stream";
-
-void createDecode(int index, const char* gpu_id){
-    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
-    MgrDecConfig config;
-    config.name = "dec" + to_string(index);
-    config.cfg.uri = test_uri;
-    config.cfg.post_decoded_cbk = postDecoded;
-    config.cfg.decode_finished_cbk = decode_finished_cbk;
-    config.cfg.force_tcp = true;
-    config.dec_type = DECODER_TYPE_FFMPEG;
-
-    config.cfg.gpuid = gpu_id;
-    // if (index % 2 == 0)
-    // {
-    //     config.cfg.gpuid = "0";
-    // }
-    // else
-    // {
-    //     config.cfg.gpuid = "0";
-    // }
-    
-    AbstractDecoder* decoder = pDecManager->createDecoder(config);
-    if (!decoder)
-    {
-        return ;
-    }
-    pDecManager->setPostDecArg(config.name, decoder);
-    pDecManager->setFinishedDecArg(config.name, decoder);
-    pDecManager->startDecodeByName(config.name);
-}
-
-void createGB28181Decode(int index, char* gpu_id, int port){
-    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
-    MgrDecConfig config;
-    config.name = "dec" + to_string(index);
-    config.cfg.uri = config.name;
-    config.cfg.post_decoded_cbk = postDecoded;
-    config.cfg.decode_finished_cbk = decode_finished_cbk;
-    config.cfg.request_stream_cbk = decode_request_stream_cbk;
-    config.cfg.force_tcp = true;
-
-    config.dec_type = DECODER_TYPE_GB28181;
-    config.cfg.port = port;//allocRtpPort();
-
-    config.cfg.gpuid = gpu_id;
-    
-    AbstractDecoder* decoder = pDecManager->createDecoder(config);
-    if (!decoder)
-    {
-        return ;
-    }
-    pDecManager->setPostDecArg(config.name, decoder);
-    pDecManager->setFinishedDecArg(config.name, decoder);
-    pDecManager->startDecodeByName(config.name);
-}
-
-void logFF(void *, int level, const char *fmt, va_list ap)
-{
-    vfprintf(stdout, fmt, ap);
-}
-
-
-int main(int argc, char* argv[]){
-
-    test_uri = "rtsp://admin:admin@123456@192.168.60.176:554/cam/realmonitor?channel=1&subtype=0";//argv[1];
-    char* gpuid = argv[2];
-    int port = atoi(argv[3]);
-    cout << test_uri << "   gpu_id:" << gpuid << "   port:" << port << endl;
-
-    // av_log_set_callback(&logFF);
-
-    // CheckCUDAProperty(atoi(gpuid));
-
-    pthread_t m_decode_thread;
-    pthread_create(&m_decode_thread,0,
-        [](void* arg)
-        {
-            // cudaSetDevice(atoi(gpuid));
-            while (true)
-            {
-                std::this_thread::sleep_for(std::chrono::minutes(1));
-                FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
-                int count = pDecManager->count();
-                cout << "当前时间:" << UtilTools::get_cur_time_ms() << "  当前运行路数: " << pDecManager->count() << endl;
-            }  
-
-            return (void*)0;
-        }
-    ,nullptr);
-
-
-    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
-    int i = 0;
-
-    while (true)
-    {
-        int ch = getchar();
-        if (ch == 'q')
-        {
-            break;
-        }
-
-        switch (ch)
-        {
-        case 'f':
-        case 'F':
-            createDecode(i, gpuid);
-            i++;
-            break;
-        case 'g':
-        case 'G':
-            createGB28181Decode(i, gpuid, port);
-            i++;
-            break;
-        case 'r':
-        case 'R':
-            pDecManager->resumeDecoder("dec0");
-            break;
-        case 'p':
-        case 'P':
-            pDecManager->pauseDecoder("dec0");
-            break;
-
-        case 'c':
-        case 'C':
-            i--;
-            pDecManager->closeDecoderByName("dec" + to_string(i));
-            break;
-
-        case 'i':
-        case 'I':
-        {
-            int w,h;
-            pDecManager->getResolution("dec0", w,h);
-            printf( "%s : %dx%d\n", "dec0" , w,h );
-        }
-            break;
-
-        default:
-            break;
-        }
-
-        /* code */
-    }
-
-    cout << "总共帧数:" << sum << endl;
-    pDecManager->closeAllDecoder();
-}
\ No newline at end of file
diff --git a/src/demo/main_nvdec.cpp1 b/src/demo/main_nvdec.cpp1
new file mode 100644
index 0000000..227bc8a
--- /dev/null
+++ b/src/demo/main_nvdec.cpp1
@@ -0,0 +1,456 @@
+#include "FFNvDecoderManager.h"
+#include <iostream>
+
+// #include "cuda_kernels.h"
+// #include "NvJpegEncoder.h"
+
+#include <pthread.h>
+#include <thread>
+
+#include <chrono>
+
+#include <unistd.h>
+
+
+#ifdef _WIN32
+#include "Winsock2.h"
+#pragma comment(lib, "ws2_32.lib")
+#endif
+
+#ifdef __linux__
+#include "arpa/inet.h"
+#endif
+
+#include "utiltools.hpp"
+
+#define MIN_RTP_PORT		10000
+#define MAX_RTP_PORT		60000
+
+// ȡ MIN_RTP_PORT(10000)~MAX_RTP_PORT(60000)֮�������˿�(ż���������������˿ڿ���)
+int allocRtpPort() {
+
+	static int s_rtpPort = MIN_RTP_PORT;
+	if (MIN_RTP_PORT == s_rtpPort)
+	{
+		srand((unsigned int)time(NULL));
+		s_rtpPort = MIN_RTP_PORT + (rand() % MIN_RTP_PORT);
+	}
+
+	if (s_rtpPort % 2)
+		++s_rtpPort;
+
+	while (true)
+	{
+		s_rtpPort += 2;
+		s_rtpPort = s_rtpPort >= MAX_RTP_PORT ? MIN_RTP_PORT : s_rtpPort;
+
+		int i = 0;
+		for (; i < 2; i++)
+		{
+			sockaddr_in sRecvAddr;
+			int s = socket(AF_INET, SOCK_DGRAM, 0);
+
+			sRecvAddr.sin_family = AF_INET;        
+			sRecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);    
+			sRecvAddr.sin_port = htons(s_rtpPort + i); 
+
+			int nResult = bind(s, (sockaddr *)&sRecvAddr, sizeof(sRecvAddr));
+			if (nResult != 0)
+			{
+				break;
+			}
+
+			nResult = close(s);
+			if (nResult != 0)
+			{
+				printf("closesocket failed:%d\n", nResult);
+				break;
+			}
+		}
+
+		if (i == 2)
+			break;
+	}
+
+	return s_rtpPort;
+}
+
+
+
+
+
+unsigned char *pHwRgb[2] = {nullptr, nullptr};
+
+int sum1 = 0;
+int sum2 = 0;
+
+// cudaStream_t stream[2];
+
+string data_home = "/mnt/data/cmhu/tmp/";
+
+
+// #define checkCudaErrors(S) do {CUresult  status; \
+//         status = S; \
+//         if (status != CUDA_SUCCESS ) std::cout << __LINE__ <<" checkCudaErrors - status = " << status << std::endl; \
+//         } while (false)
+
+
+// static void gpu_helper(int gpuid)
+// {
+//     cudaSetDevice(gpuid);
+
+//     // int *dn;
+//     // cudaMalloc((void **)&dn, 1 * sizeof(int));
+
+// 	size_t free_byte;
+// 	size_t total_byte;
+
+// 	CUresult cuda_status = cuMemGetInfo(&free_byte, &total_byte);
+
+// 	const char *pStr = nullptr;
+// 	if (CUDA_SUCCESS != cuda_status) {
+// 		cuGetErrorString(cuda_status, &pStr);
+// 		printf("Error: cudaMemGetInfo fails, %s \n", pStr);
+// 		return;
+// 	}
+
+// 	double free_db = (double)free_byte;
+// 	double total_db = (double)total_byte;
+// 	double used_db_1 = (total_db - free_db) / 1024.0 / 1024.0;
+
+// 	std::cout <<"显存已使用 " << used_db_1 << " MB\n";
+
+//     // cudaFree(dn);
+// }
+
+// int CheckCUDAProperty( int devId )
+// {
+//     cuInit(0);
+
+// 	CUdevice dev = devId;
+// 	size_t memSize = 0;
+// 	char devName[256] = {0};
+// 	int major = 0, minor = 0;
+// 	CUresult rlt = CUDA_SUCCESS;
+
+//     rlt = cuDeviceGetAttribute(&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, dev);
+//     checkCudaErrors( rlt );
+
+//     rlt = cuDeviceGetAttribute(&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, dev);
+// 	checkCudaErrors( rlt );
+
+// 	rlt = cuDeviceGetName( devName, sizeof( devName ), dev );
+// 	checkCudaErrors( rlt );
+
+// 	printf( "Using GPU Device %d: %s has SM %d.%d compute capability\n",
+// 		    dev, devName, major, minor );
+
+// 	rlt = cuDeviceTotalMem( &memSize, dev );
+// 	checkCudaErrors( rlt );
+
+// 	printf( "Total amount of global memory:   %4.4f MB\n",
+// 		   (float)memSize / ( 1024 * 1024 ) );
+
+// 	return 0;
+// }
+
+/**
+ * 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况
+ * */
+static long lastpts = 0;
+void postDecoded(const void * userPtr, DeviceRgbMemory * gpuFrame){
+    AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
+    if (decoder!= nullptr)
+    {
+        long curpts = UtilTools::get_cur_time_ms();
+        cout <<  decoder->getName() << "  " << gpuFrame->getWidth() << "x" << gpuFrame->getHeight() << "  " << curpts - lastpts << endl;
+        lastpts = curpts;
+        delete gpuFrame;
+        gpuFrame = nullptr;
+
+            // const char* gpu_pixfmt = av_get_pix_fmt_name((AVPixelFormat)gpuFrame->format);
+            // cout << "pixfmt: " << gpu_pixfmt << endl;
+            // cout << "keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;
+            // cout << "decode successed ✿✿ヽ(°▽°)ノ✿ " << endl;
+
+            // int sum = sum1;
+            // if (decoder->getName() == "dec0")
+            // {
+            //     sum1 ++ ;
+            //     sum = sum1;
+
+            //     if (gpuFrame->format == AV_PIX_FMT_CUDA)
+            //     {   
+            //         // cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl;
+            //         cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
+            //         cudaError_t cudaStatus;
+            //         if(pHwRgb[0] == nullptr){
+            //             // cudaStreamCreate(&stream[0]);
+            //             cuda_common::setColorSpace( ITU_709, 0 );
+            //             cudaStatus = cudaMalloc((void **)&pHwRgb[0], 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
+            //         }
+            //         cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwRgb[0], gpuFrame->width, gpuFrame->height);
+            //         cudaDeviceSynchronize();
+            //         if (cudaStatus != cudaSuccess) {
+            //             cout << "CUDAToBGR failed !!!" << endl;
+            //             return;
+            //         }
+
+            //         string path = data_home + decoder->getName() + ".jpg";
+            //         saveJpeg(path.c_str(), pHwRgb[0], gpuFrame->width, gpuFrame->height, stream[0]);  // 验证 CUDAToRGB 
+            //     }
+            // } else if (decoder->getName() == "dec2") 
+            // {
+            //     sum2 ++ ;
+            //     sum = sum2;
+
+            //     if (gpuFrame->format == AV_PIX_FMT_CUDA)
+            //     {   
+            //         // cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl;
+            //         cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
+            //         cudaError_t cudaStatus;
+            //         if(pHwRgb[1] == nullptr){
+            //             // cudaStreamCreate(&stream[1]);
+            //             cuda_common::setColorSpace( ITU_709, 0 );
+            //             cudaStatus = cudaMalloc((void **)&pHwRgb[1], 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
+            //         }
+            //         cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwRgb[1], gpuFrame->width, gpuFrame->height);
+            //         cudaDeviceSynchronize();
+            //         if (cudaStatus != cudaSuccess) {
+            //             cout << "CUDAToBGR failed !!!" << endl;
+            //             return;
+            //         }
+
+            //         string path = data_home + decoder->getName() + ".jpg";
+            //         saveJpeg(path.c_str(), pHwRgb[1], gpuFrame->width, gpuFrame->height, stream[1]);  // 验证 CUDAToRGB 
+            //     }
+            // }
+    }
+}
+
+long start_time = 0;
+long end_time = 0;
+bool count_flag = false;
+int count = 0;
+int count_std = 100;
+
+
+static int sum = 0;
+unsigned char *pHwData = nullptr;
+
+void postDecoded0(const void * userPtr, DeviceRgbMemory* gpuFrame){
+    // std::this_thread::sleep_for(std::chrono::milliseconds(30000));
+
+    AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
+    if (decoder!= nullptr)
+    {
+        // cout << "decode name: " << decoder->getName() << endl;
+        // if (decoder->getName() == "dec")
+        // {
+        //     if (! count_flag)
+        //     {
+        //         count_flag = true;
+        //         count = 0;
+        //         end_time = start_time = UtilTools::get_cur_time_ms();
+        //     }
+        //     count++;
+        //     sum ++ ;
+        //     if (count >= count_std)
+        //     {
+        //         // end_time = UtilTools::get_cur_time_ms();
+        //         // long time_using = end_time - start_time;
+        //         // double time_per_frame = double(time_using)/count_std ;
+        //         // cout << count_std << "帧用时:" << time_using << "ms 每帧用时:" << time_per_frame << "ms" << endl;
+        //         cout << decoder->getName() << " keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;
+        //         // cout << gpuFrame->pts << endl;
+
+        //         count_flag = false;
+        //     }
+        //     // cout << "帧数:" << sum << endl;
+
+        //     if (gpuFrame->format == AV_PIX_FMT_CUDA)
+        //     {   
+        //         cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
+        //         // cout << "gpu id : " << decoder->m_cfg.gpuid.c_str() << endl;
+        //         cudaError_t cudaStatus;
+        //         if(pHwData == nullptr){
+        //             cuda_common::setColorSpace( ITU_709, 0 );
+        //             cudaStatus = cudaMalloc((void **)&pHwData, 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
+        //         }
+        //         cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwData, gpuFrame->width, gpuFrame->height);
+        //         cudaDeviceSynchronize();
+        //         if (cudaStatus != cudaSuccess) {
+        //             cout << "CUDAToBGR failed !!!" << endl;
+        //             return;
+        //         }
+
+        //         string path = data_home + decoder->getName() + ".jpg";
+        //         saveJpeg(path.c_str(), pHwData, gpuFrame->width, gpuFrame->height, nullptr);  // 验证 CUDAToRGB 
+        //     }
+        // }
+    }
+}
+
+void decode_finished_cbk(const void* userPtr){
+    cout << "当前时间戳: " << UtilTools::get_cur_time_ms() << endl;
+}
+
+bool decode_request_stream_cbk(const char* deviceId){
+    cout << "需在此请求流" << endl;
+    return true;
+}
+
+// string test_uri = "rtmp://192.168.10.56:1935/objecteye/1";
+// string test_uri = "/home/cmhu/data/output_800x480.mp4";
+// string test_uri = "/home/cmhu/data/output_1920x1080.mp4";
+// string test_uri = "rtsp://176.10.0.2:8554/stream";
+// string test_uri = "/mnt/f/fiss/test_data/h265.mp4";
+string test_uri = "rtsp://176.10.0.4:8554/stream";
+
+void createDecode(int index, const char* gpu_id){
+    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
+    MgrDecConfig config;
+    config.name = "dec" + to_string(index);
+    config.cfg.uri = test_uri;
+    config.cfg.post_decoded_cbk = postDecoded;
+    config.cfg.decode_finished_cbk = decode_finished_cbk;
+    config.cfg.force_tcp = true;
+    config.dec_type = DECODER_TYPE_FFMPEG;
+
+    config.cfg.gpuid = gpu_id;
+    // if (index % 2 == 0)
+    // {
+    //     config.cfg.gpuid = "0";
+    // }
+    // else
+    // {
+    //     config.cfg.gpuid = "0";
+    // }
+    
+    AbstractDecoder* decoder = pDecManager->createDecoder(config);
+    if (!decoder)
+    {
+        return ;
+    }
+    pDecManager->setPostDecArg(config.name, decoder);
+    pDecManager->setFinishedDecArg(config.name, decoder);
+    pDecManager->startDecodeByName(config.name);
+}
+
+void createGB28181Decode(int index, char* gpu_id, int port){
+    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
+    MgrDecConfig config;
+    config.name = "dec" + to_string(index);
+    config.cfg.uri = config.name;
+    config.cfg.post_decoded_cbk = postDecoded;
+    config.cfg.decode_finished_cbk = decode_finished_cbk;
+    config.cfg.request_stream_cbk = decode_request_stream_cbk;
+    config.cfg.force_tcp = true;
+
+    config.dec_type = DECODER_TYPE_GB28181;
+    config.cfg.port = port;//allocRtpPort();
+
+    config.cfg.gpuid = gpu_id;
+    
+    AbstractDecoder* decoder = pDecManager->createDecoder(config);
+    if (!decoder)
+    {
+        return ;
+    }
+    pDecManager->setPostDecArg(config.name, decoder);
+    pDecManager->setFinishedDecArg(config.name, decoder);
+    pDecManager->startDecodeByName(config.name);
+}
+
+void logFF(void *, int level, const char *fmt, va_list ap)
+{
+    vfprintf(stdout, fmt, ap);
+}
+
+
+int main(int argc, char* argv[]){
+
+    test_uri = "rtsp://admin:admin@123456@192.168.60.176:554/cam/realmonitor?channel=1&subtype=0";//argv[1];
+    char* gpuid = argv[2];
+    int port = atoi(argv[3]);
+    cout << test_uri << "   gpu_id:" << gpuid << "   port:" << port << endl;
+
+    // av_log_set_callback(&logFF);
+
+    // CheckCUDAProperty(atoi(gpuid));
+
+    pthread_t m_decode_thread;
+    pthread_create(&m_decode_thread,0,
+        [](void* arg)
+        {
+            // cudaSetDevice(atoi(gpuid));
+            while (true)
+            {
+                std::this_thread::sleep_for(std::chrono::minutes(1));
+                FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
+                int count = pDecManager->count();
+                cout << "当前时间:" << UtilTools::get_cur_time_ms() << "  当前运行路数: " << pDecManager->count() << endl;
+            }  
+
+            return (void*)0;
+        }
+    ,nullptr);
+
+
+    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
+    int i = 0;
+
+    while (true)
+    {
+        int ch = getchar();
+        if (ch == 'q')
+        {
+            break;
+        }
+
+        switch (ch)
+        {
+        case 'f':
+        case 'F':
+            createDecode(i, gpuid);
+            i++;
+            break;
+        case 'g':
+        case 'G':
+            createGB28181Decode(i, gpuid, port);
+            i++;
+            break;
+        case 'r':
+        case 'R':
+            pDecManager->resumeDecoder("dec0");
+            break;
+        case 'p':
+        case 'P':
+            pDecManager->pauseDecoder("dec0");
+            break;
+
+        case 'c':
+        case 'C':
+            i--;
+            pDecManager->closeDecoderByName("dec" + to_string(i));
+            break;
+
+        case 'i':
+        case 'I':
+        {
+            int w,h;
+            pDecManager->getResolution("dec0", w,h);
+            printf( "%s : %dx%d\n", "dec0" , w,h );
+        }
+            break;
+
+        default:
+            break;
+        }
+
+        /* code */
+    }
+
+    cout << "总共帧数:" << sum << endl;
+    pDecManager->closeAllDecoder();
+}
\ No newline at end of file
diff --git a/src/dvpp/Makefile b/src/dvpp/Makefile
index 1f044f5..8bca911 100644
--- a/src/dvpp/Makefile
+++ b/src/dvpp/Makefile
@@ -15,7 +15,7 @@ DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
 DEFS = -DENABLE_DVPP_INTERFACE
 
 # 最终目标文件
-TARGET:=$(LIB_DIR)/lib$(MODULE).a
+TARGET:=$(LIB_DIR)/$(MODULE).a
 
 export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/runtime/lib64:$LD_LIBRARY_PATH
 export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/lib64:$LD_LIBRARY_PATH
@@ -25,7 +25,7 @@ include_dir=-I/usr/local/Ascend/ascend-toolkit/latest/acllib/include
 lib_dir=-L/usr/lib -L/usr/local/lib -L/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64 -L/usr/local/Ascend/driver/lib64 -L/usr/local/Ascend/ascend-toolkit/latest/atc/lib64
 lib=-lacl_dvpp -lascendcl -lmmpa -lglog -lgflags -lpthread -lz
 
-CXXFLAGS= -g -O0 -fPIC $(include_dir) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl
+CXXFLAGS= -g -O0 -fPIC $(include_dir) $(INCS) $(LIBS) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl
 	# -DUNICODE -D_UNICODE
 
 # 默认最终目标
@@ -44,7 +44,7 @@ $(LIB_DIR):
 # 生成中间目标文件
 $(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR)
 	@echo -e "\e[33m""Building object $@""\e[0m"
-	@$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(LDFLAGS) $(lib_dir) $(lib) $(MACROS) -o $@ $<
+	@$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(LDFLAGS) $(lib_dir) $(lib) $(MACROS) -o $@ $<
 
 # 若没有obj目录则自动生成
 $(OBJ_DIR):
diff --git a/src/interface/FFNvDecoderManager.h b/src/interface/FFNvDecoderManager.h
index ca23f91..2c1e3eb 100644
--- a/src/interface/FFNvDecoderManager.h
+++ b/src/interface/FFNvDecoderManager.h
@@ -14,7 +14,7 @@ struct MgrDecConfig
     string name{""};    // 解码器名称
 };
 
-#define USE_NVDEC
+// #define USE_NVDEC
 // #define USE_DVPP
 /**
  * 解码器管理类,单例类
diff --git a/src/nvdec/Makefile b/src/nvdec/Makefile
index 5d1e8ad..2a6afb2 100644
--- a/src/nvdec/Makefile
+++ b/src/nvdec/Makefile
@@ -15,7 +15,7 @@ NVCC = $(CUDA_ROOT)/bin/nvcc
 # 自动生成头文件依赖选项
 DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
 
-DEFS = -DENABLE_DVPP_INTERFACE
+DEFS = 
 
 # 最终目标文件
 TARGET:=$(LIB_DIR)/$(MODULE).a
@@ -34,7 +34,7 @@ LIBSPATH= -L $(JRTP_ROOT)/jthread/lib -l:libjthread.a \
    -L $(JRTP_ROOT)/jrtplib/lib -l:libjrtp.a \
    -L $(CUDA_ROOT)/lib64 -lcuda -lcudart -lnvcuvid -lcurand -lcublas -lnvjpeg \
 
-CXXFLAGS= -g -O0 -fPIC $(INCLUDE) $(LIBSPATH) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl -Wwrite-strings
+CXXFLAGS= -g -O0 -fPIC $(INCLUDE) $(LIBSPATH) $(DEFS) $(INCS) $(LIBS) $(MACROS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl -Wwrite-strings
 	# -DUNICODE -D_UNICODE
 
 NFLAGS_LIB=-g -c -shared -Xcompiler -fPIC
@@ -61,8 +61,8 @@ $(LIB_DIR):
 # 生成中间目标文件
 $(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR)
 	@echo -e "\e[33m""Building object $@""\e[0m"
-	@echo "$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(LIBS) $(MACROS) -o $@ $<"
-	@$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(LIBS) $(MACROS) -o $@ $<
+	@echo "$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) -o $@ $<"
+	@$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) -o $@ $<
 
 $(OBJ_DIR)%.o:$(SRC_DIR)/%.cu
 	@echo -e "\e[33m""Building object $@""\e[0m"
--
libgit2 0.21.4