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:
Diffstat (limited to 'source/blender/blenkernel/intern/sequencer.c')
-rw-r--r--source/blender/blenkernel/intern/sequencer.c46
1 files changed, 37 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index d6bb5cc3745..8de093cd845 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -886,7 +886,8 @@ static void multibuf(ImBuf *ibuf, float fmul)
}
}
-static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se)
+static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se,
+ int render_size)
{
TStripElem *se1, *se2, *se3;
float fac, facf;
@@ -920,7 +921,7 @@ static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se)
if (early_out == -1) { /* no input needed */
sh.execute(scene, seq, cfra, fac, facf,
- se->ibuf->x, se->ibuf->y,
+ se->ibuf->x, se->ibuf->y, render_size,
0, 0, 0, se->ibuf);
return;
}
@@ -1008,7 +1009,8 @@ static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se)
IMB_rect_from_float(se3->ibuf);
}
- sh.execute(scene, seq, cfra, fac, facf, x, y, se1->ibuf, se2->ibuf, se3->ibuf,
+ sh.execute(scene, seq, cfra, fac, facf, x, y, render_size,
+ se1->ibuf, se2->ibuf, se3->ibuf,
se->ibuf);
}
@@ -2023,7 +2025,7 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int
else
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
- do_effect(scene, cfra, seq, se);
+ do_effect(scene, cfra, seq, se, render_size);
if (input_have_to_preprocess(scene, seq, se, cfra,
seqrectx, seqrecty) &&
!build_proxy_run) {
@@ -2362,7 +2364,7 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra
test_and_auto_discard_ibuf(se, seqrectx, seqrecty);
if (se->ibuf == NULL) {
- se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left, render_size, seqrectx, seqrecty);
+ se1 = do_build_seq_recursively(scene, seq->seq1, cfra_left, render_size, seqrectx, seqrecty);
if((se1 && se1->ibuf && se1->ibuf->rect_float))
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
@@ -2394,8 +2396,8 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra
}
if (se->ibuf == NULL) {
- se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left, render_size, seqrectx, seqrecty);
- se2 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_right, render_size, seqrectx, seqrecty);
+ se1 = do_build_seq_recursively(scene, seq->seq1, cfra_left, render_size, seqrectx, seqrecty);
+ se2 = do_build_seq_recursively(scene, seq->seq1, cfra_right, render_size, seqrectx, seqrecty);
if((se1 && se1->ibuf && se1->ibuf->rect_float))
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
@@ -2411,6 +2413,7 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra
f_cfra - (float) cfra_left,
f_cfra - (float) cfra_left,
se->ibuf->x, se->ibuf->y,
+ render_size,
se1->ibuf, se2->ibuf, 0, se->ibuf);
}
}
@@ -2450,6 +2453,11 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra
static TStripElem* do_build_seq_recursively(Scene *scene, Sequence * seq, int cfra, int render_size, int seqrectx, int seqrecty)
{
TStripElem *se;
+
+ /* BAD HACK! Seperate handling for speed effects needed, since
+ a) you can't just fetch a different cfra within an effect strip
+ b) we have to blend two frames, and CFRA is not float...
+ */
if (seq->type == SEQ_SPEED) {
se = do_handle_speed_effect(scene, seq, cfra, render_size, seqrectx, seqrecty);
} else {
@@ -2679,12 +2687,12 @@ static TStripElem* do_build_seq_array_recursively(
if (swap_input) {
sh.execute(scene, seq, cfra,
- facf, facf, x, y,
+ facf, facf, x, y, render_size,
se2->ibuf, se1->ibuf_comp, 0,
se2->ibuf_comp);
} else {
sh.execute(scene, seq, cfra,
- facf, facf, x, y,
+ facf, facf, x, y, render_size,
se1->ibuf_comp, se2->ibuf, 0,
se2->ibuf_comp);
}
@@ -2746,6 +2754,26 @@ static ImBuf *give_ibuf_seq_impl(Scene *scene, int rectx, int recty, int cfra, i
return se->ibuf_comp;
}
+ImBuf *give_ibuf_seqbase(struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size, ListBase *seqbasep)
+{
+ TStripElem *se;
+
+ se = do_build_seq_array_recursively(scene, seqbasep, cfra, chanshown, render_size, rectx, recty);
+
+ if(!se) {
+ return 0;
+ }
+
+ check_limiter_refcount_comp("give_ibuf_seqbase", se);
+
+ if (se->ibuf_comp) {
+ IMB_cache_limiter_unref(se->ibuf_comp);
+ }
+
+ return se->ibuf_comp;
+}
+
+
ImBuf *give_ibuf_seq_direct(Scene *scene, int rectx, int recty, int cfra, int render_size, Sequence *seq)
{
TStripElem* se;