[h264d]: optimize refer info relative process

1. add mvc flag for interview process.
2. reduce empty loop when init ref info.

Change-Id: Ie2745cbe1b78b26a8f26e97c02fb76d4bf6ca315
Signed-off-by: Ding Wei <leo.ding@rock-chips.com>
This commit is contained in:
Ding Wei
2021-05-10 15:05:22 +08:00
committed by Herman Chen
parent 4d7d1b5b79
commit 547ec685a1

View File

@@ -1068,7 +1068,7 @@ static MPP_RET init_lists_p_slice_mvc(H264_SLICE_t *currSlice)
}
currSlice->listXsizeP[1] = 0;
if (currSlice->svc_extension_flag == 0) {
if (currSlice->mvcExt.valid && currSlice->svc_extension_flag == 0) {
RK_S32 curr_layer_id = currSlice->layer_id;
currSlice->fs_listinterview0 = mpp_calloc(H264_FrameStore_t*, p_Dpb->size);
MEM_CHECK(ret, currSlice->fs_listinterview0);
@@ -1235,7 +1235,7 @@ static MPP_RET init_lists_b_slice_mvc(H264_SLICE_t *currSlice)
currSlice->listB[1][1] = tmp_s;
}
}
if (currSlice->svc_extension_flag == 0) {
if (currSlice->mvcExt.valid && currSlice->svc_extension_flag == 0) {
RK_S32 curr_layer_id = currSlice->layer_id;
// B-Slice
currSlice->fs_listinterview0 = mpp_calloc(H264_FrameStore_t*, p_Dpb->size);
@@ -1704,6 +1704,7 @@ static MPP_RET prepare_init_ref_info(H264_SLICE_t *currSlice)
RK_S32 poc = 0, TOP_POC = 0, BOT_POC = 0;
RK_S32 min_poc = 0, max_poc = 0;
RK_S32 layer_id = 0, voidx = 0, is_used = 0, near_dpb_idx = 0;
RK_U32 mmco5_flag = 0;
H264_DecCtx_t *p_Dec = currSlice->p_Dec;
memset(p_Dec->refpic_info_p, 0, MAX_REF_SIZE * sizeof(H264_RefPicInfo_t));
@@ -1716,18 +1717,17 @@ static MPP_RET prepare_init_ref_info(H264_SLICE_t *currSlice)
//!<------ set listP -------
near_dpb_idx = 0;
for (j = 0; j < 32; j++) {
if (j >= currSlice->listXsizeP[0])
break;
poc = 0;
layer_id = currSlice->listP[0][j]->layer_id;
if (j < currSlice->listXsizeP[0]) {
mmco5_flag = (currSlice->listP[0][j]->is_mmco_5 && currSlice->layer_id && !currSlice->listP[0][j]->layer_id) ? 1 : 0;
if (currSlice->listP[0][j]->structure == FRAME) {
poc = (currSlice->listP[0][j]->is_mmco_5 && currSlice->layer_id && currSlice->listP[0][j]->layer_id == 0)
? currSlice->listP[0][j]->poc_mmco5 : currSlice->listP[0][j]->poc;
poc = mmco5_flag ? currSlice->listP[0][j]->poc_mmco5 : currSlice->listP[0][j]->poc;
} else if (currSlice->listP[0][j]->structure == TOP_FIELD) {
poc = (currSlice->listP[0][j]->is_mmco_5 && currSlice->layer_id && currSlice->listP[0][j]->layer_id == 0)
? currSlice->listP[0][j]->top_poc_mmco5 : currSlice->listP[0][j]->top_poc;
poc = mmco5_flag ? currSlice->listP[0][j]->top_poc_mmco5 : currSlice->listP[0][j]->top_poc;
} else {
poc = (currSlice->listP[0][j]->is_mmco_5 && currSlice->layer_id && currSlice->listP[0][j]->layer_id == 0)
? currSlice->listP[0][j]->bot_poc_mmco5 : currSlice->listP[0][j]->bottom_poc;
poc = mmco5_flag ? currSlice->listP[0][j]->bot_poc_mmco5 : currSlice->listP[0][j]->bottom_poc;
}
for (i = 0; i < 16; i++) {
refpic = p_Dec->dpb_info[i].refpic;
@@ -1765,11 +1765,6 @@ static MPP_RET prepare_init_ref_info(H264_SLICE_t *currSlice)
p_Dec->refpic_info_p[j].bottom_flag = 0;
}
p_Dec->refpic_info_p[j].valid = 1;
} else {
p_Dec->refpic_info_p[j].valid = 0;
p_Dec->refpic_info_p[j].dpb_idx = 0;
p_Dec->refpic_info_p[j].bottom_flag = 0;
}
}
//!<------ set listB -------
for (k = 0; k < 2; k++) {
@@ -1777,18 +1772,18 @@ static MPP_RET prepare_init_ref_info(H264_SLICE_t *currSlice)
max_poc = -0xFFFF;
near_dpb_idx = 0;
for (j = 0; j < 32; j++) {
if (j >= currSlice->listXsizeB[k])
break;
poc = 0;
layer_id = currSlice->listB[k][j]->layer_id;
if (j < currSlice->listXsizeB[k]) {
mmco5_flag = (currSlice->listB[k][j]->is_mmco_5 && currSlice->layer_id && !currSlice->listB[k][j]->layer_id) ? 1 : 0;
if (currSlice->listB[k][j]->structure == FRAME) {
poc = (currSlice->listB[k][j]->is_mmco_5 && currSlice->layer_id && currSlice->listB[k][j]->layer_id == 0)
? currSlice->listB[k][j]->poc_mmco5 : currSlice->listB[k][j]->poc;
poc = mmco5_flag ? currSlice->listB[k][j]->poc_mmco5 : currSlice->listB[k][j]->poc;
} else if (currSlice->listB[k][j]->structure == TOP_FIELD) {
poc = (currSlice->listB[k][j]->is_mmco_5 && currSlice->layer_id && currSlice->listB[k][j]->layer_id == 0)
? currSlice->listB[k][j]->top_poc_mmco5 : currSlice->listB[k][j]->top_poc;
poc = mmco5_flag ? currSlice->listB[k][j]->top_poc_mmco5 : currSlice->listB[k][j]->top_poc;
} else {
poc = (currSlice->listB[k][j]->is_mmco_5 && currSlice->layer_id && currSlice->listB[k][j]->layer_id == 0)
? currSlice->listB[k][j]->bot_poc_mmco5 : currSlice->listB[k][j]->bottom_poc;
poc = mmco5_flag ? currSlice->listB[k][j]->bot_poc_mmco5 : currSlice->listB[k][j]->bottom_poc;
}
min_poc = MPP_MIN(min_poc, poc);
@@ -1829,11 +1824,6 @@ static MPP_RET prepare_init_ref_info(H264_SLICE_t *currSlice)
p_Dec->refpic_info_b[k][j].bottom_flag = 0;
}
p_Dec->refpic_info_b[k][j].valid = 1;
} else {
p_Dec->refpic_info_b[k][j].valid = 0;
p_Dec->refpic_info_b[k][j].dpb_idx = 0;
p_Dec->refpic_info_b[k][j].bottom_flag = 0;
}
}
}