aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Conrad <lessen42@gmail.com>2010-03-13 05:56:15 +0000
committerDavid Conrad <lessen42@gmail.com>2010-03-13 05:56:15 +0000
commit577838842d9a1ea5911ce8235bcb9b8f811a6beb (patch)
tree0529473167d1caf875783f24282c8601d326769a
parent1c183aa418b28c6d9a097cab2be6e8a127eb740f (diff)
downloadffmpeg-577838842d9a1ea5911ce8235bcb9b8f811a6beb.tar.gz
vp3: Make fragment_width _height by plane
Originally committed as revision 22498 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/vp3.c46
1 files changed, 24 insertions, 22 deletions
diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
index 2f6ff9b699..284be45c9f 100644
--- a/libavcodec/vp3.c
+++ b/libavcodec/vp3.c
@@ -158,8 +158,8 @@ typedef struct Vp3DecodeContext {
int macroblock_height;
int fragment_count;
- int fragment_width;
- int fragment_height;
+ int fragment_width[2];
+ int fragment_height[2];
Vp3Fragment *all_fragments;
int fragment_start[3];
@@ -266,8 +266,8 @@ static int init_block_mapping(Vp3DecodeContext *s)
for (plane = 0; plane < 3; plane++) {
int sb_width = plane ? s->c_superblock_width : s->y_superblock_width;
int sb_height = plane ? s->c_superblock_height : s->y_superblock_height;
- int frag_width = s->fragment_width >> !!plane;
- int frag_height = s->fragment_height >> !!plane;
+ int frag_width = s->fragment_width[!!plane];
+ int frag_height = s->fragment_height[!!plane];
for (sb_y = 0; sb_y < sb_height; sb_y++)
for (sb_x = 0; sb_x < sb_width; sb_x++)
@@ -559,7 +559,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
/* 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;
+ current_fragment = BLOCK_Y*s->fragment_width[0] + BLOCK_X;
if (s->all_fragments[current_fragment].coding_method != MODE_COPY)
break;
}
@@ -578,7 +578,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
s->macroblock_coding[current_macroblock] = coding_mode;
for (k = 0; k < 4; k++) {
current_fragment =
- BLOCK_Y*s->fragment_width + BLOCK_X;
+ BLOCK_Y*s->fragment_width[0] + BLOCK_X;
if (s->all_fragments[current_fragment].coding_method !=
MODE_COPY)
s->all_fragments[current_fragment].coding_method =
@@ -586,7 +586,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
}
for (k = 0; k < 2; k++) {
current_fragment = s->fragment_start[k+1] +
- mb_y*(s->fragment_width>>1) + mb_x;
+ mb_y*s->fragment_width[1] + mb_x;
if (s->all_fragments[current_fragment].coding_method !=
MODE_COPY)
s->all_fragments[current_fragment].coding_method =
@@ -668,7 +668,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
/* fetch 4 vectors from the bitstream, one for each
* Y fragment, then average for the C fragment vectors */
for (k = 0; k < 4; k++) {
- current_fragment = BLOCK_Y*s->fragment_width + BLOCK_X;
+ current_fragment = BLOCK_Y*s->fragment_width[0] + BLOCK_X;
if (s->all_fragments[current_fragment].coding_method != MODE_COPY) {
if (coding_mode == 0) {
motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
@@ -720,7 +720,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
/* assign the motion vectors to the correct fragments */
for (k = 0; k < 4; k++) {
current_fragment =
- BLOCK_Y*s->fragment_width + BLOCK_X;
+ BLOCK_Y*s->fragment_width[0] + BLOCK_X;
if (s->macroblock_coding[current_macroblock] == MODE_INTER_FOURMV) {
s->all_fragments[current_fragment].motion_x = motion_x[k];
s->all_fragments[current_fragment].motion_y = motion_y[k];
@@ -735,7 +735,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
}
for (k = 0; k < 2; k++) {
current_fragment = s->fragment_start[k+1] +
- mb_y*(s->fragment_width>>1) + mb_x;
+ mb_y*s->fragment_width[1] + mb_x;
s->all_fragments[current_fragment].motion_x = motion_x[0];
s->all_fragments[current_fragment].motion_y = motion_y[0];
}
@@ -941,7 +941,7 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
0, residual_eob_run);
/* reverse prediction of the Y-plane DC coefficients */
- reverse_dc_prediction(s, 0, s->fragment_width, s->fragment_height);
+ reverse_dc_prediction(s, 0, s->fragment_width[0], s->fragment_height[0]);
/* unpack the C plane DC coefficients */
residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
@@ -953,9 +953,9 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
if (!(s->avctx->flags & CODEC_FLAG_GRAY))
{
reverse_dc_prediction(s, s->fragment_start[1],
- s->fragment_width / 2, s->fragment_height / 2);
+ s->fragment_width[1], s->fragment_height[1]);
reverse_dc_prediction(s, s->fragment_start[2],
- s->fragment_width / 2, s->fragment_height / 2);
+ s->fragment_width[1], s->fragment_height[1]);
}
/* fetch the AC table indexes */
@@ -1158,8 +1158,8 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye
int x, y;
int *bounding_values= s->bounding_values_array+127;
- int width = s->fragment_width >> !!plane;
- int height = s->fragment_height >> !!plane;
+ int width = s->fragment_width[!!plane];
+ int height = s->fragment_height[!!plane];
int fragment = s->fragment_start [plane] + ystart * width;
int stride = s->current_frame.linesize[plane];
uint8_t *plane_data = s->current_frame.data [plane];
@@ -1316,8 +1316,8 @@ static void render_slice(Vp3DecodeContext *s, int slice)
int slice_height = sb_y + (plane ? 1 : 2);
int slice_width = plane ? s->c_superblock_width : s->y_superblock_width;
- int fragment_width = s->fragment_width >> !!plane;
- int fragment_height = s->fragment_height >> !!plane;
+ int fragment_width = s->fragment_width[!!plane];
+ int fragment_height = s->fragment_height[!!plane];
int fragment_start = s->fragment_start[plane];
if (!s->flipped_image) stride = -stride;
@@ -1510,13 +1510,15 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
s->macroblock_height = (s->height + 15) / 16;
s->macroblock_count = s->macroblock_width * s->macroblock_height;
- s->fragment_width = s->width / FRAGMENT_PIXELS;
- s->fragment_height = s->height / FRAGMENT_PIXELS;
+ s->fragment_width[0] = s->width / FRAGMENT_PIXELS;
+ s->fragment_height[0] = s->height / FRAGMENT_PIXELS;
+ s->fragment_width[1] = s->fragment_width[0] >> 1;
+ s->fragment_height[1] = s->fragment_height[0] >> 1;
/* fragment count covers all 8x8 blocks for all 3 planes */
- s->fragment_count = s->fragment_width * s->fragment_height * 3 / 2;
- s->fragment_start[1] = s->fragment_width * s->fragment_height;
- s->fragment_start[2] = s->fragment_width * s->fragment_height * 5 / 4;
+ s->fragment_count = s->fragment_width[0] * s->fragment_height[0] * 3 / 2;
+ s->fragment_start[1] = s->fragment_width[0] * s->fragment_height[0];
+ s->fragment_start[2] = s->fragment_width[0] * s->fragment_height[0] * 5 / 4;
s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment));
s->coded_fragment_list[0] = av_malloc(s->fragment_count * sizeof(int));