Merge "mvc: corrected handling of incorrect bitstreams in mmco parsing"

This commit is contained in:
Treehugger Robot 2022-08-30 15:29:42 +00:00 • committed by Gerrit Code Review
commit b7ac6e9575
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_diff_pic_num;
WORD32 i4_pic_num;
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++)
{
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;
}
i4_pic_num = i8_pic_num;
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,
MAX_REF_BUFS + 1);
i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(
ps_dpb_mgr, (WORD32) i8_pic_num, MAX_REF_BUFS + 1);
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;
i4_error_code =
imvcd_dpb_delete_gap_frm_mmco(ps_dpb_mgr, i4_pic_num, &u1_dummy);
i4_error_code = imvcd_dpb_delete_gap_frm_mmco(
ps_dpb_mgr, (WORD32) i8_pic_num, &u1_dummy);
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;
}
i4_pic_num = i8_pic_num;
u4_lt_idx = ps_mmc_params->u4_lt_idx;
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)
{
i4_error_code =
imvcd_dpb_delete_st_node_or_make_lt(ps_dpb_mgr, i4_pic_num, u4_lt_idx);
i4_error_code = imvcd_dpb_delete_st_node_or_make_lt(
ps_dpb_mgr, (WORD32) i8_pic_num, u4_lt_idx);
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:
{
if(au4_num_mmco_cmds[SET_MAX_LT_INDEX] > 0)
{
return ERROR_DBP_MANAGER_T;
}
u4_lt_idx =
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:
{
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
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;
}
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:
{
break;
return ERROR_DBP_MANAGER_T;
}
}
if((u4_mmco == RESET_REF_PICTURES) || (u4_mmco == RESET_ALL_PICTURES))
{
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;
}
au4_num_mmco_cmds[u4_mmco]++;
}
}

View file

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