From fe18375850fe04b8c4ff2f1b20069e161f718e53 Mon Sep 17 00:00:00 2001 From: Hamsalekha S Date: Mon, 22 May 2017 14:10:15 +0530 Subject: Fix resolution change within a decode call. If resolution changes within a decode call,due to multiple sps, the decoder hangs as the the application will give the same data again in the next decode call. This results in a hang. Fixed this by flaging an error, when sps/resoultion changes within a process call. Bug: 38487564 Test: ran POC on patched O-based system w/o hanging Change-Id: I30095b2e8bf573c1a58a316a23b1a5e6a4af589b --- decoder/ih264d_api.c | 1 + decoder/ih264d_parse_headers.c | 10 ++++++++++ decoder/ih264d_structs.h | 1 + 3 files changed, 12 insertions(+) (limited to 'decoder') diff --git a/decoder/ih264d_api.c b/decoder/ih264d_api.c index 17486ba..61a91a6 100644 --- a/decoder/ih264d_api.c +++ b/decoder/ih264d_api.c @@ -2879,6 +2879,7 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) ps_dec->u4_bs_deblk_thread_created = 0; ps_dec->u4_cur_bs_mb_num = 0; ps_dec->u4_start_recon_deblk = 0; + ps_dec->u4_sps_cnt_in_process = 0; DEBUG_THREADS_PRINTF(" Starting process call\n"); diff --git a/decoder/ih264d_parse_headers.c b/decoder/ih264d_parse_headers.c index c979ade..ec57874 100644 --- a/decoder/ih264d_parse_headers.c +++ b/decoder/ih264d_parse_headers.c @@ -1221,6 +1221,16 @@ WORD32 ih264d_parse_nal_unit(iv_obj_t *dec_hdl, /* ! */ ih264d_rbsp_to_sodb(ps_dec->ps_bitstrm); i_status = ih264d_parse_sps(ps_dec, ps_bitstrm); + ps_dec->u4_sps_cnt_in_process++; + /*If a resolution change happens within a process call, due to multiple sps + * we will not support it. + */ + if((ps_dec->u4_sps_cnt_in_process > 1 ) && + (i_status == IVD_RES_CHANGED)) + { + i_status = ERROR_INV_SPS_PPS_T; + ps_dec->u1_res_changed = 0; + } if(i_status == ERROR_INV_SPS_PPS_T) return i_status; if(!i_status) diff --git a/decoder/ih264d_structs.h b/decoder/ih264d_structs.h index 062747b..69fddb1 100644 --- a/decoder/ih264d_structs.h +++ b/decoder/ih264d_structs.h @@ -1317,6 +1317,7 @@ typedef struct _DecStruct UWORD32 u4_cur_bs_mb_num; UWORD32 u4_bs_cur_slice_num_mbs; UWORD32 u4_cur_deblk_mb_num; + UWORD32 u4_sps_cnt_in_process; volatile UWORD16 u2_cur_slice_num_bs; UWORD32 u4_deblk_mb_x; -- cgit v1.2.3