From 7da71a5c687a3ceff7826a9e60a59aed3b1feffa Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Tue, 22 Oct 2002 19:48:52 +0000 Subject: [PATCH] xvid qpel bug autodetect Originally committed as revision 1064 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h263.c | 16 +++++++++++++--- libavcodec/h263dec.c | 7 +++++++ libavcodec/mpegvideo.h | 2 ++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/libavcodec/h263.c b/libavcodec/h263.c index 35963eb5a2..dfcc0b5baf 100644 --- a/libavcodec/h263.c +++ b/libavcodec/h263.c @@ -4328,6 +4328,8 @@ static int decode_user_data(MpegEncContext *s, GetBitContext *gb){ skip_bits(gb, 8); } buf[255]=0; + + /* divx detection */ e=sscanf(buf, "DivX%dBuild%d", &ver, &build); if(e!=2) e=sscanf(buf, "DivX%db%d", &ver, &build); @@ -4336,11 +4338,10 @@ static int decode_user_data(MpegEncContext *s, GetBitContext *gb){ s->divx_build= build; if(s->picture_number==0){ printf("This file was encoded with DivX%d Build%d\n", ver, build); - if(ver==500 && build==413){ - printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n"); - } } } + + /* ffmpeg detection */ e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build); if(e!=4) e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build); @@ -4356,6 +4357,15 @@ static int decode_user_data(MpegEncContext *s, GetBitContext *gb){ if(s->picture_number==0) printf("This file was encoded with libavcodec build %d\n", build); } + + /* xvid detection */ + e=sscanf(buf, "XviD%d", &build); + if(e==1){ + s->xvid_build= build; + if(s->picture_number==0) + printf("This file was encoded with XviD build %d\n", build); + } + //printf("User Data: %s\n", buf); return 0; } diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index 653a2a8708..1e4345e623 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -376,6 +376,13 @@ uint64_t time= rdtsc(); if(s->divx_version){ s->workaround_bugs|= FF_BUG_QPEL_CHROMA; } + + if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0) + s->workaround_bugs|= FF_BUG_QPEL_CHROMA; + + if(s->xvid_build && s->xvid_build<=1) + s->workaround_bugs|= FF_BUG_QPEL_CHROMA; + //printf("padding_bug_score: %d\n", s->padding_bug_score); #if 0 if(s->divx_version==500) diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 35df0915f6..254e85dac7 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -413,6 +413,8 @@ typedef struct MpegEncContext { UINT8 *bitstream_buffer; //Divx 5.01 puts several frames in a single one, this is used to reorder them int bitstream_buffer_size; + int xvid_build; + /* lavc specific stuff, used to workaround bugs in libavcodec */ int ffmpeg_version; int lavc_build;