From 8a3c293203b42fb7241207206dcb30a7c734ed43 Mon Sep 17 00:00:00 2001 From: Hu Chunming <2657262686@qq.com> Date: Mon, 22 Jul 2024 17:09:44 +0800 Subject: [PATCH] 修复任务创建失败造成的内存泄漏问题 --- bin/gb28181_cfg.xml | 2 +- src/ai_engine_module/VPTProcess.cpp | 2 +- src/decoder/dvpp/DvppDecoder.cpp | 31 +++++++++++++++++++------------ src/decoder/dvpp/DvppStreamDecoder.cpp | 2 +- src/decoder/dvpp/VpcUtils.cpp | 26 +++++++++++++++++++++----- src/decoder/dvpp/VpcUtils.h | 1 - 6 files changed, 43 insertions(+), 21 deletions(-) diff --git a/bin/gb28181_cfg.xml b/bin/gb28181_cfg.xml index 0bab184..d2658a6 100644 --- a/bin/gb28181_cfg.xml +++ b/bin/gb28181_cfg.xml @@ -1,7 +1,7 @@ 192.168.60.179 - 9006 + 9007 20000 20400 diff --git a/src/ai_engine_module/VPTProcess.cpp b/src/ai_engine_module/VPTProcess.cpp index 4fb90cc..40d276e 100755 --- a/src/ai_engine_module/VPTProcess.cpp +++ b/src/ai_engine_module/VPTProcess.cpp @@ -46,7 +46,7 @@ int VPTProcess::init(VPTProcess_PARAM vparam){ int ret = vpt_init(&m_det_handle, param); if(ret != 0){ - LOG_DEBUG("vpt init error."); + LOG_ERROR("vpt init error."); return -1; } diff --git a/src/decoder/dvpp/DvppDecoder.cpp b/src/decoder/dvpp/DvppDecoder.cpp index 251ff30..f4a5f78 100644 --- a/src/decoder/dvpp/DvppDecoder.cpp +++ b/src/decoder/dvpp/DvppDecoder.cpp @@ -102,23 +102,30 @@ bool DvppDecoder::init(FFDecConfig cfg){ m_dec_name = cfg.dec_name; m_frameSkip = cfg.skip_frame; + m_cfg = cfg; + + decode_finished_cbk = cfg.decode_finished_cbk; + AVCodecContext* avctx = init_FFmpeg(cfg); if(avctx == nullptr){ return false; } - bool bRet = init_dvpp(cfg); - if(!bRet){ - return false; - } - - m_cfg = cfg; + do + { + bool bRet = init_dvpp(cfg); + if(!bRet){ + break; + } - decode_finished_cbk = cfg.decode_finished_cbk; + m_bFinished = false; - m_bFinished = false; + return true; + } while (0); + + release_ffmpeg(); - return true; + return false; } AVCodecContext* DvppDecoder::init_FFmpeg(FFDecConfig config){ @@ -328,13 +335,13 @@ int DvppDecoder::getVdecType(int videoType, int profile) aclError ret = aclrtSetDevice(m_dvpp_deviceId); if(ret != ACL_ERROR_NONE){ LOG_ERROR("[{}]-aclrtSetDevice failed !", m_dec_name); - return false; + break; } ret = aclrtCreateContext(&m_context, m_dvpp_deviceId); if (ret != ACL_ERROR_NONE) { LOG_ERROR("[{}]-aclrtCreateContext failed !", m_dec_name); - return false; + break; } // DvppSourceManager 创建时包含 aclInit,析构时包含 aclFinalize @@ -342,7 +349,7 @@ int DvppDecoder::getVdecType(int videoType, int profile) m_dvpp_channel = pSrcMgr->getChannel(m_dvpp_deviceId); if(m_dvpp_channel < 0){ LOG_ERROR("[{}]-该设备channel已经用完了!", m_dec_name); - return false; + break; } m_vpcUtils.init(m_dvpp_deviceId); diff --git a/src/decoder/dvpp/DvppStreamDecoder.cpp b/src/decoder/dvpp/DvppStreamDecoder.cpp index cf82ede..5b00f77 100644 --- a/src/decoder/dvpp/DvppStreamDecoder.cpp +++ b/src/decoder/dvpp/DvppStreamDecoder.cpp @@ -55,7 +55,7 @@ DvppStreamDecoder::~DvppStreamDecoder() { Close(); - LOG_DEBUG("[{}]- ~DvppDecoder() in_count:{} out_count:{}", m_dec_name, m_in_count, m_out_count); + LOG_DEBUG("[{}]- ~DvppStreamDecoder() in_count:{} out_count:{}", m_dec_name, m_in_count, m_out_count); } bool DvppStreamDecoder::Init(FFDecConfig cfg) { diff --git a/src/decoder/dvpp/VpcUtils.cpp b/src/decoder/dvpp/VpcUtils.cpp index aec7c52..19d70c8 100644 --- a/src/decoder/dvpp/VpcUtils.cpp +++ b/src/decoder/dvpp/VpcUtils.cpp @@ -17,10 +17,6 @@ VpcUtils::VpcUtils(){ } VpcUtils::~VpcUtils(){ - if(nullptr != stream_){ - aclrtDestroyStream(stream_); - } - if(context_){ aclrtDestroyContext(context_); } @@ -40,7 +36,6 @@ int VpcUtils::init(int devId){ aclrtCreateContext(&context_, m_devId); CHECK_AND_RETURN(aclrtSetCurrentContext(context_), "aclrtSetCurrentContext failed"); - CHECK_AND_RETURN(aclrtCreateStream(&stream_), "aclrtCreateStream failed! "); dvppChannelDesc_ = acldvppCreateChannelDesc(); @@ -79,6 +74,10 @@ DvppDataMemory* VpcUtils::convert2bgr(acldvppPicDesc *inputDesc_, int out_width, acldvppSetPicDescSize(outputDesc_, out_buf_size); aclError ret = ACL_ERROR_NONE; + + aclrtStream stream_ = nullptr; + aclrtCreateStream(&stream_); + do{ // 9. 执行异步色域转换,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成 ret = acldvppVpcConvertColorAsync(dvppChannelDesc_, inputDesc_, outputDesc_, stream_); @@ -93,6 +92,10 @@ DvppDataMemory* VpcUtils::convert2bgr(acldvppPicDesc *inputDesc_, int out_width, } }while(0); + if (stream_ != nullptr) { + aclrtDestroyStream(stream_); + } + acldvppDestroyPicDesc(outputDesc_); if(ret != ACL_ERROR_NONE){ @@ -138,6 +141,9 @@ DvppDataMemory* VpcUtils::convert2bgr(DvppDataMemory* inMem){ acldvppSetPicDescSize(outputDesc_, out_buf_size); aclError ret = ACL_ERROR_NONE; + + aclrtStream stream_ = nullptr; + aclrtCreateStream(&stream_); do{ // 9. 执行异步色域转换,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成 ret = acldvppVpcConvertColorAsync(dvppChannelDesc_, inputDesc_, outputDesc_, stream_); @@ -152,6 +158,10 @@ DvppDataMemory* VpcUtils::convert2bgr(DvppDataMemory* inMem){ } }while(0); + if (stream_ != nullptr) { + aclrtDestroyStream(stream_); + } + acldvppDestroyPicDesc(outputDesc_); acldvppDestroyPicDesc(inputDesc_); @@ -187,6 +197,8 @@ DvppDataMemory* VpcUtils::resize(acldvppPicDesc *inputDesc_, int out_width, int acldvppResizeConfig *resizeConfig_ = acldvppCreateResizeConfig(); aclError ret = ACL_ERROR_NONE; + aclrtStream stream_ = nullptr; + aclrtCreateStream(&stream_); do{ // 9. 执行异步色域转换,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成 ret = acldvppVpcResizeAsync(dvppChannelDesc_, inputDesc_, outputDesc_, resizeConfig_, stream_); @@ -201,6 +213,10 @@ DvppDataMemory* VpcUtils::resize(acldvppPicDesc *inputDesc_, int out_width, int } }while(0); + if (stream_ != nullptr) { + aclrtDestroyStream(stream_); + } + acldvppDestroyResizeConfig(resizeConfig_); acldvppDestroyPicDesc(outputDesc_); diff --git a/src/decoder/dvpp/VpcUtils.h b/src/decoder/dvpp/VpcUtils.h index ae8dcde..2c5e781 100644 --- a/src/decoder/dvpp/VpcUtils.h +++ b/src/decoder/dvpp/VpcUtils.h @@ -16,7 +16,6 @@ public: private: aclrtContext context_{nullptr}; - aclrtStream stream_{nullptr}; int m_devId; acldvppChannelDesc *dvppChannelDesc_ {nullptr}; string m_dec_name; -- libgit2 0.21.4