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 544 CHECK_AND_BREAK(aclvdecSetChannelDescOutPicFormat(vdecChannelDesc, PIXEL_FORMAT_YUV_SEMIPLANAR_420), "aclvdecSetChannelDescOutPicFormat failed");
545 545 CHECK_AND_BREAK(aclvdecCreateChannel(vdecChannelDesc), "aclvdecCreateChannel failed");
546 546  
547   - AVPacket* pkt = av_packet_alloc();
548   - av_init_packet( pkt );
549 547 unsigned long long frame_nb = 0;
550 548 while (m_bRunning){
551 549  
... ... @@ -573,9 +571,12 @@ void DvppDecoder::read_thread() {
573 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 576 int result = av_read_frame(fmt_ctx, pkt);
577 577 if (result == AVERROR_EOF || result < 0){
578   - av_packet_unref(pkt);
  578 + av_packet_free(&pkt);
  579 + pkt = nullptr;
579 580 LOG_WARN("[{}]- Failed to read frame!", m_dec_name);
580 581 break;
581 582 }
... ... @@ -588,7 +589,8 @@ void DvppDecoder::read_thread() {
588 589 }
589 590  
590 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 594 continue;
593 595 }
594 596  
... ... @@ -597,23 +599,18 @@ void DvppDecoder::read_thread() {
597 599 ret = av_bsf_send_packet(h264bsfc, pkt);
598 600 if(ret < 0) {
599 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 604 continue;
602 605 }
603 606  
  607 + frame_nb++;
604 608 int nSended = -1;
605 609 while ((ret = av_bsf_receive_packet(h264bsfc, pkt)) == 0) {
606   -
607 610 if(!m_bRunning){
608 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 613 nSended = sendPkt(vdecChannelDesc, pkt, frame_nb);
616   -
617 614 }
618 615  
619 616 if(nSended < 0) {
... ... @@ -621,14 +618,15 @@ void DvppDecoder::read_thread() {
621 618 m_bRunning=false;
622 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 631 if (vdecChannelDesc) {
634 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 474 if(ret < 0) {
475 475 LOG_ERROR("[{}]- av_bsf_send_packet error!", m_dec_name);
476 476 ret = -3;
477   - break;;
  477 + break;
478 478 }
479 479  
480 480 int nSended = -1;
... ... @@ -484,21 +484,25 @@ int DvppStreamDecoder::SendData(int videoType, char* data, int len, int isKey, u
484 484 }
485 485  
486 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 487 // dvpp 解码
493 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 495 if(nSended < 0) {
497 496 // 执行出错,强行结束整个任务
498 497 ret = -2;
  498 + break;
499 499 }
500   -
  500 +#ifdef USE_VILLAGE
  501 + //直接返回,不释放pkt,pkt在recoderManager释放
  502 + return 0;
  503 +#elif
501 504 ret = 0;
  505 +#endif
502 506 }
503 507 } while (0);
504 508  
... ...
src/decoder/dvpp/FFRecoderTaskManager.cpp
... ... @@ -85,6 +85,23 @@ static AVPacket* packet_clone(AVPacket* pkt) {
85 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 105 void FFRecoderTaskManager::cache_pkt(AVPacket* pkt, long long frame_nb, string dec_name){
89 106 if(m_bExit) {
90 107 // 任务退出了就不再缓存数据了
... ... @@ -92,10 +109,10 @@ void FFRecoderTaskManager::cache_pkt(AVPacket* pkt, long long frame_nb, string d
92 109 }
93 110  
94 111 // 考虑到一个AVPacket中的数据并不很大,为减少与解码模块的耦合度,方便管理,这里做一个clone
95   - AVPacket *new_pkt = packet_clone(pkt);
  112 + // AVPacket *new_pkt = copy_packet(pkt);
96 113  
97 114 DataPacket* newDataPkt = new DataPacket();
98   - newDataPkt->pkt = new_pkt;
  115 + newDataPkt->pkt = pkt;
99 116 newDataPkt->frame_nb = frame_nb;
100 117  
101 118 if(is_key_frame(pkt)){
... ... @@ -296,7 +313,7 @@ void FFRecoderTaskManager::recode_thread() {
296 313 LOG_ERROR("{} pkt is nullptr", recoderinfo.task_id);
297 314 continue;
298 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 317 continue;
301 318 }
302 319  
... ...