From 42424bf28af2f9637af2b6b58b100a3e315c0175 Mon Sep 17 00:00:00 2001 From: fiss <2657262686@qq.com> Date: Thu, 16 Mar 2023 10:38:15 +0000 Subject: [PATCH] 代码优化 --- src/dvpp/DvppDec.cpp | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------- 1 file changed, 61 insertions(+), 44 deletions(-) diff --git a/src/dvpp/DvppDec.cpp b/src/dvpp/DvppDec.cpp index dfea4be..7282494 100644 --- a/src/dvpp/DvppDec.cpp +++ b/src/dvpp/DvppDec.cpp @@ -2,11 +2,13 @@ #include "DvppSourceManager.h" #define CHECK_AND_RETURN(ret, message) \ - if(ret != 0) {cout << "device: " << m_dvpp_deviceId << ", chn: " << m_dvpp_channel << ", ret: " << ret << ", [ERROR] " << message; return ret;} + if(ret != 0) {LOG_ERROR("[{}]- {}", m_dec_name, message); return ret;} #define CHECK_NOT_RETURN(ret, message) \ - if(ret != 0) {cout << "device: " << m_dvpp_deviceId << ", chn: " << m_dvpp_channel << ", ret: " << ret << ", [ERROR] " << message;} + if(ret != 0) {LOG_ERROR("[{}]- {}", m_dec_name, message);} #define CHECK_AND_RETURN_NOVALUE(ret, message) \ - if(ret != 0) {cout << "device: " << m_dvpp_deviceId << ", chn: " << m_dvpp_channel << ", ret: " << ret << ", [ERROR] " << message; return;} + if(ret != 0) {LOG_ERROR("[{}]- {}", m_dec_name, message); return;} +#define CHECK_AND_BREAK(ret, message) \ + if(ret != 0) {LOG_ERROR("[{}]- {}", m_dec_name, message); break;} struct Vdec_CallBack_UserData { uint64_t frameId; @@ -259,7 +261,7 @@ void DvppDec::releaseResource(){ for(int i = 0; i < m_vec_vdec.size(); i++){ if(m_vec_vdec[i] != nullptr){ - acldvppFree((uint8_t*)m_vec_vdec[i]); + acldvppFree(m_vec_vdec[i]); m_vec_vdec[i] = nullptr; } } @@ -316,22 +318,22 @@ void DvppDec::decode_thread(){ } // 尽量保证数据全部解码完成 - // int sum = 0; - // if(!bBreak){ - // while(!m_pktQueueptr->isEmpty()){ - // int ret = sentFrame(vdecChannelDesc, frame_count); - // if(ret == 2){ - // break; - // } - // sum++; - // if(sum > 10){ - // // 避免卡死 - // break; - // } - // } - // } + int sum = 0; + if(!bBreak){ + while(!m_pktQueueptr->isEmpty()){ + int ret = sentFrame(vdecChannelDesc, frame_count); + if(ret == 2){ + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(3)); + sum++; + if(sum > 40){ + // 避免卡死 + break; + } + } + } - sendVdecEos(vdecChannelDesc); CHECK_NOT_RETURN(aclvdecDestroyChannel(vdecChannelDesc), "aclvdecDestroyChannel failed"); @@ -378,33 +380,48 @@ int DvppDec::sentFrame(aclvdecChannelDesc *vdecChannelDesc, uint64_t frame_count return 2; } - /************ 解码*************/ - acldvppStreamDesc *input_stream_desc = acldvppCreateStreamDesc(); + acldvppStreamDesc *input_stream_desc = nullptr; + acldvppPicDesc *output_pic_desc = nullptr; + do{ + input_stream_desc = acldvppCreateStreamDesc(); if (input_stream_desc == nullptr) { cout << "acldvppCreateStreamDesc error" << endl; } - acldvppPicDesc *output_pic_desc = acldvppCreatePicDesc(); + output_pic_desc = acldvppCreatePicDesc(); if (output_pic_desc == nullptr) { cout<< "acldvppCreatePicDesc error" << endl; } - CHECK_NOT_RETURN(acldvppSetStreamDescData(input_stream_desc, vdecInputbuf), "acldvppSetStreamDescData failed"); - CHECK_NOT_RETURN(acldvppSetStreamDescSize(input_stream_desc, pkt->size), "acldvppSetStreamDescSize failed"); - CHECK_NOT_RETURN(acldvppSetPicDescData(output_pic_desc, vdecOutputBuf), "acldvppSetPicDescData failed"); - CHECK_NOT_RETURN(acldvppSetPicDescSize(output_pic_desc, m_vdec_out_size), "acldvppSetPicDescSize failed"); - - Vdec_CallBack_UserData *user_data = NULL; - user_data = new Vdec_CallBack_UserData; - user_data->frameId = frame_count; - // user_data->startTime = startTime; - user_data->sendTime = UtilTools::get_cur_time_ms(); - user_data->self = this; - // user_data->inBufNode = bufNode; - cout << "send frame" << endl; - CHECK_NOT_RETURN(aclvdecSendFrame(vdecChannelDesc, input_stream_desc, output_pic_desc, nullptr, reinterpret_cast(user_data)), - "aclvdecSendFrame failed"); - - m_vdecQueue.addTail(); - - m_pktQueueptr->addHead(); - av_packet_unref(pkt); - - return 0; + CHECK_AND_BREAK(acldvppSetStreamDescData(input_stream_desc, vdecInputbuf), "acldvppSetStreamDescData failed"); + CHECK_AND_BREAK(acldvppSetStreamDescSize(input_stream_desc, pkt->size), "acldvppSetStreamDescSize failed"); + CHECK_AND_BREAK(acldvppSetPicDescData(output_pic_desc, vdecOutputBuf), "acldvppSetPicDescData failed"); + CHECK_AND_BREAK(acldvppSetPicDescSize(output_pic_desc, m_vdec_out_size), "acldvppSetPicDescSize failed"); + + Vdec_CallBack_UserData *user_data = NULL; + user_data = new Vdec_CallBack_UserData; + user_data->frameId = frame_count; + // user_data->startTime = startTime; + user_data->sendTime = UtilTools::get_cur_time_ms(); + user_data->self = this; + // user_data->inBufNode = bufNode; + cout << "send frame" << endl; + CHECK_NOT_RETURN(aclvdecSendFrame(vdecChannelDesc, input_stream_desc, output_pic_desc, nullptr, reinterpret_cast(user_data)), + "aclvdecSendFrame failed"); + + m_vdecQueue.addTail(); + + m_pktQueueptr->addHead(); + av_packet_unref(pkt); + + return 0; + }while (0); + + if(input_stream_desc){ + CHECK_NOT_RETURN(acldvppDestroyStreamDesc(input_stream_desc), "acldvppDestroyStreamDesc failed"); + } + if(output_pic_desc){ + CHECK_NOT_RETURN(acldvppDestroyPicDesc(output_pic_desc), "acldvppDestroyPicDesc failed"); + } + + acldvppFree(vdecOutputBuf); + vdecOutputBuf = nullptr; + + return 1; } -- libgit2 0.21.4