From 6b8184944b0a361fdc4b34f017e0ed47b7ac8a32 Mon Sep 17 00:00:00 2001 From: Hamsalekha S Date: Thu, 11 May 2017 11:36:05 -0700 Subject: [PATCH] DO NOT MERGE Fixed bug during resolution change Modifies how i4_header_decoded is decoder context is used, to ensure that resolution change is detected even if PPS has not been decoded. This retrofits parts of the below mentioned 'merged-in' commits which solve this for mnc-dr and later versions of the library. The retrofit required dropping portions that affected code introduced in a later baseline. Bug: 35583675 Test: provided input file no longer hangs Change-Id: I8fa30543759c5762b18e2380513e2ce616c858ef Merged-In: I0d248212aaf6635f34a70ad36657416a0c623d32 Merged-In: Ifd21ebe1827d6d0c13018983c46c4301c2bb1669 --- decoder/ih264d_parse_headers.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/decoder/ih264d_parse_headers.c b/decoder/ih264d_parse_headers.c index a398658..9dd9848 100644 --- a/decoder/ih264d_parse_headers.c +++ b/decoder/ih264d_parse_headers.c @@ -563,6 +563,23 @@ 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; + + if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_profile_idc != u1_profile_idc)) + { + ps_dec->u1_res_changed = 1; + return IVD_RES_CHANGED; + } + + if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_level_idc != u1_level_idc)) + { + ps_dec->u1_res_changed = 1; + return IVD_RES_CHANGED; + } + + ps_seq->u1_profile_idc = u1_profile_idc; ps_seq->u1_level_idc = u1_level_idc; ps_seq->u1_seq_parameter_set_id = u1_seq_parameter_set_id; @@ -729,6 +746,14 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm) { return ERROR_NUM_REF; } + + /* Compare with older num_ref_frames is header is already once */ + if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_num_ref_frames != u4_temp)) + { + ps_dec->u1_res_changed = 1; + return IVD_RES_CHANGED; + } + ps_seq->u1_num_ref_frames = u4_temp; if(ps_seq->u1_num_ref_frames > ps_dec->u4_num_ref_frames_at_init) @@ -922,12 +947,12 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm) return ERROR_INV_SPS_PPS_T; } - if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_wd != u2_pic_wd)) + if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_pic_wd != u2_pic_wd)) { ps_dec->u1_res_changed = 1; return IVD_RES_CHANGED; } - if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_ht != u2_pic_ht)) + if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_pic_ht != u2_pic_ht)) { ps_dec->u1_res_changed = 1; return IVD_RES_CHANGED; @@ -961,6 +986,7 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm) return ret; } + if(ps_dec->u4_level_at_init < u1_level_idc) { UWORD32 u4_num_pic_bufs_reqd, u4_num_reorder_frames,