Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-08-08 20:46:45 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-08-08 20:46:45 +0400
commit7483429e62ed5fb17f74e85d24471c879acf9ed1 (patch)
treeee1c27f396459ce76d6ad0cecda16192e38a721f /source/blender/blenkernel/intern/seqeffects.c
parentac2b6e23eb5479151385bc9b5366b56172e406bf (diff)
Sequencer: initial implementation of multithreaded effects
Added a framework to run effects in several threads. Port most of effects to this new framework. Still some work to be done here (some effects are not so easy to port)
Diffstat (limited to 'source/blender/blenkernel/intern/seqeffects.c')
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c291
1 files changed, 191 insertions, 100 deletions
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index a6688a4f7ee..938d11400a6 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -56,7 +56,37 @@
#include "RNA_access.h"
-/* **** XXX **** */
+static void slize_get_byte_buffers(const SeqRenderData *context, const ImBuf *ibuf1, const ImBuf *ibuf2,
+ const ImBuf *ibuf3, const ImBuf *out, int start_line, unsigned char **rect1,
+ unsigned char **rect2, unsigned char **rect3, unsigned char **rect_out)
+{
+ int offset = 4 * start_line * context->rectx;
+
+ *rect1 = (unsigned char*) ibuf1->rect + offset;
+ *rect_out = (unsigned char*) out->rect + offset;
+
+ if (ibuf2)
+ *rect2 = (unsigned char*) ibuf2->rect + offset;
+
+ if (ibuf3)
+ *rect3 = (unsigned char*) ibuf3->rect + offset;
+}
+
+static void slize_get_float_buffers(const SeqRenderData *context, const ImBuf *ibuf1, const ImBuf *ibuf2,
+ const ImBuf *ibuf3, const ImBuf *out, int start_line,
+ float **rect1, float **rect2, float **rect3, float **rect_out)
+{
+ int offset = 4 * start_line * context->rectx;
+
+ *rect1 = ibuf1->rect_float + offset;
+ *rect_out = out->rect_float + offset;
+
+ if (ibuf2)
+ *rect2 = ibuf2->rect_float + offset;
+
+ if (ibuf3)
+ *rect3 = ibuf3->rect_float + offset;
+}
/*********************** Glow effect *************************/
@@ -249,25 +279,24 @@ static void do_alphaover_effect_float(float facf0, float facf1, int x, int y, f
}
}
-static ImBuf *do_alphaover_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0,
- float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static void do_alphaover_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0,
+ float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3),
+ int start_line, int total_lines, ImBuf *out)
{
- ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
-
if (out->rect_float) {
- do_alphaover_effect_float(
- facf0, facf1, context.rectx, context.recty,
- ibuf1->rect_float, ibuf2->rect_float,
- out->rect_float);
+ float *rect1, *rect2, *rect_out;
+
+ slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_alphaover_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
}
else {
- do_alphaover_effect_byte(
- facf0, facf1, context.rectx, context.recty,
- (char *) ibuf1->rect, (char *) ibuf2->rect,
- (char *) out->rect);
- }
+ unsigned char *rect1, *rect2, *rect_out;
- return out;
+ slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_alphaover_effect_byte(facf0, facf1, context.rectx, total_lines, (char *) rect1, (char *) rect2, (char *) rect_out);
+ }
}
/*********************** Alpha Under *************************/
@@ -412,20 +441,24 @@ static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y,
}
}
-static ImBuf *do_alphaunder_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
- float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static void do_alphaunder_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3),
+ int start_line, int total_lines, ImBuf *out)
{
- ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
-
if (out->rect_float) {
- do_alphaunder_effect_float(facf0, facf1, context.rectx, context.recty, ibuf1->rect_float,
- ibuf2->rect_float, out->rect_float);
+ float *rect1, *rect2, *rect_out;
+
+ slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_alphaunder_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
}
else {
- do_alphaunder_effect_byte(facf0, facf1, context.rectx, context.recty,
- (char *) ibuf1->rect, (char *) ibuf2->rect, (char *) out->rect);
+ unsigned char *rect1, *rect2, *rect_out;
+
+ slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_alphaunder_effect_byte(facf0, facf1, context.rectx, total_lines, (char *) rect1, (char *) rect2, (char *) rect_out);
}
- return out;
}
/*********************** Cross *************************/
@@ -518,22 +551,24 @@ static void do_cross_effect_float(float facf0, float facf1, int x, int y, float
}
}
-/* careful: also used by speed effect! */
-
-static ImBuf *do_cross_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
- float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static void do_cross_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3),
+ int start_line, int total_lines, ImBuf *out)
{
- ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
-
if (out->rect_float) {
- do_cross_effect_float(facf0, facf1, context.rectx, context.recty,
- ibuf1->rect_float, ibuf2->rect_float, out->rect_float);
+ float *rect1, *rect2, *rect_out;
+
+ slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_cross_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
}
else {
- do_cross_effect_byte(facf0, facf1, context.rectx, context.recty,
- (char *) ibuf1->rect, (char *) ibuf2->rect, (char *) out->rect);
+ unsigned char *rect1, *rect2, *rect_out;
+
+ slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_cross_effect_byte(facf0, facf1, context.rectx, total_lines, (char *) rect1, (char *) rect2, (char *) rect_out);
}
- return out;
}
/*********************** Gamma Cross *************************/
@@ -757,24 +792,32 @@ static void do_gammacross_effect_float(float facf0, float UNUSED(facf1), int x,
}
}
-static ImBuf *do_gammacross_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
- float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static struct ImBuf *gammacross_init_execution(SeqRenderData context, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
{
ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
-
build_gammatabs();
+ return out;
+}
+
+static void do_gammacross_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3),
+ int start_line, int total_lines, ImBuf *out)
+{
if (out->rect_float) {
- do_gammacross_effect_float(facf0, facf1, context.rectx, context.recty, ibuf1->rect_float,
- ibuf2->rect_float, out->rect_float);
+ float *rect1, *rect2, *rect_out;
+
+ slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_gammacross_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
}
else {
- do_gammacross_effect_byte(facf0, facf1, context.rectx, context.recty,
- (unsigned char *) ibuf1->rect, (unsigned char *) ibuf2->rect,
- (unsigned char *) out->rect);
- }
+ unsigned char *rect1, *rect2, *rect_out;
- return out;
+ slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_gammacross_effect_byte(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
+ }
}
/*********************** Add *************************/
@@ -864,21 +907,23 @@ static void do_add_effect_float(float facf0, float facf1, int x, int y, float *r
}
}
-static ImBuf *do_add_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1,
- ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static void do_add_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1,
+ ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3), int start_line, int total_lines, ImBuf *out)
{
- ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
-
if (out->rect_float) {
- do_add_effect_float(facf0, facf1, context.rectx, context.recty, ibuf1->rect_float,
- ibuf2->rect_float, out->rect_float);
+ float *rect1, *rect2, *rect_out;
+
+ slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_add_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
}
else {
- do_add_effect_byte(facf0, facf1, context.rectx, context.recty, (unsigned char *) ibuf1->rect,
- (unsigned char *) ibuf2->rect, (unsigned char *) out->rect);
- }
+ unsigned char *rect1, *rect2, *rect_out;
- return out;
+ slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_add_effect_byte(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
+ }
}
/*********************** Sub *************************/
@@ -966,21 +1011,23 @@ static void do_sub_effect_float(float facf0, float facf1, int x, int y, float *r
}
}
-static ImBuf *do_sub_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1,
- ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static void do_sub_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1,
+ ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3), int start_line, int total_lines, ImBuf *out)
{
- ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
-
if (out->rect_float) {
- do_sub_effect_float(facf0, facf1, context.rectx, context.recty, ibuf1->rect_float,
- ibuf2->rect_float, out->rect_float);
+ float *rect1, *rect2, *rect_out;
+
+ slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_sub_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
}
else {
- do_sub_effect_byte(facf0, facf1, context.rectx, context.recty, (char *) ibuf1->rect,
- (char *) ibuf2->rect, (char *) out->rect);
- }
+ unsigned char *rect1, *rect2, *rect_out;
- return out;
+ slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_sub_effect_byte(facf0, facf1, context.rectx, total_lines, (char *) rect1, (char *) rect2, (char *) rect_out);
+ }
}
/*********************** Drop *************************/
@@ -1161,21 +1208,23 @@ static void do_mul_effect_float(float facf0, float facf1, int x, int y, float *r
}
}
-static ImBuf *do_mul_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1,
- ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static void do_mul_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1,
+ ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3), int start_line, int total_lines, ImBuf *out)
{
- ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
-
if (out->rect_float) {
- do_mul_effect_float(facf0, facf1, context.rectx, context.recty, ibuf1->rect_float,
- ibuf2->rect_float, out->rect_float);
+ float *rect1, *rect2, *rect_out;
+
+ slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_mul_effect_float(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
}
else {
- do_mul_effect_byte(facf0, facf1, context.rectx, context.recty, (unsigned char *) ibuf1->rect,
- (unsigned char *) ibuf2->rect, (unsigned char *) out->rect);
- }
+ unsigned char *rect1, *rect2, *rect_out;
- return out;
+ slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_mul_effect_byte(facf0, facf1, context.rectx, total_lines, rect1, rect2, rect_out);
+ }
}
/*********************** Wipe *************************/
@@ -2672,6 +2721,48 @@ void BKE_sequence_effect_speed_rebuild_map(Scene *scene, Sequence *seq, int forc
}
}
+static ImBuf *do_speed_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+{
+ ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
+
+ if (out->rect_float) {
+ do_cross_effect_float(facf0, facf1, context.rectx, context.recty,
+ ibuf1->rect_float, ibuf2->rect_float, out->rect_float);
+ }
+ else {
+ do_cross_effect_byte(facf0, facf1, context.rectx, context.recty,
+ (char *) ibuf1->rect, (char *) ibuf2->rect, (char *) out->rect);
+ }
+ return out;
+}
+
+/*********************** overdrop *************************/
+
+static void do_overdrop_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1,
+ ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3), int start_line, int total_lines, ImBuf *out)
+{
+ int x = context.rectx;
+ int y = total_lines;
+
+ if (out->rect_float) {
+ float *rect1, *rect2, *rect_out;
+
+ slize_get_float_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_drop_effect_float(facf0, facf1, x, y, rect1, rect2, rect_out);
+ do_alphaover_effect_float(facf0, facf1, x, y, rect1, rect2, rect_out);
+ }
+ else {
+ unsigned char *rect1, *rect2, *rect_out;
+
+ slize_get_byte_buffers(&context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
+
+ do_drop_effect_byte(facf0, facf1, x, y, (char *) rect1, (char *) rect2, (char *) rect_out);
+ do_alphaover_effect_byte(facf0, facf1, x, y, (char *) rect1, (char *) rect2, (char *) rect_out);
+ }
+}
+
/*********************** sequence effect factory *************************/
static void init_noop(Sequence *UNUSED(seq))
@@ -2736,21 +2827,9 @@ static void get_default_fac_fade(Sequence *seq, float cfra, float *facf0, float
*facf1 /= seq->len;
}
-static ImBuf *do_overdrop_effect(SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra), float facf0, float facf1,
- ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
+static struct ImBuf *init_execution(SeqRenderData context, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *ibuf3)
{
ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3);
- int x = context.rectx;
- int y = context.recty;
-
- if (out->rect_float) {
- do_drop_effect_float(facf0, facf1, x, y, ibuf1->rect_float, ibuf2->rect_float, out->rect_float);
- do_alphaover_effect_float(facf0, facf1, x, y, ibuf1->rect_float, ibuf2->rect_float, out->rect_float);
- }
- else {
- do_drop_effect_byte(facf0, facf1, x, y, (char *) ibuf1->rect, (char *) ibuf2->rect, (char *) out->rect);
- do_alphaover_effect_byte(facf0, facf1, x, y, (char *) ibuf1->rect, (char *) ibuf2->rect, (char *) out->rect);
- }
return out;
}
@@ -2760,6 +2839,7 @@ static struct SeqEffectHandle get_sequence_effect_impl(int seq_type)
struct SeqEffectHandle rval;
int sequence_type = seq_type;
+ rval.multithreaded = FALSE;
rval.init = init_noop;
rval.num_inputs = num_inputs_default;
rval.load = load_noop;
@@ -2768,44 +2848,55 @@ static struct SeqEffectHandle get_sequence_effect_impl(int seq_type)
rval.get_default_fac = get_default_fac_noop;
rval.store_icu_yrange = store_icu_yrange_noop;
rval.execute = NULL;
+ rval.init_execution = init_execution;
+ rval.execute_slice = NULL;
rval.copy = NULL;
switch (sequence_type) {
case SEQ_TYPE_CROSS:
- rval.execute = do_cross_effect;
+ rval.multithreaded = TRUE;
+ rval.execute_slice = do_cross_effect;
rval.early_out = early_out_fade;
rval.get_default_fac = get_default_fac_fade;
break;
case SEQ_TYPE_GAMCROSS:
+ rval.multithreaded = TRUE;
rval.init = init_gammacross;
rval.load = load_gammacross;
rval.free = free_gammacross;
rval.early_out = early_out_fade;
rval.get_default_fac = get_default_fac_fade;
- rval.execute = do_gammacross_effect;
+ rval.init_execution = gammacross_init_execution;
+ rval.execute_slice = do_gammacross_effect;
break;
case SEQ_TYPE_ADD:
- rval.execute = do_add_effect;
+ rval.multithreaded = TRUE;
+ rval.execute_slice = do_add_effect;
rval.early_out = early_out_mul_input2;
break;
case SEQ_TYPE_SUB:
- rval.execute = do_sub_effect;
+ rval.multithreaded = TRUE;
+ rval.execute_slice = do_sub_effect;
rval.early_out = early_out_mul_input2;
break;
case SEQ_TYPE_MUL:
- rval.execute = do_mul_effect;
+ rval.multithreaded = TRUE;
+ rval.execute_slice = do_mul_effect;
rval.early_out = early_out_mul_input2;
break;
case SEQ_TYPE_ALPHAOVER:
+ rval.multithreaded = TRUE;
rval.init = init_alpha_over_or_under;
- rval.execute = do_alphaover_effect;
+ rval.execute_slice = do_alphaover_effect;
break;
case SEQ_TYPE_OVERDROP:
- rval.execute = do_overdrop_effect;
+ rval.multithreaded = TRUE;
+ rval.execute_slice = do_overdrop_effect;
break;
case SEQ_TYPE_ALPHAUNDER:
+ rval.multithreaded = TRUE;
rval.init = init_alpha_over_or_under;
- rval.execute = do_alphaunder_effect;
+ rval.execute_slice = do_alphaunder_effect;
break;
case SEQ_TYPE_WIPE:
rval.init = init_wipe_effect;
@@ -2836,7 +2927,7 @@ static struct SeqEffectHandle get_sequence_effect_impl(int seq_type)
rval.load = load_speed_effect;
rval.free = free_speed_effect;
rval.copy = copy_speed_effect;
- rval.execute = do_cross_effect;
+ rval.execute = do_speed_effect;
rval.early_out = early_out_speed;
rval.store_icu_yrange = store_icu_yrange_speed;
break;
@@ -2865,7 +2956,7 @@ static struct SeqEffectHandle get_sequence_effect_impl(int seq_type)
struct SeqEffectHandle BKE_sequence_get_effect(Sequence *seq)
{
- struct SeqEffectHandle rval = {NULL};
+ struct SeqEffectHandle rval = {FALSE, NULL};
if (seq->type & SEQ_TYPE_EFFECT) {
rval = get_sequence_effect_impl(seq->type);
@@ -2880,7 +2971,7 @@ struct SeqEffectHandle BKE_sequence_get_effect(Sequence *seq)
struct SeqEffectHandle BKE_sequence_get_blend(Sequence *seq)
{
- struct SeqEffectHandle rval = {NULL};
+ struct SeqEffectHandle rval = {FALSE, NULL};
if (seq->blend_mode != 0) {
rval = get_sequence_effect_impl(seq->blend_mode);
@@ -2898,7 +2989,7 @@ int BKE_sequence_effect_get_num_inputs(int seq_type)
struct SeqEffectHandle rval = get_sequence_effect_impl(seq_type);
int cnt = rval.num_inputs();
- if (rval.execute) {
+ if (rval.execute || (rval.execute_slice && rval.init_execution)) {
return cnt;
}
return 0;