changeset 2726:77ba1f653619 libavcodec

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
author melanson
date Sat, 21 May 2005 19:31:16 +0000
parents 0131b4ae1fb0
children 41ae70d266fd
files vp3.c
diffstat 1 files changed, 26 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- 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
             }