[h265e_dpb]: Mark unused ref which no show in dpb

Change-Id: Ie41740c8f85bd61ca590532501d7e89e6fd66fa5
Signed-off-by: sayon.chen <sayon.chen@rock-chips.com>
This commit is contained in:
sayon.chen
2021-08-06 11:32:48 +08:00
committed by Herman Chen
parent fb3e07d963
commit 196b918d07
4 changed files with 28 additions and 10 deletions

View File

@@ -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];
}

View File

@@ -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];

View File

@@ -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]) {

View File

@@ -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;
}