vf_blend: Use memcpy when opacity is 0
authorTimothy Gu <timothygu99@gmail.com>
Sat, 13 Feb 2016 23:42:45 +0000 (23:42 +0000)
committerTimothy Gu <timothygu99@gmail.com>
Sun, 14 Feb 2016 16:57:07 +0000 (08:57 -0800)
For xor mode, 1.8x faster on Haswell.

libavfilter/vf_blend.c

index c24013d..599084f 100644 (file)
@@ -130,6 +130,7 @@ static void blend_copy ## src(const uint8_t *top, ptrdiff_t top_linesize,    \
 }
 
 COPY(top)
+COPY(bottom)
 
 #undef COPY
 
@@ -512,6 +513,7 @@ static int config_output(AVFilterLink *outlink)
         case BLEND_MULTIPLY128:param->blend = is_16bit ? blend_multiply128_16bit: blend_multiply128_8bit;break;
         case BLEND_NEGATION:   param->blend = is_16bit ? blend_negation_16bit   : blend_negation_8bit;   break;
         case BLEND_NORMAL:     param->blend = param->opacity == 1 ? blend_copytop :
+                                              param->opacity == 0 ? blend_copybottom :
                                               is_16bit ? blend_normal_16bit     : blend_normal_8bit;     break;
         case BLEND_OR:         param->blend = is_16bit ? blend_or_16bit         : blend_or_8bit;         break;
         case BLEND_OVERLAY:    param->blend = is_16bit ? blend_overlay_16bit    : blend_overlay_8bit;    break;
@@ -528,6 +530,10 @@ static int config_output(AVFilterLink *outlink)
         if (ARCH_X86)
             ff_blend_init_x86(param, is_16bit);
 
+        if (param->opacity == 0 && param->mode != BLEND_NORMAL) {
+            param->blend = blend_copytop;
+        }
+
         if (s->all_expr && !param->expr_str) {
             param->expr_str = av_strdup(s->all_expr);
             if (!param->expr_str)