Commit: 45da0d20e6f39727eacb2955d25b4a834848f03a
Author: Richard Antalik
Date:   Mon Aug 17 20:52:59 2020 +0200
Branches: master
https://developer.blender.org/rB45da0d20e6f39727eacb2955d25b4a834848f03a

VSE: make transform effect multithreaded

Multithreaded implementation can provide significant performance gain
on CPU's that can handle more parallel tasks.

On my 8 core system I got about 3.5x faster processing speed.

Reviewed By: sergey

Differential Revision: https://developer.blender.org/D8585

===================================================================

M       source/blender/blenkernel/intern/seqeffects.c

===================================================================

diff --git a/source/blender/blenkernel/intern/seqeffects.c 
b/source/blender/blenkernel/intern/seqeffects.c
index afec9b835a5..c6daecbcee6 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -2387,6 +2387,8 @@ static void copy_transform_effect(Sequence *dst, Sequence 
*src, const int UNUSED
 
 static void transform_image(int x,
                             int y,
+                            int start_line,
+                            int total_lines,
                             ImBuf *ibuf1,
                             ImBuf *out,
                             float scale_x,
@@ -2396,34 +2398,27 @@ static void transform_image(int x,
                             float rotate,
                             int interpolation)
 {
-  int xo, yo, xi, yi;
-  float xt, yt, xr, yr;
-  float s, c;
-
-  xo = x;
-  yo = y;
-
   /* Rotate */
-  s = sinf(rotate);
-  c = cosf(rotate);
+  float s = sinf(rotate);
+  float c = cosf(rotate);
 
-  for (yi = 0; yi < yo; yi++) {
-    for (xi = 0; xi < xo; xi++) {
+  for (int yi = start_line; yi < start_line + total_lines; yi++) {
+    for (int xi = 0; xi < x; xi++) {
       /* translate point */
-      xt = xi - translate_x;
-      yt = yi - translate_y;
+      float xt = xi - translate_x;
+      float yt = yi - translate_y;
 
       /* rotate point with center ref */
-      xr = c * xt + s * yt;
-      yr = -s * xt + c * yt;
+      float xr = c * xt + s * yt;
+      float yr = -s * xt + c * yt;
 
       /* scale point with center ref */
       xt = xr / scale_x;
       yt = yr / scale_y;
 
       /* undo reference center point  */
-      xt += (xo / 2.0f);
-      yt += (yo / 2.0f);
+      xt += (x / 2.0f);
+      yt += (y / 2.0f);
 
       /* interpolate */
       switch (interpolation) {
@@ -2441,9 +2436,19 @@ static void transform_image(int x,
   }
 }
 
-static void do_transform(
-    Scene *scene, Sequence *seq, float UNUSED(facf0), int x, int y, ImBuf 
*ibuf1, ImBuf *out)
+static void do_transform_effect(const SeqRenderData *context,
+                                 Sequence *seq,
+                                 float UNUSED(cfra),
+                                 float UNUSED(facf0),
+                                 float UNUSED(facf1),
+                                 ImBuf *ibuf1,
+                                 ImBuf *UNUSED(ibuf2),
+                                 ImBuf *UNUSED(ibuf3),
+                                 int start_line,
+                                 int total_lines,
+                                 ImBuf *out)
 {
+  Scene *scene = context->scene;
   TransformVars *transform = (TransformVars *)seq->effectdata;
   float scale_x, scale_y, translate_x, translate_y, rotate_radians;
 
@@ -2456,6 +2461,9 @@ static void do_transform(
     scale_y = transform->ScaleyIni;
   }
 
+  int x = context->rectx;
+  int y = context->recty;
+
   /* Translate */
   if (!transform->percent) {
     float rd_s = (scene->r.size / 100.0f);
@@ -2473,6 +2481,8 @@ static void do_transform(
 
   transform_image(x,
                   y,
+                  start_line,
+                  total_lines,
                   ibuf1,
                   out,
                   scale_x,
@@ -2483,22 +2493,6 @@ static void do_transform(
                   transform->interpolation);
 }
 
-static ImBuf *do_transform_effect(const SeqRenderData *context,
-                                  Sequence *seq,
-                                  float UNUSED(cfra),
-                                  float facf0,
-                                  float UNUSED(facf1),
-                                  ImBuf *ibuf1,
-                                  ImBuf *ibuf2,
-                                  ImBuf *ibuf3)
-{
-  ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
-
-  do_transform(context->scene, seq, facf0, context->rectx, context->recty, 
ibuf1, out);
-
-  return out;
-}
-
 /*********************** Glow *************************/
 
 static void RVBlurBitmap2_float(float *map, int width, int height, float blur, 
int quality)
@@ -4183,11 +4177,12 @@ static struct SeqEffectHandle 
get_sequence_effect_impl(int seq_type)
       rval.execute = do_glow_effect;
       break;
     case SEQ_TYPE_TRANSFORM:
+      rval.multithreaded = true;
       rval.init = init_transform_effect;
       rval.num_inputs = num_inputs_transform;
       rval.free = free_transform_effect;
       rval.copy = copy_transform_effect;
-      rval.execute = do_transform_effect;
+      rval.execute_slice = do_transform_effect;
       break;
     case SEQ_TYPE_SPEED:
       rval.init = init_speed_effect;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to