aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrant Hsu <grant.hsu@cidana.com>2016-06-21 18:08:13 +0800
committerRay Essick <essick@google.com>2016-06-28 22:44:48 +0000
commit3426916ae11a156b3bc216f6e074007a0353e518 (patch)
treeabcf3d11ab97dce56c658a0ec71b0deda02f9e48
parent3a405b4cc3a0c23eb70253b174a1aadb0a167ac4 (diff)
downloadlibhevc-3426916ae11a156b3bc216f6e074007a0353e518.tar.gz
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.h2
-rw-r--r--decoder/ihevcd_parse_headers.c2
-rw-r--r--decoder/ihevcd_parse_slice_header.c13
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];
}