gst/videoscale/vs_scanline.c: C-level optimization of the RGBA nearest neighbour...
authorEdward Hervey <bilboed@bilboed.com>
Thu, 16 Feb 2006 17:06:46 +0000 (17:06 +0000)
committerEdward Hervey <bilboed@bilboed.com>
Thu, 16 Feb 2006 17:06:46 +0000 (17:06 +0000)
Original commit message from CVS:
Reviewed by Edward Hervey  <edward@fluendo.com>
* gst/videoscale/vs_scanline.c: (vs_scanline_resample_nearest_RGBA):
C-level optimization of the RGBA nearest neighbour function.
Eventually this might end up in liboil with vectorized versions.

ChangeLog
gst/videoscale/vs_scanline.c

index 7eaa33ebd41116eefe7ce2c19ca6b633e7814588..01da4b04ee97aa5c2be37e128efd4a7710390478 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-02-16  Mathieu Garcia <b0nk at free dot fr>
+
+       Reviewed by Edward Hervey  <edward@fluendo.com>
+
+       * gst/videoscale/vs_scanline.c: (vs_scanline_resample_nearest_RGBA): 
+       C-level optimization of the RGBA nearest neighbour function.
+       Eventually this might end up in liboil with vectorized versions.
+
 2006-02-16  Tim-Philipp Müller  <tim at centricular dot net>
 
        * gst-libs/gst/audio/multichannel.c:
index d3c6e102aafa7c51edac74e8cf8028027ed4fa57..cb2c28d7b8768a16efd1c7b239122c995e2d0a8b 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <liboil/liboil.h>
 #include <glib.h>
+#include <stdio.h>
 
 /* greyscale, i.e., single componenet */
 
@@ -114,22 +115,57 @@ void
 vs_scanline_resample_nearest_RGBA (guint8 * dest, guint8 * src, int n,
     int *accumulator, int increment)
 {
+  guint8 *tmpsrc;
   int acc = *accumulator;
   int i;
   int j;
   int x;
 
-  for (i = 0; i < n; i++) {
+  /* Optimization Pass #1 :
+   * - Unroll loop by 16
+   * - Pointer arithmetics (most CPUs have DAGs !)
+   * - Avoid useless branching
+   */
+  for (i = 0, tmpsrc = src; i < n; i++) {
     j = acc >> 16;
     x = acc & 0xffff;
-    dest[i * 4 + 0] = (x < 32768) ? src[j * 4 + 0] : src[j * 4 + 4];
-    dest[i * 4 + 1] = (x < 32768) ? src[j * 4 + 1] : src[j * 4 + 5];
-    dest[i * 4 + 2] = (x < 32768) ? src[j * 4 + 2] : src[j * 4 + 6];
-    dest[i * 4 + 3] = (x < 32768) ? src[j * 4 + 3] : src[j * 4 + 7];
 
-    acc += increment;
+    if (x < 32768) {
+      tmpsrc = src + j * 4;
+      *dest++ = *tmpsrc++;
+
+      /* We do it here to avoid low-level instruction locks */
+      acc += increment;
+
+      *dest++ = *tmpsrc++;
+      *dest++ = *tmpsrc++;
+      *dest++ = *tmpsrc++;
+    } else {
+      tmpsrc = src + (j + 1) * 4;;
+      *dest++ = *tmpsrc++;
+
+      /* We do it here to avoid low-level instruction locks */
+      acc += increment;
+
+      *dest++ = *tmpsrc++;
+      *dest++ = *tmpsrc++;
+      *dest++ = *tmpsrc++;
+    }
   }
 
+  /* --- Unoptimized code BEGIN ---
+     for (i = 0; i < n; i++) {
+     j = acc >> 16;
+     x = acc & 0xffff;
+     dest[i * 4 + 0] = (x < 32768) ? src[j * 4 + 0] : src[j * 4 + 4];
+     dest[i * 4 + 1] = (x < 32768) ? src[j * 4 + 1] : src[j * 4 + 5];
+     dest[i * 4 + 2] = (x < 32768) ? src[j * 4 + 2] : src[j * 4 + 6];
+     dest[i * 4 + 3] = (x < 32768) ? src[j * 4 + 3] : src[j * 4 + 7];
+
+     acc += increment;
+     }
+     --- Unoptimized code END --- */
+
   *accumulator = acc;
 }