From 00b0fbdb28050ddecec6db2f21a697ec6373e30a Mon Sep 17 00:00:00 2001 From: fiss <2657262686@qq.com> Date: Mon, 20 Mar 2023 04:40:49 -0400 Subject: [PATCH] 编译nvdec --- .vscode/launch.json | 18 ++++++++++++++++++ src/Makefile | 11 ++++++----- src/Makefile.bak | 4 +--- src/Makefile.bak0308 | 62 -------------------------------------------------------------- src/demo/Makefile | 78 ++++++++++++++++++++++++++++++++++++++++++++++++------------------------------ src/demo/Makefile.BK0308 | 43 ------------------------------------------- src/demo/Makefile.dvpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/demo/main_dvpp.cpp | 348 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ src/demo/main_dvpp.cpp1 | 337 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/demo/main_nvdec.cpp | 457 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/demo/main_nvdec.cpp1 | 452 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/dvpp/DvppDecoderApi.h | 2 +- src/dvpp/depend_headers.h | 8 ++++---- src/gb28181/FFGB28181Decoder.cpp | 44 +++++++++++++++++++++++++++++++++++++++++--- src/gb28181/FFGB28181Decoder.h | 28 +++++++++++++++++++++++++++- src/gb28181/Makefile | 32 ++++++++++++++++++++++++++++++-- src/interface/FFNvDecoderManager.h | 4 ++-- src/interface/Makefile | 40 ++++++++++++++++++++++++++++++++++++---- src/interface/utiltools.hpp | 2 +- src/nvdecoder/DrawImageOnGPU.cu | 2 +- src/nvdecoder/FFCuContextManager.cpp | 12 ++++++++++++ src/nvdecoder/FFCuContextManager.h | 13 ++----------- src/nvdecoder/FFNvDecoder.cpp | 43 +++++++++++++++++++++++++++++++++++++++++-- src/nvdecoder/FFNvDecoder.h | 45 ++++++++++++++++++++++++++++++++++++++++++--- src/nvdecoder/GpuRgbMemory.hpp | 8 ++++---- src/nvdecoder/Makefile | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/nvdecoder/NV12ToRGB.cu | 2 +- src/nvdecoder/NvDecoderApi.cpp | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/nvdecoder/NvDecoderApi.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/nvdecoder/common_header.h | 1 + 30 files changed, 1440 insertions(+), 983 deletions(-) delete mode 100644 src/Makefile.bak0308 delete mode 100644 src/demo/Makefile.BK0308 create mode 100644 src/demo/Makefile.dvpp delete mode 100644 src/demo/main_dvpp.cpp create mode 100644 src/demo/main_dvpp.cpp1 create mode 100644 src/demo/main_nvdec.cpp delete mode 100644 src/demo/main_nvdec.cpp1 create mode 100644 src/nvdecoder/Makefile create mode 100644 src/nvdecoder/NvDecoderApi.cpp create mode 100644 src/nvdecoder/NvDecoderApi.h diff --git a/.vscode/launch.json b/.vscode/launch.json index 258f7e1..bde8772 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -19,6 +19,24 @@ "ignoreFailures": true } ] + },{ + "name": "nvdec", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/bin/lib/demo", + "args": ["/mnt/data/cmhu/data/caishenkezhan.mp4","0", "0"], + "stopAtEntry": false, + "cwd": "${workspaceFolder}/bin/lib", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] } ] } \ No newline at end of file diff --git a/src/Makefile b/src/Makefile index 2daafeb..2b6c8d8 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= /home/huchunming/FFNvDecoder +PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder DEPEND_DIR = $(PROJECT_ROOT)/bin SRC_ROOT = $(PROJECT_ROOT)/src @@ -29,11 +29,12 @@ LDFLAGS:= LIBS:= -L $(SPDLOG_ROOT)/lib -l:libspdlog.a \ # 各个模块 -MODULES:= dvpp interface demo +MODULES:= nvdecoder gb28181 interface demo # 各个模块对应的库 -MODULE_LIBS:=$(BUILD_DIR)/dvpp/lib/libdvpp.a\ - $(BUILD_DIR)/interface/lib/interface.a\ +# MODULE_LIBS:=$(BUILD_DIR)/nvdecoder/lib/nvdecoder.a\ +# $(BUILD_DIR)/nvdecoder/lib/gb28181.a\ +# $(BUILD_DIR)/interface/lib/interface.a\ # 最终目标文件 TARGET:=$(BIN_DIR)/test @@ -45,7 +46,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/Makefile.bak b/src/Makefile.bak index 2e225eb..bddc482 100644 --- a/src/Makefile.bak +++ b/src/Makefile.bak @@ -8,12 +8,10 @@ PROJECT_ROOT= /home/huchunming/FFNvDecoder DEPEND_DIR = $(PROJECT_ROOT)/bin SRC_ROOT = $(PROJECT_ROOT)/src -THIRDPARTY_ROOT = $(PROJECT_ROOT)/3rdparty - TARGET= $(DEPEND_DIR)/lib/test - +THIRDPARTY_ROOT = $(PROJECT_ROOT)/3rdparty SPDLOG_ROOT = $(THIRDPARTY_ROOT)/spdlog-1.9.2/release JRTP_ROOT = $(THIRDPARTY_ROOT)/jrtp_export diff --git a/src/Makefile.bak0308 b/src/Makefile.bak0308 deleted file mode 100644 index b8f7d89..0000000 --- a/src/Makefile.bak0308 +++ /dev/null @@ -1,62 +0,0 @@ -# 项目根目录 -TOP_DIR:=$(patsubst %/, %, $(dir $(abspath $(lastword $(MAKEFILE_LIST))))) -export TOP_DIR - -# 各项目录 -BUILD_DIR:=$(TOP_DIR)/build -BIN_DIR:=$(BUILD_DIR)/bin -export BUILD_DIR - -PROJECT_ROOT= /home/huchunming/FFNvDecoder - -DEPEND_DIR = $(PROJECT_ROOT)/bin -SRC_ROOT = $(PROJECT_ROOT)/src -THIRDPARTY_ROOT = $(PROJECT_ROOT)/3rdparty -SPDLOG_ROOT = $(THIRDPARTY_ROOT)/spdlog-1.9.2/release - -#编译器 -CXX:=g++ -CXXFLAGS:=-std=c++11 -Wall -Wextra -Og -g -INCS:=-I $(TOP_DIR) \ - -I $(SPDLOG_ROOT)/include \ - -MACROS:= -export CXX CXXFLAGS INCS MACROS - -# 链接器 -LD:=g++ -LDFLAGS:= -LIBS:= -L $(SPDLOG_ROOT)/lib -l:libspdlog.a \ - -# 各个模块 -MODULES:= dvpp interface - -# 各个模块对应的库 -MODULE_LIBS:=$(BUILD_DIR)/dvpp/lib/libdvpp.a\ - $(BUILD_DIR)/interface/lib/interface.a\ - -# 最终目标文件 -TARGET:=$(BIN_DIR)/test - -# 默认最终目标 -.PHONY:all -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" -#@$(LD) $(LDFLAGS) -o $@ $(MODULE_LIBS) $(LIBS) - -# 若没有bin目录则自动生成 -$(BIN_DIR): - @mkdir -p $@ - -# 强制执行命令 -.PHONY:FORCE -FORCE: - -# make clean直接删除整个build目录 -.PHONY:clean -clean: - @rm -rf $(BUILD_DIR) diff --git a/src/demo/Makefile b/src/demo/Makefile index 25c49e5..b19cdb2 100644 --- a/src/demo/Makefile +++ b/src/demo/Makefile @@ -1,60 +1,78 @@ XX = g++ -PROJECT_ROOT= /home/huchunming/FFNvDecoder +PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder + +CUDA_ROOT = /usr/local/cuda-11.1 DEPEND_DIR = $(PROJECT_ROOT)/bin -SRC_ROOT = $(PROJECT_ROOT)/src THIRDPARTY_ROOT = $(PROJECT_ROOT)/3rdparty - - -TARGET= /home/huchunming/FFNvDecoder/src/build/bin/demo - - SPDLOG_ROOT = $(THIRDPARTY_ROOT)/spdlog-1.9.2/release JRTP_ROOT = $(THIRDPARTY_ROOT)/jrtp_export +SRC_ROOT = $(PROJECT_ROOT)/src -include_dir=-I/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/runtime/include -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 +TARGET= $(PROJECT_ROOT)/bin/lib/demo DEFS = -DENABLE_DVPP_INTERFACE INCLUDE= -I $(SRC_ROOT)/interface \ -I $(SRC_ROOT)/dvpp \ + -I $(SRC_ROOT)/gb28181 \ + -I $(SRC_ROOT)/nvdecoder \ + -I $(DEPEND_DIR)/include \ + -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 \ + -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 + + +# include_dir=-I/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/runtime/include + +# 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 +# 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 -LIBSPATH= - -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 +CXXFLAGS= -g -O0 -fPIC $(INCLUDE) $(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))) -OBJ_ROOT = /home/huchunming/FFNvDecoder/src/build -DVPP_SRCS:=$(wildcard $(OBJ_ROOT)/dvpp/obj/*.o) +OBJ_ROOT = $(PROJECT_ROOT)/src/build +# DVPP_SRCS:=$(wildcard $(OBJ_ROOT)/dvpp/obj/*.o) INTEFACE_SRCS:=$(wildcard $(OBJ_ROOT)/interface/obj/*.o) +NVDECODER_SRCS:=$(wildcard $(OBJ_ROOT)/nvdecoder/obj/*.o) +GB28181_SRCS:=$(wildcard $(OBJ_ROOT)/gb28181/obj/*.o) -$(TARGET):$(OBJS) $(INTEFACE_SRCS) $(DVPP_SRCS) +$(TARGET):$(OBJS) $(INTEFACE_SRCS) $(NVDECODER_SRCS) $(GB28181_SRCS) rm -f $(TARGET) - @echo -e "\e[33m""Building object $@""\e[0m" - $(XX) -o $@ $^ $(CXXFLAGS) $(LIBS) $(lib_dir) $(lib) -Wwrite-strings +# @echo -e "\e[33m""Building object $@""\e[0m" +# $(XX) -o $@ $^ $(CXXFLAGS) $(LIBS) $(lib_dir) $(lib) -Wwrite-strings + $(XX) -o $@ $^ $(CXXFLAGS) $(LIBSPATH) -Wwrite-strings rm -f *.o %.o:$(SRC_ROOT)/demo/%.cpp - $(XX) $(CFLAGS) -c $< + $(XX) $(CXXFLAGS) -c $< clean: diff --git a/src/demo/Makefile.BK0308 b/src/demo/Makefile.BK0308 deleted file mode 100644 index e096cc9..0000000 --- a/src/demo/Makefile.BK0308 +++ /dev/null @@ -1,43 +0,0 @@ -XX = g++ - - -PROJECT_ROOT= /home/huchunming/FFNvDecoder - -DEPEND_DIR = $(PROJECT_ROOT)/bin -SRC_ROOT = $(PROJECT_ROOT)/src -THIRDPARTY_ROOT = $(PROJECT_ROOT)/3rdparty - - -TARGET= /home/huchunming/FFNvDecoder/src/build/bin/test - - -SPDLOG_ROOT = $(THIRDPARTY_ROOT)/spdlog-1.9.2/release -JRTP_ROOT = $(THIRDPARTY_ROOT)/jrtp_export - - -INCLUDE= -I $(SRC_ROOT)/interface \ - -LIBSPATH= -L /home/huchunming/FFNvDecoder/src/build/interface/lib -l:interface.a \ - -L /home/huchunming/FFNvDecoder/src/build/dvpp/lib -l:libdvpp.a \ - - -LIBS= -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice - -CFLAGS= -g -fPIC -O0 $(INCLUDE) -pthread -lrt -lz -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl - # -DUNICODE -D_UNICODE - -SRCS:=$(wildcard $(SRC_ROOT)/demo/*.cpp) -OBJS = $(patsubst %.cpp, %.o, $(notdir $(SRCS))) - - -$(TARGET):$(OBJS) $(CU_OBJS) - rm -f $(TARGET) - $(XX) -o $@ $^ $(CFLAGS) $(LIBSPATH) $(LIBS) -Wwrite-strings - rm -f *.o - -%.o:$(SRC_ROOT)/demo/%.cpp - $(XX) $(CFLAGS) -c $< - - -clean: - rm -f *.o $(TARGET) \ No newline at end of file diff --git a/src/demo/Makefile.dvpp b/src/demo/Makefile.dvpp new file mode 100644 index 0000000..d369b20 --- /dev/null +++ b/src/demo/Makefile.dvpp @@ -0,0 +1,48 @@ +XX = g++ + + +PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder + +SRC_ROOT = $(PROJECT_ROOT)/src + +TARGET= $(PROJECT_ROOT)/src/build/bin/demo + +DEFS = -DENABLE_DVPP_INTERFACE + + +include_dir=-I/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/runtime/include + +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 +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))) + +OBJ_ROOT = $(PROJECT_ROOT)/src/build +DVPP_SRCS:=$(wildcard $(OBJ_ROOT)/dvpp/obj/*.o) +INTEFACE_SRCS:=$(wildcard $(OBJ_ROOT)/interface/obj/*.o) + + +$(TARGET):$(OBJS) $(INTEFACE_SRCS) $(NVDECODER_SRCS) $(GB28181_SRCS) + rm -f $(TARGET) + @echo -e "\e[33m""Building object $@""\e[0m" + $(XX) -o $@ $^ $(CXXFLAGS) $(LIBS) $(lib_dir) $(lib) -Wwrite-strings + rm -f *.o + +%.o:$(SRC_ROOT)/demo/%.cpp + $(XX) $(CXXFLAGS) -c $< + + +clean: + rm -f *.o $(TARGET) \ No newline at end of file diff --git a/src/demo/main_dvpp.cpp b/src/demo/main_dvpp.cpp deleted file mode 100644 index 7e8ef57..0000000 --- a/src/demo/main_dvpp.cpp +++ /dev/null @@ -1,348 +0,0 @@ -#include -#include -#include -#include -#include - - -#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; - - createDvppDecoder(i, gpuid, 0); - i++; - createDvppDecoder(i, gpuid, 0); - i++; - createDvppDecoder(i, gpuid, 0); - i++; - - for(;i<30;i++){ - createDvppDecoder(i, gpuid, 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 new file mode 100644 index 0000000..602a170 --- /dev/null +++ b/src/demo/main_dvpp.cpp1 @@ -0,0 +1,337 @@ +#include +#include +#include +#include +#include + + +#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 new file mode 100644 index 0000000..db2da61 --- /dev/null +++ b/src/demo/main_nvdec.cpp @@ -0,0 +1,457 @@ +#include "FFNvDecoderManager.h" +#include + +#include "cuda_kernels.h" + +#include "NvJpegEncoder.h" + +#include +#include + +#include + +#include + + +#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 deleted file mode 100644 index be0094d..0000000 --- a/src/demo/main_nvdec.cpp1 +++ /dev/null @@ -1,452 +0,0 @@ -// #include "FFNvDecoderManager.h" -// #include - -// #include "cuda_kernels.h" - -// #include "NvJpegEncoder.h" - -// #include -// #include - -// #include - -// #include - - -// #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 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况 -// * */ -// void postDecoded(const void * userPtr, AVFrame * gpuFrame){ -// AbstractDecoder* decoder = (AbstractDecoder*)userPtr; -// if (decoder!= nullptr) -// { -// // cout << "decode name: " << decoder->getName() << endl; - -// // 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, AVFrame * 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/DvppDecoderApi.h b/src/dvpp/DvppDecoderApi.h index e1b98a8..b020d75 100644 --- a/src/dvpp/DvppDecoderApi.h +++ b/src/dvpp/DvppDecoderApi.h @@ -8,7 +8,7 @@ using namespace std; class DvppDecoder; -class DvppDecoderApi : public AbstractDecoder{ +class DvppDecoderApi : public AbstractDecoder { public: DvppDecoderApi(); ~DvppDecoderApi(); diff --git a/src/dvpp/depend_headers.h b/src/dvpp/depend_headers.h index 84788e3..0e942a2 100644 --- a/src/dvpp/depend_headers.h +++ b/src/dvpp/depend_headers.h @@ -23,10 +23,10 @@ // ffmpeg 是c库 所以编译的时候要加入从 extern导入的C 来声明否则连接失败 extern "C" { -#include "libavutil/imgutils.h" -#include "libavutil/samplefmt.h" -#include "libavformat/avformat.h" -#include "libavcodec/avcodec.h" + #include "libavutil/imgutils.h" + #include "libavutil/samplefmt.h" + #include "libavformat/avformat.h" + #include "libavcodec/avcodec.h" } diff --git a/src/gb28181/FFGB28181Decoder.cpp b/src/gb28181/FFGB28181Decoder.cpp index 68d4b8a..a4ea5da 100644 --- a/src/gb28181/FFGB28181Decoder.cpp +++ b/src/gb28181/FFGB28181Decoder.cpp @@ -2,7 +2,7 @@ #include #include "FFGB28181Decoder.h" -#include "../FFCuContextManager.h" +#include "../nvdecoder/FFCuContextManager.h" extern "C" { #include "libavutil/avstring.h" @@ -296,7 +296,7 @@ void FFGB28181Decoder::post_decode_thread(){ m_queue_mutex.unlock(); // 跳帧 if (m_frameSkip == 1 || index % m_frameSkip == 0){ - post_decoded_cbk(m_postDecArg, gpuFrame); + post_decoded_cbk(m_postDecArg, convert2bgr(gpuFrame)); } av_frame_free(&gpuFrame); @@ -320,6 +320,14 @@ void FFGB28181Decoder::stream_end_callback() return; } +void FFGB28181Decoder::setPostDecArg(const void* postDecArg){ + m_postDecArg = postDecArg; +} + +void FFGB28181Decoder::setFinishedDecArg(const void* finishedDecArg){ + m_finishedDecArg = finishedDecArg; +} + void FFGB28181Decoder::pause() { m_status = EPAUSE; LOG_INFO("pause --{}", m_dec_name); @@ -370,6 +378,36 @@ int FFGB28181Decoder::getCachedQueueLength(){ return m_rtpPtr->GetPsFrameListSize(); } +DeviceRgbMemory* FFGB28181Decoder::convert2bgr(AVFrame * gpuFrame){ + if (gpuFrame != nullptr && gpuFrame->format == AV_PIX_FMT_CUDA ){ + LOG_DEBUG("decode task: gpuid: {} width: {} height: {}", m_cfg.gpuid, gpuFrame->width, gpuFrame->height); + GpuRgbMemory* gpuMem = new GpuRgbMemory(3, gpuFrame->width, gpuFrame->height, getName(), m_cfg.gpuid, false, true); + + do{ + if (gpuMem->getMem() == nullptr){ + LOG_ERROR("new GpuRgbMemory failed !!!"); + break; + } + + cudaSetDevice(atoi(m_cfg.gpuid.c_str())); + cuda_common::setColorSpace( ITU_709, 0 ); + cudaError_t cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], gpuMem->getMem(), gpuFrame->width, gpuFrame->height); + cudaDeviceSynchronize(); + if (cudaStatus != cudaSuccess) { + LOG_ERROR("CUDAToBGR failed failed !!!"); + break; + } + + return gpuMem; + }while(0); + + delete gpuMem; + gpuMem = nullptr; + } + + return nullptr; +} + FFImgInfo* FFGB28181Decoder::snapshot(){ // 锁住停止队列消耗 @@ -401,7 +439,7 @@ FFImgInfo* FFGB28181Decoder::snapshot(){ if (gpuFrame != nullptr && gpuFrame->format == AV_PIX_FMT_CUDA ){ LOG_DEBUG("decode task: gpuid: {} width: {} height: {}", m_cfg.gpuid, gpuFrame->width, gpuFrame->height); - GpuRgbMemory* gpuMem = new GpuRgbMemory(3, gpuFrame->width, gpuFrame->height, getName(), m_cfg.gpuid , true); + GpuRgbMemory* gpuMem = new GpuRgbMemory(3, gpuFrame->width, gpuFrame->height, getName(), m_cfg.gpuid , false, true); if (gpuMem->getMem() == nullptr){ LOG_ERROR("new GpuRgbMemory failed !!!"); diff --git a/src/gb28181/FFGB28181Decoder.h b/src/gb28181/FFGB28181Decoder.h index 9fee58f..abae9e5 100644 --- a/src/gb28181/FFGB28181Decoder.h +++ b/src/gb28181/FFGB28181Decoder.h @@ -3,7 +3,8 @@ #include "RTPReceiver.h" -#include "../AbstractDecoder.h" +#include "common_header.h" +#include "../interface/AbstractDecoder.h" #include #include @@ -14,6 +15,7 @@ struct AVCodec; struct AVFrame; struct AVPacket; struct SwsContext; +struct AVDictionary; using namespace std; @@ -46,12 +48,29 @@ public: FFImgInfo* snapshot(); + void setName(string nm){ + m_dec_name = nm; + } + + string getName(){ + return m_dec_name; + } + + void setPostDecArg(const void* postDecArg); + void setFinishedDecArg(const void* finishedDecArg); + public: void stream_callback(int videoType, char* data, int len, int isKey, uint64_t pts, uint64_t localPts); void stream_end_callback(); void post_decode_thread(); private: + DeviceRgbMemory* convert2bgr(AVFrame * gpuFrame); + +private: + string m_dec_name; + FFDecConfig m_cfg; + AVCodecContext* m_pAVCodecCtx {}; const AVCodec* m_pAVCodec {}; @@ -76,10 +95,17 @@ private: AVDictionary *gpu_options = nullptr; pthread_t m_post_decode_thread; + const void * m_postDecArg; + POST_DECODE_CALLBACK post_decoded_cbk; // 解码数据回调接口 + + const void * m_finishedDecArg; + DECODE_FINISHED_CALLBACK decode_finished_cbk; queue mFrameQueue; mutex m_queue_mutex; mutex m_snapshot_mutex; + + bool m_dec_keyframe; }; #endif // _GB28181_DECODER_H_ diff --git a/src/gb28181/Makefile b/src/gb28181/Makefile index 46094f5..d15ead3 100644 --- a/src/gb28181/Makefile +++ b/src/gb28181/Makefile @@ -12,6 +12,34 @@ DEPS:=$(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d,a $(SRCS))) # 自动生成头文件依赖选项 DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d +CUDA_ROOT = /usr/local/cuda-11.1 + +PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder + +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 + + +INCLUDE= -I $(DEPEND_DIR)/include \ + -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 \ + -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) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl -Wwrite-strings + # 最终目标文件 TARGET:=$(LIB_DIR)/$(MODULE).a @@ -22,7 +50,7 @@ all:$(TARGET) # 生成最终目标 $(TARGET):$(OBJS) | $(LIB_DIR) @echo -e "\e[32m""Linking static library $(TARGET)""\e[0m" - @ar -rc $@ $^ +# @ar -rc $@ $^ # 若没有lib目录则自动生成 $(LIB_DIR): @@ -31,7 +59,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) $(MACROS) -o $@ $< + @$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(LIBSPATH) $(MACROS) -o $@ $< # 若没有obj目录则自动生成 $(OBJ_DIR): diff --git a/src/interface/FFNvDecoderManager.h b/src/interface/FFNvDecoderManager.h index bb1c0de..ca23f91 100644 --- a/src/interface/FFNvDecoderManager.h +++ b/src/interface/FFNvDecoderManager.h @@ -14,8 +14,8 @@ struct MgrDecConfig string name{""}; // 解码器名称 }; -// #define USE_NVDEC -#define USE_DVPP +#define USE_NVDEC +// #define USE_DVPP /** * 解码器管理类,单例类 * 谨防死锁 diff --git a/src/interface/Makefile b/src/interface/Makefile index 60c3103..2b9ab32 100644 --- a/src/interface/Makefile +++ b/src/interface/Makefile @@ -12,10 +12,41 @@ DEPS:=$(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d,a $(SRCS))) # 自动生成头文件依赖选项 DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d + +PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder + +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 + + +INCLUDE= -I $(DEPEND_DIR)/include \ + -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 \ + -I $(TOP_DIR)/src/gb28181 \ + -I $(TOP_DIR)/src/nvdecoder \ + +LIBSPATH= -L $(DEPEND_DIR)/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice \ + -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) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl -Wwrite-strings + + # 最终目标文件 TARGET:=$(LIB_DIR)/$(MODULE).a -MODULE_LIBS:=$(BUILD_DIR)/dvpp/lib/libdvpp.a\ +# MODULE_LIBS:=$(BUILD_DIR)/nvdecoder/lib/nvdecoder.a \ +# $(BUILD_DIR)/gb28181/lib/gb28181.a\ # 默认最终目标 .PHONY:all @@ -23,8 +54,8 @@ all:$(TARGET) # 生成最终目标 $(TARGET):$(OBJS) | $(LIB_DIR) - @echo -e "\e[32m""Linking static library $(TARGET)""\e[0m" - @ar -rc $@ $^ + # @echo -e "\e[32m""Linking static library $(TARGET)""\e[0m" +# @ar -rc $@ $^ # 若没有lib目录则自动生成 $(LIB_DIR): @@ -33,7 +64,8 @@ $(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) $(MACROS) -o $@ $(MODULE_LIBS) $< +# @$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(LIBSPATH) $(MACROS) -o $@ $(MODULE_LIBS) $< + @$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(LIBSPATH) $(MACROS) -o $@ $< # 若没有obj目录则自动生成 $(OBJ_DIR): diff --git a/src/interface/utiltools.hpp b/src/interface/utiltools.hpp index 8caff91..a156ab9 100644 --- a/src/interface/utiltools.hpp +++ b/src/interface/utiltools.hpp @@ -1,7 +1,7 @@ #ifndef _UTIL_TOOLS_HPP_ #define _UTIL_TOOLS_HPP_ -#include +#include using namespace std; diff --git a/src/nvdecoder/DrawImageOnGPU.cu b/src/nvdecoder/DrawImageOnGPU.cu index 8770cea..1fa99dc 100644 --- a/src/nvdecoder/DrawImageOnGPU.cu +++ b/src/nvdecoder/DrawImageOnGPU.cu @@ -1,6 +1,6 @@ #include "cuda_kernels.h" -#include "logger.hpp" +#include "../interface/logger.hpp" typedef unsigned char uchar; typedef unsigned int uint32; diff --git a/src/nvdecoder/FFCuContextManager.cpp b/src/nvdecoder/FFCuContextManager.cpp index 9ae930c..382c4d8 100644 --- a/src/nvdecoder/FFCuContextManager.cpp +++ b/src/nvdecoder/FFCuContextManager.cpp @@ -4,6 +4,18 @@ using namespace std; +extern "C" +{ + #include + #include + #include + #include + #include + #include + #include + #include +} + FFCuContextManager::~FFCuContextManager() { for(auto iter = ctxMap.begin(); iter != ctxMap.end(); iter++){ diff --git a/src/nvdecoder/FFCuContextManager.h b/src/nvdecoder/FFCuContextManager.h index 3050641..758167c 100644 --- a/src/nvdecoder/FFCuContextManager.h +++ b/src/nvdecoder/FFCuContextManager.h @@ -2,19 +2,10 @@ #include #include -extern "C" -{ - #include - #include - #include - #include - #include - #include - #include -} - using namespace std; +struct AVBufferRef; + class FFCuContextManager{ public: static FFCuContextManager* getInstance(){ diff --git a/src/nvdecoder/FFNvDecoder.cpp b/src/nvdecoder/FFNvDecoder.cpp index 3ebcd6c..e64e2a5 100644 --- a/src/nvdecoder/FFNvDecoder.cpp +++ b/src/nvdecoder/FFNvDecoder.cpp @@ -63,6 +63,7 @@ FFNvDecoder::~FFNvDecoder() bool FFNvDecoder::init(FFDecConfig& cfg) { m_cfg = cfg; + m_dec_name = cfg.dec_name; fstream infile(cfg.uri); if (infile.is_open()){ @@ -315,7 +316,7 @@ void FFNvDecoder::post_decode_thread(){ m_queue_mutex.unlock(); // 跳帧 if (skip_frame == 1 || index % skip_frame == 0){ - post_decoded_cbk(m_postDecArg, gpuFrame); + post_decoded_cbk(m_postDecArg, convert2bgr(gpuFrame)); index = 0; } @@ -387,6 +388,44 @@ float FFNvDecoder::fps(){ return m_fps; } +void FFNvDecoder::setPostDecArg(const void* postDecArg){ + m_postDecArg = postDecArg; +} + +void FFNvDecoder::setFinishedDecArg(const void* finishedDecArg){ + m_finishedDecArg = finishedDecArg; +} + +DeviceRgbMemory* FFNvDecoder::convert2bgr(AVFrame * gpuFrame){ + if (gpuFrame != nullptr && gpuFrame->format == AV_PIX_FMT_CUDA ){ + LOG_DEBUG("decode task: gpuid: {} width: {} height: {}", m_cfg.gpuid, gpuFrame->width, gpuFrame->height); + GpuRgbMemory* gpuMem = new GpuRgbMemory(3, gpuFrame->width, gpuFrame->height, getName(), m_cfg.gpuid, false, true); + + do{ + if (gpuMem->getMem() == nullptr){ + LOG_ERROR("new GpuRgbMemory failed !!!"); + break; + } + + cudaSetDevice(atoi(m_cfg.gpuid.c_str())); + cuda_common::setColorSpace( ITU_709, 0 ); + cudaError_t cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], gpuMem->getMem(), gpuFrame->width, gpuFrame->height); + cudaDeviceSynchronize(); + if (cudaStatus != cudaSuccess) { + LOG_ERROR("CUDAToBGR failed failed !!!"); + break; + } + + return gpuMem; + }while(0); + + delete gpuMem; + gpuMem = nullptr; + } + + return nullptr; +} + FFImgInfo* FFNvDecoder::snapshot(){ // 锁住停止队列消耗 @@ -418,7 +457,7 @@ FFImgInfo* FFNvDecoder::snapshot(){ if (gpuFrame != nullptr && gpuFrame->format == AV_PIX_FMT_CUDA ){ LOG_DEBUG("decode task: gpuid: {} width: {} height: {}", m_cfg.gpuid, gpuFrame->width, gpuFrame->height); - GpuRgbMemory* gpuMem = new GpuRgbMemory(3, gpuFrame->width, gpuFrame->height, getName(), m_cfg.gpuid , true); + GpuRgbMemory* gpuMem = new GpuRgbMemory(3, gpuFrame->width, gpuFrame->height, getName(), m_cfg.gpuid, false, true); if (gpuMem->getMem() == nullptr){ LOG_ERROR("new GpuRgbMemory failed !!!"); diff --git a/src/nvdecoder/FFNvDecoder.h b/src/nvdecoder/FFNvDecoder.h index 4bc12e9..4784ab6 100644 --- a/src/nvdecoder/FFNvDecoder.h +++ b/src/nvdecoder/FFNvDecoder.h @@ -1,13 +1,27 @@ #include #include -#include "../AbstractDecoder.h" - #include +extern "C" +{ + #include + #include + #include + #include + #include + #include + #include + #include +} + +#include "common_header.h" + +#include "../interface/AbstractDecoder.h" + using namespace std; -class FFNvDecoder : public AbstractDecoder{ +class FFNvDecoder : public AbstractDecoder { public: FFNvDecoder(); ~FFNvDecoder(); @@ -34,6 +48,17 @@ public: FFImgInfo* snapshot(); + void setName(string nm){ + m_dec_name = nm; + } + + string getName(){ + return m_dec_name; + } + + void setPostDecArg(const void* postDecArg); + void setFinishedDecArg(const void* finishedDecArg); + public: AVPixelFormat getHwPixFmt(); @@ -43,7 +68,12 @@ private: bool init(const char* uri, const char* gpuid, bool force_tcp); void decode_finished(); + DeviceRgbMemory* convert2bgr(AVFrame * gpuFrame); + private: + string m_dec_name; + FFDecConfig m_cfg; + AVStream* stream; AVCodecContext *avctx; int stream_index; @@ -65,4 +95,13 @@ private: queue mFrameQueue; mutex m_queue_mutex; mutex m_snapshot_mutex; + long m_index{0}; + + bool m_dec_keyframe; + + const void * m_postDecArg; + POST_DECODE_CALLBACK post_decoded_cbk; // 解码数据回调接口 + + const void * m_finishedDecArg; + DECODE_FINISHED_CALLBACK decode_finished_cbk; }; \ No newline at end of file diff --git a/src/nvdecoder/GpuRgbMemory.hpp b/src/nvdecoder/GpuRgbMemory.hpp index 31be476..35eac65 100644 --- a/src/nvdecoder/GpuRgbMemory.hpp +++ b/src/nvdecoder/GpuRgbMemory.hpp @@ -1,17 +1,17 @@ #include -#include "../DeviceRgbMemory.hpp" +#include "../interface/DeviceRgbMemory.hpp" #include "cuda_kernels.h" #include "define.hpp" -#include "utiltools.hpp" +#include "common_header.h" using namespace std; class GpuRgbMemory : public DeviceRgbMemory{ public: - GpuRgbMemory(int _channel, int _width, int _height, string _id, string _gpuid, bool _isused) - :DeviceRgbMemory(_channel, _width, _height, _id, _gpuid, _isused){ + GpuRgbMemory(int _channel, int _width, int _height, string _id, string _gpuid, bool _key_frame, bool _isused) + :DeviceRgbMemory(_channel, _width, _height, _id, _gpuid, _key_frame, _isused){ gpuid = _gpuid; cudaSetDevice(atoi(gpuid.c_str())); CHECK_CUDA(cudaMalloc((void **)&pHwRgb, data_size * sizeof(unsigned char))); diff --git a/src/nvdecoder/Makefile b/src/nvdecoder/Makefile new file mode 100644 index 0000000..8b6ceff --- /dev/null +++ b/src/nvdecoder/Makefile @@ -0,0 +1,102 @@ +# 各项目录 +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))) + +CUDA_ROOT = /usr/local/cuda-11.1 +NVCC = $(CUDA_ROOT)/bin/nvcc + +# 自动生成头文件依赖选项 +DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d + +DEFS = -DENABLE_DVPP_INTERFACE + +# 最终目标文件 +TARGET:=$(LIB_DIR)/$(MODULE).a + + +PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder + +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 + + +INCLUDE= -I $(DEPEND_DIR)/include \ + -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 \ + -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) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl -Wwrite-strings +# CFLAGS= -g -fPIC -O0 $(INCLUDE) -pthread -lrt -lz -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl + # -DUNICODE -D_UNICODE + +NFLAGS_LIB=-g -c -shared -Xcompiler -fPIC -Xcompiler -fvisibility=hidden +NFLAGS = $(NFLAGS_LIB) $(INCLUDE) -std=c++11 + +# CU_SOURCES = $(wildcard ${SRC_DIR}/*.cu) +# CU_OBJS = $(patsubst %.cu, %.o, $(notdir $(CU_SOURCES))) + +CU_SOURCES:=$(notdir $(wildcard $(SRC_DIR)/*.cu)) +CU_OBJS:=$(addprefix $(OBJ_DIR)/, $(patsubst %.cu, %.o, $(CU_SOURCES))) + + +# 默认最终目标 +.PHONY:all +all:$(TARGET) + +# 生成最终目标 +$(TARGET):$(OBJS) $(CU_OBJS) | $(LIB_DIR) + @echo -e "\e[32m""Linking static library $(TARGET)""\e[0m" +# @ar -rc $@ $^ + +# 若没有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" + @$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(LIBSPATH) $(MACROS) -o $@ $< + +$(OBJ_DIR)%.o:$(SRC_DIR)/%.cu + @echo "#######################CU_OBJS:$@###############" + $(NVCC) $(NFLAGS) -o $@ $< + + +# 若没有obj目录则自动生成 +$(OBJ_DIR): + @mkdir -p $@ + +# 若没有.dep目录则自动生成 +$(DEP_DIR): + @mkdir -p $@ + +# 依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错 +$(DEPS): + +# 引入中间目标文件头文件依赖关系 +include $(wildcard $(DEPS)) + +# 直接删除组件build目录 +.PHONY:clean +clean: + @rm -rf $(BUILD_DIR)/$(MODULE) diff --git a/src/nvdecoder/NV12ToRGB.cu b/src/nvdecoder/NV12ToRGB.cu index 58e1dff..68e54ac 100644 --- a/src/nvdecoder/NV12ToRGB.cu +++ b/src/nvdecoder/NV12ToRGB.cu @@ -2,7 +2,7 @@ #include "cuda_kernels.h" #include -#include "common/inc/helper_cuda_drvapi.h" +#include "helper_cuda_drvapi.h" typedef unsigned char uint8; typedef unsigned int uint32; diff --git a/src/nvdecoder/NvDecoderApi.cpp b/src/nvdecoder/NvDecoderApi.cpp new file mode 100644 index 0000000..efb63cd --- /dev/null +++ b/src/nvdecoder/NvDecoderApi.cpp @@ -0,0 +1,133 @@ +#include "NvDecoderApi.h" +#include "FFNvDecoder.h" + +NvDecoderApi::NvDecoderApi(){ + m_pDecoder = nullptr; +} + +NvDecoderApi::~NvDecoderApi(){ + if(m_pDecoder != nullptr){ + delete m_pDecoder; + m_pDecoder = nullptr; + } +} + +bool NvDecoderApi::init(FFDecConfig& cfg){ + m_pDecoder = new FFNvDecoder(); + if(m_pDecoder != nullptr){ + return m_pDecoder->init(cfg); + } + return false; +} + +void NvDecoderApi::close(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->close(); + } +} + +bool NvDecoderApi::start(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->start(); + } + return false; +} + +void NvDecoderApi::pause(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->pause(); + } +} + +void NvDecoderApi::resume(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->resume(); + } +} + +void NvDecoderApi::setDecKeyframe(bool bKeyframe){ + if(m_pDecoder != nullptr){ + return m_pDecoder->setDecKeyframe(bKeyframe); + } +} + +bool NvDecoderApi::isRunning(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->isRunning(); + } + return false; +} + +bool NvDecoderApi::isFinished(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->isFinished(); + } + return false; +} + +bool NvDecoderApi::isPausing(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->isPausing(); + } + return false; +} + +bool NvDecoderApi::getResolution(int &width, int &height){ + if(m_pDecoder != nullptr){ + return m_pDecoder->getResolution(width, height); + } + return false; +} + +bool NvDecoderApi::isSurport(FFDecConfig& cfg){ + if(m_pDecoder != nullptr){ + return m_pDecoder->isSurport(cfg); + } + return false; +} + +float NvDecoderApi::fps(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->fps(); + } + return 0.0; +} + +int NvDecoderApi::getCachedQueueLength(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->getCachedQueueLength(); + } + return 0; +} + +void NvDecoderApi::setName(string nm){ + if(m_pDecoder != nullptr){ + return m_pDecoder->setName(nm); + } +} + +string NvDecoderApi::getName(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->getName(); + } + return nullptr; +} + +FFImgInfo* NvDecoderApi::snapshot(){ + if(m_pDecoder != nullptr){ + return m_pDecoder->snapshot(); + } + return nullptr; +} + +void NvDecoderApi::setPostDecArg(const void* postDecArg){ + if(m_pDecoder != nullptr){ + return m_pDecoder->setPostDecArg(postDecArg); + } +} + +void NvDecoderApi::setFinishedDecArg(const void* finishedDecArg){ + if(m_pDecoder != nullptr){ + return m_pDecoder->setFinishedDecArg(finishedDecArg); + } +} \ No newline at end of file diff --git a/src/nvdecoder/NvDecoderApi.h b/src/nvdecoder/NvDecoderApi.h new file mode 100644 index 0000000..f742dd8 --- /dev/null +++ b/src/nvdecoder/NvDecoderApi.h @@ -0,0 +1,44 @@ +#include +#include + +#include "common_header.h" +#include "../interface/AbstractDecoder.h" + +using namespace std; + +class FFNvDecoder; + +class NvDecoderApi : public AbstractDecoder{ +public: + NvDecoderApi(); + ~NvDecoderApi(); + bool init(FFDecConfig& cfg); + void close(); + bool start(); + void pause(); + void resume(); + + void setDecKeyframe(bool bKeyframe); + + bool isRunning(); + bool isFinished(); + bool isPausing(); + bool getResolution( int &width, int &height ); + + bool isSurport(FFDecConfig& cfg); + + int getCachedQueueLength(); + + float fps(); + + FFImgInfo* snapshot(); + + DECODER_TYPE getDecoderType(){ return DECODER_TYPE_DVPP; } + void setName(string nm); + string getName(); + + void setPostDecArg(const void* postDecArg); + void setFinishedDecArg(const void* finishedDecArg); +private: + FFNvDecoder* m_pDecoder; +}; \ No newline at end of file diff --git a/src/nvdecoder/common_header.h b/src/nvdecoder/common_header.h index d5feed8..cf45c91 100644 --- a/src/nvdecoder/common_header.h +++ b/src/nvdecoder/common_header.h @@ -4,5 +4,6 @@ #include "../interface/logger.hpp" #include "../interface/utiltools.hpp" +#include "../interface/interface_headers.h" #endif \ No newline at end of file -- libgit2 0.21.4