changeset 1053:f07fd48c23d4 libavcodec

direct blocksize in bframes fix (might fix qpel+bframe bug)
author michaelni
date Sat, 08 Feb 2003 18:23:39 +0000
parents f529b09e64b7
children f874e2122d45
files avcodec.h h263.c h263dec.c motion_est.c
diffstat 4 files changed, 39 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/avcodec.h	Sat Feb 08 15:34:25 2003 +0000
+++ b/avcodec.h	Sat Feb 08 18:23:39 2003 +0000
@@ -16,8 +16,8 @@
 
 #define LIBAVCODEC_VERSION_INT 0x000406
 #define LIBAVCODEC_VERSION     "0.4.6"
-#define LIBAVCODEC_BUILD       4654
-#define LIBAVCODEC_BUILD_STR   "4654"
+#define LIBAVCODEC_BUILD       4655
+#define LIBAVCODEC_BUILD_STR   "4655"
 
 enum CodecID {
     CODEC_ID_NONE, 
@@ -531,6 +531,7 @@
 #define FF_BUG_QPEL_CHROMA      64
 #define FF_BUG_STD_QPEL         128
 #define FF_BUG_QPEL_CHROMA2     256
+#define FF_BUG_DIRECT_BLOCKSIZE 512
 //#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100%
         
     /**
--- a/h263.c	Sat Feb 08 15:34:25 2003 +0000
+++ b/h263.c	Sat Feb 08 18:23:39 2003 +0000
@@ -403,17 +403,20 @@
     uint16_t time_pp= s->pp_time;
     uint16_t time_pb= s->pb_time;
     int i;
-        
+    
     //FIXME avoid divides
     switch(s->co_located_type_table[mb_index]){
     case 0:
-        s->mv_type= MV_TYPE_16X16;
-        s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
-        s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
-        s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
+        s->mv[0][0][0] = s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
+        s->mv[0][0][1] = s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
+        s->mv[1][0][0] = s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
                             : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
-        s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1] 
+        s->mv[1][0][1] = s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1] 
                             : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
+        if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
+            s->mv_type= MV_TYPE_16X16;
+        else
+            s->mv_type= MV_TYPE_8X8;
         break;
     case CO_LOCATED_TYPE_4MV:
         s->mv_type = MV_TYPE_8X8;
--- a/h263dec.c	Sat Feb 08 15:34:25 2003 +0000
+++ b/h263dec.c	Sat Feb 08 18:23:39 2003 +0000
@@ -332,6 +332,13 @@
     return -1;
 }
 
+/**
+ * draws an line from (ex, ey) -> (sx, sy).
+ * @param w width of the image
+ * @param h height of the image
+ * @param stride stride/linesize of the image
+ * @param color color of the arrow
+ */
 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
     int t, x, y, f;
     
@@ -368,6 +375,13 @@
     }
 }
 
+/**
+ * draws an arrow from (ex, ey) -> (sx, sy).
+ * @param w width of the image
+ * @param h height of the image
+ * @param stride stride/linesize of the image
+ * @param color color of the arrow
+ */
 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){ 
     int dx= ex - sx;
     int dy= ey - sy;
@@ -510,6 +524,11 @@
         if(s->lavc_build && s->lavc_build<4653)
             s->workaround_bugs|= FF_BUG_STD_QPEL;
         
+        if(s->lavc_build && s->lavc_build<4655)
+            s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;
+
+        if(s->divx_version)
+            s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;
 //printf("padding_bug_score: %d\n", s->padding_bug_score);
 #if 0
         if(s->divx_version==500)
--- a/motion_est.c	Sat Feb 08 15:34:25 2003 +0000
+++ b/motion_est.c	Sat Feb 08 18:23:39 2003 +0000
@@ -241,8 +241,14 @@
         int fxy= (fx&3) + 4*(fy&3);\
         int bxy= (bx&3) + 4*(by&3);\
 \
-        qpel_put[0][fxy](s->me.scratchpad, (ref_y ) + (fx>>2) + (fy>>2)*(stride), stride);\
-        qpel_avg[0][bxy](s->me.scratchpad, (ref2_y) + (bx>>2) + (by>>2)*(stride), stride);\
+        qpel_put[1][fxy](s->me.scratchpad               , (ref_y ) + (fx>>2) + (fy>>2)*(stride)               , stride);\
+        qpel_put[1][fxy](s->me.scratchpad + 8           , (ref_y ) + (fx>>2) + (fy>>2)*(stride) + 8           , stride);\
+        qpel_put[1][fxy](s->me.scratchpad     + 8*stride, (ref_y ) + (fx>>2) + (fy>>2)*(stride)     + 8*stride, stride);\
+        qpel_put[1][fxy](s->me.scratchpad + 8 + 8*stride, (ref_y ) + (fx>>2) + (fy>>2)*(stride) + 8 + 8*stride, stride);\
+        qpel_avg[1][bxy](s->me.scratchpad               , (ref2_y) + (bx>>2) + (by>>2)*(stride)               , stride);\
+        qpel_avg[1][bxy](s->me.scratchpad + 8           , (ref2_y) + (bx>>2) + (by>>2)*(stride) + 8           , stride);\
+        qpel_avg[1][bxy](s->me.scratchpad     + 8*stride, (ref2_y) + (bx>>2) + (by>>2)*(stride)     + 8*stride, stride);\
+        qpel_avg[1][bxy](s->me.scratchpad + 8 + 8*stride, (ref2_y) + (bx>>2) + (by>>2)*(stride) + 8 + 8*stride, stride);\
     }\
     d = cmp_func(s, s->me.scratchpad, src_y, stride);\
 }else\