# HG changeset patch # User conrad # Date 1266012085 0 # Node ID 0bca1b2ac58de3c6d013e54f9b80af2c06d05d79 # Parent b6a0e8a2794123d4415053577a9d455fbaee7db0 Move apply_loop_filter above render_slice, it'll be used by the latter soon diff -r b6a0e8a27941 -r 0bca1b2ac58d vp3.c --- a/vp3.c Fri Feb 12 22:01:22 2010 +0000 +++ b/vp3.c Fri Feb 12 22:01:25 2010 +0000 @@ -1389,6 +1389,70 @@ } } +static void apply_loop_filter(Vp3DecodeContext *s) +{ + int plane; + int x, y; + int *bounding_values= s->bounding_values_array+127; + + for (plane = 0; plane < 3; plane++) { + int width = s->fragment_width >> !!plane; + int height = s->fragment_height >> !!plane; + int fragment = s->fragment_start [plane]; + int stride = s->current_frame.linesize[plane]; + uint8_t *plane_data = s->current_frame.data [plane]; + if (!s->flipped_image) stride = -stride; + + for (y = 0; y < height; y++) { + + for (x = 0; x < width; x++) { + /* This code basically just deblocks on the edges of coded blocks. + * However, it has to be much more complicated because of the + * braindamaged deblock ordering used in VP3/Theora. Order matters + * because some pixels get filtered twice. */ + if( s->all_fragments[fragment].coding_method != MODE_COPY ) + { + /* do not perform left edge filter for left columns frags */ + if (x > 0) { + s->dsp.vp3_h_loop_filter( + plane_data + s->all_fragments[fragment].first_pixel, + stride, bounding_values); + } + + /* do not perform top edge filter for top row fragments */ + if (y > 0) { + s->dsp.vp3_v_loop_filter( + plane_data + s->all_fragments[fragment].first_pixel, + stride, bounding_values); + } + + /* do not perform right edge filter for right column + * fragments or if right fragment neighbor is also coded + * in this frame (it will be filtered in next iteration) */ + if ((x < width - 1) && + (s->all_fragments[fragment + 1].coding_method == MODE_COPY)) { + s->dsp.vp3_h_loop_filter( + plane_data + s->all_fragments[fragment + 1].first_pixel, + stride, bounding_values); + } + + /* do not perform bottom edge filter for bottom row + * fragments or if bottom fragment neighbor is also coded + * in this frame (it will be filtered in the next row) */ + if ((y < height - 1) && + (s->all_fragments[fragment + width].coding_method == MODE_COPY)) { + s->dsp.vp3_v_loop_filter( + plane_data + s->all_fragments[fragment + width].first_pixel, + stride, bounding_values); + } + } + + fragment++; + } + } + } +} + /* * Perform the final rendering for a particular slice of data. * The slice number ranges from 0..(macroblock_height - 1). @@ -1562,70 +1626,6 @@ emms_c(); } -static void apply_loop_filter(Vp3DecodeContext *s) -{ - int plane; - int x, y; - int *bounding_values= s->bounding_values_array+127; - - for (plane = 0; plane < 3; plane++) { - int width = s->fragment_width >> !!plane; - int height = s->fragment_height >> !!plane; - int fragment = s->fragment_start [plane]; - int stride = s->current_frame.linesize[plane]; - uint8_t *plane_data = s->current_frame.data [plane]; - if (!s->flipped_image) stride = -stride; - - for (y = 0; y < height; y++) { - - for (x = 0; x < width; x++) { - /* This code basically just deblocks on the edges of coded blocks. - * However, it has to be much more complicated because of the - * braindamaged deblock ordering used in VP3/Theora. Order matters - * because some pixels get filtered twice. */ - if( s->all_fragments[fragment].coding_method != MODE_COPY ) - { - /* do not perform left edge filter for left columns frags */ - if (x > 0) { - s->dsp.vp3_h_loop_filter( - plane_data + s->all_fragments[fragment].first_pixel, - stride, bounding_values); - } - - /* do not perform top edge filter for top row fragments */ - if (y > 0) { - s->dsp.vp3_v_loop_filter( - plane_data + s->all_fragments[fragment].first_pixel, - stride, bounding_values); - } - - /* do not perform right edge filter for right column - * fragments or if right fragment neighbor is also coded - * in this frame (it will be filtered in next iteration) */ - if ((x < width - 1) && - (s->all_fragments[fragment + 1].coding_method == MODE_COPY)) { - s->dsp.vp3_h_loop_filter( - plane_data + s->all_fragments[fragment + 1].first_pixel, - stride, bounding_values); - } - - /* do not perform bottom edge filter for bottom row - * fragments or if bottom fragment neighbor is also coded - * in this frame (it will be filtered in the next row) */ - if ((y < height - 1) && - (s->all_fragments[fragment + width].coding_method == MODE_COPY)) { - s->dsp.vp3_v_loop_filter( - plane_data + s->all_fragments[fragment + width].first_pixel, - stride, bounding_values); - } - } - - fragment++; - } - } - } -} - /* * This function computes the first pixel addresses for each fragment. * This function needs to be invoked after the first frame is allocated