# HG changeset patch # User conrad # Date 1266012089 0 # Node ID fb5358e0dded60f236b2a788276e7ceac84d3ef9 # Parent 0bca1b2ac58de3c6d013e54f9b80af2c06d05d79 Do loop filter per-row rather than per-frame 3% faster on Elephants_Dream_HD-q7-aq7.ogg on my penryn diff -r 0bca1b2ac58d -r fb5358e0dded vp3.c --- a/vp3.c Fri Feb 12 22:01:25 2010 +0000 +++ b/vp3.c Fri Feb 12 22:01:29 2010 +0000 @@ -1389,21 +1389,19 @@ } } -static void apply_loop_filter(Vp3DecodeContext *s) +static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int yend) { - 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 fragment = s->fragment_start [plane] + ystart * width; 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 (y = ystart; y < yend; y++) { for (x = 0; x < width; x++) { /* This code basically just deblocks on the edges of coded blocks. @@ -1450,7 +1448,6 @@ fragment++; } } - } } /* @@ -1612,6 +1609,10 @@ } } + // Filter the previous block row. We can't filter the current row yet + // since it needs pixels from the next row + if (y > 0) + apply_loop_filter(s, plane, (y>>3)-1, (y>>3)); } } @@ -2010,7 +2011,11 @@ for (i = 0; i < s->macroblock_height; i++) render_slice(s, i); - apply_loop_filter(s); + // filter the last row + for (i = 0; i < 3; i++) { + int row = (s->height >> (3+!!i)) - 1; + apply_loop_filter(s, i, row, row+1); + } *data_size=sizeof(AVFrame); *(AVFrame*)data= s->current_frame;