From b070c0fde045ac35b70e8e247273ed1f654b0c4f Mon Sep 17 00:00:00 2001 From: cmhu <2657262686@qq.com> Date: Tue, 12 Sep 2023 08:52:36 +0000 Subject: [PATCH] 修正m_recoderinfo_list的size为1时pop后会导致崩溃的问题 --- src/decoder/dvpp/FFRecoderTaskManager.cpp | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------- 1 file changed, 63 insertions(+), 55 deletions(-) diff --git a/src/decoder/dvpp/FFRecoderTaskManager.cpp b/src/decoder/dvpp/FFRecoderTaskManager.cpp index f739c24..8e20e5d 100644 --- a/src/decoder/dvpp/FFRecoderTaskManager.cpp +++ b/src/decoder/dvpp/FFRecoderTaskManager.cpp @@ -180,72 +180,80 @@ void FFRecoderTaskManager::recode_thread() { auto it_param = m_recoderinfo_list.begin(); RecoderInfo recoderinfo = *it_param; - m_recoderinfo_list.pop_front(); m_recoderinfo_list_mtx.unlock(); - auto it_data = getStartIterator(recoderinfo.frame_nb); - if(it_data == m_pkt_list.end()) { - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - continue; - } + do + { + auto it_data = getStartIterator(recoderinfo.frame_nb); + if(it_data == m_pkt_list.end()) { + std::this_thread::sleep_for(std::chrono::milliseconds(3)); + break; + } - LOG_INFO("start frame_nb: {}", (*it_data)->frame_nb); + LOG_INFO("start frame_nb: {}", (*it_data)->frame_nb); - m_pkt_list_mtx.lock(); - 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(); - } - m_pkt_list_mtx.unlock(); + m_pkt_list_mtx.lock(); + 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(); + } + m_pkt_list_mtx.unlock(); - string file_name = recoderinfo.recoderPath; - - FFRecoder ffrecoder; - bool bInit = ffrecoder.init(m_inStream, m_avctx, file_name.c_str()); - if (!bInit) { - LOG_ERROR("ffrecoder init error : {} {} {}", recoderinfo.task_id, recoderinfo.object_id, recoderinfo.frame_nb); - ffrecoder.uninit(); - continue; - } - LOG_DEBUG("record start, pkt_list size: {} task_id: {} object_id:{} frame_nb: {}", m_pkt_list.size(), recoderinfo.task_id, recoderinfo.object_id, recoderinfo.frame_nb); - - int count = 0; - auto it_save = it_data; - unsigned long long start_frame_nb = (*it_data)->frame_nb; - unsigned long long end_frame_nb = (*it_data)->frame_nb; - for (; it_save != m_pkt_list.end() && count < 500; ++it_save) { - DataPacket* dataPkt = *it_save; - if(dataPkt->frame_nb > recoderinfo.frame_nb) { + string file_name = recoderinfo.recoderPath; + + FFRecoder ffrecoder; + bool bInit = ffrecoder.init(m_inStream, m_avctx, file_name.c_str()); + if (!bInit) { + LOG_ERROR("ffrecoder init error : {} {} {}", recoderinfo.task_id, recoderinfo.object_id, recoderinfo.frame_nb); + ffrecoder.uninit(); 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", recoderinfo.task_id); - continue; + LOG_DEBUG("record start, pkt_list size: {} task_id: {} object_id:{} frame_nb: {}", m_pkt_list.size(), recoderinfo.task_id, recoderinfo.object_id, recoderinfo.frame_nb); + + int count = 0; + auto it_save = it_data; + unsigned long long start_frame_nb = (*it_data)->frame_nb; + unsigned long long end_frame_nb = (*it_data)->frame_nb; + for (; it_save != m_pkt_list.end() && count < 500; ++it_save) { + DataPacket* dataPkt = *it_save; + 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", recoderinfo.task_id); + continue; + } + + ffrecoder.write_pkt(pkt); + count++; + end_frame_nb = (*it_save)->frame_nb; } - - ffrecoder.write_pkt(pkt); - count++; - end_frame_nb = (*it_save)->frame_nb; - } - ffrecoder.flush_pkt(); - ffrecoder.uninit(); + ffrecoder.flush_pkt(); + ffrecoder.uninit(); - // 发送mq消息 - if(mq_publish_func && recoderinfo.mq_info.length() > 0) { - mq_publish_func(recoderinfo.mq_info.c_str()); - // LOG_INFO("record save: {}", recoderinfo.mq_info.c_str()); - } + // 发送mq消息 + if(mq_publish_func && recoderinfo.mq_info.length() > 0) { + mq_publish_func(recoderinfo.mq_info.c_str()); + // LOG_INFO("record save: {}", recoderinfo.mq_info.c_str()); + } - LOG_INFO("record end, total save: {} start_frame_nb: {} end_frame_nb: {} file_path: {}", count, start_frame_nb, end_frame_nb, file_name); + LOG_INFO("record end, total save: {} start_frame_nb: {} end_frame_nb: {} file_path: {}", count, start_frame_nb, end_frame_nb, file_name); + } while (0); + + // m_recoderinfo_list 为空会触发 m_pkt_list size 大于1000时的删除操作, + // 因此应当在本次m_pkt_list操作都完成之后再pop,避免这边在用m_pkt_list, 另一边在删除,从而导致崩溃 + m_recoderinfo_list_mtx.lock(); + m_recoderinfo_list.pop_front(); + m_recoderinfo_list_mtx.unlock(); } LOG_INFO("recode_thread end."); -- libgit2 0.21.4