From 196b918d07ec1fc88a0a58853e7f366c8e3d87fe Mon Sep 17 00:00:00 2001 From: "sayon.chen" Date: Fri, 6 Aug 2021 11:32:48 +0800 Subject: [PATCH] [h265e_dpb]: Mark unused ref which no show in dpb Change-Id: Ie41740c8f85bd61ca590532501d7e89e6fd66fa5 Signed-off-by: sayon.chen --- mpp/codec/enc/h265/h265e_dpb.c | 13 +++++++++++++ mpp/codec/enc/h265/h265e_slice.h | 1 + mpp/codec/enc/h265/h265e_syntax.c | 20 ++++++++++++-------- mpp/hal/rkenc/h265e/hal_h265e_vepu541.c | 4 ++-- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/mpp/codec/enc/h265/h265e_dpb.c b/mpp/codec/enc/h265/h265e_dpb.c index 39de7762..9aa3a2ee 100644 --- a/mpp/codec/enc/h265/h265e_dpb.c +++ b/mpp/codec/enc/h265/h265e_dpb.c @@ -223,13 +223,16 @@ void sort_delta_poc(H265eReferencePictureSet *rps) for (j = 1; j < rps->m_numberOfPictures; j++) { RK_S32 deltaPOC = rps->delta_poc[j]; RK_U32 used = rps->m_used[j]; + RK_U32 refed = rps->m_ref[j]; for (k = j - 1; k >= 0; k--) { int temp = rps->delta_poc[k]; if (deltaPOC < temp) { rps->delta_poc[k + 1] = temp; rps->m_used[k + 1] = rps->m_used[k]; + rps->m_ref[k + 1] = rps->m_ref[k]; rps->delta_poc[k] = deltaPOC; rps->m_used[k] = used; + rps->m_ref[k] = refed; } } } @@ -239,10 +242,13 @@ void sort_delta_poc(H265eReferencePictureSet *rps) for (j = 0, k = numNegPics - 1; j < numNegPics >> 1; j++, k--) { RK_S32 deltaPOC = rps->delta_poc[j]; RK_U32 used = rps->m_used[j]; + RK_U32 refed = rps->m_ref[j]; rps->delta_poc[j] = rps->delta_poc[k]; rps->m_used[j] = rps->m_used[k]; + rps->m_ref[j] = rps->m_ref[k]; rps->delta_poc[k] = deltaPOC; rps->m_used[k] = used; + rps->m_ref[k] = refed; } } @@ -555,6 +561,7 @@ void h265e_dpb_cpb2rps(H265eDpb *dpb, RK_S32 curPoc, H265eSlice *slice, EncCpbSt for (idx_rps = 0; idx_rps < 16; idx_rps++) { rps->delta_poc[idx_rps] = 0; rps->m_used[idx_rps] = 0; + rps->m_ref[idx_rps] = 0; } memset(rps->delta_poc, 0, MAX_REFS * sizeof(int)); @@ -612,13 +619,19 @@ void h265e_dpb_cpb2rps(H265eDpb *dpb, RK_S32 curPoc, H265eSlice *slice, EncCpbSt } else { ref_dealt_poc = p->poc - curPoc; } + + for (i = 0; i < st_size; i++) { + rps->m_ref[i] = (rps->delta_poc[i] == ref_dealt_poc); + } } + if (lt_size > 0) { for ( i = 0; i < lt_size; i++) { h265e_dbg_dpb("numLongTermRefPic %d nShortTerm %d", lt_size, st_size); rps->poc[i + st_size] = nLongTermRefPicPoc[i]; rps->m_RealPoc[i + st_size] = nLongTermRefPicRealPoc[i]; rps->m_used[i + st_size] = 1; + rps->m_ref[i + st_size] = p->is_long_term; rps->delta_poc[i + st_size] = nLongTermDealtPoc[i]; rps->check_lt_msb[i + st_size] = isMsbValid[i]; } diff --git a/mpp/codec/enc/h265/h265e_slice.h b/mpp/codec/enc/h265/h265e_slice.h index 2bab91db..dd3ddcf4 100644 --- a/mpp/codec/enc/h265/h265e_slice.h +++ b/mpp/codec/enc/h265/h265e_slice.h @@ -63,6 +63,7 @@ typedef struct H265eReferencePictureSet_e { RK_S32 num_positive_pic; RK_S32 delta_poc[MAX_REFS]; RK_U32 m_used[MAX_REFS]; + RK_U32 m_ref[MAX_REFS]; RK_S32 poc[MAX_REFS]; RK_S32 m_RealPoc[MAX_REFS]; diff --git a/mpp/codec/enc/h265/h265e_syntax.c b/mpp/codec/enc/h265/h265e_syntax.c index 4a093e40..71f81bd9 100644 --- a/mpp/codec/enc/h265/h265e_syntax.c +++ b/mpp/codec/enc/h265/h265e_syntax.c @@ -172,8 +172,6 @@ static void fill_slice_parameters( const H265eCtx *h, sp->dpdnt_sli_seg_flg = 0; sp->sli_pps_id = slice->m_pps->m_PPSId; sp->no_out_pri_pic = slice->no_output_of_prior_pics_flag; - sp->tot_poc_num = slice->tot_poc_num; - sp->sli_tc_ofst_div2 = slice->m_deblockingFilterTcOffsetDiv2; sp->sli_beta_ofst_div2 = slice->m_deblockingFilterBetaOffsetDiv2; @@ -201,6 +199,7 @@ RK_S32 fill_ref_parameters(const H265eCtx *h, H265eSlicParams *sp) RK_S32 i, j, k; sp->dlt_poc_msb_prsnt0 = 0; sp->dlt_poc_msb_cycl0 = 0; + sp->tot_poc_num = 0; if (slice->m_bdIdx < 0) { RK_S32 prev = 0; sp->st_ref_pic_flg = 0; @@ -209,21 +208,27 @@ RK_S32 fill_ref_parameters(const H265eCtx *h, H265eSlicParams *sp) for (j = 0; j < rps->num_negative_pic; j++) { if (0 == j) { sp->dlt_poc_s0_m10 = prev - rps->delta_poc[j] - 1; - sp->used_by_s0_flg = rps->m_used[j]; + sp->used_by_s0_flg = rps->m_ref[j]; } else if (1 == j) { sp->dlt_poc_s0_m11 = prev - rps->delta_poc[j] - 1; - sp->used_by_s0_flg |= rps->m_used[j] << 1; + sp->used_by_s0_flg |= rps->m_ref[j] << 1; } else if (2 == j) { sp->dlt_poc_s0_m12 = prev - rps->delta_poc[j] - 1; - sp->used_by_s0_flg |= rps->m_used[j] << 2; + sp->used_by_s0_flg |= rps->m_ref[j] << 2; } else if (3 == j) { sp->dlt_poc_s0_m13 = prev - rps->delta_poc[j] - 1; - sp->used_by_s0_flg |= rps->m_used[j] << 3; + sp->used_by_s0_flg |= rps->m_ref[j] << 3; } prev = rps->delta_poc[j]; } } + for (i = 0; i < rps->m_numberOfPictures; i++) { + if (rps->m_ref[i]) { + sp->tot_poc_num++; + } + } + if (slice->m_sps->m_bLongTermRefsPresent) { RK_S32 numLtrpInSH = rps->num_long_term_pic; RK_S32 numLtrpInSPS = 0; @@ -280,12 +285,11 @@ RK_S32 fill_ref_parameters(const H265eCtx *h, H265eSlicParams *sp) for ( i = rps->m_numberOfPictures - 1; i > offset - 1; i--) { RK_U32 deltaFlag = 0; - if ((i == rps->m_numberOfPictures - 1) || (i == rps->m_numberOfPictures - 1 - numLtrpInSPS)) { deltaFlag = 1; } poc_lsb_lt[numLongTerm - 1 - (i - offset)] = rps->m_pocLSBLT[i]; - used_by_lt_flg[numLongTerm - 1 - (i - offset)] = rps->m_used[i]; + used_by_lt_flg[numLongTerm - 1 - (i - offset)] = rps->m_ref[i]; dlt_poc_msb_prsnt[numLongTerm - 1 - (i - offset)] = rps->m_deltaPocMSBPresentFlag[i]; if (rps->m_deltaPocMSBPresentFlag[i]) { diff --git a/mpp/hal/rkenc/h265e/hal_h265e_vepu541.c b/mpp/hal/rkenc/h265e/hal_h265e_vepu541.c index f4314d71..a0bb7f45 100644 --- a/mpp/hal/rkenc/h265e/hal_h265e_vepu541.c +++ b/mpp/hal/rkenc/h265e/hal_h265e_vepu541.c @@ -1485,10 +1485,10 @@ MPP_RET hal_h265e_v541_gen_regs(void *hal, HalEncTask *task) if (ctx->frame_type == INTRA_FRAME) { /* reset ref pictures */ i_nal_type = NAL_IDR_W_RADL; - } else if (ctx->frame_type == INTER_P_FRAME ) { + } else if (ctx->frame_type == INTER_P_FRAME && !syn->sp.non_reference_flag) { i_nal_type = NAL_TRAIL_R; } else { - i_nal_type = NAL_TRAIL_R; + i_nal_type = NAL_TRAIL_N; } regs->synt_nal.nal_unit_type = i_nal_type; }