Commit efd35d36560a31fd63fc091433026cec9eccefd4

Authored by Hu Chunming
1 parent b092645e

pkt释放移到recoder里面,尝试修复encoder的时候data为null的问题

src/decoder/dvpp/DvppDecoder.cpp
@@ -544,8 +544,6 @@ void DvppDecoder::read_thread() { @@ -544,8 +544,6 @@ void DvppDecoder::read_thread() {
544 CHECK_AND_BREAK(aclvdecSetChannelDescOutPicFormat(vdecChannelDesc, PIXEL_FORMAT_YUV_SEMIPLANAR_420), "aclvdecSetChannelDescOutPicFormat failed"); 544 CHECK_AND_BREAK(aclvdecSetChannelDescOutPicFormat(vdecChannelDesc, PIXEL_FORMAT_YUV_SEMIPLANAR_420), "aclvdecSetChannelDescOutPicFormat failed");
545 CHECK_AND_BREAK(aclvdecCreateChannel(vdecChannelDesc), "aclvdecCreateChannel failed"); 545 CHECK_AND_BREAK(aclvdecCreateChannel(vdecChannelDesc), "aclvdecCreateChannel failed");
546 546
547 - AVPacket* pkt = av_packet_alloc();  
548 - av_init_packet( pkt );  
549 unsigned long long frame_nb = 0; 547 unsigned long long frame_nb = 0;
550 while (m_bRunning){ 548 while (m_bRunning){
551 549
@@ -573,9 +571,12 @@ void DvppDecoder::read_thread() { @@ -573,9 +571,12 @@ void DvppDecoder::read_thread() {
573 m_last_read_ts = get_cur_time_ms(); 571 m_last_read_ts = get_cur_time_ms();
574 } 572 }
575 573
  574 + AVPacket* pkt = av_packet_alloc();
  575 + av_init_packet( pkt );
576 int result = av_read_frame(fmt_ctx, pkt); 576 int result = av_read_frame(fmt_ctx, pkt);
577 if (result == AVERROR_EOF || result < 0){ 577 if (result == AVERROR_EOF || result < 0){
578 - av_packet_unref(pkt); 578 + av_packet_free(&pkt);
  579 + pkt = nullptr;
579 LOG_WARN("[{}]- Failed to read frame!", m_dec_name); 580 LOG_WARN("[{}]- Failed to read frame!", m_dec_name);
580 break; 581 break;
581 } 582 }
@@ -588,7 +589,8 @@ void DvppDecoder::read_thread() { @@ -588,7 +589,8 @@ void DvppDecoder::read_thread() {
588 } 589 }
589 590
590 if (m_dec_keyframe && !(pkt->flags & AV_PKT_FLAG_KEY)) { 591 if (m_dec_keyframe && !(pkt->flags & AV_PKT_FLAG_KEY)) {
591 - av_packet_unref(pkt); 592 + av_packet_free(&pkt);
  593 + pkt = nullptr;
592 continue; 594 continue;
593 } 595 }
594 596
@@ -597,23 +599,18 @@ void DvppDecoder::read_thread() { @@ -597,23 +599,18 @@ void DvppDecoder::read_thread() {
597 ret = av_bsf_send_packet(h264bsfc, pkt); 599 ret = av_bsf_send_packet(h264bsfc, pkt);
598 if(ret < 0) { 600 if(ret < 0) {
599 LOG_ERROR("[{}]- av_bsf_send_packet error!", m_dec_name); 601 LOG_ERROR("[{}]- av_bsf_send_packet error!", m_dec_name);
600 - av_packet_unref(pkt); 602 + av_packet_free(&pkt);
  603 + pkt = nullptr;
601 continue; 604 continue;
602 } 605 }
603 606
  607 + frame_nb++;
604 int nSended = -1; 608 int nSended = -1;
605 while ((ret = av_bsf_receive_packet(h264bsfc, pkt)) == 0) { 609 while ((ret = av_bsf_receive_packet(h264bsfc, pkt)) == 0) {
606 -  
607 if(!m_bRunning){ 610 if(!m_bRunning){
608 break; 611 break;
609 } 612 }
610 -  
611 - frame_nb++;  
612 - #ifdef USE_VILLAGE  
613 - m_recoderManager.cache_pkt(pkt, frame_nb, m_dec_name);  
614 - #endif  
615 nSended = sendPkt(vdecChannelDesc, pkt, frame_nb); 613 nSended = sendPkt(vdecChannelDesc, pkt, frame_nb);
616 -  
617 } 614 }
618 615
619 if(nSended < 0) { 616 if(nSended < 0) {
@@ -621,14 +618,15 @@ void DvppDecoder::read_thread() { @@ -621,14 +618,15 @@ void DvppDecoder::read_thread() {
621 m_bRunning=false; 618 m_bRunning=false;
622 break; 619 break;
623 } 620 }
624 - }  
625 -  
626 - // 音频等其他分量的情形  
627 - av_packet_unref(pkt);  
628 - }  
629 621
630 - av_packet_free(&pkt);  
631 - pkt = nullptr; 622 + #ifdef USE_VILLAGE
  623 + m_recoderManager.cache_pkt(pkt, frame_nb, m_dec_name);
  624 + #endif
  625 + } else {
  626 + av_packet_free(&pkt);
  627 + pkt = nullptr;
  628 + }
  629 + }
632 630
633 if (vdecChannelDesc) { 631 if (vdecChannelDesc) {
634 sendVdecEos(vdecChannelDesc); 632 sendVdecEos(vdecChannelDesc);
src/decoder/dvpp/DvppStreamDecoder.cpp
@@ -474,7 +474,7 @@ int DvppStreamDecoder::SendData(int videoType, char* data, int len, int isKey, u @@ -474,7 +474,7 @@ int DvppStreamDecoder::SendData(int videoType, char* data, int len, int isKey, u
474 if(ret < 0) { 474 if(ret < 0) {
475 LOG_ERROR("[{}]- av_bsf_send_packet error!", m_dec_name); 475 LOG_ERROR("[{}]- av_bsf_send_packet error!", m_dec_name);
476 ret = -3; 476 ret = -3;
477 - break;; 477 + break;
478 } 478 }
479 479
480 int nSended = -1; 480 int nSended = -1;
@@ -484,21 +484,25 @@ int DvppStreamDecoder::SendData(int videoType, char* data, int len, int isKey, u @@ -484,21 +484,25 @@ int DvppStreamDecoder::SendData(int videoType, char* data, int len, int isKey, u
484 } 484 }
485 485
486 m_frame_nb++; 486 m_frame_nb++;
487 -  
488 - #ifdef USE_VILLAGE  
489 - m_recoderManager.cache_pkt(pkt, m_frame_nb, m_dec_name);  
490 -#endif  
491 -  
492 // dvpp 解码 487 // dvpp 解码
493 nSended = sendPkt(vdecChannelDesc, pkt, m_frame_nb, vdec_out_size); 488 nSended = sendPkt(vdecChannelDesc, pkt, m_frame_nb, vdec_out_size);
494 } 489 }
495 490
  491 +#ifdef USE_VILLAGE
  492 + m_recoderManager.cache_pkt(pkt, m_frame_nb, m_dec_name);
  493 +#endif
  494 +
496 if(nSended < 0) { 495 if(nSended < 0) {
497 // 执行出错,强行结束整个任务 496 // 执行出错,强行结束整个任务
498 ret = -2; 497 ret = -2;
  498 + break;
499 } 499 }
500 - 500 +#ifdef USE_VILLAGE
  501 + //直接返回,不释放pkt,pkt在recoderManager释放
  502 + return 0;
  503 +#elif
501 ret = 0; 504 ret = 0;
  505 +#endif
502 } 506 }
503 } while (0); 507 } while (0);
504 508
src/decoder/dvpp/FFRecoderTaskManager.cpp
@@ -85,6 +85,23 @@ static AVPacket* packet_clone(AVPacket* pkt) { @@ -85,6 +85,23 @@ static AVPacket* packet_clone(AVPacket* pkt) {
85 return new_pkt; 85 return new_pkt;
86 } 86 }
87 87
  88 +static AVPacket* copy_packet(const AVPacket* src)
  89 +{
  90 + AVPacket* dst = av_packet_alloc(); // 分配内存
  91 + if (!dst) {
  92 + return NULL;
  93 + }
  94 +
  95 + // 复制所有字段
  96 + av_packet_ref(dst, src);
  97 +
  98 + // 复制音视频数据
  99 + dst->data = (uint8_t*)av_malloc(src->size);
  100 + memcpy(dst->data, src->data, src->size);
  101 + dst->size = src->size;
  102 + return dst;
  103 +}
  104 +
88 void FFRecoderTaskManager::cache_pkt(AVPacket* pkt, long long frame_nb, string dec_name){ 105 void FFRecoderTaskManager::cache_pkt(AVPacket* pkt, long long frame_nb, string dec_name){
89 if(m_bExit) { 106 if(m_bExit) {
90 // 任务退出了就不再缓存数据了 107 // 任务退出了就不再缓存数据了
@@ -92,10 +109,10 @@ void FFRecoderTaskManager::cache_pkt(AVPacket* pkt, long long frame_nb, string d @@ -92,10 +109,10 @@ void FFRecoderTaskManager::cache_pkt(AVPacket* pkt, long long frame_nb, string d
92 } 109 }
93 110
94 // 考虑到一个AVPacket中的数据并不很大,为减少与解码模块的耦合度,方便管理,这里做一个clone 111 // 考虑到一个AVPacket中的数据并不很大,为减少与解码模块的耦合度,方便管理,这里做一个clone
95 - AVPacket *new_pkt = packet_clone(pkt); 112 + // AVPacket *new_pkt = copy_packet(pkt);
96 113
97 DataPacket* newDataPkt = new DataPacket(); 114 DataPacket* newDataPkt = new DataPacket();
98 - newDataPkt->pkt = new_pkt; 115 + newDataPkt->pkt = pkt;
99 newDataPkt->frame_nb = frame_nb; 116 newDataPkt->frame_nb = frame_nb;
100 117
101 if(is_key_frame(pkt)){ 118 if(is_key_frame(pkt)){
@@ -296,7 +313,7 @@ void FFRecoderTaskManager::recode_thread() { @@ -296,7 +313,7 @@ void FFRecoderTaskManager::recode_thread() {
296 LOG_ERROR("{} pkt is nullptr", recoderinfo.task_id); 313 LOG_ERROR("{} pkt is nullptr", recoderinfo.task_id);
297 continue; 314 continue;
298 } else if (pkt->data == nullptr || pkt->size <= 0){ 315 } else if (pkt->data == nullptr || pkt->size <= 0){
299 - LOG_ERROR("{} pkt data is nullptr", recoderinfo.task_id); 316 + LOG_ERROR("{} pkt data is nullptr or size is {}", recoderinfo.task_id, pkt->size);
300 continue; 317 continue;
301 } 318 }
302 319