direct blocksize in bframes fix (might fix qpel+bframe bug)
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 8 Feb 2003 18:23:39 +0000 (18:23 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 8 Feb 2003 18:23:39 +0000 (18:23 +0000)
Originally committed as revision 1557 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/h263.c
libavcodec/h263dec.c
libavcodec/motion_est.c

index 6e7b0d48379d62b9dacb5cd3c0f2c5a0e729b692..c5fd425e3ce650a41794670c0b36fa57d25de267 100644 (file)
@@ -16,8 +16,8 @@ extern "C" {
 
 #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 @@ typedef struct AVCodecContext {
 #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%
         
     /**
index 63bf190597b3ddf2a659540266d54a67ff244ecc..a9c1fc742164f4c9d6b88a6a52e07d736e5b0df9 100644 (file)
@@ -403,17 +403,20 @@ void ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
     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;
index 89f606b216c06792859bdabb7e3eeb0b38241fad..3a445ec9446acc08a706f39d35635b20fb30a31d 100644 (file)
@@ -332,6 +332,13 @@ static int mpeg4_find_frame_end(MpegEncContext *s, UINT8 *buf, int buf_size){
     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 @@ static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h
     }
 }
 
+/**
+ * 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 @@ retry:
         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)
index 5814cb33cf2eeb5db76cb8dba41b6ab9df29ac63..a8517fb7cd63290d84db089c46cbfe8906c1c57e 100644 (file)
@@ -241,8 +241,14 @@ if((x) >= xmin && 4*(x) + (dx) <= 4*xmax && (y) >= ymin && 4*(y) + (dy) <= 4*yma
         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\