Commit bc48c889 authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/h264: Do not fail with randomly truncated VUIs

Fixes Ticket4445
Tested-by: 's avatarVittorio Giovara <vittorio.giovara@gmail.com>
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 4d0f6d3f
...@@ -1634,7 +1634,9 @@ again: ...@@ -1634,7 +1634,9 @@ again:
break; break;
case NAL_SPS: case NAL_SPS:
init_get_bits(&h->gb, ptr, bit_length); init_get_bits(&h->gb, ptr, bit_length);
if (ff_h264_decode_seq_parameter_set(h) < 0 && (h->is_avc ? nalsize : 1)) { if (ff_h264_decode_seq_parameter_set(h, 0) >= 0)
break;
if (h->is_avc ? nalsize : 1) {
av_log(h->avctx, AV_LOG_DEBUG, av_log(h->avctx, AV_LOG_DEBUG,
"SPS decoding failure, trying again with the complete NAL\n"); "SPS decoding failure, trying again with the complete NAL\n");
if (h->is_avc) if (h->is_avc)
...@@ -1643,8 +1645,11 @@ again: ...@@ -1643,8 +1645,11 @@ again:
break; break;
init_get_bits(&h->gb, &buf[buf_index + 1 - consumed], init_get_bits(&h->gb, &buf[buf_index + 1 - consumed],
8*(next_avc - buf_index + consumed - 1)); 8*(next_avc - buf_index + consumed - 1));
ff_h264_decode_seq_parameter_set(h); if (ff_h264_decode_seq_parameter_set(h, 0) >= 0)
break;
} }
init_get_bits(&h->gb, ptr, bit_length);
ff_h264_decode_seq_parameter_set(h, 1);
break; break;
case NAL_PPS: case NAL_PPS:
......
...@@ -812,7 +812,7 @@ int ff_h264_decode_sei(H264Context *h); ...@@ -812,7 +812,7 @@ int ff_h264_decode_sei(H264Context *h);
/** /**
* Decode SPS * Decode SPS
*/ */
int ff_h264_decode_seq_parameter_set(H264Context *h); int ff_h264_decode_seq_parameter_set(H264Context *h, int ignore_truncation);
/** /**
* compute profile from sps * compute profile from sps
......
...@@ -282,7 +282,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, ...@@ -282,7 +282,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
init_get_bits(&h->gb, ptr, 8 * dst_length); init_get_bits(&h->gb, ptr, 8 * dst_length);
switch (h->nal_unit_type) { switch (h->nal_unit_type) {
case NAL_SPS: case NAL_SPS:
ff_h264_decode_seq_parameter_set(h); ff_h264_decode_seq_parameter_set(h, 0);
break; break;
case NAL_PPS: case NAL_PPS:
ff_h264_decode_picture_parameter_set(h, h->gb.size_in_bits); ff_h264_decode_picture_parameter_set(h, h->gb.size_in_bits);
......
...@@ -297,7 +297,7 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps, ...@@ -297,7 +297,7 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps,
} }
} }
int ff_h264_decode_seq_parameter_set(H264Context *h) int ff_h264_decode_seq_parameter_set(H264Context *h, int ignore_truncation)
{ {
int profile_idc, level_idc, constraint_set_flags = 0; int profile_idc, level_idc, constraint_set_flags = 0;
unsigned int sps_id; unsigned int sps_id;
...@@ -518,9 +518,10 @@ int ff_h264_decode_seq_parameter_set(H264Context *h) ...@@ -518,9 +518,10 @@ int ff_h264_decode_seq_parameter_set(H264Context *h)
} }
if (get_bits_left(&h->gb) < 0) { if (get_bits_left(&h->gb) < 0) {
av_log(h->avctx, AV_LOG_ERROR, av_log(h->avctx, ignore_truncation ? AV_LOG_WARNING : AV_LOG_ERROR,
"Overread %s by %d bits\n", sps->vui_parameters_present_flag ? "VUI" : "SPS", -get_bits_left(&h->gb)); "Overread %s by %d bits\n", sps->vui_parameters_present_flag ? "VUI" : "SPS", -get_bits_left(&h->gb));
goto fail; if (!ignore_truncation)
goto fail;
} }
if (!sps->sar.den) if (!sps->sar.den)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment