diff --git a/src/dvpp/DvppDec.cpp b/src/dvpp/DvppDec.cpp index 763ff93..a76a348 100644 --- a/src/dvpp/DvppDec.cpp +++ b/src/dvpp/DvppDec.cpp @@ -273,6 +273,7 @@ void DvppDec::decode_thread(){ // dvpp解码参数 CHECK_AND_RETURN_NOVALUE(aclrtSetCurrentContext(m_context), "aclrtSetCurrentContext failed"); + m_bExitReportThd = false; pthread_t report_thread; ret = pthread_create(&report_thread, nullptr, ReportThd, (void *)this); if(ret != 0){ @@ -286,50 +287,53 @@ void DvppDec::decode_thread(){ cout << "aclvdecCreateChannelDesc failed"; return; } - // 创建 channel dec结构体 - // 通道ID在dvpp层面为0~31 - CHECK_AND_RETURN_NOVALUE(aclvdecSetChannelDescChannelId(vdecChannelDesc, m_dvpp_channel), "aclvdecSetChannelDescChannelId failed"); - CHECK_AND_RETURN_NOVALUE(aclvdecSetChannelDescThreadId(vdecChannelDesc, report_thread), "aclvdecSetChannelDescThreadId failed"); - CHECK_AND_RETURN_NOVALUE(aclvdecSetChannelDescCallback(vdecChannelDesc, VdecCallback), "aclvdecSetChannelDescCallback failed"); - CHECK_AND_RETURN_NOVALUE(aclvdecSetChannelDescEnType(vdecChannelDesc, enType), "aclvdecSetChannelDescEnType failed"); - CHECK_AND_RETURN_NOVALUE(aclvdecSetChannelDescOutPicFormat(vdecChannelDesc, PIXEL_FORMAT_YUV_SEMIPLANAR_420), "aclvdecSetChannelDescOutPicFormat failed"); - CHECK_AND_RETURN_NOVALUE(aclvdecCreateChannel(vdecChannelDesc), "aclvdecCreateChannel failed"); - - uint64_t frame_count = 0; - bool bBreak = false; - while (m_bRunning) - { - int ret = sentFrame(vdecChannelDesc, frame_count); - if(ret == 2){ - break; - bBreak = true; - }else if(ret == 1){ - continue; - } - - frame_count++; - } - - // 尽量保证数据全部解码完成 - int sum = 0; - if(!bBreak){ - while(!m_pktQueueptr->isEmpty()){ + do{ + // 创建 channel dec结构体 + // 通道ID在dvpp层面为0~31 + CHECK_AND_BREAK(aclvdecSetChannelDescChannelId(vdecChannelDesc, m_dvpp_channel), "aclvdecSetChannelDescChannelId failed"); + CHECK_AND_BREAK(aclvdecSetChannelDescThreadId(vdecChannelDesc, report_thread), "aclvdecSetChannelDescThreadId failed"); + CHECK_AND_BREAK(aclvdecSetChannelDescCallback(vdecChannelDesc, VdecCallback), "aclvdecSetChannelDescCallback failed"); + CHECK_AND_BREAK(aclvdecSetChannelDescEnType(vdecChannelDesc, enType), "aclvdecSetChannelDescEnType failed"); + CHECK_AND_BREAK(aclvdecSetChannelDescOutPicFormat(vdecChannelDesc, PIXEL_FORMAT_YUV_SEMIPLANAR_420), "aclvdecSetChannelDescOutPicFormat failed"); + CHECK_AND_BREAK(aclvdecCreateChannel(vdecChannelDesc), "aclvdecCreateChannel failed"); + + uint64_t frame_count = 0; + bool bBreak = false; + while (m_bRunning) + { int ret = sentFrame(vdecChannelDesc, frame_count); if(ret == 2){ break; + bBreak = true; + }else if(ret == 1){ + continue; } - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - sum++; - if(sum > 40){ - // 避免卡死 - break; + + frame_count++; + } + + // 尽量保证数据全部解码完成 + 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); + + sendVdecEos(vdecChannelDesc); - CHECK_NOT_RETURN(aclvdecDestroyChannel(vdecChannelDesc), "aclvdecDestroyChannel failed"); + CHECK_NOT_RETURN(aclvdecDestroyChannel(vdecChannelDesc), "aclvdecDestroyChannel failed"); + }while(0); + CHECK_NOT_RETURN(aclvdecDestroyChannelDesc(vdecChannelDesc), "aclvdecDestroyChannelDesc failed"); // report_thread 需后于destroy退出