diff options
author | Grant Hsu <grant.hsu@cidana.com> | 2016-06-21 18:08:13 +0800 |
---|---|---|
committer | Ray Essick <essick@google.com> | 2016-06-28 22:44:48 +0000 |
commit | 3426916ae11a156b3bc216f6e074007a0353e518 (patch) | |
tree | abcf3d11ab97dce56c658a0ec71b0deda02f9e48 | |
parent | 3a405b4cc3a0c23eb70253b174a1aadb0a167ac4 (diff) | |
download | libhevc-3426916ae11a156b3bc216f6e074007a0353e518.tar.gz |
Fixed decode conformance stream LTRPSPS_A_Qualcomm_1.bitandroid-wear-n-preview-2android-wear-7.1.1_r1android-n-preview-5android-n-iot-preview-2nougat-mr1-wear-releasen-iot-preview-2
1. change ai1_lt_ref_pic_poc_lsb_sps from WORD8 to UWORD16 because i1_log2_max_pic_order_cnt_lsb can be up to 16 by the spec
2. fixed bug using CLZ to compute Ceil( Log2( num_long_term_ref_pics_sps ) ) and check if i1_num_long_term_ref_pics_sps is greater than 1 to avoid BITS_PARSE(0)
Change-Id: I298b74d053b17d133b9dcba0e924136ec274ea3c
-rw-r--r-- | common/ihevc_structs.h | 2 | ||||
-rw-r--r-- | decoder/ihevcd_parse_headers.c | 2 | ||||
-rw-r--r-- | decoder/ihevcd_parse_slice_header.c | 13 |
3 files changed, 12 insertions, 5 deletions
diff --git a/common/ihevc_structs.h b/common/ihevc_structs.h index 93d2ad4..0205582 100644 --- a/common/ihevc_structs.h +++ b/common/ihevc_structs.h @@ -2406,7 +2406,7 @@ typedef struct /** * lt_ref_pic_poc_lsb_sps[] */ - WORD8 ai1_lt_ref_pic_poc_lsb_sps[MAX_LTREF_PICS_SPS]; + UWORD16 au2_lt_ref_pic_poc_lsb_sps[MAX_LTREF_PICS_SPS]; /** * used_by_curr_pic_lt_sps_flag[] diff --git a/decoder/ihevcd_parse_headers.c b/decoder/ihevcd_parse_headers.c index d15e273..ea82a80 100644 --- a/decoder/ihevcd_parse_headers.c +++ b/decoder/ihevcd_parse_headers.c @@ -1518,7 +1518,7 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) for(i = 0; i < ps_sps->i1_num_long_term_ref_pics_sps; i++) { BITS_PARSE("lt_ref_pic_poc_lsb_sps[ i ]", value, ps_bitstrm, ps_sps->i1_log2_max_pic_order_cnt_lsb); - ps_sps->ai1_lt_ref_pic_poc_lsb_sps[i] = value; + ps_sps->au2_lt_ref_pic_poc_lsb_sps[i] = value; BITS_PARSE("used_by_curr_pic_lt_sps_flag[ i ]", value, ps_bitstrm, 1); ps_sps->ai1_used_by_curr_pic_lt_sps_flag[i] = value; diff --git a/decoder/ihevcd_parse_slice_header.c b/decoder/ihevcd_parse_slice_header.c index e9c3073..b0ed14d 100644 --- a/decoder/ihevcd_parse_slice_header.c +++ b/decoder/ihevcd_parse_slice_header.c @@ -468,9 +468,16 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, if(i < ps_slice_hdr->i1_num_long_term_sps) { /* Use CLZ to compute Ceil( Log2( num_long_term_ref_pics_sps ) ) */ - WORD32 num_bits = 32 - CLZ(ps_sps->i1_num_long_term_ref_pics_sps); - BITS_PARSE("lt_idx_sps[ i ]", value, ps_bitstrm, num_bits); - ps_slice_hdr->ai4_poc_lsb_lt[i] = ps_sps->ai1_lt_ref_pic_poc_lsb_sps[value]; + if (ps_sps->i1_num_long_term_ref_pics_sps > 1) + { + WORD32 num_bits = 32 - CLZ(ps_sps->i1_num_long_term_ref_pics_sps - 1); + BITS_PARSE("lt_idx_sps[ i ]", value, ps_bitstrm, num_bits); + } + else + { + value = 0; + } + ps_slice_hdr->ai4_poc_lsb_lt[i] = ps_sps->au2_lt_ref_pic_poc_lsb_sps[value]; ps_slice_hdr->ai1_used_by_curr_pic_lt_flag[i] = ps_sps->ai1_used_by_curr_pic_lt_sps_flag[value]; } |