Commit efd35d36560a31fd63fc091433026cec9eccefd4
1 parent
b092645e
pkt释放移到recoder里面,尝试修复encoder的时候data为null的问题
Showing
3 changed files
with
48 additions
and
29 deletions
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 | ... | ... |