diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-10-01 17:41:28 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-10-01 17:59:27 +0200 |
commit | c9c7a776db3615b627dde75b9b9e3e786da43827 (patch) | |
tree | 3e658a318bf4416370ccc4b6507d4c74c072d72d | |
parent | fe70c1f45f108c73ebb9c23009e271a96336796f (diff) | |
download | ffmpeg-c9c7a776db3615b627dde75b9b9e3e786da43827.tar.gz |
h264: try reading SPS with wrong escaping, it sometimes works better
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/h264.c | 6 | ||||
-rw-r--r-- | libavcodec/h264_ps.c | 5 |
2 files changed, 9 insertions, 2 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 2ea141e0df..792775494a 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -3801,7 +3801,11 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ break; case NAL_SPS: init_get_bits(&s->gb, ptr, bit_length); - ff_h264_decode_seq_parameter_set(h); + if(ff_h264_decode_seq_parameter_set(h) < 0 && h->is_avc && (nalsize != consumed) && nalsize){ + av_log(h->s.avctx, AV_LOG_DEBUG, "SPS decoding failure, trying alternative mode\n"); + init_get_bits(&s->gb, &buf[buf_index + 1 - consumed], 8*nalsize); + ff_h264_decode_seq_parameter_set(h); + } if (s->flags& CODEC_FLAG_LOW_DELAY || (h->sps.bitstream_restriction_flag && !h->sps.num_reorder_frames)) diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c index ba16e1c076..36b18e9cc7 100644 --- a/libavcodec/h264_ps.c +++ b/libavcodec/h264_ps.c @@ -228,7 +228,6 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){ get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/ if(s->gb.size_in_bits < get_bits_count(&s->gb)){ - av_log(h->s.avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", get_bits_count(&s->gb) - s->gb.size_in_bits); sps->num_reorder_frames=0; sps->bitstream_restriction_flag= 0; } @@ -238,6 +237,10 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){ return -1; } } + if(s->gb.size_in_bits < get_bits_count(&s->gb)){ + av_log(h->s.avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", get_bits_count(&s->gb) - s->gb.size_in_bits); + return -1; + } return 0; } |