From caef8aa259a1687ae5f5c717cb34b6012ae12214 Mon Sep 17 00:00:00 2001 From: cmhu <2657262686@qq.com> Date: Wed, 21 Aug 2024 15:49:42 +0800 Subject: [PATCH] 修复aclrtSetDevice和视频截存的内存泄露 --- src/decoder/dvpp/DvppDecoder.cpp | 53 +++++++++++++++++------------------------------------ src/decoder/dvpp/DvppStreamDecoder.cpp | 2 +- 2 files changed, 18 insertions(+), 37 deletions(-) diff --git a/src/decoder/dvpp/DvppDecoder.cpp b/src/decoder/dvpp/DvppDecoder.cpp index e99f2f2..b34a390 100644 --- a/src/decoder/dvpp/DvppDecoder.cpp +++ b/src/decoder/dvpp/DvppDecoder.cpp @@ -332,13 +332,7 @@ 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); + aclError ret = aclrtCreateContext(&m_context, m_dvpp_deviceId); if (ret != ACL_ERROR_NONE) { LOG_ERROR("[{}]-aclrtCreateContext failed !", m_dec_name); break; @@ -515,7 +509,7 @@ void DvppDecoder::read_thread() { } m_bExitDisplayThd = false; - std::thread display_thread = std::thread( + std::thread display_thread( [](void* arg) { DvppDecoder* a=(DvppDecoder*)arg; @@ -525,11 +519,9 @@ void DvppDecoder::read_thread() { this ); - aclrtContext ctx = nullptr; 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); @@ -552,6 +544,8 @@ void DvppDecoder::read_thread() { CHECK_AND_BREAK(aclvdecCreateChannel(vdecChannelDesc), "aclvdecCreateChannel failed"); unsigned long long frame_nb = 0; + AVPacket* pkt = av_packet_alloc(); + av_init_packet( pkt ); while (m_bRunning){ if (!m_bReal){ @@ -578,12 +572,9 @@ void DvppDecoder::read_thread() { m_last_read_ts = get_cur_time_ms(); } - AVPacket* pkt = av_packet_alloc(); - av_init_packet( pkt ); int result = av_read_frame(fmt_ctx, pkt); if (result == AVERROR_EOF || result < 0){ - av_packet_free(&pkt); - pkt = nullptr; + av_packet_unref(pkt); LOG_WARN("[{}]- Failed to read frame!", m_dec_name); break; } @@ -591,15 +582,13 @@ void DvppDecoder::read_thread() { if (m_bReal && m_DvppCacheCounter.load() > m_cache_gop){ // 解码器解码不过来。实时流在此处的处理会导致花屏,这是由于解码器性能问题导致,无法避免 // 实时流在这里处理是为了避免长时间不读取数据导致数据中断 - av_packet_free(&pkt); - pkt = nullptr; + av_packet_unref(pkt); std::this_thread::sleep_for(std::chrono::milliseconds(10)); continue; } if (m_dec_keyframe && !(pkt->flags & AV_PKT_FLAG_KEY)) { - av_packet_free(&pkt); - pkt = nullptr; + av_packet_unref(pkt); continue; } @@ -608,8 +597,7 @@ void DvppDecoder::read_thread() { ret = av_bsf_send_packet(h264bsfc, pkt); if(ret < 0) { LOG_ERROR("[{}]- av_bsf_send_packet error!", m_dec_name); - av_packet_free(&pkt); - pkt = nullptr; + av_packet_unref(pkt); continue; } @@ -631,12 +619,14 @@ void DvppDecoder::read_thread() { #ifdef USE_VILLAGE m_recoderManager.cache_pkt(pkt, frame_nb, m_dec_name); #endif - } else { - av_packet_free(&pkt); - pkt = nullptr; - } + } + + av_packet_unref(pkt); } + av_packet_free(&pkt); + pkt = nullptr; + if (vdecChannelDesc) { sendVdecEos(vdecChannelDesc); } @@ -764,24 +754,15 @@ 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); - if (ret != ACL_ERROR_NONE) { - // cout << "aclrtCreateContext failed " << endl; - LOG_ERROR("aclrtCreateContext failed !"); - return ; + LOG_ERROR("[{}]-aclrtSetDevice failed !", m_dec_name); + return; } while (!m_bExitReportThd) { aclrtProcessReport(1000); } - ret = aclrtDestroyContext(ctx); + ret = aclrtResetDevice(m_dvpp_deviceId); if(ret != ACL_ERROR_NONE){ LOG_ERROR("aclrtDestroyContext failed !"); } diff --git a/src/decoder/dvpp/DvppStreamDecoder.cpp b/src/decoder/dvpp/DvppStreamDecoder.cpp index 03ce395..3a85277 100644 --- a/src/decoder/dvpp/DvppStreamDecoder.cpp +++ b/src/decoder/dvpp/DvppStreamDecoder.cpp @@ -487,7 +487,7 @@ int DvppStreamDecoder::SendData(int videoType, char* data, int len, int isKey, u #ifdef USE_VILLAGE //直接返回,不释放pkt,pkt在recoderManager释放 return 0; -#elif +#else ret = 0; #endif } -- libgit2 0.21.4