mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-09 14:14:39 +02:00
avcodec/h264: Do not fail with randomly truncated VUIs
Fixes Ticket4445 Tested-by: Vittorio Giovara <vittorio.giovara@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
4d0f6d3fb4
commit
bc48c88918
@ -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:
|
|||||||
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);
|
|||||||
/**
|
/**
|
||||||
* 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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user