[FFmpeg-devel] [PATCH 1/3] Move apply_loop_filter above render_slice, it'll be used by the latter soon

David Conrad lessen42
Wed Feb 10 02:54:02 CET 2010


---
 libavcodec/vp3.c |  128 +++++++++++++++++++++++++++---------------------------
 1 files changed, 64 insertions(+), 64 deletions(-)

diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
index f54dff3..dd46a2f 100644
--- a/libavcodec/vp3.c
+++ b/libavcodec/vp3.c
@@ -1389,6 +1389,70 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
     }
 }
 
+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 @@ static void render_slice(Vp3DecodeContext *s, int slice)
     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
-- 
1.6.6




More information about the ffmpeg-devel mailing list