Merge "mvc: corrected handling of incorrect bitstreams in mmco parsing" am: b7ac6e9575 am: 1cff5c1466 am: b0a6949605

Original change: 2191344

Change-Id: I3ea49dbb037547678b337c645cf07c38c12b6afa
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot 2022-08-30 16:59:43 +00:00 • committed by Automerger Merge Worker
commit 95bb0f5616
2 changed files with 62 additions and 34 deletions

View file

@ -1862,9 +1862,10 @@ WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_
UWORD32 u4_mmco; UWORD32 u4_mmco;
UWORD32 u4_diff_pic_num; UWORD32 u4_diff_pic_num;
WORD32 i4_pic_num;
UWORD32 u4_lt_idx; UWORD32 u4_lt_idx;
UWORD32 au4_num_mmco_cmds[NUM_MMCO_CMD_IDS] = {0};
for(j = 0; j < ps_dpb_cmds->u1_num_of_commands; j++) for(j = 0; j < ps_dpb_cmds->u1_num_of_commands; j++)
{ {
ps_mmc_params = &ps_dpb_cmds->as_mmc_params[j]; ps_mmc_params = &ps_dpb_cmds->as_mmc_params[j];
@ -1885,12 +1886,10 @@ WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_
return ERROR_DBP_MANAGER_T; return ERROR_DBP_MANAGER_T;
} }
i4_pic_num = i8_pic_num;
if(ps_dpb_mgr->u1_num_st_ref_bufs > 0) if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
{ {
i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(ps_dpb_mgr, i4_pic_num, i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(
MAX_REF_BUFS + 1); ps_dpb_mgr, (WORD32) i8_pic_num, MAX_REF_BUFS + 1);
if(i4_error_code != OK) if(i4_error_code != OK)
{ {
@ -1901,8 +1900,8 @@ WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_
{ {
UWORD8 u1_dummy; UWORD8 u1_dummy;
i4_error_code = i4_error_code = imvcd_dpb_delete_gap_frm_mmco(
imvcd_dpb_delete_gap_frm_mmco(ps_dpb_mgr, i4_pic_num, &u1_dummy); ps_dpb_mgr, (WORD32) i8_pic_num, &u1_dummy);
if(i4_error_code != OK) if(i4_error_code != OK)
{ {
@ -1939,8 +1938,6 @@ WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_
return ERROR_DBP_MANAGER_T; return ERROR_DBP_MANAGER_T;
} }
i4_pic_num = i8_pic_num;
u4_lt_idx = ps_mmc_params->u4_lt_idx; u4_lt_idx = ps_mmc_params->u4_lt_idx;
if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) || if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) ||
@ -1951,8 +1948,8 @@ WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_
if(ps_dpb_mgr->u1_num_st_ref_bufs > 0) if(ps_dpb_mgr->u1_num_st_ref_bufs > 0)
{ {
i4_error_code = i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(
imvcd_dpb_delete_st_node_or_make_lt(ps_dpb_mgr, i4_pic_num, u4_lt_idx); ps_dpb_mgr, (WORD32) i8_pic_num, u4_lt_idx);
if(i4_error_code != OK) if(i4_error_code != OK)
{ {
@ -1964,6 +1961,11 @@ WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_
} }
case SET_MAX_LT_INDEX: case SET_MAX_LT_INDEX:
{ {
if(au4_num_mmco_cmds[SET_MAX_LT_INDEX] > 0)
{
return ERROR_DBP_MANAGER_T;
}
u4_lt_idx = u4_lt_idx =
ps_mmc_params->u4_max_lt_idx_plus1; // Get Max_long_term_index_plus1 ps_mmc_params->u4_max_lt_idx_plus1; // Get Max_long_term_index_plus1
@ -2036,6 +2038,11 @@ WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_
} }
case SET_LT_INDEX: case SET_LT_INDEX:
{ {
if(au4_num_mmco_cmds[SET_LT_INDEX] > 0)
{
return ERROR_DBP_MANAGER_T;
}
u4_lt_idx = ps_mmc_params->u4_lt_idx; // Get long term index u4_lt_idx = ps_mmc_params->u4_lt_idx; // Get long term index
if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) || if((ps_dpb_mgr->u1_max_lt_frame_idx == NO_LONG_TERM_INDICIES) ||
@ -2070,34 +2077,52 @@ WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_
break; break;
} }
case RESET_REF_PICTURES:
{
if((au4_num_mmco_cmds[RESET_REF_PICTURES] > 0) ||
(au4_num_mmco_cmds[MARK_ST_PICNUM_AS_NONREF] > 0) ||
(au4_num_mmco_cmds[MARK_LT_INDEX_AS_NONREF] > 0) ||
(au4_num_mmco_cmds[MARK_ST_PICNUM_AS_LT_INDEX] > 0))
{
return ERROR_DBP_MANAGER_T;
}
if((j > 0) && (ps_dpb_cmds->as_mmc_params[j - 1].u4_mmco == SET_LT_INDEX))
{
return ERROR_DBP_MANAGER_T;
}
__attribute__((fallthrough));
}
case RESET_ALL_PICTURES:
{
WORD32 i4_pic_num = ps_cur_au->i4_frame_num;
imvcd_reset_dpb(ps_dpb_mgr);
ps_cur_au->i4_frame_num = 0;
if(!u1_marked_lt && u1_insert_st_pic)
{
i4_error_code = imvcd_dpb_insert_st_node(ps_dpb_mgr, ps_cur_au);
if(i4_error_code != OK)
{
return i4_error_code;
}
}
ps_cur_au->i4_frame_num = i4_pic_num;
return OK;
}
default: default:
{ {
break; return ERROR_DBP_MANAGER_T;
} }
} }
if((u4_mmco == RESET_REF_PICTURES) || (u4_mmco == RESET_ALL_PICTURES)) au4_num_mmco_cmds[u4_mmco]++;
{
i4_pic_num = ps_cur_au->i4_frame_num;
imvcd_reset_dpb(ps_dpb_mgr);
ps_cur_au->i4_frame_num = 0;
if(!u1_marked_lt && u1_insert_st_pic)
{
i4_error_code = imvcd_dpb_insert_st_node(ps_dpb_mgr, ps_cur_au);
if(i4_error_code != OK)
{
return i4_error_code;
}
}
ps_cur_au->i4_frame_num = i4_pic_num;
return OK;
}
} }
} }

View file

@ -34,10 +34,13 @@
#include "ih264_error.h" #include "ih264_error.h"
#include "ih264_buf_mgr.h" #include "ih264_buf_mgr.h"
#include "ih264_disp_mgr.h" #include "ih264_disp_mgr.h"
#include "ih264d_dpb_manager.h"
#include "imvcd_defs.h" #include "imvcd_defs.h"
#include "imvcd_structs.h" #include "imvcd_structs.h"
#include "imvcd_utils.h" #include "imvcd_utils.h"
#define NUM_MMCO_CMD_IDS ((RESET_ALL_PICTURES) + 1)
typedef struct mvc_dpb_info_t typedef struct mvc_dpb_info_t
{ {
mvc_au_buffer_t *ps_au_buf; mvc_au_buffer_t *ps_au_buf;