Commit d516b7b3 authored by conrad's avatar conrad

Eliminate fragment -> macroblock mapping array

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@21802 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 8d3303a3
...@@ -53,8 +53,6 @@ typedef struct Coeff { ...@@ -53,8 +53,6 @@ typedef struct Coeff {
//FIXME split things out into their own arrays //FIXME split things out into their own arrays
typedef struct Vp3Fragment { typedef struct Vp3Fragment {
Coeff *next_coeff; Coeff *next_coeff;
/* this is the macroblock that the fragment belongs to */
uint16_t macroblock;
uint8_t coding_method; uint8_t coding_method;
int8_t motion_x; int8_t motion_x;
int8_t motion_y; int8_t motion_y;
...@@ -346,48 +344,6 @@ static int init_block_mapping(Vp3DecodeContext *s) ...@@ -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 */ return 0; /* successful path out */
} }
...@@ -623,7 +579,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -623,7 +579,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
first_c_fragment_seen = 1; first_c_fragment_seen = 1;
} }
s->coded_fragment_list_index++; s->coded_fragment_list_index++;
s->macroblock_coding[s->all_fragments[current_fragment].macroblock] = MODE_INTER_NO_MV;
} else { } else {
/* not coded; copy this fragment from the prior frame */ /* not coded; copy this fragment from the prior frame */
s->all_fragments[current_fragment].coding_method = s->all_fragments[current_fragment].coding_method =
...@@ -647,7 +602,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -647,7 +602,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
first_c_fragment_seen = 1; first_c_fragment_seen = 1;
} }
s->coded_fragment_list_index++; 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) ...@@ -720,14 +674,25 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
for (j = 0; j < 4; j++) { for (j = 0; j < 4; j++) {
int mb_x = 2*sb_x + (j>>1); int mb_x = 2*sb_x + (j>>1);
int mb_y = 2*sb_y + (((j>>1)+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; current_macroblock = mb_y * s->macroblock_width + mb_x;
if (mb_x >= s->macroblock_width || mb_y >= s->macroblock_height || if (mb_x >= s->macroblock_width || mb_y >= s->macroblock_height)
(s->macroblock_coding[current_macroblock] == MODE_COPY))
continue; continue;
#define BLOCK_X (2*mb_x + (k&1)) #define BLOCK_X (2*mb_x + (k&1))
#define BLOCK_Y (2*mb_y + (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 */ /* mode 7 means get 3 bits for each coding mode */
if (scheme == 7) if (scheme == 7)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment