diff --git a/src/ai_engine_module/VPTProcess.cpp b/src/ai_engine_module/VPTProcess.cpp index 40d276e..c743c19 100755 --- a/src/ai_engine_module/VPTProcess.cpp +++ b/src/ai_engine_module/VPTProcess.cpp @@ -41,7 +41,6 @@ int VPTProcess::init(VPTProcess_PARAM vparam){ param.max_batch = 16; m_devId = param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int ret = vpt_init(&m_det_handle, param); @@ -81,7 +80,6 @@ int VPTProcess::process_gpu(sy_img * batch_img, vector& tasklist, vpt_result *real_res = vpt_det_result + startbatch; - // aclrtSetDevice(m_devId); int ret = aclrtSetCurrentContext(m_algorthim_ctx); if(ACL_SUCCESS != ret){ break; diff --git a/src/ai_engine_module/VPTProcess.cpp_debug b/src/ai_engine_module/VPTProcess.cpp_debug index b4ff5fa..81660da 100755 --- a/src/ai_engine_module/VPTProcess.cpp_debug +++ b/src/ai_engine_module/VPTProcess.cpp_debug @@ -38,7 +38,6 @@ int VPTProcess::init(VPTProcess_PARAM vparam){ param.isTrk = false; m_devId = param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_ERROR_NONE, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_ERROR_NONE, -1); int ret = vpt_init(&m_det_handle, param); @@ -81,7 +80,6 @@ int VPTProcess::process_gpu(sy_img * batch_img, vector vec_vptMem vpt_result *real_res = vpt_det_result + startbatch; - aclrtSetDevice(m_devId); int ret = aclrtSetCurrentContext(m_algorthim_ctx); if(ACL_ERROR_NONE != ret){ break; diff --git a/src/ai_engine_module/face_det_ai_engine.cpp b/src/ai_engine_module/face_det_ai_engine.cpp index 70542f1..2175f82 100755 --- a/src/ai_engine_module/face_det_ai_engine.cpp +++ b/src/ai_engine_module/face_det_ai_engine.cpp @@ -16,7 +16,6 @@ face_det_ai_engine::~face_det_ai_engine(){ clear(); if(m_algorthim_ctx){ - aclrtSetDevice(m_devId); aclrtDestroyContext(m_algorthim_ctx); } } @@ -27,7 +26,6 @@ int face_det_ai_engine::init_ai_engine(const facedet_ai_engine_param &ai_param/* m_devId = ai_param.sdk_param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_ERROR_NONE, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_ERROR_NONE, -1); return fd_init(&handle, ai_param.sdk_param); @@ -42,7 +40,6 @@ int face_det_ai_engine::ai_engine_process_batch(std::vector &task_i return 0; } - aclrtSetDevice(m_devId); int ret = aclrtSetCurrentContext(m_algorthim_ctx); if(ACL_ERROR_NONE != ret){ return 0; diff --git a/src/ai_engine_module/motocycle_hs_process.cpp b/src/ai_engine_module/motocycle_hs_process.cpp index c125367..377ae4d 100644 --- a/src/ai_engine_module/motocycle_hs_process.cpp +++ b/src/ai_engine_module/motocycle_hs_process.cpp @@ -99,7 +99,6 @@ namespace ai_engine_module param.max_batch = 8; m_devId = param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int status; diff --git a/src/ai_engine_module/motocycle_phone_process.cpp b/src/ai_engine_module/motocycle_phone_process.cpp index 5955511..4430f84 100644 --- a/src/ai_engine_module/motocycle_phone_process.cpp +++ b/src/ai_engine_module/motocycle_phone_process.cpp @@ -102,7 +102,6 @@ namespace ai_engine_module param.max_batch = 8; m_devId = param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int status; diff --git a/src/ai_engine_module/motocycle_refit_phone_process.cpp b/src/ai_engine_module/motocycle_refit_phone_process.cpp index 58c7b1b..0e6855a 100644 --- a/src/ai_engine_module/motocycle_refit_phone_process.cpp +++ b/src/ai_engine_module/motocycle_refit_phone_process.cpp @@ -117,7 +117,6 @@ namespace ai_engine_module hcp_param.max_batch = 8; m_devId = gpu_id; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int status; diff --git a/src/ai_engine_module/motocycle_refit_process.cpp b/src/ai_engine_module/motocycle_refit_process.cpp index d1fa7a2..cd3f8cf 100644 --- a/src/ai_engine_module/motocycle_refit_process.cpp +++ b/src/ai_engine_module/motocycle_refit_process.cpp @@ -103,7 +103,6 @@ namespace ai_engine_module param.max_batch = 8; m_devId = param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int status; diff --git a/src/ai_engine_module/road_seg_3cls_statistics.cpp b/src/ai_engine_module/road_seg_3cls_statistics.cpp index 68017f4..d16b598 100644 --- a/src/ai_engine_module/road_seg_3cls_statistics.cpp +++ b/src/ai_engine_module/road_seg_3cls_statistics.cpp @@ -213,7 +213,6 @@ int Road3clsSegProcess::init(int gpu_id, string models_dir) { param.devId = gpu_id; m_devId = param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int ret = rs3cls_init(&m_seg_handle, param); diff --git a/src/ai_engine_module/road_seg_correlation_algor.cpp b/src/ai_engine_module/road_seg_correlation_algor.cpp index f2ba2f9..040496b 100644 --- a/src/ai_engine_module/road_seg_correlation_algor.cpp +++ b/src/ai_engine_module/road_seg_correlation_algor.cpp @@ -545,7 +545,6 @@ namespace ai_engine_module param.devId = gpu_id;*/ m_devId = gpu_id; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); /*int status; diff --git a/src/ai_engine_module/road_seg_statistics.cpp b/src/ai_engine_module/road_seg_statistics.cpp index 2080e3b..24b6827 100644 --- a/src/ai_engine_module/road_seg_statistics.cpp +++ b/src/ai_engine_module/road_seg_statistics.cpp @@ -239,7 +239,6 @@ int RoadSegProcess::init(int gpu_id, string models_dir) { param.devId = gpu_id; m_devId = param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int ret = rs_init(&m_seg_handle, param); diff --git a/src/ai_engine_module/road_seg_statistics.cpp.old b/src/ai_engine_module/road_seg_statistics.cpp.old index 4ca01f3..4214821 100644 --- a/src/ai_engine_module/road_seg_statistics.cpp.old +++ b/src/ai_engine_module/road_seg_statistics.cpp.old @@ -241,7 +241,6 @@ int RoadSegProcess::init(int gpu_id, string models_dir) { param.devId = gpu_id; m_devId = param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int ret = rs_init(&m_seg_handle, param); diff --git a/src/ai_engine_module/traffic_light_process.cpp b/src/ai_engine_module/traffic_light_process.cpp index 303d50d..e4bb119 100644 --- a/src/ai_engine_module/traffic_light_process.cpp +++ b/src/ai_engine_module/traffic_light_process.cpp @@ -281,7 +281,6 @@ namespace ai_engine_module param.max_batch = 8; m_devId = param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int status; diff --git a/src/ai_engine_module/tricycle_manned_process.cpp b/src/ai_engine_module/tricycle_manned_process.cpp index a75f3cc..24578c6 100644 --- a/src/ai_engine_module/tricycle_manned_process.cpp +++ b/src/ai_engine_module/tricycle_manned_process.cpp @@ -47,7 +47,6 @@ namespace ai_engine_module param.max_batch = 8; m_devId = param.devId; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int status; diff --git a/src/ai_engine_module/truck_manned_process.cpp b/src/ai_engine_module/truck_manned_process.cpp index 2eb6bc7..8acc3ad 100644 --- a/src/ai_engine_module/truck_manned_process.cpp +++ b/src/ai_engine_module/truck_manned_process.cpp @@ -131,7 +131,6 @@ namespace ai_engine_module vparam.devId = gpu_id; m_devId = gpu_id; - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1); ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1); int status; diff --git a/src/ai_platform/Makefile b/src/ai_platform/Makefile deleted file mode 100755 index a456115..0000000 --- a/src/ai_platform/Makefile +++ /dev/null @@ -1,80 +0,0 @@ -# 各项目录 -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))) - -# 自动生成头文件依赖选项 -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 - -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 \ - -LIBSPATH= -L $(BUILD_DIR)/interface/lib -l:interface.a \ - -L $(BUILD_DIR)/dvpp/lib -l:dvpp.a - -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) | $(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" - @echo -e "$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) -o $@ $<" - $(CXX) -c $(DEPFLAGS) $(CXXFLAGS) -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/ai_platform/MultiSourceProcess.cpp b/src/ai_platform/MultiSourceProcess.cpp index ae7521c..d525905 100755 --- a/src/ai_platform/MultiSourceProcess.cpp +++ b/src/ai_platform/MultiSourceProcess.cpp @@ -28,7 +28,7 @@ #define WITH_FACE_DET_SS -#define AUTHORIZATION +// #define AUTHORIZATION #define productSN "51C4B28135604F649671727185949A91" //linux 通途抓拍引擎产品序列号 @@ -118,9 +118,6 @@ int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam){ vparam.max_batch = m_batch_size; vparam.threshold = 0.4; vparam.model_dir = models_dir; - - aclrtSetDevice(m_devId); - int ret = vpt_process.init(vparam); if (ret < 0){ return ret; @@ -136,7 +133,6 @@ int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam){ LOG_FATAL("Init road_3clsseg failed"); return -1; } - //三轮车头肩检测 if (!tricycle_manned_.init(vptParam.gpuid, models_dir)) { @@ -697,7 +693,6 @@ bool CMultiSourceProcess::finish_task(const string taskID, const bool delete_sna int CMultiSourceProcess::algorthim_process_thread(){ LOG_INFO("algorthim_process_thread start..."); - ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, 1); aclrtContext ctx; ACL_CALL(aclrtCreateContext(&ctx, m_devId), ACL_SUCCESS, 1); @@ -753,9 +748,6 @@ int CMultiSourceProcess::algorthim_process_thread(){ } } } - - - } m_RgbDataList.pop_front(); diff --git a/src/ai_platform/vpt_proj.cpp1 b/src/ai_platform/vpt_proj.cpp1 index 7cbd277..8ada72f 100755 --- a/src/ai_platform/vpt_proj.cpp1 +++ b/src/ai_platform/vpt_proj.cpp1 @@ -86,7 +86,6 @@ int main(){ param.isTrk = false; ACL_CALL(aclInit(nullptr), ACL_ERROR_NONE, 1); - ACL_CALL(aclrtSetDevice(param.devId), ACL_ERROR_NONE, 1); aclrtContext ctx; ACL_CALL(aclrtCreateContext(&ctx, param.devId), ACL_ERROR_NONE, 1); diff --git a/src/decoder/dvpp/DvppDecoder.cpp b/src/decoder/dvpp/DvppDecoder.cpp index 778ecb4..4117a97 100644 --- a/src/decoder/dvpp/DvppDecoder.cpp +++ b/src/decoder/dvpp/DvppDecoder.cpp @@ -332,18 +332,6 @@ int DvppDecoder::getVdecType(int videoType, int profile) post_decoded_cbk = cfg.post_decoded_cbk; do{ - aclError ret = aclrtSetDevice(m_dvpp_deviceId); - if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]-aclrtSetDevice failed !", m_dec_name); - break; - } - - ret = aclrtCreateContext(&m_context, m_dvpp_deviceId); - if (ret != ACL_ERROR_NONE) { - LOG_ERROR("[{}]-aclrtCreateContext failed !", m_dec_name); - break; - } - // DvppSourceManager 创建时包含 aclInit,析构时包含 aclFinalize DvppSourceManager* pSrcMgr = DvppSourceManager::getInstance(); m_dvpp_channel = pSrcMgr->getChannel(m_dvpp_deviceId); @@ -446,9 +434,9 @@ static int snap_count = 0; DeviceMemory* DvppDecoder::snapshot(){ - int ret = aclrtSetCurrentContext(m_context); + aclError ret = aclrtSetDevice(m_dvpp_deviceId); if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]- aclrtSetCurrentContext failed", m_dec_name); + LOG_ERROR("[{}]-aclrtSetDevice failed !", m_dec_name); return nullptr; } @@ -477,6 +465,12 @@ DeviceMemory* DvppDecoder::snapshot(){ break; } + ret = aclrtResetDevice(m_dvpp_deviceId); + if(ret != ACL_ERROR_NONE){ + LOG_ERROR("[{}]-aclrtResetDevice failed !", m_dec_name); + return nullptr; + } + return snapshot_mem; } @@ -521,17 +515,11 @@ void DvppDecoder::read_thread() { this ); - aclrtContext ctx = nullptr; + CHECK_AND_RETURN_NOVALUE(aclrtSetDevice(m_dvpp_deviceId), "aclrtSetDevice failed!"); + aclvdecChannelDesc *vdecChannelDesc = nullptr; do { - CHECK_AND_BREAK(aclrtSetDevice(m_dvpp_deviceId), "aclrtSetDevice failed"); - int ret = aclrtSetCurrentContext(m_context); - if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]- aclrtSetCurrentContext failed", m_dec_name); - break; - } - vdecChannelDesc = aclvdecCreateChannelDesc(); if (vdecChannelDesc == nullptr) { LOG_ERROR("[{}]- aclvdecCreateChannelDesc failed", m_dec_name); @@ -621,16 +609,18 @@ void DvppDecoder::read_thread() { if(nSended < 0) { // 执行出错,强行结束整个任务 m_bRunning=false; + av_packet_free(&pkt); + pkt = nullptr; break; } #ifdef USE_VILLAGE m_recoderManager.cache_pkt(pkt, frame_nb, m_dec_name); #endif - } else { - av_packet_free(&pkt); - pkt = nullptr; - } + } + + av_packet_free(&pkt); + pkt = nullptr; } if (vdecChannelDesc) { @@ -638,7 +628,7 @@ void DvppDecoder::read_thread() { } while(m_bRunning && m_decoded_data_queue.size() > 0) { - std::this_thread::sleep_for(std::chrono::milliseconds(5)); + std::this_thread::sleep_for(std::chrono::milliseconds(15)); } } while (0); @@ -649,6 +639,8 @@ void DvppDecoder::read_thread() { vdecChannelDesc = nullptr; } + CHECK_NOT_RETURN(aclrtResetDevice(m_dvpp_deviceId), "aclrtResetDevice failed"); + m_bRunning=false; m_bExitReportThd = true; @@ -758,15 +750,8 @@ int DvppDecoder::sendPkt(aclvdecChannelDesc *vdecChannelDesc, AVPacket* pkt, uns void DvppDecoder::doProcessReport(){ - aclError ret = aclrtSetDevice(m_dvpp_deviceId); - if(ret != ACL_ERROR_NONE){ - // cout << "aclrtSetDevice failed" << endl; - LOG_ERROR("aclrtSetDevice failed !"); - return ; - } - aclrtContext ctx; - ret = aclrtCreateContext(&ctx, m_dvpp_deviceId); + aclError ret = aclrtCreateContext(&ctx, m_dvpp_deviceId); if (ret != ACL_ERROR_NONE) { // cout << "aclrtCreateContext failed " << endl; LOG_ERROR("aclrtCreateContext failed !"); @@ -798,7 +783,7 @@ void DvppDecoder::doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *o m_out_count++; - CHECK_AND_RETURN_NOVALUE(aclrtSetCurrentContext(m_context), "aclrtSetCurrentContext failed"); + CHECK_AND_RETURN_NOVALUE(aclrtSetDevice(m_dvpp_deviceId), "aclrtSetDevice failed"); void *inputDataDev = acldvppGetStreamDescData(input); acldvppFree(inputDataDev); @@ -814,7 +799,7 @@ void DvppDecoder::doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *o do{ int ret = acldvppGetPicDescRetCode(output); if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]- decode result error, retCode:{} ", m_dec_name, ret); + LOG_WARN("[{}]- decode result error, retCode:{} ", m_dec_name, ret); acldvppFree(outputDataDev); outputDataDev = nullptr; break; @@ -870,8 +855,10 @@ void DvppDecoder::doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *o } }while(0); - CHECK_AND_RETURN_NOVALUE(acldvppDestroyStreamDesc(input), "acldvppDestroyStreamDesc failed"); - CHECK_AND_RETURN_NOVALUE(acldvppDestroyPicDesc(output), "acldvppDestroyPicDesc failed"); + CHECK_NOT_RETURN(acldvppDestroyStreamDesc(input), "acldvppDestroyStreamDesc failed"); + CHECK_NOT_RETURN(acldvppDestroyPicDesc(output), "acldvppDestroyPicDesc failed"); + + CHECK_NOT_RETURN(aclrtResetDevice(m_dvpp_deviceId), "aclrtResetDevice failed"); } bool DvppDecoder::sendVdecEos(aclvdecChannelDesc *vdecChannelDesc) { @@ -943,14 +930,6 @@ void DvppDecoder::display_thread() { } void DvppDecoder::release_dvpp(){ - if(m_context){ - aclError ret = aclrtDestroyContext(m_context); - if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]- aclrtDestroyContext failed !", m_dec_name); - } - m_context = nullptr; - } - if(m_dvpp_channel >= 0){ DvppSourceManager* pSrcMgr = DvppSourceManager::getInstance(); pSrcMgr->releaseChannel(m_dvpp_deviceId, m_dvpp_channel); diff --git a/src/decoder/dvpp/DvppDecoder.h b/src/decoder/dvpp/DvppDecoder.h index 35ce529..1c0b9dc 100644 --- a/src/decoder/dvpp/DvppDecoder.h +++ b/src/decoder/dvpp/DvppDecoder.h @@ -117,7 +117,6 @@ private: // 解码 int m_dvpp_deviceId {-1}; int m_dvpp_channel {-1}; - aclrtContext m_context{nullptr}; acldvppStreamFormat m_enType; const void * m_postDecArg {nullptr}; diff --git a/src/decoder/dvpp/DvppRtpDecoder.cpp b/src/decoder/dvpp/DvppRtpDecoder.cpp index 237d03d..9eec0fb 100644 --- a/src/decoder/dvpp/DvppRtpDecoder.cpp +++ b/src/decoder/dvpp/DvppRtpDecoder.cpp @@ -185,18 +185,6 @@ int DvppRtpDecoder::getVdecType(int videoType, int profile) post_decoded_cbk = cfg.post_decoded_cbk; do{ - aclError ret = aclrtSetDevice(m_dvpp_deviceId); - if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]-aclrtSetDevice failed !", m_dec_name); - break; - } - - ret = aclrtCreateContext(&m_context, m_dvpp_deviceId); - if (ret != ACL_ERROR_NONE) { - LOG_ERROR("[{}]-aclrtCreateContext failed !", m_dec_name); - break; - } - // DvppSourceManager 创建时包含 aclInit,析构时包含 aclFinalize DvppSourceManager* pSrcMgr = DvppSourceManager::getInstance(); m_dvpp_channel = pSrcMgr->getChannel(m_dvpp_deviceId); @@ -311,9 +299,9 @@ static int snap_count = 0; DeviceMemory* DvppRtpDecoder::snapshot(){ - int ret = aclrtSetCurrentContext(m_context); + aclError ret = aclrtSetDevice(m_dvpp_deviceId); if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]- aclrtSetCurrentContext failed", m_dec_name); + LOG_ERROR("[{}]-aclrtSetDevice failed !", m_dec_name); return nullptr; } @@ -342,6 +330,12 @@ DeviceMemory* DvppRtpDecoder::snapshot(){ break; } + ret = aclrtResetDevice(m_dvpp_deviceId); + if(ret != ACL_ERROR_NONE){ + LOG_ERROR("[{}]-aclrtResetDevice failed !", m_dec_name); + return nullptr; + } + return snapshot_mem; } @@ -535,17 +529,11 @@ void DvppRtpDecoder::read_thread() { return; } - aclrtContext ctx = nullptr; + CHECK_AND_RETURN_NOVALUE(aclrtSetDevice(m_dvpp_deviceId), "aclrtSetDevice failed!"); + aclvdecChannelDesc *vdecChannelDesc = nullptr; do { - CHECK_AND_BREAK(aclrtSetDevice(m_dvpp_deviceId), "aclrtSetDevice failed"); - int ret = aclrtSetCurrentContext(m_context); - if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]- aclrtSetCurrentContext failed", m_dec_name); - break; - } - vdecChannelDesc = aclvdecCreateChannelDesc(); if (vdecChannelDesc == nullptr) { LOG_ERROR("[{}]- aclvdecCreateChannelDesc failed", m_dec_name); @@ -624,14 +612,11 @@ void DvppRtpDecoder::read_thread() { #ifdef USE_VILLAGE m_recoderManager.cache_pkt(pkt, frame_nb, m_dec_name); - #else - av_packet_free(&pkt); - pkt = nullptr; #endif - } else { - av_packet_free(&pkt); - pkt = nullptr; } + + av_packet_free(&pkt); + pkt = nullptr; } if (vdecChannelDesc) { @@ -751,15 +736,8 @@ int DvppRtpDecoder::sendPkt(aclvdecChannelDesc *vdecChannelDesc, AVPacket* pkt, void DvppRtpDecoder::doProcessReport(){ - aclError ret = aclrtSetDevice(m_dvpp_deviceId); - if(ret != ACL_ERROR_NONE){ - // cout << "aclrtSetDevice failed" << endl; - LOG_ERROR("aclrtSetDevice failed !"); - return ; - } - aclrtContext ctx; - ret = aclrtCreateContext(&ctx, m_dvpp_deviceId); + aclError ret = aclrtCreateContext(&ctx, m_dvpp_deviceId); if (ret != ACL_ERROR_NONE) { // cout << "aclrtCreateContext failed " << endl; LOG_ERROR("aclrtCreateContext failed !"); @@ -851,8 +829,10 @@ void DvppRtpDecoder::doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc } }while(0); - CHECK_AND_RETURN_NOVALUE(acldvppDestroyStreamDesc(input), "acldvppDestroyStreamDesc failed"); - CHECK_AND_RETURN_NOVALUE(acldvppDestroyPicDesc(output), "acldvppDestroyPicDesc failed"); + CHECK_NOT_RETURN(acldvppDestroyStreamDesc(input), "acldvppDestroyStreamDesc failed"); + CHECK_NOT_RETURN(acldvppDestroyPicDesc(output), "acldvppDestroyPicDesc failed"); + + CHECK_NOT_RETURN(aclrtResetDevice(m_dvpp_deviceId), "aclrtResetDevice failed"); } bool DvppRtpDecoder::sendVdecEos(aclvdecChannelDesc *vdecChannelDesc) { @@ -894,13 +874,6 @@ DvppDataMemory* DvppRtpDecoder::GetFrame() { } void DvppRtpDecoder::release_dvpp(){ - if(m_context){ - aclError ret = aclrtDestroyContext(m_context); - if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]- aclrtDestroyContext failed !", m_dec_name); - } - m_context = nullptr; - } if(m_dvpp_channel >= 0){ DvppSourceManager* pSrcMgr = DvppSourceManager::getInstance(); diff --git a/src/decoder/dvpp/DvppSourceManager.cpp b/src/decoder/dvpp/DvppSourceManager.cpp index c928e42..cd3ebcc 100644 --- a/src/decoder/dvpp/DvppSourceManager.cpp +++ b/src/decoder/dvpp/DvppSourceManager.cpp @@ -20,30 +20,6 @@ DvppSourceManager::~DvppSourceManager() // aclFinalize(); } -aclrtContext DvppSourceManager::getContext(int devId) -{ - aclrtContext ctx = ctxMap[devId]; - if (ctx == nullptr) - { - // 初始化硬件解码器 - aclError ret = aclrtSetDevice(devId); - if(ret != ACL_ERROR_NONE){ - // cout << "aclrtSetDevice failed" << endl; - LOG_ERROR("aclrtSetDevice failed !"); - return nullptr; - } - - ret = aclrtCreateContext(&ctx, devId); - if (ret != ACL_ERROR_NONE) { - // cout << "aclrtCreateContext failed " << endl; - LOG_ERROR("aclrtCreateContext failed !"); - return nullptr; - } - ctxMap[devId] = ctx; - } - return ctx; -} - int DvppSourceManager::getChannel(int devId){ // channel 最大值暂定为32, 华为没有接口获取最大channel,只有文档说明 for(int iChannel = 0; iChannel < 32; iChannel++){ diff --git a/src/decoder/dvpp/DvppSourceManager.h b/src/decoder/dvpp/DvppSourceManager.h index 6320a46..e77ed90 100644 --- a/src/decoder/dvpp/DvppSourceManager.h +++ b/src/decoder/dvpp/DvppSourceManager.h @@ -16,8 +16,6 @@ public: return singleton; } - aclrtContext getContext(int devId); - int getChannel(int devId); void releaseChannel(int devId, int channel); diff --git a/src/decoder/dvpp/DvppStreamDecoder.cpp b/src/decoder/dvpp/DvppStreamDecoder.cpp index e88ba7e..921ab20 100644 --- a/src/decoder/dvpp/DvppStreamDecoder.cpp +++ b/src/decoder/dvpp/DvppStreamDecoder.cpp @@ -67,17 +67,6 @@ bool DvppStreamDecoder::Init(FFDecConfig cfg) { m_deviceId = atoi(cfg.gpuid.c_str()); do{ - aclError ret = aclrtSetDevice(m_deviceId); - if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]-aclrtSetDevice failed !", m_dec_name); - return false; - } - - ret = aclrtCreateContext(&m_context, m_deviceId); - if (ret != ACL_ERROR_NONE) { - LOG_ERROR("[{}]-aclrtCreateContext failed !", m_dec_name); - return false; - } // DvppSourceManager 创建时包含 aclInit,析构时包含 aclFinalize DvppSourceManager* pSrcMgr = DvppSourceManager::getInstance(); @@ -104,14 +93,6 @@ bool DvppStreamDecoder::Init(FFDecConfig cfg) { void DvppStreamDecoder::release_dvpp(){ - if(m_context){ - aclError ret = aclrtDestroyContext(m_context); - if(ret != ACL_ERROR_NONE){ - LOG_ERROR("[{}]- aclrtDestroyContext failed !", m_dec_name); - } - m_context = nullptr; - } - if(m_dvpp_channel >= 0){ DvppSourceManager* pSrcMgr = DvppSourceManager::getInstance(); pSrcMgr->releaseChannel(m_deviceId, m_dvpp_channel); @@ -138,13 +119,6 @@ int DvppStreamDecoder::getVdecType(int videoType) void DvppStreamDecoder::doProcessReport(){ - aclError ret = aclrtSetDevice(m_deviceId); - if(ret != ACL_ERROR_NONE){ - // cout << "aclrtSetDevice failed" << endl; - LOG_ERROR("aclrtSetDevice failed !"); - return ; - } - aclrtContext ctx; ret = aclrtCreateContext(&ctx, m_deviceId); if (ret != ACL_ERROR_NONE) { @@ -178,7 +152,7 @@ void DvppStreamDecoder::doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicD m_out_count++; - CHECK_AND_RETURN_NOVALUE(aclrtSetCurrentContext(m_context), "aclrtSetCurrentContext failed"); + CHECK_AND_RETURN_NOVALUE(aclrtSetDevice(m_dvpp_deviceId), "aclrtSetDevice failed"); void *inputDataDev = acldvppGetStreamDescData(input); acldvppFree(inputDataDev); @@ -261,8 +235,10 @@ void DvppStreamDecoder::doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicD } }while(0); - CHECK_AND_RETURN_NOVALUE(acldvppDestroyStreamDesc(input), "acldvppDestroyStreamDesc failed"); - CHECK_AND_RETURN_NOVALUE(acldvppDestroyPicDesc(output), "acldvppDestroyPicDesc failed"); + CHECK_NOT_RETURN(acldvppDestroyStreamDesc(input), "acldvppDestroyStreamDesc failed"); + CHECK_NOT_RETURN(acldvppDestroyPicDesc(output), "acldvppDestroyPicDesc failed"); + + CHECK_NOT_RETURN(aclrtResetDevice(m_dvpp_deviceId), "aclrtResetDevice failed"); } DvppDataMemory* DvppStreamDecoder::GetFrame() { diff --git a/src/decoder/dvpp/FFRecoder.cpp b/src/decoder/dvpp/FFRecoder.cpp index a8c1370..e426009 100644 --- a/src/decoder/dvpp/FFRecoder.cpp +++ b/src/decoder/dvpp/FFRecoder.cpp @@ -1,9 +1,18 @@ +// FFRecoder.cpp #include "FFRecoder.h" - #include #include #include +extern "C" { +#include +#include +#include +#include +#include +#include +} + FFRecoder::FFRecoder() :width_{}, @@ -14,20 +23,17 @@ FFRecoder::FFRecoder() codec_ctx_{ nullptr }, fmt_ctx_{ nullptr }, out_stream_{ nullptr }, - yuv_frame_{ nullptr }, - img_convert_ctx{nullptr} + yuv_frame_{ nullptr } { - bFirstFrame = true; - last_src_pts = 0; - last_pts = 0; } FFRecoder::~FFRecoder() { + uninit(); } -bool FFRecoder::init(int w, int h, AVRational time_base, AVCodecContext* avctx, const char* outfile_name) +bool FFRecoder::init(int w, int h, int fps, int bit_rate, const char* outfile_name) { uninit(); @@ -36,30 +42,32 @@ bool FFRecoder::init(int w, int h, AVRational time_base, AVCodecContext* avctx, y_size_ = w * h; uv_size_ = y_size_ / 4; + m_fps = fps; + // [1] 创建解码器 - const AVCodec* encoder = avcodec_find_encoder(AV_CODEC_ID_HEVC); + const AVCodec* encoder = avcodec_find_encoder(AV_CODEC_ID_H264); if (!encoder) { - LOG_ERROR("Find encoder AV_CODEC_ID_H264 failed!"); + fprintf(stderr, "Find encoder AV_CODEC_ID_H264 failed!\n"); return false; } // 获取解码器上下文 codec_ctx_ = avcodec_alloc_context3(encoder); if (!codec_ctx_) { - LOG_ERROR("Alloc context for encoder contx failed!"); + fprintf(stderr, "Alloc context for encoder contx failed!\n"); return false; } // 设置解码器上下文参数 - codec_ctx_->bit_rate = avctx->bit_rate; + codec_ctx_->bit_rate = bit_rate; codec_ctx_->width = width_; codec_ctx_->height = height_; - codec_ctx_->time_base = time_base; - codec_ctx_->gop_size = avctx->gop_size; - codec_ctx_->max_b_frames = avctx->max_b_frames; + codec_ctx_->time_base = AVRational{ 1, fps }; + codec_ctx_->gop_size = 50; + codec_ctx_->max_b_frames = 0; codec_ctx_->pix_fmt = AV_PIX_FMT_YUV420P; codec_ctx_->thread_count = 4; - codec_ctx_->qmin = avctx->qmin; - codec_ctx_->qmax = avctx->qmax; - codec_ctx_->qcompress = avctx->qcompress; + codec_ctx_->qmin = 10; + codec_ctx_->qmax = 51; + codec_ctx_->qcompress = 0.6f; codec_ctx_->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; av_opt_set(codec_ctx_->priv_data, "preset", "ultrafast", 0); @@ -68,7 +76,7 @@ bool FFRecoder::init(int w, int h, AVRational time_base, AVCodecContext* avctx, // 打开解码器 int ret = avcodec_open2(codec_ctx_, encoder, nullptr); if (ret < 0) { - LOG_ERROR("Open encoder failed!"); + fprintf(stderr, "Open encoder failed!\n"); return false; } @@ -80,7 +88,6 @@ bool FFRecoder::init(int w, int h, AVRational time_base, AVCodecContext* avctx, out_stream_->id = 0; out_stream_->codecpar->codec_tag = 0; avcodec_parameters_from_context(out_stream_->codecpar, codec_ctx_); - out_stream_->time_base = { 1,30 }; av_dump_format(fmt_ctx_, out_stream_->id, outfile_name, 1); @@ -93,119 +100,25 @@ bool FFRecoder::init(int w, int h, AVRational time_base, AVCodecContext* avctx, if (av_frame_get_buffer(yuv_frame_, 0) < 0) { av_frame_free(&yuv_frame_); yuv_frame_ = nullptr; - LOG_ERROR("Frame get buffer failed!"); + fprintf(stderr, "Frame get buffer failed!\n"); return false; } // [5] 打开输出视频文件并写入视频头信息 if (avio_open(&fmt_ctx_->pb, outfile_name, AVIO_FLAG_WRITE) < 0) { - LOG_ERROR("avio_open failed!"); + fprintf(stderr, "avio_open failed!\n"); return false; } if (avformat_write_header(fmt_ctx_, nullptr) < 0) { - LOG_ERROR("Write header failed!"); + fprintf(stderr, "Write header failed!\n"); return false; } - // 计算解码后原始数据所需缓冲区大小,并分配内存空间 Determine required buffer size and allocate buffer - int numBytes = av_image_get_buffer_size(AV_PIX_FMT_YUV420P, w, h, 1); - out_buffer = (uint8_t *)av_malloc(numBytes * sizeof(uint8_t)); - - //pFrameOut = av_frame_alloc(); - //av_image_fill_arrays(pFrameOut->data, pFrameOut->linesize, buffer, AV_PIX_FMT_YUV420P, w, h, 1); - - img_convert_ctx = sws_getContext(avctx->width, avctx->height, avctx->pix_fmt, w, h, AV_PIX_FMT_YUV420P, - SWS_BICUBIC, nullptr, nullptr, nullptr); - return true; } -bool FFRecoder::init(AVStream* stream, AVCodecContext* avctx, const char* outfile_name) { - - const AVCodec* encoder = avcodec_find_encoder(avctx->codec_id); - if (!encoder) { - LOG_ERROR("Find encoder AV_CODEC_ID_H264 failed!"); - return false; - } - // 获取解码器上下文 - codec_ctx_ = avcodec_alloc_context3(encoder); - if (!codec_ctx_) { - LOG_ERROR("Alloc context for encoder contx failed!"); - return false; - } - - m_inStream = stream; - - int ret = avcodec_parameters_to_context(codec_ctx_, m_inStream->codecpar); - if (ret < 0) { - printf("Failed to copy in_stream codecpar to codec context\n"); - return false; - } - - // avcodec_copy_context(codec_ctx_, avctx); - codec_ctx_->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; - - // [2] 创建输出上下文 - avformat_alloc_output_context2(&fmt_ctx_, nullptr, nullptr, outfile_name); - - // [3] 添加输出视频流 - out_stream_ = avformat_new_stream(fmt_ctx_, nullptr); - - out_stream_->id = 0; - out_stream_->codecpar->codec_tag = 0; - avcodec_parameters_from_context(out_stream_->codecpar, codec_ctx_); - // out_stream_->time_base = { 1,25 }; - out_stream_->time_base = stream->time_base; - out_stream_->r_frame_rate = stream->r_frame_rate; - out_stream_->avg_frame_rate = stream->r_frame_rate; - - codec_ctx_->time_base = out_stream_->time_base; - - av_opt_set(out_stream_->priv_data, "preset", "ultrafast", 0); - av_opt_set(out_stream_->priv_data, "tune", "zerolatency", 0); - - // av_dump_format(fmt_ctx_, out_stream_->id, outfile_name, 1); - - // [5] 打开输出视频文件并写入视频头信息 - if (avio_open(&fmt_ctx_->pb, outfile_name, AVIO_FLAG_WRITE) < 0) { - LOG_ERROR("avio_open failed!"); - return false; - } - if (avformat_write_header(fmt_ctx_, nullptr) < 0) { - LOG_ERROR("Write header failed!"); - return false; - } - - return true; -} - -void FFRecoder::release() { - av_write_trailer(fmt_ctx_); - - avcodec_parameters_free(&fmt_ctx_->streams[0]->codecpar); - av_freep(&fmt_ctx_->streams[0]); - - avio_close(fmt_ctx_->pb); - av_free(fmt_ctx_); - fmt_ctx_ = nullptr; -} - void FFRecoder::uninit() { - //if (out_buffer) { - // av_free(out_buffer); - //} - - if (yuv_frame_) { - av_frame_free(&yuv_frame_); - yuv_frame_ = nullptr; - } - - if (img_convert_ctx) { - sws_freeContext(img_convert_ctx); - img_convert_ctx = nullptr; - } - if (fmt_ctx_) { av_write_trailer(fmt_ctx_); avio_close(fmt_ctx_->pb); @@ -219,6 +132,11 @@ void FFRecoder::uninit() codec_ctx_ = nullptr; } + if (yuv_frame_) { + av_frame_free(&yuv_frame_); + yuv_frame_ = nullptr; + } + width_ = 0; height_ = 0; y_size_ = 0; @@ -256,84 +174,13 @@ bool FFRecoder::write_yuv(const uint8_t* yuv_data) return write_frame(yuv_frame_); } -void FFRecoder::update_pts(AVPacket* pkt) { - if (pkt->pts > 0) { - if (bFirstFrame) { - bFirstFrame = false; - last_src_pts = pkt->pts; - } - int64_t pkt_pts = pkt->pts; - pkt->pts = last_pts + (pkt_pts - last_src_pts); - last_src_pts = pkt_pts; - last_pts = pkt->pts; - pkt->dts = pkt->pts; - } - else { - if (bFirstFrame) { - bFirstFrame = false; - last_pts = 0; - } - pkt->pts = last_pts + 512; - last_pts = pkt->pts; - } - -} - -bool FFRecoder::write_pkt(AVPacket *pkt) { - char errbuf[64]{ 0 }; - - // av_packet_rescale_ts(pkt, codec_ctx_->time_base, out_stream_->time_base); - // update_pts(pkt); - // pkt->stream_index = out_stream_->index; - - if(pkt->pts==AV_NOPTS_VALUE) { - // printf("frame_index:%d", frame_index); - //Write PTS - AVRational time_base1 = codec_ctx_->time_base; - //Duration between 2 frames (us) - int64_t calc_duration = (double)AV_TIME_BASE / av_q2d(m_inStream->r_frame_rate); - //Parameters - pkt->pts = (double)(frame_index*calc_duration) / (double)(av_q2d(time_base1)*AV_TIME_BASE); - pkt->dts = pkt->pts; - pkt->duration = (double)calc_duration / (double)(av_q2d(time_base1)*AV_TIME_BASE); - frame_index++; - } - // Convert PTS/DTS - pkt->pts = av_rescale_q_rnd(pkt->pts, codec_ctx_->time_base, out_stream_->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); - pkt->dts = av_rescale_q_rnd(pkt->dts, codec_ctx_->time_base, out_stream_->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); - pkt->duration = av_rescale_q(pkt->duration, codec_ctx_->time_base, out_stream_->time_base); - - pkt->pos = -1; - pkt->stream_index = out_stream_->index; - fmt_ctx_->duration += pkt->duration; - - // 将数据写入到输出流 - int ret = av_write_frame(fmt_ctx_, pkt); - if (ret < 0) { - LOG_ERROR("Error while writing output packet: {}", av_make_error_string(errbuf, sizeof(errbuf), ret)); - return false; - } - return true; -} - -bool FFRecoder::write_frame(AVFrame* frame) +bool FFRecoder::write_frame(const AVFrame* frame) { - AVFrame *pFrameOut = nullptr; - if (frame != nullptr && frame->format != AV_PIX_FMT_YUV420P) { - pFrameOut = av_frame_clone(frame); - pFrameOut->format = AV_PIX_FMT_YUV420P; - av_image_fill_arrays(pFrameOut->data, pFrameOut->linesize, out_buffer, AV_PIX_FMT_YUV420P, frame->width, frame->height, 1); - sws_scale(img_convert_ctx, (const unsigned char* const*)frame->data, frame->linesize, 0, frame->height, pFrameOut->data, pFrameOut->linesize); - } - else { - pFrameOut = frame; - } char errbuf[64]{ 0 }; // 将帧数据发送到编码器 - int ret = avcodec_send_frame(codec_ctx_, pFrameOut); - av_frame_free(&pFrameOut); + int ret = avcodec_send_frame(codec_ctx_, frame); if (ret < 0) { - LOG_ERROR("Error sending a frame to the encoder: {}", av_make_error_string(errbuf, sizeof(errbuf), ret)); + fprintf(stderr, "Error sending a frame to the encoder: %s\n", av_make_error_string(errbuf, sizeof(errbuf), ret)); return false; } @@ -344,36 +191,85 @@ bool FFRecoder::write_frame(AVFrame* frame) if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) return true; else if (ret < 0) { - LOG_ERROR("Error encoding a frame: {}", av_make_error_string(errbuf, sizeof(errbuf), ret)); + fprintf(stderr, "Error encoding a frame: %s\n", av_make_error_string(errbuf, sizeof(errbuf), ret)); return false; } // 将pts缩放到输出流的time_base上 av_packet_rescale_ts(&pkt, codec_ctx_->time_base, out_stream_->time_base); pkt.stream_index = out_stream_->index; - update_pts(&pkt); // 将数据写入到输出流 ret = av_interleaved_write_frame(fmt_ctx_, &pkt); - //ret = av_write_frame(fmt_ctx_, &pkt); av_packet_unref(&pkt); if (ret < 0) { - LOG_ERROR("Error while writing output packet: {}", av_make_error_string(errbuf, sizeof(errbuf), ret)); + fprintf(stderr, "Error while writing output packet: %s\n", av_make_error_string(errbuf, sizeof(errbuf), ret)); return false; } - /* av_interleaved_write_frame(fmt_ctx_, nullptr); - avio_flush(fmt_ctx_->pb);*/ } return true; } -bool FFRecoder::flush() -{ - return write_frame(nullptr); +static double a2d(AVRational a) { + return a.den / a.num; +} + +void FFRecoder::calc_pkt_ts(AVPacket* pkt, int frame_index) { + //Duration between 2 frames (us) + int64_t calc_duration=(double)AV_TIME_BASE/m_fps; + //Parameters + pkt->pts=(double)(frame_index*calc_duration)/(double)(av_q2d(codec_ctx_->time_base)*AV_TIME_BASE); + pkt->dts=pkt->pts; + pkt->duration=(double)calc_duration/(double)(av_q2d(codec_ctx_->time_base)*AV_TIME_BASE); } -bool FFRecoder::flush_pkt() +bool FFRecoder::write_pkt(AVPacket* new_pkt) { + frame_nb++; + calc_pkt_ts(new_pkt, frame_nb); + new_pkt->pts = av_rescale_q_rnd(new_pkt->pts, codec_ctx_->time_base, out_stream_->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + new_pkt->dts = av_rescale_q_rnd(new_pkt->dts, codec_ctx_->time_base, out_stream_->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + new_pkt->duration = av_rescale_q(new_pkt->duration, codec_ctx_->time_base, out_stream_->time_base); + new_pkt->stream_index = out_stream_->index; + // 将数据写入到输出流 + int ret = av_interleaved_write_frame(fmt_ctx_, new_pkt); + + char errbuf[64]{ 0 }; + if (ret < 0) { + fprintf(stderr, "Error while writing output packet: %s\n", av_make_error_string(errbuf, sizeof(errbuf), ret)); + return false; + } + + return true; +} + +bool FFRecoder::write_pkt_data(const uint8_t* pkt_data, int pkt_size) { + AVPacket* new_pkt = av_packet_alloc(); + av_new_packet(new_pkt, pkt_size); + memcpy(new_pkt->data, pkt_data, pkt_size); + + frame_nb++; + calc_pkt_ts(new_pkt, frame_nb); + new_pkt->pts = av_rescale_q_rnd(new_pkt->pts, codec_ctx_->time_base, out_stream_->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + new_pkt->dts = av_rescale_q_rnd(new_pkt->dts, codec_ctx_->time_base, out_stream_->time_base, (enum AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)); + new_pkt->duration = av_rescale_q(new_pkt->duration, codec_ctx_->time_base, out_stream_->time_base); + new_pkt->stream_index = out_stream_->index; + // 将数据写入到输出流 + int ret = av_interleaved_write_frame(fmt_ctx_, new_pkt); + + av_packet_free(&new_pkt); + new_pkt = nullptr; + + char errbuf[64]{ 0 }; + if (ret < 0) { + fprintf(stderr, "Error while writing output packet: %s\n", av_make_error_string(errbuf, sizeof(errbuf), ret)); + return false; + } + + return true; +} + +bool FFRecoder::flush() { - return av_write_frame(fmt_ctx_, nullptr); + return write_frame(nullptr); } bool FFRecoder::bgr_to_yuv420p(const uint8_t* const buf_bgr, uint8_t* const buf_420p) @@ -381,25 +277,30 @@ bool FFRecoder::bgr_to_yuv420p(const uint8_t* const buf_bgr, uint8_t* const buf_ // 分配转换上下文 thread_local std::tuple params{ 0, 0, 0 }; thread_local std::unique_ptr sws_context{ nullptr, &sws_freeContext }; - - std::tuple new_params{ width_, height_, av_image_get_linesize(AV_PIX_FMT_YUV420P, width_, 0) }; + + std::tuple new_params{ width_, height_, av_image_get_linesize(AV_PIX_FMT_YUV420P, width_, 0) }; if (!sws_context || params != new_params) { sws_context.reset(sws_getContext(width_, height_, AV_PIX_FMT_BGR24, width_, height_, AV_PIX_FMT_YUV420P, SWS_FAST_BILINEAR, nullptr, nullptr, nullptr)); params = new_params; } + // 转换格式 const int stride = std::get<2>(params);//Y平面一行的数据长度 - //const int ret = sws_scale(sws_context.get(), - // std::array{ buf_bgr }.data(),/* bgr数据只有一个平面 */ - // std::array{ width_ * 3 }.data(),/* BGR所以图像宽度*3 */ - // 0, height_, - // std::array{ buf_420p, buf_420p + y_size_, buf_420p + y_size_ + uv_size_ }.data(),/* YUV三个平面的起始地址 */ - // std::array{ stride, stride / 2, stride / 2 }.data());/* YUV每个平面中一行的宽度 */ - const int rgba_linesize = width_ * 3; - int yuv_linesize[3] = { stride, stride / 2, stride / 2 }; - int ret = sws_scale(sws_context.get(), (const uint8_t* const*)buf_bgr, &rgba_linesize, 0, height_, (uint8_t* const*)buf_420p, yuv_linesize); - - return 0; + const int ret = sws_scale(sws_context.get(), + &buf_bgr,/* bgr数据只有一个平面 */ + std::array {width_ * 3}.data(),/* BGR所以图像宽度*3 */ + 0, height_, + std::array{ buf_420p, buf_420p + y_size_, buf_420p + y_size_ + uv_size_ }.data(),/* YUV三个平面的起始地址 */ + std::array{ stride, stride / 2, stride / 2 }.data() + );/* YUV每个平面中一行的宽度 */ + + return ret >= 0; +} + +bool FFRecoder::close() +{ + flush(); + uninit(); } \ No newline at end of file diff --git a/src/decoder/dvpp/FFRecoder.h b/src/decoder/dvpp/FFRecoder.h index dfee0e4..c960aff 100644 --- a/src/decoder/dvpp/FFRecoder.h +++ b/src/decoder/dvpp/FFRecoder.h @@ -1,30 +1,31 @@ #pragma once #include -#include "depend_headers.h" +class AVFrame; +class AVStream; +class AVCodecContext; +class AVFormatContext; +class AVPacket; class FFRecoder { public: FFRecoder(); - virtual ~FFRecoder(); + ~FFRecoder(); - bool init(int w, int h, AVRational time_base, AVCodecContext* avctx, const char* outfile_name); + bool init(int w, int h, int fps, int bit_rate, const char* outfile_name); void uninit(); bool write_image(const uint8_t* bgr); bool write_yuv(const uint8_t* yuv_data); - bool write_frame(AVFrame* frame); + bool write_frame(const AVFrame* frame); + bool write_pkt(AVPacket* pkt); + bool write_pkt_data(const uint8_t* data, int size); bool flush(); - - // AVPacket 方式 - bool init(AVStream* stream, AVCodecContext* avctx, const char* outfile_name); - bool write_pkt(AVPacket *pkt); - bool flush_pkt(); - void release(); + bool close(); private: bool bgr_to_yuv420p(const uint8_t* const buf_bgr, uint8_t* const buf_420p); - void update_pts(AVPacket* pkt); + void calc_pkt_ts(AVPacket* pkt, int frame_index); private: int width_; @@ -37,17 +38,7 @@ private: AVStream* out_stream_; AVFrame* yuv_frame_; - SwsContext * img_convert_ctx; - //AVFrame* pFrameOut; - uint8_t * out_buffer; - - bool bFirstFrame; - int64_t last_src_pts; - int64_t last_pts; - - int64_t first_pts; - int64_t first_dts; + int m_fps{1}; - int64_t frame_index{0}; - AVStream* m_inStream; + int frame_nb{0}; }; \ No newline at end of file diff --git a/src/decoder/dvpp/FFRecoder2.cpp b/src/decoder/dvpp/FFRecoder2.cpp deleted file mode 100644 index f9dd526..0000000 --- a/src/decoder/dvpp/FFRecoder2.cpp +++ /dev/null @@ -1,269 +0,0 @@ -// FFRecoder2.cpp -#include "FFRecoder2.h" -#include -#include -#include - -extern "C" { -#include -#include -#include -#include -#include -#include -} - - -FFRecoder2::FFRecoder2() - :width_{}, - height_{}, - y_size_{}, - uv_size_{}, - pts_{}, - codec_ctx_{ nullptr }, - fmt_ctx_{ nullptr }, - out_stream_{ nullptr }, - yuv_frame_{ nullptr } -{ -} - -FFRecoder2::~FFRecoder2() -{ - uninit(); -} - - -bool FFRecoder2::init(int w, int h, int fps, int bit_rate, const char* outfile_name) -{ - uninit(); - - width_ = w; - height_ = h; - y_size_ = w * h; - uv_size_ = y_size_ / 4; - - // [1] 创建解码器 - const AVCodec* encoder = avcodec_find_encoder(AV_CODEC_ID_H264); - if (!encoder) { - fprintf(stderr, "Find encoder AV_CODEC_ID_H264 failed!\n"); - return false; - } - // 获取解码器上下文 - codec_ctx_ = avcodec_alloc_context3(encoder); - if (!codec_ctx_) { - fprintf(stderr, "Alloc context for encoder contx failed!\n"); - return false; - } - // 设置解码器上下文参数 - codec_ctx_->bit_rate = bit_rate; - codec_ctx_->width = width_; - codec_ctx_->height = height_; - codec_ctx_->time_base = AVRational{ 1, fps }; - codec_ctx_->gop_size = 50; - codec_ctx_->max_b_frames = 0; - codec_ctx_->pix_fmt = AV_PIX_FMT_YUV420P; - codec_ctx_->thread_count = 4; - codec_ctx_->qmin = 10; - codec_ctx_->qmax = 51; - codec_ctx_->qcompress = 0.6f; - codec_ctx_->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; - - //av_opt_set(codec_ctx_->priv_data, "preset", "ultrafast", 0); - av_opt_set(codec_ctx_->priv_data, "tune", "zerolatency", 0); - - // 打开解码器 - int ret = avcodec_open2(codec_ctx_, encoder, nullptr); - if (ret < 0) { - fprintf(stderr, "Open encoder failed!\n"); - return false; - } - - // [2] 创建输出上下文 - avformat_alloc_output_context2(&fmt_ctx_, nullptr, nullptr, outfile_name); - - // [3] 添加输出视频流 - out_stream_ = avformat_new_stream(fmt_ctx_, nullptr); - out_stream_->id = 0; - out_stream_->codecpar->codec_tag = 0; - avcodec_parameters_from_context(out_stream_->codecpar, codec_ctx_); - - av_dump_format(fmt_ctx_, out_stream_->id, outfile_name, 1); - - // 创建YUV格式帧 - yuv_frame_ = av_frame_alloc(); - yuv_frame_->format = AV_PIX_FMT_YUV420P; - yuv_frame_->width = width_; - yuv_frame_->height = height_; - // 为创建的YUV帧分配内存 - if (av_frame_get_buffer(yuv_frame_, 0) < 0) { - av_frame_free(&yuv_frame_); - yuv_frame_ = nullptr; - fprintf(stderr, "Frame get buffer failed!\n"); - return false; - } - - // [5] 打开输出视频文件并写入视频头信息 - if (avio_open(&fmt_ctx_->pb, outfile_name, AVIO_FLAG_WRITE) < 0) { - fprintf(stderr, "avio_open failed!\n"); - return false; - } - if (avformat_write_header(fmt_ctx_, nullptr) < 0) { - fprintf(stderr, "Write header failed!\n"); - return false; - } - - return true; -} - -void FFRecoder2::uninit() -{ - if (fmt_ctx_) { - av_write_trailer(fmt_ctx_); - avio_close(fmt_ctx_->pb); - avformat_free_context(fmt_ctx_); - fmt_ctx_ = nullptr; - } - - if (codec_ctx_) { - avcodec_close(codec_ctx_); - avcodec_free_context(&codec_ctx_); - codec_ctx_ = nullptr; - } - - if (yuv_frame_) { - av_frame_free(&yuv_frame_); - yuv_frame_ = nullptr; - } - - width_ = 0; - height_ = 0; - y_size_ = 0; - uv_size_ = 0; - pts_ = 0; -} - -bool FFRecoder2::write_image(const uint8_t* bgr) -{ - // 分配YUV格式数据的内存 - thread_local std::vector yuv_data; - if (yuv_data.size() != y_size_ * 3 / 2) { - yuv_data.resize(y_size_ * 3 / 2); - } - // BGR格式转YUV格式 - bgr_to_yuv420p(bgr, yuv_data.data()); - - return write_yuv(yuv_data.data()); -} - -bool FFRecoder2::write_yuv(const uint8_t* yuv_data) -{ - //拷贝YUV数据到帧,由于帧数据存在内存对齐,故需逐行拷贝 - for (int i = 0; i < height_; i++) { - memcpy(yuv_frame_->data[0] + i * yuv_frame_->linesize[0], yuv_data + width_ * i, width_); - } - const int uv_stride = width_ / 2; - for (int i = 0; i < height_ / 2; i++) { - memcpy(yuv_frame_->data[1] + i * yuv_frame_->linesize[1], yuv_data + y_size_ + uv_stride * i, uv_stride); - memcpy(yuv_frame_->data[2] + i * yuv_frame_->linesize[2], yuv_data + y_size_ + uv_size_ + uv_stride * i, uv_stride); - } - - yuv_frame_->pts = pts_++; - - return write_frame(yuv_frame_); -} - -bool FFRecoder2::write_frame(const AVFrame* frame) -{ - char errbuf[64]{ 0 }; - // 将帧数据发送到编码器 - int ret = avcodec_send_frame(codec_ctx_, frame); - if (ret < 0) { - fprintf(stderr, "Error sending a frame to the encoder: %s\n", av_make_error_string(errbuf, sizeof(errbuf), ret)); - return false; - } - - while (true) { - AVPacket pkt{ 0 }; - // 获取编码后的数据 - ret = avcodec_receive_packet(codec_ctx_, &pkt); - if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) - return true; - else if (ret < 0) { - fprintf(stderr, "Error encoding a frame: %s\n", av_make_error_string(errbuf, sizeof(errbuf), ret)); - return false; - } - // 将pts缩放到输出流的time_base上 - av_packet_rescale_ts(&pkt, codec_ctx_->time_base, out_stream_->time_base); - pkt.stream_index = out_stream_->index; - // 将数据写入到输出流 - ret = av_interleaved_write_frame(fmt_ctx_, &pkt); - av_packet_unref(&pkt); - if (ret < 0) { - fprintf(stderr, "Error while writing output packet: %s\n", av_make_error_string(errbuf, sizeof(errbuf), ret)); - return false; - } - } - - return true; -} - -static double a2d(AVRational a) { - return a.den / a.num; -} - -bool FFRecoder2::write_pkt(AVPacket* pkt) { - frame_nb++; - pkt->duration = int(a2d(codec_ctx_->time_base)); - pkt->pts = frame_nb; - // 将pts缩放到输出流的time_base上 - av_packet_rescale_ts(pkt, codec_ctx_->time_base, out_stream_->time_base); - pkt->stream_index = out_stream_->index; - // 将数据写入到输出流 - int ret = av_interleaved_write_frame(fmt_ctx_, pkt); - - char errbuf[64]{ 0 }; - if (ret < 0) { - fprintf(stderr, "Error while writing output packet: %s\n", av_make_error_string(errbuf, sizeof(errbuf), ret)); - return false; - } - - return true; -} - -bool FFRecoder2::flush() -{ - return write_frame(nullptr); -} - -bool FFRecoder2::bgr_to_yuv420p(const uint8_t* const buf_bgr, uint8_t* const buf_420p) -{ - // 分配转换上下文 - thread_local std::tuple params{ 0, 0, 0 }; - thread_local std::unique_ptr sws_context{ nullptr, &sws_freeContext }; - - std::tuple new_params{ width_, height_, av_image_get_linesize(AV_PIX_FMT_YUV420P, width_, 0) }; - if (!sws_context || params != new_params) - { - sws_context.reset(sws_getContext(width_, height_, AV_PIX_FMT_BGR24, width_, height_, - AV_PIX_FMT_YUV420P, SWS_FAST_BILINEAR, nullptr, nullptr, nullptr)); - params = new_params; - } - - // 转换格式 - const int stride = std::get<2>(params);//Y平面一行的数据长度 - const int ret = sws_scale(sws_context.get(), - &buf_bgr,/* bgr数据只有一个平面 */ - std::array {width_ * 3}.data(),/* BGR所以图像宽度*3 */ - 0, height_, - std::array{ buf_420p, buf_420p + y_size_, buf_420p + y_size_ + uv_size_ }.data(),/* YUV三个平面的起始地址 */ - std::array{ stride, stride / 2, stride / 2 }.data() - );/* YUV每个平面中一行的宽度 */ - - return ret >= 0; -} - -bool FFRecoder2::close() -{ - flush(); - uninit(); -} \ No newline at end of file diff --git a/src/decoder/dvpp/FFRecoder2.h b/src/decoder/dvpp/FFRecoder2.h deleted file mode 100644 index 309aa81..0000000 --- a/src/decoder/dvpp/FFRecoder2.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once -#include - -class AVFrame; -class AVStream; -class AVCodecContext; -class AVFormatContext; -class AVPacket; - -class FFRecoder2 -{ -public: - FFRecoder2(); - ~FFRecoder2(); - - bool init(int w, int h, int fps, int bit_rate, const char* outfile_name); - void uninit(); - bool write_image(const uint8_t* bgr); - bool write_yuv(const uint8_t* yuv_data); - bool write_frame(const AVFrame* frame); - bool write_pkt(AVPacket* pkt); - bool flush(); - bool close(); - -private: - bool bgr_to_yuv420p(const uint8_t* const buf_bgr, uint8_t* const buf_420p); - -private: - int width_; - int height_; - int y_size_; - int uv_size_; - int pts_; - AVCodecContext* codec_ctx_; - AVFormatContext* fmt_ctx_; - AVStream* out_stream_; - AVFrame* yuv_frame_; - - int frame_nb{0}; -}; \ No newline at end of file diff --git a/src/decoder/dvpp/FFRecoderTaskManager.cpp b/src/decoder/dvpp/FFRecoderTaskManager.cpp index e2ce460..0b870bf 100644 --- a/src/decoder/dvpp/FFRecoderTaskManager.cpp +++ b/src/decoder/dvpp/FFRecoderTaskManager.cpp @@ -1,11 +1,6 @@ #include "FFRecoderTaskManager.h" #include -struct RecodeThreadParam { - FFRecoderTaskManager* _this; - RecodeParam param; -}; - static long get_cur_time() { chrono::time_point tpMicro @@ -69,68 +64,14 @@ bool FFRecoderTaskManager::init(int w, int h, int fps, int bit_rate) { return true; } -static AVPacket* packet_clone(AVPacket* pkt) { - AVPacket *new_pkt = av_packet_alloc(); - av_init_packet( new_pkt ); - av_new_packet(new_pkt, pkt->size); - memcpy(new_pkt->data, pkt->data, pkt->size); - new_pkt->size = pkt->size; - // new_pkt->pts = pkt->pts; - // new_pkt->dts = pkt->dts; - // new_pkt->stream_index = pkt->stream_index; - // new_pkt->duration = pkt->duration; - // new_pkt->pos = pkt->pos; - // new_pkt->flags = pkt->flags; - // av_copy_packet_side_data(new_pkt, pkt); - return new_pkt; -} - -static AVPacket* copy_packet(const AVPacket* src) -{ - AVPacket* dst = av_packet_alloc(); // 分配内存 - if (!dst) { - return NULL; - } - - // 复制所有字段 - av_packet_ref(dst, src); - - // 复制音视频数据 - dst->data = (uint8_t*)av_malloc(src->size); - memcpy(dst->data, src->data, src->size); - dst->size = src->size; - return dst; -} - void FFRecoderTaskManager::cache_pkt(AVPacket* pkt, long long frame_nb, string dec_name){ if(m_bExit) { // 任务退出了就不再缓存数据了 return; } - // 考虑到一个AVPacket中的数据并不很大,为减少与解码模块的耦合度,方便管理,这里做一个clone - // AVPacket *new_pkt = copy_packet(pkt); - - DataPacket* newDataPkt = new DataPacket(); - newDataPkt->pkt = pkt; - newDataPkt->frame_nb = frame_nb; - - if(is_key_frame(pkt)){ - // 越来越大的值 - newDataPkt->isKeyFrame = true; - LOG_INFO("[{}] - key frame_nb: {}", dec_name, frame_nb); - } else { - newDataPkt->isKeyFrame = false; - } - - AVPacket* npkt = newDataPkt->pkt; - if(npkt == nullptr) { - return ; - } else if (npkt->data == nullptr || npkt->size <= 0){ - return ; - } - std::lock_guard l_info(m_pkt_list_short_mtx); + DataPacket* newDataPkt = new DataPacket(pkt->data, pkt->size, frame_nb, is_key_frame(pkt)); m_pkt_list_short.push_back(newDataPkt); } @@ -277,20 +218,11 @@ void FFRecoderTaskManager::recode_thread() { break; } - auto it = m_pkt_list.begin(); - while (it != it_data) { - DataPacket* dataPkt = m_pkt_list.front(); - delete dataPkt; - dataPkt = nullptr; - m_pkt_list.pop_front(); - it = m_pkt_list.begin(); - } - LOG_INFO("start frame_nb: {}", (*it_data)->frame_nb); string file_name = recoderinfo.recoderPath; - FFRecoder2 ffrecoder; + FFRecoder ffrecoder; bool bInit = ffrecoder.init(m_width, m_height, m_fps, m_bit_rate, file_name.c_str()); if (!bInit) { LOG_ERROR("ffrecoder init error : {} {} {}", recoderinfo.task_id, recoderinfo.object_id, recoderinfo.frame_nb); @@ -308,16 +240,15 @@ void FFRecoderTaskManager::recode_thread() { if(dataPkt->frame_nb > recoderinfo.frame_nb) { break; } - AVPacket* pkt = dataPkt->pkt; - if(pkt == nullptr) { - LOG_ERROR("{} pkt is nullptr", recoderinfo.task_id); - continue; - } else if (pkt->data == nullptr || pkt->size <= 0){ - LOG_ERROR("{} pkt data is nullptr or size is {}", recoderinfo.task_id, pkt->size); + + if (dataPkt->pkt_data == nullptr || dataPkt->pkt_size <= 0){ + LOG_ERROR("{} pkt data is nullptr or size is {}", recoderinfo.task_id, dataPkt->pkt_size); continue; } - ffrecoder.write_pkt(pkt); + // LOG_INFO("ref count: {}", av_buffer_get_ref_count(pkt->buf)); + + ffrecoder.write_pkt_data(dataPkt->pkt_data, dataPkt->pkt_size); count++; end_frame_nb = (*it_save)->frame_nb; } diff --git a/src/decoder/dvpp/FFRecoderTaskManager.h b/src/decoder/dvpp/FFRecoderTaskManager.h index d30486f..dd731e0 100644 --- a/src/decoder/dvpp/FFRecoderTaskManager.h +++ b/src/decoder/dvpp/FFRecoderTaskManager.h @@ -1,4 +1,4 @@ -#include "FFRecoder2.h" +#include "FFRecoder.h" #include "../../ai_platform/common_header.h" #include "depend_headers.h" @@ -12,11 +12,6 @@ using namespace std; -struct RecodeParam { - AVRational time_base; - RecoderInfo recoderInfo; - AVCodecContext* avctx; -}; typedef std::function mq_callback_t; @@ -65,7 +60,7 @@ private: mq_callback_t mq_publish_func; - // FFRecoder2 + // FFRecoder int m_width; int m_height; int m_fps; diff --git a/src/decoder/dvpp/depend_headers.h b/src/decoder/dvpp/depend_headers.h index 0c1c7ea..ef987ad 100644 --- a/src/decoder/dvpp/depend_headers.h +++ b/src/decoder/dvpp/depend_headers.h @@ -41,16 +41,28 @@ extern "C" { struct DataPacket { - AVPacket* pkt {nullptr}; + uint8_t *pkt_data{nullptr}; + int pkt_size{0}; unsigned long long frame_nb{0}; bool isKeyFrame{false}; + DataPacket(uint8_t *data, int size, unsigned long long frameNb, bool isKey) { + pkt_data = (uint8_t*) malloc(size); + memcpy(pkt_data, data, size); + pkt_size = size; + frame_nb = frameNb; + isKeyFrame = isKey; + } + ~DataPacket(){ - if(pkt != nullptr) { + if(pkt_data != nullptr) { // LOG_INFO("free frame_nb:{}", frame_nb); - av_packet_free(&pkt); - pkt = nullptr; + free(pkt_data); + pkt_data = nullptr; } + pkt_size = 0; + frame_nb = 0; + isKeyFrame = false; } }; diff --git a/src/decoder/gb28181/Makefile000 b/src/decoder/gb28181/Makefile000 deleted file mode 100644 index f0d2492..0000000 --- a/src/decoder/gb28181/Makefile000 +++ /dev/null @@ -1,71 +0,0 @@ -# 各项目录 -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))) - -# 自动生成头文件依赖选项 -DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d - -JRTP_ROOT = $(THIRDPARTY_ROOT)/jrtp_export - -INCLUDE= -I $(TOP_DIR)/common/inc \ - -I $(TOP_DIR)/common/UtilNPP \ - -I $(TOP_DIR)/ \ - -I $(CUDA_ROOT)/include \ - -I $(JRTP_ROOT)/jrtplib/include/jrtplib3 \ - -I $(JRTP_ROOT)/jthread/include/jthread - -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) $(INCS) $(LIBS) $(LIBSPATH) $(MACROS) $(DEFS) -lpthread -lrt -lz -fexceptions -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl -Wwrite-strings - -# 最终目标文件 -TARGET:=$(LIB_DIR)/$(MODULE).a - -# 默认最终目标 -.PHONY:all -all:$(TARGET) - -# 生成最终目标 -$(TARGET):$(OBJS) | $(LIB_DIR) - @echo -e "\e[32m""Linking static library $(TARGET)""\e[0m" - @echo -e "ar -rc $@ $^" - @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" - @echo -e "$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) -o $@ $<" - @$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) -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/decoder/interface/DecoderManager.cpp b/src/decoder/interface/DecoderManager.cpp index 0bc2baf..71a3c7f 100644 --- a/src/decoder/interface/DecoderManager.cpp +++ b/src/decoder/interface/DecoderManager.cpp @@ -7,7 +7,7 @@ #ifdef USE_DVPP #include "../dvpp/DvppDecoderApi.h" -#include "../gb28181/DvppGB28181Decoder2.h" +// #include "../gb28181/DvppGB28181Decoder2.h" #endif #include "logger.hpp" @@ -61,7 +61,7 @@ AbstractDecoder* DecoderManager::createDecoder(MgrDecConfig config){ if(DECODER_TYPE_DVPP == config.dec_type){ dec = new DvppDecoderApi(); } else if(DECODER_TYPE_DVPP_GB28181 == config.dec_type){ - dec = new DvppGB28181Decoder2(); + // dec = new DvppGB28181Decoder2(); } #endif diff --git a/src/decoder/test_28181.cpp b/src/decoder/test_28181.cpp0 index 7c0e32c..7c0e32c 100644 --- a/src/decoder/test_28181.cpp +++ b/src/decoder/test_28181.cpp0 diff --git a/src/decoder/test_decoder.cpp.dvpp b/src/decoder/test_decoder.cpp index 7760ebf..a97d551 100644 --- a/src/decoder/test_decoder.cpp.dvpp +++ b/src/decoder/test_decoder.cpp @@ -207,22 +207,22 @@ void algorthim_process_thread(){ } void snap_shot_thread(){ - DecoderManager* pDecManager = DecoderManager::getInstance(); - while (true){ - if(m_bfinish){ - break; - } + // DecoderManager* pDecManager = DecoderManager::getInstance(); + // while (true){ + // if(m_bfinish){ + // break; + // } - vector vec_devMem = pDecManager->timing_snapshot_all(); - for(auto devMem : vec_devMem){ - delete devMem; - devMem = nullptr; - } - // vec_devMem.clear(); + // vector vec_devMem = pDecManager->timing_snapshot_all(); + // for(auto devMem : vec_devMem){ + // delete devMem; + // devMem = nullptr; + // } + // // vec_devMem.clear(); - vector().swap(vec_devMem); + // vector().swap(vec_devMem); - std::this_thread::sleep_for(std::chrono::milliseconds(600)); + // std::this_thread::sleep_for(std::chrono::milliseconds(600)); - } + // } } \ No newline at end of file diff --git a/src/decoder/test_face.cpp1 b/src/decoder/test_face.cpp1 index 1ef3eb2..7d6efd1 100644 --- a/src/decoder/test_face.cpp1 +++ b/src/decoder/test_face.cpp1 @@ -75,7 +75,6 @@ int main(){ string models_dir = "."; aclInit(nullptr); - aclrtSetDevice(m_devId); // 人脸检测初始化 facedet_ai_engine_param fd_param; @@ -179,7 +178,6 @@ int main(){ void algorthim_process_thread(){ - aclrtSetDevice(m_devId); aclrtCreateContext(&ctx, m_devId); while (true){ diff --git a/src/demo/demo.cpp b/src/demo/demo.cpp index dd5ce48..da000d2 100755 --- a/src/demo/demo.cpp +++ b/src/demo/demo.cpp @@ -1320,22 +1320,30 @@ void test_gpu(int gpuID){ // } - createTask(handle, algor_vec2, 0, false); - createTask(handle, algor_vec2, 2, false); - createTask(handle, algor_vec2, 0, false); - createTask(handle, algor_vec2, 2, false); - createTask(handle, algor_vec2, 0, false); - createTask(handle, algor_vec2, 2, false); - createTask(handle, algor_vec2, 0, false); - createTask(handle, algor_vec2, 2, false); - createTask(handle, algor_vec2, 0, false); - createTask(handle, algor_vec2, 2, false); - createTask(handle, algor_vec2, 0, false); - createTask(handle, algor_vec2, 2, false); - - while (getchar() != 'q'); - - /* + // createTask(handle, algor_vec2, 0, false); + // createTask(handle, algor_vec2, 2, false); + // createTask(handle, algor_vec2, 0, false); + // createTask(handle, algor_vec2, 2, false); + // createTask(handle, algor_vec2, 0, false); + // createTask(handle, algor_vec2, 2, false); + // createTask(handle, algor_vec2, 0, false); + // createTask(handle, algor_vec2, 2, false); + // createTask(handle, algor_vec2, 0, false); + // createTask(handle, algor_vec2, 2, false); + // createTask(handle, algor_vec2, 0, false); + // createTask(handle, algor_vec2, 2, false); + + // createTask(handle, algor_vec2, 4, false); + // createTask(handle, algor_vec2, 5, false); + // createTask(handle, algor_vec2, 6, false); + // createTask(handle, algor_vec2, 7, false); + // createTask(handle, algor_vec2, 8, false); + // createTask(handle, algor_vec2, 9, false); + // createTask(handle, algor_vec2, 10, false); + + // while (getchar() != 'q'); + + char ch = 'a'; while (ch != 'q') { ch = getchar(); @@ -1343,12 +1351,12 @@ void test_gpu(int gpuID){ { case 'a': createTask(handle, algor_vec2, 4, false); - createTask(handle, algor_vec2, 5, false); - createTask(handle, algor_vec2, 6, false); - createTask(handle, algor_vec2, 7, false); - createTask(handle, algor_vec2, 8, false); - createTask(handle, algor_vec2, 9, false); - createTask(handle, algor_vec2, 10, false); + // createTask(handle, algor_vec2, 5, false); + // createTask(handle, algor_vec2, 6, false); + // createTask(handle, algor_vec2, 7, false); + // createTask(handle, algor_vec2, 8, false); + // createTask(handle, algor_vec2, 9, false); + // createTask(handle, algor_vec2, 10, false); // createTask(handle, algor_vec2, 11, false); // createTask(handle, algor_vec2, 12, false); // createTask(handle, algor_vec2, 13, false); @@ -1365,7 +1373,7 @@ void test_gpu(int gpuID){ break; } - }*/ + } // finish_task(handle, (char*)task_id.data(), 0); @@ -1508,12 +1516,12 @@ int main(int argc, char *argv[]) { // int repeat_num = atoi(argv[3]); // int gpuID = atoi(argv[4]); - // test_gpu(0); + test_gpu(0); // test_gpu(1); // test_gpu(2); // test_gpu(3); - test_dvpp28181(0); + // test_dvpp28181(0); printf("Done.\n"); diff --git a/src/test/test.cpp b/src/test/test.cpp index e7e73dc..657d7a0 100755 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -60,7 +60,6 @@ int main() { void* handle = nullptr; cout << "init start " << endl; ACL_CALL(aclInit(nullptr), ACL_SUCCESS, SY_FAILED); - ACL_CALL(aclrtSetDevice(param.devId), ACL_SUCCESS, SY_FAILED); aclrtContext ctx; ACL_CALL(aclrtCreateContext(&ctx, param.devId), ACL_SUCCESS, SY_FAILED); aclrtStream stream = nullptr;