diff options
author | Janne Grunau <janne-libav@jannau.net> | 2011-12-19 21:11:44 +0400 |
---|---|---|
committer | Janne Grunau <janne-libav@jannau.net> | 2011-12-20 02:14:21 +0400 |
commit | 729ebb2f185244b0ff06d48edbbbbb02ceb4ed4e (patch) | |
tree | 7dec75679b21d24163785451ffbc3ebd8d07d7dd /libavcodec | |
parent | 0a6aff69366cb60d252ae46bd1d21d4b2074fa71 (diff) |
h264: clear trailing bits in partially parsed NAL units
Trailing bits are likely to be non-zero if the NAL unit is truncated.
Clearing the bits make overreads of the bitstream less likely in this
case. Fixes playback of
http://streams.videolan.org/streams/mp4/Mr_MrsSmith-h264_aac.mp4 which
has a forbidden byte sequence of 0x00 0x00 0x00 in it SPS.
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/h264.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 77acd7168f..a9a10513e3 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -3759,7 +3759,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ int consumed; int dst_length; int bit_length; - const uint8_t *ptr; + uint8_t *ptr; int i, nalsize = 0; int err; @@ -3809,6 +3809,9 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ } if (h->is_avc && (nalsize != consumed) && nalsize){ + // set trailing bits in the last partial byte to zero + if (bit_length & 7) + ptr[bit_length >> 3] = ptr[bit_length >> 3] & (0xff << 8 - (bit_length & 7)); av_log(h->s.avctx, AV_LOG_DEBUG, "AVC: Consumed only %d bytes instead of %d\n", consumed, nalsize); } |