diff --git a/src/ai_engine_module/road_seg_correlation_algor.cpp b/src/ai_engine_module/road_seg_correlation_algor.cpp index c12100b..472b834 100644 --- a/src/ai_engine_module/road_seg_correlation_algor.cpp +++ b/src/ai_engine_module/road_seg_correlation_algor.cpp @@ -234,7 +234,8 @@ namespace ai_engine_module int deg1 = atan2(car_toward.y, car_toward.x) * 180 / Pi; // 返回与x轴的夹角 int deg_std = atan2(std_toward.y, std_toward.x) * 180 / Pi; int deg_diff = abs(deg1 - deg_std); - if (deg_diff < 135) { return false; } + // if (deg_diff < 135) { return false; } + if (abs(deg_std) < 30 || abs(deg_std) > 150 || deg_diff < 135) return false; // 过滤横向绿化带 else { /*std::cout << flag1 << " " << flag2 << std::endl;*/ return true; } } diff --git a/src/ai_engine_module/traffic_light_process.cpp b/src/ai_engine_module/traffic_light_process.cpp index 75d2140..d0dcc65 100644 --- a/src/ai_engine_module/traffic_light_process.cpp +++ b/src/ai_engine_module/traffic_light_process.cpp @@ -5,9 +5,8 @@ #include "../common/logger.hpp" #include "../ai_platform/mvpt_process_assist.h" -#if 0 +#if 1 #include "opencv2/opencv.hpp" -#include "opencv2/imgcodecs/legacy/constants_c.h" #endif namespace ai_engine_module @@ -39,6 +38,7 @@ namespace ai_engine_module bool is_valid_box(const int top, const int left, const int right, const int bottom, const float score, const algorithm_type_t &algor_type, + const int src_img_w, const int src_img_h, const task_param_manager::algo_param_type_t_ *params_ptr = nullptr) { if (!params_ptr) return false; @@ -49,10 +49,10 @@ namespace ai_engine_module if (params_ptr->algor_param == nullptr) return false; - - const unsigned width = right - left; - const unsigned height = bottom - top; - + float scale_w = src_img_w / 1920.0; + float scale_h = src_img_h / 1080.0; + const unsigned width = (right - left) / scale_w; //归一化为1080p下的宽高,用于大小过滤(尺寸阈值按1080p设置) + const unsigned height = (bottom - top) / scale_h; if (width == 0 || height == 0) return false; @@ -126,6 +126,98 @@ namespace ai_engine_module return (nCross % 2 == 1); } + float contourArea(const vector& polygon, cv::Point2f* quad_point) { + std::vector contour; + for (int i = 0; i < polygon.size(); ++i) { + cv::Point tmp_p; tmp_p.x = polygon[i].x; tmp_p.y = polygon[i].y; + contour.push_back(tmp_p); + } + cv::Point2f rect_point[4]; + cv::RotatedRect rect = cv::minAreaRect(contour); // 最小外接矩形 rect[0]中心点 rect[1]宽 高 rect[2]旋转角度 + rect.points(rect_point); // 求外接矩形顶点坐标,顺时针依次为box[0] box[1] box[2] box[3], -45 <= angle <= 0:box[0]在左下角; angle > 45:box[0]在右下角 + + // 根据外接矩形求外接四边形(有可能求出三角形):取距矩形顶点近的4个点 + for (int k = 0; k < 4; k ++) { + quad_point[k] = rect_point[k]; + float sum_min_dist = 100000; + for (int j = 0; j < polygon.size(); ++j) { + float t_diff_x = polygon[j].x - rect_point[k].x, t_diff_y = polygon[j].y - rect_point[k].y; + float temp_dist = sqrt(t_diff_x * t_diff_x + t_diff_y * t_diff_y); + float temp_min_dist = temp_dist + 3*fabs(t_diff_y); //提高纵坐标的权重 + if (temp_min_dist < sum_min_dist) { + quad_point[k].x = polygon[j].x; quad_point[k].y = polygon[j].y; + sum_min_dist = temp_min_dist; + } + } + } + return fabs(rect.angle); + } + + // 与0作比较,小于精度则认为是和0相等,返回0 1 -1 + int cmpzero(double d) { return (fabs(d) < PRECISION)? 0: (d > 0? 1:-1); } + + // 向量叉积 + double cross_det(double x1, double y1, double x2, double y2) { return x1*y2 - x2*y1; } + + // 判断是否在区域两侧 + bool inBothSidesOfArea(tr_point curpos, cv::Point2f* boxPoints, float angle) { + // 根据叉积判断目标相对于区域边界的位置,大于0:左 小于0:右 等于0:共线 (左侧/右侧和向量起始方向有关,当前设定的起始方向是y小的那侧) + if (angle > 45) { + // 左边界 + int l_flag = cmpzero(cross_det(boxPoints[1].x-boxPoints[2].x, boxPoints[1].y-boxPoints[2].y, curpos.x-boxPoints[2].x, curpos.y-boxPoints[2].y)); + // 右边界 + int r_flag = cmpzero(cross_det(boxPoints[0].x-boxPoints[3].x, boxPoints[0].y-boxPoints[3].y, curpos.x-boxPoints[0].x, curpos.y-boxPoints[3].y)); + if (l_flag > 0 || r_flag < 0) return true; + } + else { + // 左边界 + int l_flag = cmpzero(cross_det(boxPoints[0].x-boxPoints[1].x, boxPoints[0].y-boxPoints[1].y, curpos.x-boxPoints[1].x, curpos.y-boxPoints[1].y)); + // 右边界 + int r_flag = cmpzero(cross_det(boxPoints[3].x-boxPoints[2].x, boxPoints[3].y-boxPoints[2].y, curpos.x-boxPoints[2].x, curpos.y-boxPoints[2].y)); + if (l_flag > 0 || r_flag < 0) return true; + } + + return false; + } + + // 判断目标是否在区域两侧且轨迹为南北走向 + bool inBothSidesOfAreaV2(tr_point curpos, cv::Point2f* boxPoints, float angle, const vector& tracker_list, int check_frames) { + int trackcnt = tracker_list.size(); + tr_point p_start, p_end; + p_start.x = tracker_list[trackcnt-check_frames-1].x_; p_start.y = tracker_list[trackcnt-check_frames-1].y_; + p_end.x = tracker_list[trackcnt-1].x_; p_end.y = tracker_list[trackcnt-1].y_; + + // 目标方向 + tr_point obj_toward; + obj_toward.x = p_end.x - p_start.x; + obj_toward.y = p_end.y - p_start.y; + + // 根据叉积判断目标相对于区域边界的位置,大于0:左 小于0:右 等于0:共线 (左侧/右侧和向量起始方向有关,当前设定的起始方向是y小的那侧) + bool flag = false; + if (angle > 45) { + // 左边界 + int l_flag = cmpzero(cross_det(boxPoints[1].x-boxPoints[2].x, boxPoints[1].y-boxPoints[2].y, curpos.x-boxPoints[2].x, curpos.y-boxPoints[2].y)); + // 右边界 + int r_flag = cmpzero(cross_det(boxPoints[0].x-boxPoints[3].x, boxPoints[0].y-boxPoints[3].y, curpos.x-boxPoints[0].x, curpos.y-boxPoints[3].y)); + if (l_flag > 0 || r_flag < 0) flag = true; + } + else { + // 左边界 + int l_flag = cmpzero(cross_det(boxPoints[0].x-boxPoints[1].x, boxPoints[0].y-boxPoints[1].y, curpos.x-boxPoints[1].x, curpos.y-boxPoints[1].y)); + // 右边界 + int r_flag = cmpzero(cross_det(boxPoints[3].x-boxPoints[2].x, boxPoints[3].y-boxPoints[2].y, curpos.x-boxPoints[2].x, curpos.y-boxPoints[2].y)); + if (l_flag > 0 || r_flag < 0) flag = true; + } + + if (flag) { + int deg = atan2(obj_toward.y, obj_toward.x) * 180 / Pi; // 返回轨迹与x轴的夹角 + if (abs(deg) < 30 || abs(deg) > 150) return false; + else return true; + } + + return false; + } + #if 0 void CvtYuvToBgr(sy_img src, sy_img dst) { const int uvStart = src.w_ * src.h_; @@ -239,7 +331,7 @@ namespace ai_engine_module return res; } - bool TrafficLightProcess::update_mstreams(const std::vector& taskIds, vector src_interest_imgs, vector vec_det_input_images, const std::vector &det_results) + bool TrafficLightProcess::update_mstreams(const std::vector& taskIds, vector src_interest_imgs, vector vec_det_input_images, const vector>>& traffic_region, const vector>& labels, map &m_total_obj_info, const std::vector &det_results) { if (!check_initied()) return false; @@ -275,6 +367,22 @@ namespace ai_engine_module int src_img_w = src_img->getWidth(); int src_img_h = src_img->getHeight(); + auto seg_regions = traffic_region[n]; + auto seg_labels = labels[n]; + vector> crosswalk_regions; //人行道区域 + vector> interestion_regions; //十字路口区域 + for (unsigned i = 0; i < seg_labels.size(); ++i) { + const seg_label_t seg_label = static_cast(seg_labels[i]); + if ((seg_label == seg_label_t::crosswalk)) { + vector cur_region(seg_regions[i].begin(),seg_regions[i].end()); + crosswalk_regions.push_back(cur_region); + } + if ((seg_label == seg_label_t::interestion_area)) { + vector cur_region(seg_regions[i].begin(),seg_regions[i].end()); + interestion_regions.push_back(cur_region); + } + } + auto& boxes_of_one_image = det_results[n].obj; for (int i = 0; i < det_results[n].obj_count; ++i) { @@ -301,17 +409,43 @@ namespace ai_engine_module continue; } - if (!is_valid_box(top, left, right, bottom, box.confidence, algor_type, algor_param_wrap)) + if (!is_valid_box(top, left, right, bottom, box.confidence, algor_type, src_img_w, src_img_h, algor_param_wrap)) continue; //DEBUG增加多边形区域选择及判断================================================================ tr_point curpos; curpos.x = (left + right) * 0.5; curpos.y = bottom; +#if 0 vector args = {1552,435,1756,537,1915,537,1915,499,1725,435}; //区域(泰兴黄桥锦润福府路口) // vector args = {0,0,0,1080,1920,1080,1920,0}; //区域 vector tr_boxes = Mbuild_area(args); int cur_flag = McheckPointPolygon(tr_boxes, curpos); //cur_flag==true表示在区域内 if (!cur_flag) continue; +#else + // 目标在人行道区域且在十字路口区域的左侧或右侧---->只判南北向 + int check_frames = 5; //1s 25 + OBJ_KEY trace_obj_key = {taskId, box.id}; + if (m_total_obj_info[trace_obj_key].center_points.size() < check_frames) continue; //忽略太短的轨迹 + bool interestion_flag = false; + for (auto region : interestion_regions) { + vector tr_boxes = Mbuild_area(region); + vector boxPoints; + cv::Point2f quad_point[4]; + float angle = contourArea(tr_boxes, quad_point); + // interestion_flag = inBothSidesOfArea(curpos, quad_point, angle); + interestion_flag = inBothSidesOfAreaV2(curpos, quad_point, angle, m_total_obj_info[trace_obj_key].center_points, check_frames); //判断轨迹是否是南北向 + if (interestion_flag) break; + } + if (!interestion_flag) continue; + + bool cur_flag = false; + for (auto region : crosswalk_regions) { + vector tr_boxes = Mbuild_area(region); + cur_flag = McheckPointPolygon(tr_boxes, curpos); //cur_flag==true表示在区域内 + if (cur_flag) break; + } + if (!cur_flag) continue; +#endif //DEBUG END================================================================================== stream_idx_and_algor_seq.algors.emplace(algor_type); } @@ -399,7 +533,7 @@ namespace ai_engine_module const label_t label = static_cast(box.index); if (!is_valid_label(label)) continue; - if (box.left < 1200 || box.top < 159 || box.right > 1307 || box.bottom > 212) continue; // 限制红绿灯的出现位置(泰兴黄桥锦润福府路口) + // if (box.left < 1200 || box.top < 159 || box.right > 1307 || box.bottom > 212) continue; // 限制红绿灯的出现位置(泰兴黄桥锦润福府路口) LOG_TRACE("task id is {} obj_id {} label {} index {} score {}", task_id, objId, label, box.index, box.confidence); red_cnt ++; } diff --git a/src/ai_engine_module/traffic_light_process.h b/src/ai_engine_module/traffic_light_process.h index 466b26c..5e845b4 100644 --- a/src/ai_engine_module/traffic_light_process.h +++ b/src/ai_engine_module/traffic_light_process.h @@ -15,6 +15,8 @@ #define IMAGE_CROP_EXPAND_RATIO 0 #define MAX_OBJ_BOX_COUNT 100 #define MAX_LANE_NUM 100 +#define PRECISION 1e-8 +#define Pi 3.14159265358979 namespace ai_engine_module { @@ -42,6 +44,22 @@ namespace ai_engine_module no = 12, //灭灯 }; + enum class seg_label_t { + PLACEHOLDER = -1, + background = 0, //背景 + vehicle_lanes = 1, //机动车道 + nonvehicle_lanes = 2, //非机动车道 + emerg_lanes = 3, //应急车道 + guide_line = 4, //导流线 + crosswalk = 5, //人行横道 + no_parking_area = 6, //禁停区域 + interestion_area = 7, //十字路口区域 + yellow_solidline = 8, //黄实线 + white_solidline = 9, //白实线 + white_dottedline = 10, //虚线 + yellow_dottedline = 11, //黄虚线 + }; + typedef struct input_data_wrap_t { id_t id; @@ -99,7 +117,8 @@ namespace ai_engine_module bool check_initied(); bool init(int gpu_id, string models_dir); - bool update_mstreams(const std::vector& taskIds, vector src_interest_imgs, vector vec_det_input_images, const std::vector &det_results); + // bool update_mstreams(const std::vector& taskIds, vector src_interest_imgs, vector vec_det_input_images, const std::vector &det_results); + bool update_mstreams(const std::vector& taskIds, vector src_interest_imgs, vector vec_det_input_images, const vector>>& traffic_region, const vector>& labels, map &m_total_obj_info, const std::vector &det_results); std::shared_ptr get_result_by_objectid(const id_t& id, bool do_erase = true); void force_release_result(const task_id_t& task_id); diff --git a/src/ai_platform/MultiSourceProcess.cpp b/src/ai_platform/MultiSourceProcess.cpp index 2e9ad81..24682ff 100755 --- a/src/ai_platform/MultiSourceProcess.cpp +++ b/src/ai_platform/MultiSourceProcess.cpp @@ -462,7 +462,7 @@ bool CMultiSourceProcess::AddTask(task_param _cur_task_param){ // if(algor_face != algor_map->end()){ // const algor_basic_config_param_t *cur_param = ((algor_init_config_param_t *)(algor_face->second))->basic_param; // LOG_INFO("face_snapshot, result_folder: {} result_folder_little: {}", cur_param->result_folder, cur_param->result_folder_little); - // } + // } } LOG_INFO("started task {} successed!", config.name); @@ -470,6 +470,11 @@ bool CMultiSourceProcess::AddTask(task_param _cur_task_param){ return true; } +int CMultiSourceProcess::CountRunningTask() { + DecoderManager* pDecManager = DecoderManager::getInstance(); + return pDecManager->count(); +} + bool CMultiSourceProcess::task_has_vpt_algor(const std::string &task_id){ //! TODO: create enum iterator. auto algor_map = m_task_param_manager->get_task_other_param(task_id); @@ -684,6 +689,11 @@ void CMultiSourceProcess::CloseAllTask(){ LOG_INFO("CloseAllTask exit."); } +void CMultiSourceProcess::CloseAllTask2() { + DecoderManager* pDecManager = DecoderManager::getInstance(); + pDecManager->closeAllDecoder(); +} + void CMultiSourceProcess::clear_finished_task(){// 清理已经结束的任务 std::lock_guard l1(m_FinishedTaskMtx); @@ -720,6 +730,12 @@ bool CMultiSourceProcess::finish_task(const string taskID, const bool delete_sna // 任务结束,关闭跟踪 if (!vpt_process.finishTaskTracker(taskID)) LOG_ERROR("Finish VPT Tracker failed, task_id: {}", taskID); + +#ifdef WITH_FACE_DET_SS + // 人脸任务结束 + if (task_has_face_algor(taskID)) + m_face_det_ai_engine.finish_task(taskID); +#endif #ifdef POST_USE_RABBITMQ { @@ -897,7 +913,7 @@ int CMultiSourceProcess::algorthim_process_thread(){ } aclrtDestroyContext(ctx); - + aclrtResetDevice(m_devId); LOG_INFO("algorthim_process_thread exit."); return 0; @@ -1595,6 +1611,8 @@ void CMultiSourceProcess::algorithm_traffic_light_process(vector& vpt_in vector interest_vpt_result; vector interest_imgs; vector sy_interest_imgs; + vector>> interest_traffic_region; + vector> interest_labels; int _idx = 0; for (auto _task_id_iter = vpt_interest_task_id.begin(); _task_id_iter != vpt_interest_task_id.end(); @@ -1605,6 +1623,15 @@ void CMultiSourceProcess::algorithm_traffic_light_process(vector& vpt_in if (algor_map->find(algorithm_type_t::PERSON_RUNNING_REDLIGHTS) != algor_map->end() || algor_map->find(algorithm_type_t::NONMOTOR_RUNNING_REDLIGHTS) != algor_map->end()) { + + m_RoadSegTaskMtx.lock(); + if (!m_RoadSegTaskMap[task_id].isseg) continue; + else { + interest_traffic_region.push_back(m_RoadSegTaskMap[task_id].traffic_region); + interest_labels.push_back(m_RoadSegTaskMap[task_id].labels); + } + m_RoadSegTaskMtx.unlock(); + DeviceMemory* mem = vpt_interest_imgs[_idx]; sy_img img; img.w_ = mem->getWidth(); img.h_ = mem->getHeight(); @@ -1618,7 +1645,9 @@ void CMultiSourceProcess::algorithm_traffic_light_process(vector& vpt_in } if (!interest_imgs.empty()){ - traffic_lightprocess_.update_mstreams(interest_task_id, sy_interest_imgs, interest_imgs, interest_vpt_result); + m_TotalObjMtx.lock(); + traffic_lightprocess_.update_mstreams(interest_task_id, sy_interest_imgs, interest_imgs, interest_traffic_region, interest_labels, m_total_obj_info, interest_vpt_result); + m_TotalObjMtx.unlock(); } } @@ -2274,4 +2303,4 @@ bool CMultiSourceProcess::CheckTime() { { return false; } -} +} \ No newline at end of file diff --git a/src/ai_platform/MultiSourceProcess.h b/src/ai_platform/MultiSourceProcess.h index d59e411..9d9407f 100755 --- a/src/ai_platform/MultiSourceProcess.h +++ b/src/ai_platform/MultiSourceProcess.h @@ -46,6 +46,9 @@ public: bool FinishTask(const string taskID); void CloseAllTask(); int SnapShot(task_param param); + int CountRunningTask(); + + void CloseAllTask2(); #ifdef POST_USE_RABBITMQ int AddMqConn(mq_type_t mq_type, rabbitmq_conn_params_t mq_conn_param); diff --git a/src/ai_platform/stl_aiplatform.cpp b/src/ai_platform/stl_aiplatform.cpp index df41d35..9804a0f 100755 --- a/src/ai_platform/stl_aiplatform.cpp +++ b/src/ai_platform/stl_aiplatform.cpp @@ -95,6 +95,17 @@ int tsl_aiplatform_release(void **handle) return SUCCESS; } +int count_running_task(void *handle) +{ + CMultiSourceProcess* tools = (CMultiSourceProcess*)handle; + return tools->CountRunningTask(); +} + +void close_all_task(void *handle) +{ + CMultiSourceProcess* tools = (CMultiSourceProcess*)handle; + tools->CloseAllTask2(); +} const char* get_tsl_aiplatform_version() { diff --git a/src/ai_platform/stl_aiplatform.h b/src/ai_platform/stl_aiplatform.h index 99d6dc6..79847fe 100755 --- a/src/ai_platform/stl_aiplatform.h +++ b/src/ai_platform/stl_aiplatform.h @@ -120,6 +120,11 @@ extern "C" TSL_AIPLATFORM_API int tsl_aiplatform_release(void **handle); + TSL_AIPLATFORM_API int count_running_task(void *handle); + + TSL_AIPLATFORM_API void close_all_task(void *handle); + + /************************************************************************* * FUNCTION: get_tsl_aiplatform_version * PURPOSE: 获取SDK版本号 @@ -129,4 +134,4 @@ extern "C" *************************************************************************/ TSL_AIPLATFORM_API const char* get_tsl_aiplatform_version(); } -#endif +#endif \ No newline at end of file diff --git a/src/decoder/dvpp/DvppDataMemory.hpp b/src/decoder/dvpp/DvppDataMemory.hpp index e8e32bc..ba26cc1 100755 --- a/src/decoder/dvpp/DvppDataMemory.hpp +++ b/src/decoder/dvpp/DvppDataMemory.hpp @@ -25,7 +25,7 @@ public: ~DvppDataMemory(){ if (pHwRgb) { - int ret = acldvppFree((uint8_t*)pHwRgb); + int ret = acldvppFree(pHwRgb); if(ret != ACL_ERROR_NONE){ cout << "acldvppFree failed" << endl; } diff --git a/src/decoder/dvpp/DvppDecoder.cpp b/src/decoder/dvpp/DvppDecoder.cpp index e1ea7fb..b87d7e8 100755 --- a/src/decoder/dvpp/DvppDecoder.cpp +++ b/src/decoder/dvpp/DvppDecoder.cpp @@ -335,6 +335,7 @@ void DvppDecoder::read_thread() { int frame_count = 0; int ret = -1; + m_bExitDecodeThd = false; pthread_t m_decode_thread; pthread_create(&m_decode_thread,0, [](void* arg) @@ -429,8 +430,11 @@ void DvppDecoder::read_thread() { } } - m_bRunning=false; + while(m_bRunning && m_pktQueue.size() > 0) { + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + } + m_bExitDecodeThd = true; if(m_decode_thread != 0){ pthread_join(m_decode_thread,0); } @@ -444,6 +448,8 @@ void DvppDecoder::read_thread() { } m_pktQueue_mutex.unlock(); + m_bRunning=false; + if(decode_finished_cbk) { decode_finished_cbk(m_finishedDecArg); } @@ -618,6 +624,7 @@ void DvppDecoder::decode_thread(){ return; } + m_bExitDisplayThd = false; pthread_t display_thread; pthread_create(&display_thread,0, [](void* arg) @@ -655,7 +662,7 @@ void DvppDecoder::decode_thread(){ uint64_t frame_count = 0; bool bBreak = false; - while (m_bRunning) { + while (!m_bExitDecodeThd) { if (m_bPause){ std::this_thread::sleep_for(std::chrono::milliseconds(3)); continue; @@ -694,18 +701,26 @@ void DvppDecoder::decode_thread(){ CHECK_NOT_RETURN(aclvdecDestroyChannel(vdecChannelDesc), "aclvdecDestroyChannel failed"); }while(0); - - CHECK_NOT_RETURN(aclvdecDestroyChannelDesc(vdecChannelDesc), "aclvdecDestroyChannelDesc failed"); + // 退出 report thread + while(m_bRunning && m_vdecQueue.size() > 0) { + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + } + CHECK_NOT_RETURN(aclvdecDestroyChannelDesc(vdecChannelDesc), "aclvdecDestroyChannelDesc failed"); // report_thread 需后于destroy退出 - m_bRunning = false; m_bExitReportThd = true; - CHECK_NOT_RETURN(pthread_join(report_thread, nullptr), "pthread_join failed"); - CHECK_NOT_RETURN(pthread_join(display_thread, nullptr), "pthread_join failed"); + CHECK_NOT_RETURN(pthread_join(report_thread, nullptr), "report_thread join failed"); + + // 退出 display thread + while(m_bRunning && m_decoded_data_queue.size() > 0) { + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + } + m_bExitDisplayThd = true; + CHECK_NOT_RETURN(pthread_join(display_thread, nullptr), "display_thread join failed"); // 最后清理一遍未解码的数据 m_vdecQueue_mutex.lock(); - if(m_vdecQueue.size() > 0){ + while(m_vdecQueue.size() > 0){ void* inputData = m_vdecQueue.front(); acldvppFree(inputData); inputData = nullptr; @@ -872,7 +887,7 @@ bool DvppDecoder::sendVdecEos(aclvdecChannelDesc *vdecChannelDesc) { void DvppDecoder::display_thread(){ LOG_INFO("[{}]- display_thread start...", m_dec_name); - while(m_bRunning) { + while(!m_bExitDisplayThd) { m_decoded_data_queue_mtx.lock(); if(m_decoded_data_queue.size() <= 0) { m_decoded_data_queue_mtx.unlock(); @@ -898,7 +913,7 @@ void DvppDecoder::display_thread(){ mem = nullptr; } - LOG_INFO("[{}]- display_thread end.", m_dec_name); + LOG_INFO("[{}]- display_thread exit.", m_dec_name); } void DvppDecoder::release_dvpp(){ diff --git a/src/decoder/dvpp/DvppDecoder.h b/src/decoder/dvpp/DvppDecoder.h index 6a3e7c8..969248c 100755 --- a/src/decoder/dvpp/DvppDecoder.h +++ b/src/decoder/dvpp/DvppDecoder.h @@ -83,7 +83,10 @@ private: bool m_bFinished{false}; bool m_bRunning{false}; bool m_bPause{false}; + bool m_bExitReportThd{false}; + bool m_bExitDisplayThd{false}; + bool m_bExitDecodeThd{false}; // 读取数据 AVStream* stream{nullptr}; diff --git a/src/decoder/dvpp/FFRecoderTaskManager.cpp b/src/decoder/dvpp/FFRecoderTaskManager.cpp index 8e20e5d..7849618 100644 --- a/src/decoder/dvpp/FFRecoderTaskManager.cpp +++ b/src/decoder/dvpp/FFRecoderTaskManager.cpp @@ -92,8 +92,6 @@ void FFRecoderTaskManager::cache_pkt(AVPacket* pkt, long long frame_nb){ newDataPkt->pkt = new_pkt; newDataPkt->frame_nb = frame_nb; - m_pkt_list.emplace_back(newDataPkt); - if(is_key_frame(pkt)){ // 越来越大的值 newDataPkt->isKeyFrame = true; @@ -102,6 +100,8 @@ void FFRecoderTaskManager::cache_pkt(AVPacket* pkt, long long frame_nb){ newDataPkt->isKeyFrame = false; } + m_pkt_list.emplace_back(newDataPkt); + std::lock_guard l_info(m_recoderinfo_list_mtx); if(m_recoderinfo_list.size() <= 0){ // 没有任务的时候,维持500的长度 diff --git a/src/demo/demo.cpp b/src/demo/demo.cpp index fa94dbe..ef37edf 100755 --- a/src/demo/demo.cpp +++ b/src/demo/demo.cpp @@ -1105,11 +1105,11 @@ void test_gpu(int gpuID){ // createTask(handle, algor_vec, 1); // createTask(handle, algor_vec, 2); // createTask(handle, algor_vec, 3); - createTask(handle, algor_vec3, 4); - createTask(handle, algor_vec3, 5); - createTask(handle, algor_vec3, 6); - createTask(handle, algor_vec3, 7); - createTask(handle, algor_vec3, 8); + // createTask(handle, algor_vec3, 4); + // createTask(handle, algor_vec3, 5); + // createTask(handle, algor_vec3, 6); + // createTask(handle, algor_vec3, 7); + // createTask(handle, algor_vec3, 8); // createTask(handle, algor_vec3, 9); // createTask(handle, algor_vec3, 10); // createTask(handle, algor_vec3, 11); @@ -1129,12 +1129,46 @@ void test_gpu(int gpuID){ /* + createTask(handle, algor_vec, 0, false); + createTask(handle, algor_vec, 0, false); + createTask(handle, algor_vec, 0, false); + createTask(handle, algor_vec, 0, false); + createTask(handle, algor_vec, 0, false); + createTask(handle, algor_vec, 0, false); + createTask(handle, algor_vec, 2, false); + createTask(handle, algor_vec, 2, false); + createTask(handle, algor_vec, 2, false); + createTask(handle, algor_vec, 2, false); + createTask(handle, algor_vec, 2, false); + createTask(handle, algor_vec, 2, false); + +/* // test_snapshot(handle); sleep(60); //60s finish_task(handle, (char*)task_id2.data(), 0); finish_task(handle, (char*)task_id1.data(), 0); }*/ - while (getchar() != 'q'); + + char ch = 'a'; + while (ch != 'q') { + ch = getchar(); + switch (ch) + { + case 'a': + createTask(handle, algor_vec3, 4, false); + createTask(handle, algor_vec3, 5, false); + createTask(handle, algor_vec3, 6, false); + createTask(handle, algor_vec3, 7, false); + createTask(handle, algor_vec3, 8, false); + break; + case 'c': + close_all_task(handle); + break; + default: + break; + } + + } // finish_task(handle, (char*)task_id.data(), 0); @@ -1167,4 +1201,4 @@ int main(int argc, char *argv[]) { printf("Done.\n"); return 0; -} +} \ No newline at end of file