# HG changeset patch # User melanson # Date 1116703876 0 # Node ID 77ba1f65361973d67cee1fe9d2db8cc286db0e14 # Parent 0131b4ae1fb0ce5ff8e5f4e8ed0aaeee289bf10a fix bugs in new loop filter code; also, refrain from filtering against data that has yet to be rendered; still #if'd out, will revisit when proper algorithm can be validated diff -r 0131b4ae1fb0 -r 77ba1f653619 vp3.c --- a/vp3.c Sat May 21 07:43:49 2005 +0000 +++ b/vp3.c Sat May 21 19:31:16 2005 +0000 @@ -2247,7 +2247,7 @@ slice_height = y + FRAGMENT_PIXELS; i = s->macroblock_fragments[current_macroblock_entry + 5]; } - fragment_width = plane_width / 2; + fragment_width = plane_width / FRAGMENT_PIXELS; if(ABS(stride) > 2048) return; //various tables are fixed size @@ -2396,42 +2396,36 @@ } #if 0 - /* do not perform left edge filter for left columns frags */ + /* perform the left edge filter if: + * - the fragment is not on the left column + * - the fragment is coded in this frame + * - the fragment is not coded in this frame but the left + * fragment is coded in this frame (this is done instead + * of a right edge filter when rendering the left fragment + * since this fragment is not available yet) */ if ((x > 0) && - (s->all_fragments[i].coding_method != MODE_COPY)) { + ((s->all_fragments[i].coding_method != MODE_COPY) || + ((s->all_fragments[i].coding_method == MODE_COPY) && + (s->all_fragments[i - 1].coding_method != MODE_COPY)) )) { horizontal_filter( - output_plane + s->all_fragments[i].first_pixel - 7*stride, - stride, bounding_values); - } - - /* do not perform top edge filter for top row fragments */ - if ((y > 0) && - (s->all_fragments[i].coding_method != MODE_COPY)) { - vertical_filter( - output_plane + s->all_fragments[i].first_pixel + stride, - stride, bounding_values); + output_plane + s->all_fragments[i].first_pixel + 7*stride, + -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 for next fragment) */ - if ((x < plane_width - 1) && - (s->all_fragments[i].coding_method != MODE_COPY) && - (s->all_fragments[i + 1].coding_method == MODE_COPY)) { - horizontal_filter( - output_plane + s->all_fragments[i + 1].first_pixel - 7*stride, - 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 < plane_height - 1) && - (s->all_fragments[i].coding_method != MODE_COPY) && - (s->all_fragments[i + fragment_width].coding_method == MODE_COPY)) { + /* perform the top edge filter if: + * - the fragment is not on the top row + * - the fragment is coded in this frame + * - the fragment is not coded in this frame but the above + * fragment is coded in this frame (this is done instead + * of a bottom edge filter when rendering the above + * fragment since this fragment is not available yet) */ + if ((y > 0) && + ((s->all_fragments[i].coding_method != MODE_COPY) || + ((s->all_fragments[i].coding_method == MODE_COPY) && + (s->all_fragments[i - fragment_width].coding_method != MODE_COPY)) )) { vertical_filter( - output_plane + s->all_fragments[i + fragment_width].first_pixel + stride, - stride, bounding_values); + output_plane + s->all_fragments[i].first_pixel - stride, + -stride, bounding_values); } #endif }