#include "save_snapshot_reprocessing.h" #include #include "opencv2/opencv.hpp" #include #include #include "../common/logger.hpp" #include "../util/vpc_util.h" const bool DRAW_ON_IMG = false; int save_img_thread_process(void* param) { save_snapshot_reprocessing *pThreadParam = (save_snapshot_reprocessing *)param; if (pThreadParam != nullptr){ pThreadParam->save_img_process(); } return 0; } // 初始化快照保存模块 开启图片保存线程 save_snapshot_reprocessing::save_snapshot_reprocessing(int devId) { bFinish = false; m_save_img_thread = std::thread(save_img_thread_process, this); m_devId = devId; jpegUtil.jpeg_init(m_devId); } save_snapshot_reprocessing::~save_snapshot_reprocessing(){ // 结束线程 bFinish = true; m_save_img_thread.join(); jpegUtil.jpeg_release(); release(); } // 释放资源 void save_snapshot_reprocessing::release() { std::unique_lock l(waitforsave_img_queue_mutex); while (!waitforsave_img_queue.empty()) { ImgSaveInfo cur_image = waitforsave_img_queue.front(); waitforsave_img_queue.pop(); if(!cur_image.file_path.empty()){ VPCUtil::vpc_img_release(cur_image.img_info); } } l.unlock(); } void save_snapshot_reprocessing::reprocessing_process_wo_locus_async(ImgSaveInfo saveInfo){ while(!bFinish){ waitforsave_img_queue_mutex.lock(); if(waitforsave_img_queue.size() > 100){ waitforsave_img_queue_mutex.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(5)); continue; } waitforsave_img_queue.push(saveInfo); waitforsave_img_queue_mutex.unlock(); break; } } void save_snapshot_reprocessing::save_img_process() { while (true) { if (bFinish){ break; } std::unique_lock l(waitforsave_img_queue_mutex); if (!waitforsave_img_queue.empty()) { LOG_DEBUG("waitforsave_image_queue size: {}", waitforsave_img_queue.size()); ImgSaveInfo cur_image = waitforsave_img_queue.front(); waitforsave_img_queue.pop(); l.unlock(); bool bSaved = false; if(!cur_image.file_path.empty()){ bSaved = jpegUtil.jpeg_encode(cur_image.img_info.pic_desc, cur_image.file_path); if(!bSaved){ LOG_ERROR("jpeg_encode failed"); } } VPCUtil::vpc_img_release(cur_image.img_info); } else { l.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(2)); } } }