Eliminate fragment -> macroblock mapping array
authorDavid Conrad <lessen42@gmail.com>
Sat, 13 Feb 2010 18:55:24 +0000 (18:55 +0000)
committerDavid Conrad <lessen42@gmail.com>
Sat, 13 Feb 2010 18:55:24 +0000 (18:55 +0000)
Originally committed as revision 21802 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/vp3.c

index e6d838e..8b7ff42 100644 (file)
@@ -53,8 +53,6 @@ typedef struct Coeff {
 //FIXME split things out into their own arrays
 typedef struct Vp3Fragment {
     Coeff *next_coeff;
-    /* this is the macroblock that the fragment belongs to */
-    uint16_t macroblock;
     uint8_t coding_method;
     int8_t motion_x;
     int8_t motion_y;
@@ -346,48 +344,6 @@ static int init_block_mapping(Vp3DecodeContext *s)
         }
     }
 
-    /* initialize the macroblock <-> fragment mapping */
-    current_fragment = 0;
-    current_macroblock = 0;
-    for (i = 0; i < s->fragment_height; i += 2) {
-
-        for (j = 0; j < s->fragment_width; j += 2) {
-
-            s->all_fragments[current_fragment].macroblock = current_macroblock;
-
-            if (j + 1 < s->fragment_width) {
-                s->all_fragments[current_fragment + 1].macroblock = current_macroblock;
-            }
-
-            if (i + 1 < s->fragment_height) {
-                s->all_fragments[current_fragment + s->fragment_width].macroblock =
-                    current_macroblock;
-            }
-
-            if ((j + 1 < s->fragment_width) && (i + 1 < s->fragment_height)) {
-                s->all_fragments[current_fragment + s->fragment_width + 1].macroblock =
-                    current_macroblock;
-            }
-
-            /* C planes */
-            c_fragment = s->fragment_start[1] +
-                (i * s->fragment_width / 4) + (j / 2);
-            s->all_fragments[c_fragment].macroblock = s->macroblock_count;
-
-            c_fragment = s->fragment_start[2] +
-                (i * s->fragment_width / 4) + (j / 2);
-            s->all_fragments[c_fragment].macroblock = s->macroblock_count;
-
-            if (j + 2 <= s->fragment_width)
-                current_fragment += 2;
-            else
-                current_fragment++;
-            current_macroblock++;
-        }
-
-        current_fragment += s->fragment_width;
-    }
-
     return 0;  /* successful path out */
 }
 
@@ -623,7 +579,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
                             first_c_fragment_seen = 1;
                         }
                         s->coded_fragment_list_index++;
-                        s->macroblock_coding[s->all_fragments[current_fragment].macroblock] = MODE_INTER_NO_MV;
                     } else {
                         /* not coded; copy this fragment from the prior frame */
                         s->all_fragments[current_fragment].coding_method =
@@ -647,7 +602,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
                         first_c_fragment_seen = 1;
                     }
                     s->coded_fragment_list_index++;
-                    s->macroblock_coding[s->all_fragments[current_fragment].macroblock] = MODE_INTER_NO_MV;
                 }
             }
         }
@@ -720,14 +674,25 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
             for (j = 0; j < 4; j++) {
                 int mb_x = 2*sb_x +   (j>>1);
                 int mb_y = 2*sb_y + (((j>>1)+j)&1);
+                int frags_coded = 0;
                 current_macroblock = mb_y * s->macroblock_width + mb_x;
 
-                if (mb_x >= s->macroblock_width || mb_y >= s->macroblock_height ||
-                    (s->macroblock_coding[current_macroblock] == MODE_COPY))
+                if (mb_x >= s->macroblock_width || mb_y >= s->macroblock_height)
                     continue;
 
 #define BLOCK_X (2*mb_x + (k&1))
 #define BLOCK_Y (2*mb_y + (k>>1))
+                /* coding modes are only stored if the macroblock has at least one
+                 * luma block coded, otherwise it must be INTER_NO_MV */
+                for (k = 0; k < 4; k++) {
+                    current_fragment = BLOCK_Y*s->fragment_width + BLOCK_X;
+                    if (s->all_fragments[current_fragment].coding_method != MODE_COPY)
+                        break;
+                }
+                if (k == 4) {
+                    s->macroblock_coding[current_macroblock] = MODE_INTER_NO_MV;
+                    continue;
+                }
 
                 /* mode 7 means get 3 bits for each coding mode */
                 if (scheme == 7)