From 36df88058135607162d25b73cab93e19b0a8cb76 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sun, 2 Feb 2003 23:34:30 +0000 Subject: [PATCH] divx503 decoding fix Originally committed as revision 1538 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/avcodec.h | 8 ++++++++ libavcodec/h263dec.c | 13 ++++--------- libavcodec/mpegvideo.c | 5 +++++ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 6ee2b84cdf..6e7b0d4837 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1,6 +1,13 @@ #ifndef AVCODEC_H #define AVCODEC_H +/** + * @file avcodec.h + * @brief + * external api header + */ + + #ifdef __cplusplus extern "C" { #endif @@ -523,6 +530,7 @@ typedef struct AVCodecContext { #define FF_BUG_AC_VLC 32 #define FF_BUG_QPEL_CHROMA 64 #define FF_BUG_STD_QPEL 128 +#define FF_BUG_QPEL_CHROMA2 256 //#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100% /** diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index a5dadeec4a..89f606b216 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -20,12 +20,6 @@ #include "dsputil.h" #include "mpegvideo.h" -#if 1 -#define PRINT_QP(a, b) {} -#else -#define PRINT_QP(a, b) printf(a, b) -#endif - //#define DEBUG //#define PRINT_FRAME_TIME #ifdef PRINT_FRAME_TIME @@ -205,7 +199,6 @@ static int decode_slice(MpegEncContext *s){ //printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24)); ret= s->decode_mb(s, s->block); - PRINT_QP("%2d", s->qscale); MPV_decode_mb(s, s->block); if(ret<0){ @@ -239,8 +232,6 @@ static int decode_slice(MpegEncContext *s){ ff_draw_horiz_band(s); - PRINT_QP("%s", "\n"); - s->mb_x= 0; } @@ -495,6 +486,10 @@ retry: s->workaround_bugs|= FF_BUG_QPEL_CHROMA; } + if(s->divx_version>502){ + s->workaround_bugs|= FF_BUG_QPEL_CHROMA2; + } + if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0) s->workaround_bugs|= FF_BUG_QPEL_CHROMA; diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index d721647a57..15bd0249b0 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -1680,6 +1680,10 @@ static inline void qpel_motion(MpegEncContext *s, if(field_based){ mx= motion_x/2; my= motion_y>>1; + }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){ + static const int rtab[8]= {0,0,1,1,0,0,0,1}; + mx= (motion_x>>1) + rtab[motion_x&7]; + my= (motion_y>>1) + rtab[motion_y&7]; }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){ mx= (motion_x>>1)|(motion_x&1); my= (motion_y>>1)|(motion_y&1); @@ -1689,6 +1693,7 @@ static inline void qpel_motion(MpegEncContext *s, } mx= (mx>>1)|(mx&1); my= (my>>1)|(my&1); + dxy= (mx&1) | ((my&1)<<1); mx>>=1; my>>=1;