Originally committed as revision 5792 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2006-07-19 20:57:44 +00:00
parent 1af5f60f6a
commit 1abbf64e3b
1 changed files with 36 additions and 99 deletions

View File

@ -256,8 +256,7 @@ typedef struct Vp3DecodeContext {
Vp3Fragment *all_fragments; Vp3Fragment *all_fragments;
Coeff *coeffs; Coeff *coeffs;
Coeff *next_coeff; Coeff *next_coeff;
int u_fragment_start; int fragment_start[3];
int v_fragment_start;
ScanTable scantable; ScanTable scantable;
@ -457,7 +456,7 @@ static int init_block_mapping(Vp3DecodeContext *s)
hilbert = hilbert_walk_c; hilbert = hilbert_walk_c;
/* the first operation for this variable is to advance by 1 */ /* the first operation for this variable is to advance by 1 */
current_fragment = s->u_fragment_start - 1; current_fragment = s->fragment_start[1] - 1;
} else if (i == s->v_superblock_start) { } else if (i == s->v_superblock_start) {
@ -471,7 +470,7 @@ static int init_block_mapping(Vp3DecodeContext *s)
hilbert = hilbert_walk_c; hilbert = hilbert_walk_c;
/* the first operation for this variable is to advance by 1 */ /* the first operation for this variable is to advance by 1 */
current_fragment = s->v_fragment_start - 1; current_fragment = s->fragment_start[2] - 1;
} }
@ -593,13 +592,13 @@ static int init_block_mapping(Vp3DecodeContext *s)
s->macroblock_fragments[mapping_index++] = -1; s->macroblock_fragments[mapping_index++] = -1;
/* C planes */ /* C planes */
c_fragment = s->u_fragment_start + c_fragment = s->fragment_start[1] +
(i * s->fragment_width / 4) + (j / 2); (i * s->fragment_width / 4) + (j / 2);
s->all_fragments[c_fragment].macroblock = s->macroblock_count; s->all_fragments[c_fragment].macroblock = s->macroblock_count;
s->macroblock_fragments[mapping_index++] = c_fragment; s->macroblock_fragments[mapping_index++] = c_fragment;
debug_init("%d ", c_fragment); debug_init("%d ", c_fragment);
c_fragment = s->v_fragment_start + c_fragment = s->fragment_start[2] +
(i * s->fragment_width / 4) + (j / 2); (i * s->fragment_width / 4) + (j / 2);
s->all_fragments[c_fragment].macroblock = s->macroblock_count; s->all_fragments[c_fragment].macroblock = s->macroblock_count;
s->macroblock_fragments[mapping_index++] = c_fragment; s->macroblock_fragments[mapping_index++] = c_fragment;
@ -847,7 +846,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
s->all_fragments[current_fragment].next_coeff= s->coeffs + current_fragment; s->all_fragments[current_fragment].next_coeff= s->coeffs + current_fragment;
s->coded_fragment_list[s->coded_fragment_list_index] = s->coded_fragment_list[s->coded_fragment_list_index] =
current_fragment; current_fragment;
if ((current_fragment >= s->u_fragment_start) && if ((current_fragment >= s->fragment_start[1]) &&
(s->last_coded_y_fragment == -1) && (s->last_coded_y_fragment == -1) &&
(!first_c_fragment_seen)) { (!first_c_fragment_seen)) {
s->first_coded_c_fragment = s->coded_fragment_list_index; s->first_coded_c_fragment = s->coded_fragment_list_index;
@ -875,7 +874,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
s->all_fragments[current_fragment].next_coeff= s->coeffs + current_fragment; s->all_fragments[current_fragment].next_coeff= s->coeffs + current_fragment;
s->coded_fragment_list[s->coded_fragment_list_index] = s->coded_fragment_list[s->coded_fragment_list_index] =
current_fragment; current_fragment;
if ((current_fragment >= s->u_fragment_start) && if ((current_fragment >= s->fragment_start[1]) &&
(s->last_coded_y_fragment == -1) && (s->last_coded_y_fragment == -1) &&
(!first_c_fragment_seen)) { (!first_c_fragment_seen)) {
s->first_coded_c_fragment = s->coded_fragment_list_index; s->first_coded_c_fragment = s->coded_fragment_list_index;
@ -1644,73 +1643,32 @@ static void vertical_filter(unsigned char *first_pixel, int stride,
*/ */
static void render_slice(Vp3DecodeContext *s, int slice) static void render_slice(Vp3DecodeContext *s, int slice)
{ {
int x, y; int x;
int m, n; int m, n;
int i; /* indicates current fragment */
int16_t *dequantizer; int16_t *dequantizer;
DECLARE_ALIGNED_16(DCTELEM, block[64]); DECLARE_ALIGNED_16(DCTELEM, block[64]);
unsigned char *output_plane;
unsigned char *last_plane;
unsigned char *golden_plane;
int stride;
int motion_x = 0xdeadbeef, motion_y = 0xdeadbeef; int motion_x = 0xdeadbeef, motion_y = 0xdeadbeef;
int upper_motion_limit, lower_motion_limit;
int motion_halfpel_index; int motion_halfpel_index;
uint8_t *motion_source; uint8_t *motion_source;
int plane; int plane;
int plane_width;
int plane_height;
int slice_height;
int current_macroblock_entry = slice * s->macroblock_width * 6; int current_macroblock_entry = slice * s->macroblock_width * 6;
int fragment_width;
if (slice >= s->macroblock_height) if (slice >= s->macroblock_height)
return; return;
for (plane = 0; plane < 3; plane++) { for (plane = 0; plane < 3; plane++) {
uint8_t *output_plane = s->current_frame.data [plane];
uint8_t * last_plane = s-> last_frame.data [plane];
uint8_t *golden_plane = s-> golden_frame.data [plane];
int stride = s->current_frame.linesize[plane];
int plane_width = s->width >> !!plane;
int plane_height = s->height >> !!plane;
int y = slice * FRAGMENT_PIXELS << !plane ;
int slice_height = y + (FRAGMENT_PIXELS << !plane);
int i = s->macroblock_fragments[current_macroblock_entry + plane + 3*!!plane];
if (!s->flipped_image) stride = -stride;
/* set up plane-specific parameters */
if (plane == 0) {
output_plane = s->current_frame.data[0];
last_plane = s->last_frame.data[0];
golden_plane = s->golden_frame.data[0];
stride = s->current_frame.linesize[0];
if (!s->flipped_image) stride = -stride;
upper_motion_limit = 7 * s->current_frame.linesize[0];
lower_motion_limit = s->height * s->current_frame.linesize[0] + s->width - 8;
y = slice * FRAGMENT_PIXELS * 2;
plane_width = s->width;
plane_height = s->height;
slice_height = y + FRAGMENT_PIXELS * 2;
i = s->macroblock_fragments[current_macroblock_entry + 0];
} else if (plane == 1) {
output_plane = s->current_frame.data[1];
last_plane = s->last_frame.data[1];
golden_plane = s->golden_frame.data[1];
stride = s->current_frame.linesize[1];
if (!s->flipped_image) stride = -stride;
upper_motion_limit = 7 * s->current_frame.linesize[1];
lower_motion_limit = (s->height / 2) * s->current_frame.linesize[1] + (s->width / 2) - 8;
y = slice * FRAGMENT_PIXELS;
plane_width = s->width / 2;
plane_height = s->height / 2;
slice_height = y + FRAGMENT_PIXELS;
i = s->macroblock_fragments[current_macroblock_entry + 4];
} else {
output_plane = s->current_frame.data[2];
last_plane = s->last_frame.data[2];
golden_plane = s->golden_frame.data[2];
stride = s->current_frame.linesize[2];
if (!s->flipped_image) stride = -stride;
upper_motion_limit = 7 * s->current_frame.linesize[2];
lower_motion_limit = (s->height / 2) * s->current_frame.linesize[2] + (s->width / 2) - 8;
y = slice * FRAGMENT_PIXELS;
plane_width = s->width / 2;
plane_height = s->height / 2;
slice_height = y + FRAGMENT_PIXELS;
i = s->macroblock_fragments[current_macroblock_entry + 5];
}
fragment_width = plane_width / FRAGMENT_PIXELS;
if(ABS(stride) > 2048) if(ABS(stride) > 2048)
return; //various tables are fixed size return; //various tables are fixed size
@ -1938,11 +1896,8 @@ static void vertical_filter(unsigned char *first_pixel, int stride,
static void apply_loop_filter(Vp3DecodeContext *s) static void apply_loop_filter(Vp3DecodeContext *s)
{ {
int x, y, plane; int plane;
int width, height; int x, y;
int fragment;
int stride;
unsigned char *plane_data;
int *bounding_values= s->bounding_values_array+127; int *bounding_values= s->bounding_values_array+127;
#if 0 #if 0
@ -1967,29 +1922,11 @@ static void apply_loop_filter(Vp3DecodeContext *s)
#endif #endif
for (plane = 0; plane < 3; plane++) { for (plane = 0; plane < 3; plane++) {
int width = s->fragment_width >> !!plane;
if (plane == 0) { int height = s->fragment_height >> !!plane;
/* Y plane parameters */ int fragment = s->fragment_start [plane];
fragment = 0; int stride = s->current_frame.linesize[plane];
width = s->fragment_width; uint8_t *plane_data = s->current_frame.data [plane];
height = s->fragment_height;
stride = s->current_frame.linesize[0];
plane_data = s->current_frame.data[0];
} else if (plane == 1) {
/* U plane parameters */
fragment = s->u_fragment_start;
width = s->fragment_width / 2;
height = s->fragment_height / 2;
stride = s->current_frame.linesize[1];
plane_data = s->current_frame.data[1];
} else {
/* V plane parameters */
fragment = s->v_fragment_start;
width = s->fragment_width / 2;
height = s->fragment_height / 2;
stride = s->current_frame.linesize[2];
plane_data = s->current_frame.data[2];
}
if (!s->flipped_image) stride = -stride; if (!s->flipped_image) stride = -stride;
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
@ -2066,7 +2003,7 @@ static void vp3_calculate_pixel_addresses(Vp3DecodeContext *s)
} }
/* U plane */ /* U plane */
i = s->u_fragment_start; i = s->fragment_start[1];
for (y = s->fragment_height / 2; y > 0; y--) { for (y = s->fragment_height / 2; y > 0; y--) {
for (x = 0; x < s->fragment_width / 2; x++) { for (x = 0; x < s->fragment_width / 2; x++) {
s->all_fragments[i++].first_pixel = s->all_fragments[i++].first_pixel =
@ -2079,7 +2016,7 @@ static void vp3_calculate_pixel_addresses(Vp3DecodeContext *s)
} }
/* V plane */ /* V plane */
i = s->v_fragment_start; i = s->fragment_start[2];
for (y = s->fragment_height / 2; y > 0; y--) { for (y = s->fragment_height / 2; y > 0; y--) {
for (x = 0; x < s->fragment_width / 2; x++) { for (x = 0; x < s->fragment_width / 2; x++) {
s->all_fragments[i++].first_pixel = s->all_fragments[i++].first_pixel =
@ -2113,7 +2050,7 @@ static void theora_calculate_pixel_addresses(Vp3DecodeContext *s)
} }
/* U plane */ /* U plane */
i = s->u_fragment_start; i = s->fragment_start[1];
for (y = 1; y <= s->fragment_height / 2; y++) { for (y = 1; y <= s->fragment_height / 2; y++) {
for (x = 0; x < s->fragment_width / 2; x++) { for (x = 0; x < s->fragment_width / 2; x++) {
s->all_fragments[i++].first_pixel = s->all_fragments[i++].first_pixel =
@ -2126,7 +2063,7 @@ static void theora_calculate_pixel_addresses(Vp3DecodeContext *s)
} }
/* V plane */ /* V plane */
i = s->v_fragment_start; i = s->fragment_start[2];
for (y = 1; y <= s->fragment_height / 2; y++) { for (y = 1; y <= s->fragment_height / 2; y++) {
for (x = 0; x < s->fragment_width / 2; x++) { for (x = 0; x < s->fragment_width / 2; x++) {
s->all_fragments[i++].first_pixel = s->all_fragments[i++].first_pixel =
@ -2196,8 +2133,8 @@ static int vp3_decode_init(AVCodecContext *avctx)
/* fragment count covers all 8x8 blocks for all 3 planes */ /* fragment count covers all 8x8 blocks for all 3 planes */
s->fragment_count = s->fragment_width * s->fragment_height * 3 / 2; s->fragment_count = s->fragment_width * s->fragment_height * 3 / 2;
s->u_fragment_start = s->fragment_width * s->fragment_height; s->fragment_start[1] = s->fragment_width * s->fragment_height;
s->v_fragment_start = s->fragment_width * s->fragment_height * 5 / 4; s->fragment_start[2] = s->fragment_width * s->fragment_height * 5 / 4;
debug_init(" Y plane: %d x %d\n", s->width, s->height); debug_init(" Y plane: %d x %d\n", s->width, s->height);
debug_init(" C plane: %d x %d\n", c_width, c_height); debug_init(" C plane: %d x %d\n", c_width, c_height);
@ -2213,8 +2150,8 @@ static int vp3_decode_init(AVCodecContext *avctx)
s->fragment_count, s->fragment_count,
s->fragment_width, s->fragment_width,
s->fragment_height, s->fragment_height,
s->u_fragment_start, s->fragment_start[1],
s->v_fragment_start); s->fragment_start[2]);
s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment)); s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment));
s->coeffs = av_malloc(s->fragment_count * sizeof(Coeff) * 65); s->coeffs = av_malloc(s->fragment_count * sizeof(Coeff) * 65);
@ -2501,9 +2438,9 @@ if (!s->keyframe) {
reverse_dc_prediction(s, 0, s->fragment_width, s->fragment_height); reverse_dc_prediction(s, 0, s->fragment_width, s->fragment_height);
if ((avctx->flags & CODEC_FLAG_GRAY) == 0) { if ((avctx->flags & CODEC_FLAG_GRAY) == 0) {
reverse_dc_prediction(s, s->u_fragment_start, reverse_dc_prediction(s, s->fragment_start[1],
s->fragment_width / 2, s->fragment_height / 2); s->fragment_width / 2, s->fragment_height / 2);
reverse_dc_prediction(s, s->v_fragment_start, reverse_dc_prediction(s, s->fragment_start[2],
s->fragment_width / 2, s->fragment_height / 2); s->fragment_width / 2, s->fragment_height / 2);
} }
STOP_TIMER("reverse_dc_prediction")} STOP_TIMER("reverse_dc_prediction")}