From 19928d402da412925098fc24e3c5c566de5d1869 Mon Sep 17 00:00:00 2001 From: Hamsalekha S Date: Fri, 21 Apr 2017 17:17:45 +0530 Subject: Decoder: Cleaned up parse sps function. Postponed the initializations to decoder context till the end of the parse sps function, after all the error checks are done. Bug: 37968755 Test: ran poc on ASAN-enabled build before/after Change-Id: Ibee3383c28cede3edb68d2459565d6ce10683bbd (cherry picked from commit 4eb72f7c935595817026b4cf4aed5ef2ff579ab5) --- decoder/ih264d_parse_headers.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/decoder/ih264d_parse_headers.c b/decoder/ih264d_parse_headers.c index ba32225..faf2d6f 100644 --- a/decoder/ih264d_parse_headers.c +++ b/decoder/ih264d_parse_headers.c @@ -484,7 +484,7 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm) UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; UWORD8 u1_frm, uc_constraint_set0_flag, uc_constraint_set1_flag; - + WORD32 i4_cropped_ht, i4_cropped_wd; UWORD32 u4_temp; WORD32 pic_height_in_map_units_minus1 = 0; UWORD32 u2_pic_wd = 0; @@ -566,8 +566,6 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm) ps_seq = ps_dec->pv_scratch_sps_pps; *ps_seq = ps_dec->ps_sps[u1_seq_parameter_set_id]; - if(NULL == ps_dec->ps_cur_sps) - ps_dec->ps_cur_sps = ps_seq; ps_seq->u1_profile_idc = u1_profile_idc; ps_seq->u1_level_idc = u1_level_idc; @@ -843,7 +841,6 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm) UWORD16 u2_btm_ofst = 0; UWORD8 u1_frm_mbs_flag; UWORD8 u1_vert_mult_factor; - WORD32 i4_cropped_ht, i4_cropped_wd; if(u1_frame_cropping_flag) { @@ -905,10 +902,6 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm) return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED; } - ps_dec->u2_disp_height = i4_cropped_ht; - - ps_dec->u2_disp_width = i4_cropped_wd; - } if(1 == ps_seq->u1_vui_parameters_present_flag) @@ -918,6 +911,19 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm) return ret; } + /* In case bitstream read has exceeded the filled size, then + return an error */ + if (ps_bitstrm->u4_ofst > ps_bitstrm->u4_max_ofst) + { + return ERROR_INV_SPS_PPS_T; + } + + /*--------------------------------------------------------------------*/ + /* All initializations to ps_dec are beyond this point */ + /*--------------------------------------------------------------------*/ + ps_dec->u2_disp_height = i4_cropped_ht; + ps_dec->u2_disp_width = i4_cropped_wd; + ps_dec->u2_pic_wd = u2_pic_wd; ps_dec->u2_pic_ht = u2_pic_ht; @@ -936,14 +942,9 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm) ps_dec->u2_crop_offset_y = u2_crop_offset_y; ps_dec->u2_crop_offset_uv = u2_crop_offset_uv; - /* In case bitstream read has exceeded the filled size, then - return an error */ - if(ps_bitstrm->u4_ofst > ps_bitstrm->u4_max_ofst) - { - return ERROR_INV_SPS_PPS_T; - } ps_seq->u1_is_valid = TRUE; ps_dec->ps_sps[u1_seq_parameter_set_id] = *ps_seq; + ps_dec->ps_cur_sps = &ps_dec->ps_sps[u1_seq_parameter_set_id]; return OK; } -- cgit v1.2.3