summaryrefslogtreecommitdiff
path: root/libavcodec/h264.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2010-02-12 19:25:23 +0000
committerMichael Niedermayer <michaelni@gmx.at>2010-02-12 19:25:23 +0000
commit3566042a0dfd7c016e6e9945e63699dd7296adb2 (patch)
tree8ce68de21e9e8308fd9d1a51ac8825aad6db68e9 /libavcodec/h264.c
parent9f1d760a278f59a015acbc3d432f0fddff57604e (diff)
Try to support truncated h264 frames mixed with mpeg pes headers in mkv.
Fixes issue1585 Originally committed as revision 21772 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r--libavcodec/h264.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index bbe710edb2..dfe618b444 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -2257,6 +2257,10 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
}
eos = get_cabac_terminate( &h->cabac );
+ if((s->workaround_bugs & FF_BUG_TRUNCATED) && h->cabac.bytestream > h->cabac.bytestream_end + 2){
+ ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
+ return 0;
+ }
if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) {
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d, bytestream (%td)\n", s->mb_x, s->mb_y, h->cabac.bytestream_end - h->cabac.bytestream);
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
@@ -2492,8 +2496,15 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){
if (ptr==NULL || dst_length < 0){
return -1;
}
+ i= buf_index + consumed;
+ if((s->workaround_bugs & FF_BUG_AUTODETECT) && i+3<next_avc &&
+ buf[i]==0x00 && buf[i+1]==0x00 && buf[i+2]==0x01 && buf[i+3]==0xE0)
+ s->workaround_bugs |= FF_BUG_TRUNCATED;
+
+ if(!(s->workaround_bugs & FF_BUG_TRUNCATED)){
while(ptr[dst_length - 1] == 0 && dst_length > 0)
dst_length--;
+ }
bit_length= !dst_length ? 0 : (8*dst_length - ff_h264_decode_rbsp_trailing(h, ptr + dst_length - 1));
if(s->avctx->debug&FF_DEBUG_STARTCODE){