Commit 8dc2e2240e26fcbfce63b3482307387c6166ed79

Authored by Hu Chunming
1 parent 08c1b61e

根据解码用时优化数据送给解码器的频率,避免解码器内部占用过多的显存

src/decoder/dvpp/DvppDecoder.cpp
@@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
16 16
17 struct Vdec_CallBack_UserData { 17 struct Vdec_CallBack_UserData {
18 uint64_t frameId; 18 uint64_t frameId;
19 - unsigned long long frame_nb; 19 + uint64_t frame_nb;
20 long startTime; 20 long startTime;
21 long sendTime; 21 long sendTime;
22 DvppDecoder* self; 22 DvppDecoder* self;
@@ -49,7 +49,7 @@ static void VdecCallback(acldvppStreamDesc *input, acldvppPicDesc *output, void @@ -49,7 +49,7 @@ static void VdecCallback(acldvppStreamDesc *input, acldvppPicDesc *output, void
49 if(nullptr != userData){ 49 if(nullptr != userData){
50 DvppDecoder* self = userData->self; 50 DvppDecoder* self = userData->self;
51 if(self != nullptr){ 51 if(self != nullptr){
52 - self->doVdppVdecCallBack(input, output, userData->frame_nb); 52 + self->doVdppVdecCallBack(input, output, userData);
53 } 53 }
54 delete userData; 54 delete userData;
55 userData = nullptr; 55 userData = nullptr;
@@ -387,8 +387,8 @@ DeviceMemory* DvppDecoder::snapshot(){ @@ -387,8 +387,8 @@ DeviceMemory* DvppDecoder::snapshot(){
387 snapshot_mem = new DvppDataMemory(mem); 387 snapshot_mem = new DvppDataMemory(mem);
388 m_decoded_data_queue_mtx.unlock(); 388 m_decoded_data_queue_mtx.unlock();
389 389
390 - snap_count++;  
391 - LOG_INFO("[{}]- snap_count:{} ", m_dec_name, snap_count); 390 + // snap_count++;
  391 + // LOG_INFO("[{}]- snap_count:{} ", m_dec_name, snap_count);
392 break; 392 break;
393 } 393 }
394 394
@@ -518,6 +518,12 @@ void DvppDecoder::read_thread() { @@ -518,6 +518,12 @@ void DvppDecoder::read_thread() {
518 m_recoderManager.cache_pkt(pkt, frame_nb); 518 m_recoderManager.cache_pkt(pkt, frame_nb);
519 #endif 519 #endif
520 nSended = sendPkt(vdecChannelDesc, pkt, frame_nb); 520 nSended = sendPkt(vdecChannelDesc, pkt, frame_nb);
  521 +
  522 + if(!m_bReal && frame_nb > 20 && m_avg_decode_time > 0)
  523 + {
  524 + // 针对文件,根据解码时间做延时,避免占用过多显存
  525 + std::this_thread::sleep_for(std::chrono::milliseconds(10));
  526 + }
521 } 527 }
522 528
523 if(nSended < 0) { 529 if(nSended < 0) {
@@ -542,8 +548,6 @@ void DvppDecoder::read_thread() { @@ -542,8 +548,6 @@ void DvppDecoder::read_thread() {
542 548
543 } while (0); 549 } while (0);
544 550
545 - LOG_INFO("[{}]- release.", m_dec_name);  
546 -  
547 if (vdecChannelDesc) { 551 if (vdecChannelDesc) {
548 CHECK_NOT_RETURN(aclvdecDestroyChannel(vdecChannelDesc), "aclvdecDestroyChannel failed"); 552 CHECK_NOT_RETURN(aclvdecDestroyChannel(vdecChannelDesc), "aclvdecDestroyChannel failed");
549 CHECK_NOT_RETURN(aclvdecDestroyChannelDesc(vdecChannelDesc), "aclvdecDestroyChannelDesc failed"); 553 CHECK_NOT_RETURN(aclvdecDestroyChannelDesc(vdecChannelDesc), "aclvdecDestroyChannelDesc failed");
@@ -691,10 +695,31 @@ void DvppDecoder::doProcessReport(){ @@ -691,10 +695,31 @@ void DvppDecoder::doProcessReport(){
691 LOG_INFO("doProcessReport exit."); 695 LOG_INFO("doProcessReport exit.");
692 } 696 }
693 697
694 -void DvppDecoder::doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *output, unsigned long long frame_nb){ 698 +void DvppDecoder::doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *output, void *pUserData){
  699 +
  700 + if(nullptr == pUserData){
  701 + return;
  702 + }
  703 +
  704 + Vdec_CallBack_UserData *userData = (Vdec_CallBack_UserData *) pUserData;
  705 + uint64_t frame_nb = userData->frame_nb;
695 706
696 m_out_count++; 707 m_out_count++;
697 708
  709 + if (m_out_count % 20 == 0)
  710 + {
  711 + m_decode_20_time -= m_avg_decode_time*20; // 减去等待用的时间就是实际解码用时
  712 + m_avg_decode_time = m_decode_20_time / 20;
  713 + // LOG_INFO("[{}]- m_avg_decode_time: {}", m_dec_name, m_avg_decode_time);
  714 + if (m_avg_decode_time <= 0) {
  715 + m_avg_decode_time = 1;
  716 + }
  717 + m_decode_20_time = 0;
  718 + }
  719 + m_decode_20_time += UtilTools::get_cur_time_ms() - userData->sendTime;
  720 + // LOG_INFO("[{}]- m_decode_20_time: {}", m_dec_name, m_decode_20_time);
  721 +
  722 +
698 CHECK_AND_RETURN_NOVALUE(aclrtSetCurrentContext(m_context), "aclrtSetCurrentContext failed"); 723 CHECK_AND_RETURN_NOVALUE(aclrtSetCurrentContext(m_context), "aclrtSetCurrentContext failed");
699 724
700 void *inputDataDev = acldvppGetStreamDescData(input); 725 void *inputDataDev = acldvppGetStreamDescData(input);
src/decoder/dvpp/DvppDecoder.h
@@ -59,7 +59,7 @@ public: @@ -59,7 +59,7 @@ public:
59 void set_mq_callback(mq_callback_t cb); 59 void set_mq_callback(mq_callback_t cb);
60 60
61 public: 61 public:
62 - void doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *output, unsigned long long frame_nb); 62 + void doVdppVdecCallBack(acldvppStreamDesc *input, acldvppPicDesc *output, void *pUserData);
63 void doProcessReport(); 63 void doProcessReport();
64 64
65 private: 65 private:
@@ -124,6 +124,9 @@ private: @@ -124,6 +124,9 @@ private:
124 124
125 long long last_ts {0}; 125 long long last_ts {0};
126 126
127 - int m_in_count {0};  
128 - int m_out_count {0}; 127 + uint64_t m_in_count {0};
  128 + uint64_t m_out_count {0};
  129 +
  130 + int m_avg_decode_time{1};
  131 + int m_decode_20_time{0};
129 }; 132 };
130 \ No newline at end of file 133 \ No newline at end of file
src/demo/demo.cpp
@@ -63,9 +63,10 @@ void init_mq_conn(void *handle) { @@ -63,9 +63,10 @@ void init_mq_conn(void *handle) {
63 #endif // #ifdef POST_USE_RABBITMQ 63 #endif // #ifdef POST_USE_RABBITMQ
64 64
65 void set_task_params(task_param &tparam, const unsigned &idx, const algorithm_type_t &algor_type) { 65 void set_task_params(task_param &tparam, const unsigned &idx, const algorithm_type_t &algor_type) {
66 - switch (algor_type) {  
67 auto algor_init_params = new algor_init_config_param_t; 66 auto algor_init_params = new algor_init_config_param_t;
68 67
  68 + switch (algor_type) {
  69 +
69 case algorithm_type_t::NONMOTOR_VEHICLE_NOHELMET: { 70 case algorithm_type_t::NONMOTOR_VEHICLE_NOHELMET: {
70 auto algor_params = new algor_config_param_manned_incident; 71 auto algor_params = new algor_config_param_manned_incident;
71 { 72 {
@@ -1135,7 +1136,7 @@ void test_gpu(int gpuID){ @@ -1135,7 +1136,7 @@ void test_gpu(int gpuID){
1135 // createTask(handle, algor_vec, 20, false); 1136 // createTask(handle, algor_vec, 20, false);
1136 // createTask(handle, algor_vec, 20, false); 1137 // createTask(handle, algor_vec, 20, false);
1137 // createTask(handle, algor_vec, 20, false); 1138 // createTask(handle, algor_vec, 20, false);
1138 - // createTask(handle, algor_vec, 0); 1139 + createTask(handle, algor_vec, 0);
1139 // createTask(handle, algor_vec, 1); 1140 // createTask(handle, algor_vec, 1);
1140 // createTask(handle, algor_vec, 2); 1141 // createTask(handle, algor_vec, 2);
1141 // createTask(handle, algor_vec, 3); 1142 // createTask(handle, algor_vec, 3);
@@ -1189,9 +1190,9 @@ void test_gpu(int gpuID){ @@ -1189,9 +1190,9 @@ void test_gpu(int gpuID){
1189 switch (ch) 1190 switch (ch)
1190 { 1191 {
1191 case 'a': 1192 case 'a':
1192 - createTask(handle, algor_vec3, 4, false); 1193 + // createTask(handle, algor_vec3, 4, false);
1193 // createTask(handle, algor_vec3, 5, false); 1194 // createTask(handle, algor_vec3, 5, false);
1194 - createTask(handle, algor_vec3, 6, false); 1195 + // createTask(handle, algor_vec3, 6, false);
1195 // createTask(handle, algor_vec3, 7, false); 1196 // createTask(handle, algor_vec3, 7, false);
1196 // createTask(handle, algor_vec3, 8, false); 1197 // createTask(handle, algor_vec3, 8, false);
1197 break; 1198 break;