summaryrefslogtreecommitdiff
path: root/libavcodec/h264_sei.c
diff options
context:
space:
mode:
authorMark Harris <mark.hsj@gmail.com>2015-12-28 23:04:08 -0800
committerMichael Niedermayer <michael@niedermayer.cc>2015-12-29 13:11:51 +0100
commitc51c08e0e70c186971385bdbb225f69edd4e3375 (patch)
treecdced95a7ae4749374e575984e7e5c956c45f8a2 /libavcodec/h264_sei.c
parentefa666e0da5e5fd2ded2e7dce4191bf04ac35952 (diff)
avcodec: Use get_ue_golomb_long() when needed
get_ue_golomb() cannot decode values larger than 8190 (the maximum value that can be golomb encoded in 25 bits) and produces the error "Invalid UE golomb code" if a larger value is encountered. Use get_ue_golomb_long() instead (which supports 63 bits, up to 4294967294) when valid h264/hevc values can exceed 8190. This updates decoding of the following values: (maximum) first_mb_in_slice 36863* for level 5.2 abs_diff_pic_num_minus1 131071 difference_of_pic_nums_minus1 131071 idr_pic_id 65535 recovery_frame_cnt 65535 frame_packing_arrangement_id 4294967294 frame_packing_arrangement_repetition_period 16384 display_orientation_repetition_period 16384 An alternative would be to modify get_ue_golomb() to handle encoded values of up to 49 bits as was done for get_se_golomb() in a92816c. In that case get_ue_golomb() could continue to be used for all of these except frame_packing_arrangement_id. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/h264_sei.c')
-rw-r--r--libavcodec/h264_sei.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c
index 0411b87693..77dd7b21d6 100644
--- a/libavcodec/h264_sei.c
+++ b/libavcodec/h264_sei.c
@@ -253,7 +253,7 @@ static int decode_unregistered_user_data(H264Context *h, int size)
static int decode_recovery_point(H264Context *h)
{
- h->sei_recovery_frame_cnt = get_ue_golomb(&h->gb);
+ h->sei_recovery_frame_cnt = get_ue_golomb_long(&h->gb);
/* 1b exact_match_flag,
* 1b broken_link_flag,
@@ -306,7 +306,7 @@ static int decode_buffering_period(H264Context *h)
static int decode_frame_packing_arrangement(H264Context *h)
{
- h->sei_fpa.frame_packing_arrangement_id = get_ue_golomb(&h->gb);
+ h->sei_fpa.frame_packing_arrangement_id = get_ue_golomb_long(&h->gb);
h->sei_fpa.frame_packing_arrangement_cancel_flag = get_bits1(&h->gb);
h->sei_frame_packing_present = !h->sei_fpa.frame_packing_arrangement_cancel_flag;
@@ -326,7 +326,7 @@ static int decode_frame_packing_arrangement(H264Context *h)
if (!h->quincunx_subsampling && h->frame_packing_arrangement_type != 5)
skip_bits(&h->gb, 16); // frame[01]_grid_position_[xy]
skip_bits(&h->gb, 8); // frame_packing_arrangement_reserved_byte
- h->sei_fpa.frame_packing_arrangement_repetition_period = get_ue_golomb(&h->gb) /* frame_packing_arrangement_repetition_period */;
+ h->sei_fpa.frame_packing_arrangement_repetition_period = get_ue_golomb_long(&h->gb);
}
skip_bits1(&h->gb); // frame_packing_arrangement_extension_flag
@@ -351,8 +351,8 @@ static int decode_display_orientation(H264Context *h)
h->sei_vflip = get_bits1(&h->gb); // ver_flip
h->sei_anticlockwise_rotation = get_bits(&h->gb, 16);
- get_ue_golomb(&h->gb); // display_orientation_repetition_period
- skip_bits1(&h->gb); // display_orientation_extension_flag
+ get_ue_golomb_long(&h->gb); // display_orientation_repetition_period
+ skip_bits1(&h->gb); // display_orientation_extension_flag
}
return 0;