lavfi/delogo: remember left and right samples when interpolating
authorJean Delvare <khali@linux-fr.org>
Fri, 5 Jul 2013 08:32:57 +0000 (10:32 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 5 Jul 2013 11:53:37 +0000 (13:53 +0200)
The left and right samples are the same for the whole line, so store
their values and don't recompute them for every iteration of "y".

This simple optimization results in a speed improvement between 15%
and 20% in my tests (depending on the logo geometry.)

Result is obviously the same.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Reviewed-by: Stefano Sabatini <stefasab@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavfilter/vf_delogo.c

index 3a9bdd4..462613d 100644 (file)
@@ -65,6 +65,7 @@ static void apply_delogo(uint8_t *dst, int dst_linesize,
     uint8_t *xdst, *xsrc;
 
     uint8_t *topleft, *botleft, *topright;
+    unsigned int left_sample, right_sample;
     int xclipl, xclipr, yclipt, yclipb;
     int logo_x1, logo_x2, logo_y1, logo_y2;
 
@@ -89,6 +90,13 @@ static void apply_delogo(uint8_t *dst, int dst_linesize,
     src += (logo_y1 + 1) * src_linesize;
 
     for (y = logo_y1+1; y < logo_y2-1; y++) {
+        left_sample = topleft[src_linesize*(y-logo_y1)]   +
+                      topleft[src_linesize*(y-logo_y1-1)] +
+                      topleft[src_linesize*(y-logo_y1+1)];
+        right_sample = topright[src_linesize*(y-logo_y1)]   +
+                       topright[src_linesize*(y-logo_y1-1)] +
+                       topright[src_linesize*(y-logo_y1+1)];
+
         for (x = logo_x1+1,
              xdst = dst+logo_x1+1,
              xsrc = src+logo_x1+1; x < logo_x2-1; x++, xdst++, xsrc++) {
@@ -100,13 +108,9 @@ static void apply_delogo(uint8_t *dst, int dst_linesize,
             weightb = (uint64_t)(x-logo_x1) * (logo_x2-1-x) * (y-logo_y1)                 * sar.num;
 
             interp =
-                (topleft[src_linesize*(y-logo_y1)]    +
-                 topleft[src_linesize*(y-logo_y1-1)]  +
-                 topleft[src_linesize*(y-logo_y1+1)]) * weightl
+                left_sample * weightl
                 +
-                (topright[src_linesize*(y-logo_y1)]    +
-                 topright[src_linesize*(y-logo_y1-1)]  +
-                 topright[src_linesize*(y-logo_y1+1)]) * weightr
+                right_sample * weightr
                 +
                 (topleft[x-logo_x1]    +
                  topleft[x-logo_x1-1]  +