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,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 |