diff options
author | Mark Harris <mark.hsj@gmail.com> | 2015-12-29 10:04:08 +0300 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2015-12-29 15:11:51 +0300 |
commit | c51c08e0e70c186971385bdbb225f69edd4e3375 (patch) | |
tree | cdced95a7ae4749374e575984e7e5c956c45f8a2 /libavcodec/h264_sei.c | |
parent | efa666e0da5e5fd2ded2e7dce4191bf04ac35952 (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.c | 10 |
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; |