divx503 decoding fix
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 2 Feb 2003 23:34:30 +0000 (23:34 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 2 Feb 2003 23:34:30 +0000 (23:34 +0000)
Originally committed as revision 1538 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/h263dec.c
libavcodec/mpegvideo.c

index 6ee2b84..6e7b0d4 100644 (file)
@@ -1,6 +1,13 @@
 #ifndef AVCODEC_H
 #define AVCODEC_H
 
 #ifndef AVCODEC_H
 #define AVCODEC_H
 
+/**
+ * @file avcodec.h
+ * @brief 
+ *     external api header
+ */
+
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 #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_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%
         
     /**
 //#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100%
         
     /**
index a5dadee..89f606b 100644 (file)
 #include "dsputil.h"
 #include "mpegvideo.h"
 
 #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
 //#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);
             
 //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){
             MPV_decode_mb(s, s->block);
 
             if(ret<0){
@@ -239,8 +232,6 @@ static int decode_slice(MpegEncContext *s){
         
         ff_draw_horiz_band(s);
         
         
         ff_draw_horiz_band(s);
         
-        PRINT_QP("%s", "\n");
-        
         s->mb_x= 0;
     }
     
         s->mb_x= 0;
     }
     
@@ -495,6 +486,10 @@ retry:
             s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
         }
 
             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;
         
         if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0)
             s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
         
index d721647..15bd024 100644 (file)
@@ -1680,6 +1680,10 @@ static inline void qpel_motion(MpegEncContext *s,
     if(field_based){
         mx= motion_x/2;
         my= motion_y>>1;
     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);
     }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);
     }
     mx= (mx>>1)|(mx&1);
     my= (my>>1)|(my&1);
+
     dxy= (mx&1) | ((my&1)<<1);
     mx>>=1;
     my>>=1;
     dxy= (mx&1) | ((my&1)<<1);
     mx>>=1;
     my>>=1;