mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-07 01:52:46 +08:00
[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:
@@ -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];
|
||||
}
|
||||
|
@@ -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];
|
||||
|
||||
|
@@ -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]) {
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user