diff options
author | Anton Khirnov <anton@khirnov.net> | 2016-10-01 10:03:05 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2016-10-02 11:41:45 +0200 |
commit | 5bf2454e7cb03609b3ec1a3cf4c22427fe5f8e36 (patch) | |
tree | e1dc3fe7e38845891de448d712151abc8fff91ba /libavcodec | |
parent | 2124711b950b03c582a119c75f52a87acc32d6ec (diff) | |
download | ffmpeg-5bf2454e7cb03609b3ec1a3cf4c22427fe5f8e36.tar.gz |
h264dec: support broken files with mp4 extradata/annex b data
Bug-Id: 966
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/h264dec.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index 2c5a7db33a..330a74dcb4 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -530,7 +530,24 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size) if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Error splitting the input into NAL units.\n"); - return ret; + + /* There are samples in the wild with mp4-style extradata, but Annex B + * data in the packets. If we fail parsing the packet as mp4, try it again + * as Annex B. */ + if (h->is_avc && !(avctx->err_recognition & AV_EF_EXPLODE)) { + int err = ff_h2645_packet_split(&h->pkt, buf, buf_size, avctx, 0, 0, + avctx->codec_id); + if (err >= 0) { + av_log(avctx, AV_LOG_WARNING, + "The stream seems to contain AVCC extradata with Annex B " + "formatted data, which is invalid."); + h->is_avc = 0; + ret = 0; + } + } + + if (ret < 0) + return ret; } if (avctx->active_thread_type & FF_THREAD_FRAME) |