changeset 598:0c950f816d61 libavcodec

4mv + bframe decoding bugfix
author michaelni
date Mon, 05 Aug 2002 21:36:14 +0000
parents d5d0c11ea4cf
children b1a191202f96
files h263.c mpegvideo.c mpegvideo.h
diffstat 3 files changed, 25 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/h263.c	Mon Aug 05 19:05:02 2002 +0000
+++ b/h263.c	Mon Aug 05 21:36:14 2002 +0000
@@ -2643,14 +2643,12 @@
         case 0: /* direct */
             mx = h263_decode_motion(s, 0, 1);
             my = h263_decode_motion(s, 0, 1);
-            PRINT_MB_TYPE("S");
         case 4: /* direct with mx=my=0 */
             s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
             xy= s->block_index[0];
             time_pp= s->pp_time;
             time_pb= time_pp - s->bp_time;
 //if(time_pp>3000 )printf("%d %d  ", time_pp, time_pb);
-            //FIXME 4MV
             //FIXME avoid divides
             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;
@@ -2658,11 +2656,26 @@
                                 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp + mx;
             s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1] 
                                 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp + my;
+            if(s->non_b_mv4_table[xy]){
+                int i;
+                s->mv_type = MV_TYPE_8X8;
+                for(i=1; i<4; i++){
+                    xy= s->block_index[i];
+                    s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
+                    s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
+                    s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0]
+                                        : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp + mx;
+                    s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1] 
+                                        : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp + my;
+                }
+                PRINT_MB_TYPE("4");
+            }else{
+                PRINT_MB_TYPE(mb_type==4 ? "D" : "S");
+            }
 /*            s->mv[0][0][0] = 
             s->mv[0][0][1] = 
             s->mv[1][0][0] = 
             s->mv[1][0][1] = 1000;*/
-            if(mb_type==4) PRINT_MB_TYPE("D");
             break;
         case 1: 
             s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
--- a/mpegvideo.c	Mon Aug 05 19:05:02 2002 +0000
+++ b/mpegvideo.c	Mon Aug 05 21:36:14 2002 +0000
@@ -236,6 +236,9 @@
         /* MV prediction */
         size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
         CHECKED_ALLOCZ(s->motion_val, size * 2 * sizeof(INT16));
+        
+        /* 4mv direct mode decoding table */
+        CHECKED_ALLOCZ(s->non_b_mv4_table, size * sizeof(UINT8))
     }
 
     if (s->h263_pred || s->h263_plus) {
@@ -324,7 +327,8 @@
     av_freep(&s->tex_pb_buffer);
     av_freep(&s->pb2_buffer);
     av_freep(&s->edge_emu_buffer);
-    
+    av_freep(&s->non_b_mv4_table);
+
     for(i=0;i<3;i++) {
         int j;
         if(!(s->flags&CODEC_FLAG_DR1)){
@@ -1453,6 +1457,9 @@
             s->motion_val[xy + wrap][1] = motion_y;
             s->motion_val[xy + 1 + wrap][0] = motion_x;
             s->motion_val[xy + 1 + wrap][1] = motion_y;
+            s->non_b_mv4_table[xy]=0;
+        } else { /* 8X8 */
+            s->non_b_mv4_table[xy]=1;
         }
     }
     
--- a/mpegvideo.h	Mon Aug 05 19:05:02 2002 +0000
+++ b/mpegvideo.h	Mon Aug 05 21:36:14 2002 +0000
@@ -362,6 +362,7 @@
     uint8_t *tex_pb_buffer;          
     uint8_t *pb2_buffer;
     int mpeg_quant;
+    INT8 *non_b_mv4_table;
 
     /* divx specific, used to workaround (many) bugs in divx5 */
     int divx_version;