[FFmpeg-devel] [PATCH 2/4] lavfi/delogo: remember left and right samples when interpolating

Jean Delvare khali at linux-fr.org
Fri Jul 5 10:32:57 CEST 2013


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 at linux-fr.org>
---
 libavfilter/vf_delogo.c |   16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

--- ffmpeg.orig/libavfilter/vf_delogo.c	2013-07-05 10:09:42.129990158 +0200
+++ ffmpeg/libavfilter/vf_delogo.c	2013-07-05 10:18:39.963903236 +0200
@@ -65,6 +65,7 @@ static void apply_delogo(uint8_t *dst, i
     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, i
     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, i
             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]  +

-- 
Jean Delvare


More information about the ffmpeg-devel mailing list