[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; 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; RK_S32 curr_layer_id = currSlice->layer_id;
currSlice->fs_listinterview0 = mpp_calloc(H264_FrameStore_t*, p_Dpb->size); currSlice->fs_listinterview0 = mpp_calloc(H264_FrameStore_t*, p_Dpb->size);
MEM_CHECK(ret, currSlice->fs_listinterview0); 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; 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; RK_S32 curr_layer_id = currSlice->layer_id;
// B-Slice // B-Slice
currSlice->fs_listinterview0 = mpp_calloc(H264_FrameStore_t*, p_Dpb->size); 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 poc = 0, TOP_POC = 0, BOT_POC = 0;
RK_S32 min_poc = 0, max_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_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; H264_DecCtx_t *p_Dec = currSlice->p_Dec;
memset(p_Dec->refpic_info_p, 0, MAX_REF_SIZE * sizeof(H264_RefPicInfo_t)); 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 ------- //!<------ set listP -------
near_dpb_idx = 0; near_dpb_idx = 0;
for (j = 0; j < 32; j++) { for (j = 0; j < 32; j++) {
if (j >= currSlice->listXsizeP[0])
break;
poc = 0; poc = 0;
layer_id = currSlice->listP[0][j]->layer_id; 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) { 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) poc = mmco5_flag ? currSlice->listP[0][j]->poc_mmco5 : currSlice->listP[0][j]->poc;
? currSlice->listP[0][j]->poc_mmco5 : currSlice->listP[0][j]->poc;
} else if (currSlice->listP[0][j]->structure == TOP_FIELD) { } 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) poc = mmco5_flag ? currSlice->listP[0][j]->top_poc_mmco5 : currSlice->listP[0][j]->top_poc;
? currSlice->listP[0][j]->top_poc_mmco5 : currSlice->listP[0][j]->top_poc;
} else { } else {
poc = (currSlice->listP[0][j]->is_mmco_5 && currSlice->layer_id && currSlice->listP[0][j]->layer_id == 0) poc = mmco5_flag ? currSlice->listP[0][j]->bot_poc_mmco5 : currSlice->listP[0][j]->bottom_poc;
? currSlice->listP[0][j]->bot_poc_mmco5 : currSlice->listP[0][j]->bottom_poc;
} }
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
refpic = p_Dec->dpb_info[i].refpic; 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].bottom_flag = 0;
} }
p_Dec->refpic_info_p[j].valid = 1; 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 ------- //!<------ set listB -------
for (k = 0; k < 2; k++) { for (k = 0; k < 2; k++) {
@@ -1777,18 +1772,18 @@ static MPP_RET prepare_init_ref_info(H264_SLICE_t *currSlice)
max_poc = -0xFFFF; max_poc = -0xFFFF;
near_dpb_idx = 0; near_dpb_idx = 0;
for (j = 0; j < 32; j++) { for (j = 0; j < 32; j++) {
if (j >= currSlice->listXsizeB[k])
break;
poc = 0; poc = 0;
layer_id = currSlice->listB[k][j]->layer_id; 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) { 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) poc = mmco5_flag ? currSlice->listB[k][j]->poc_mmco5 : currSlice->listB[k][j]->poc;
? currSlice->listB[k][j]->poc_mmco5 : currSlice->listB[k][j]->poc;
} else if (currSlice->listB[k][j]->structure == TOP_FIELD) { } 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) poc = mmco5_flag ? currSlice->listB[k][j]->top_poc_mmco5 : currSlice->listB[k][j]->top_poc;
? currSlice->listB[k][j]->top_poc_mmco5 : currSlice->listB[k][j]->top_poc;
} else { } else {
poc = (currSlice->listB[k][j]->is_mmco_5 && currSlice->layer_id && currSlice->listB[k][j]->layer_id == 0) poc = mmco5_flag ? currSlice->listB[k][j]->bot_poc_mmco5 : currSlice->listB[k][j]->bottom_poc;
? currSlice->listB[k][j]->bot_poc_mmco5 : currSlice->listB[k][j]->bottom_poc;
} }
min_poc = MPP_MIN(min_poc, 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].bottom_flag = 0;
} }
p_Dec->refpic_info_b[k][j].valid = 1; 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;
}
} }
} }