diff options
author | David Conrad | 2010-02-13 18:55:24 +0000 |
---|---|---|
committer | David Conrad | 2010-02-13 18:55:24 +0000 |
commit | 15675ce6098c403454a78307254a2ced36cf342f (patch) | |
tree | 654ca3a9eec96472d06b64b205372bba327eb687 /libavcodec/vp3.c | |
parent | ea67614457c04586912ed96841437c2e4a326f63 (diff) |
Eliminate fragment -> macroblock mapping array
Originally committed as revision 21802 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vp3.c')
-rw-r--r-- | libavcodec/vp3.c | 61 |
1 files changed, 13 insertions, 48 deletions
diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index e6d838e228..8b7ff42668 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -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) |