From 463ae89b6ec318ef988b09dcbfc182317f87df80 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Mon, 25 May 2020 09:43:43 +0800 Subject: [PATCH] [mpp_enc_v2]: Fix hw_length update error 1. hw_length should be only updated by hardware real stream length. 2. hw_length can be updated multi-times by slice encoding. 3. When reenc found the hw_length should be subtracted from total task stream length. Change-Id: I1c3f6affcc5dc90ad548a42efed0237c60b98f08 Signed-off-by: Herman Chen --- mpp/codec/mpp_enc_v2.cpp | 10 ++++++++-- mpp/hal/vpu/h264e/hal_h264e_vepu1_v2.c | 5 +++-- mpp/hal/vpu/h264e/hal_h264e_vepu2_v2.c | 5 +++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/mpp/codec/mpp_enc_v2.cpp b/mpp/codec/mpp_enc_v2.cpp index 4d803a56..22047646 100644 --- a/mpp/codec/mpp_enc_v2.cpp +++ b/mpp/codec/mpp_enc_v2.cpp @@ -766,13 +766,19 @@ void *mpp_enc_thread(void *data) frm->reencode = 0; // check for header adding - mpp_assert(hal_task->length == mpp_packet_get_length(packet)); + if (hal_task->length != mpp_packet_get_length(packet)) { + mpp_err_f("header adding check failed: task length is not match to packet length %d vs %d\n", + hal_task->length, mpp_packet_get_length(packet)); + } enc_dbg_detail("task %d enc proc hal\n", frm->seq_idx); RUN_ENC_IMPL_FUNC(enc_impl_proc_hal, impl, hal_task, mpp, ret); // check for user data adding - mpp_assert(hal_task->length == mpp_packet_get_length(packet)); + if (hal_task->length != mpp_packet_get_length(packet)) { + mpp_err_f("user data adding check failed: task length is not match to packet length %d vs %d\n", + hal_task->length, mpp_packet_get_length(packet)); + } enc_dbg_detail("task %d hal get task\n", frm->seq_idx); RUN_ENC_HAL_FUNC(mpp_enc_hal_get_task, hal, hal_task, mpp, ret); diff --git a/mpp/hal/vpu/h264e/hal_h264e_vepu1_v2.c b/mpp/hal/vpu/h264e/hal_h264e_vepu1_v2.c index d628d5e8..0595869f 100644 --- a/mpp/hal/vpu/h264e/hal_h264e_vepu1_v2.c +++ b/mpp/hal/vpu/h264e/hal_h264e_vepu1_v2.c @@ -760,6 +760,7 @@ static MPP_RET hal_h264e_vepu1_wait_v2(void *hal, HalEncTask *task) hw_mbrc->out_strm_size = len; } + task->hw_length += ctx->hw_mbrc.out_strm_size; hal_h264e_dbg_func("leave %p\n", hal); @@ -776,9 +777,9 @@ static MPP_RET hal_h264e_vepu1_ret_task_v2(void *hal, HalEncTask *task) hal_h264e_dbg_func("enter %p\n", hal); - task->length += ctx->hw_mbrc.out_strm_size; + task->length += task->hw_length; - rc_info->bit_real = task->length * 8; + rc_info->bit_real = task->hw_length * 8; rc_info->quality_real = ctx->hw_mbrc.qp_sum / mbs; hal_h264e_dbg_rc("real bit %d quality %d\n", rc_info->bit_real, rc_info->quality_real); diff --git a/mpp/hal/vpu/h264e/hal_h264e_vepu2_v2.c b/mpp/hal/vpu/h264e/hal_h264e_vepu2_v2.c index ec56db65..f49c6f97 100644 --- a/mpp/hal/vpu/h264e/hal_h264e_vepu2_v2.c +++ b/mpp/hal/vpu/h264e/hal_h264e_vepu2_v2.c @@ -787,6 +787,7 @@ static MPP_RET hal_h264e_vepu2_wait_v2(void *hal, HalEncTask *task) hw_mbrc->out_strm_size = len; } + task->hw_length += ctx->hw_mbrc.out_strm_size; hal_h264e_dbg_func("leave %p\n", hal); @@ -803,9 +804,9 @@ static MPP_RET hal_h264e_vepu2_ret_task_v2(void *hal, HalEncTask *task) hal_h264e_dbg_func("enter %p\n", hal); - task->length += ctx->hw_mbrc.out_strm_size; + task->length += task->hw_length; - rc_info->bit_real = task->length * 8; + rc_info->bit_real = task->hw_length * 8; rc_info->quality_real = ctx->hw_mbrc.qp_sum / mbs; hal_h264e_dbg_rc("real bit %d quality %d\n", rc_info->bit_real, rc_info->quality_real);