VSE: Fix assigning effect strip inputs

Partialy fixes T73828

Currently all 3 effect inputs were assigned even if not all 3 were used.
This causes problems with reassigning effects in python, because 3rd input is
not accessible.

This patch will only assign inputs that are necessary for effect to work
properly.

Reviewed By: campbellbarton

Differential Revision: https://developer.blender.org/D6868
This commit is contained in:
Richard Antalik 2020-06-18 05:25:20 +02:00
parent 8df99b1c0c
commit 47f98a38d0
Notes: blender-bot 2023-02-14 00:57:33 +01:00
Referenced by commit d994391e0c, Fix T77994: VSE crash adding a glow effect strip
Referenced by issue #97744, Regression: Memory leak caused by speed control strip in video sequencer
Referenced by issue #77994, VSE crash adding a glow effect strip
Referenced by issue #73828, VSE: using python to remove a scene strip with effect applied causes... weirdness
2 changed files with 29 additions and 24 deletions

View File

@ -842,30 +842,22 @@ void BKE_sequence_calc(Scene *scene, Sequence *seq)
}
/* effects and meta: automatic start and end */
if (seq->type & SEQ_TYPE_EFFECT) {
/* pointers */
if (seq->seq2 == NULL) {
seq->seq2 = seq->seq1;
}
if (seq->seq3 == NULL) {
seq->seq3 = seq->seq1;
}
/* effecten go from seq1 -> seq2: test */
/* we take the largest start and smallest end */
// seq->start = seq->startdisp = MAX2(seq->seq1->startdisp, seq->seq2->startdisp);
// seq->enddisp = MIN2(seq->seq1->enddisp, seq->seq2->enddisp);
if (seq->seq1) {
/* XXX These resets should not be necessary, but users used to be able to
* edit effect's length, leading to strange results. See [#29190] */
seq->startofs = seq->endofs = seq->startstill = seq->endstill = 0;
seq->start = seq->startdisp = max_iii(
seq->seq1->startdisp, seq->seq2->startdisp, seq->seq3->startdisp);
seq->enddisp = min_iii(seq->seq1->enddisp, seq->seq2->enddisp, seq->seq3->enddisp);
if (seq->seq3) {
seq->start = seq->startdisp = max_iii(
seq->seq1->startdisp, seq->seq2->startdisp, seq->seq3->startdisp);
seq->enddisp = min_iii(seq->seq1->enddisp, seq->seq2->enddisp, seq->seq3->enddisp);
}
else if (seq->seq2) {
seq->start = seq->startdisp = max_ii(seq->seq1->startdisp, seq->seq2->startdisp);
seq->enddisp = min_ii(seq->seq1->enddisp, seq->seq2->enddisp);
}
else {
seq->start = seq->startdisp = seq->seq1->startdisp;
seq->enddisp = seq->seq1->enddisp;
}
/* we cant help if strips don't overlap, it wont give useful results.
* but at least ensure 'len' is never negative which causes bad bugs elsewhere. */
if (seq->enddisp < seq->startdisp) {
@ -2949,9 +2941,9 @@ static ImBuf *seq_render_effect_strip_impl(const SeqRenderData *context,
case EARLY_DO_EFFECT:
for (i = 0; i < 3; i++) {
/* Speed effect requires time remapping of cfra for input(s). */
if (input[1] && seq->type == SEQ_TYPE_SPEED) {
if (input[0] && seq->type == SEQ_TYPE_SPEED) {
float target_frame = BKE_sequencer_speed_effect_target_frame_get(context, seq, cfra, i);
ibuf[i] = seq_render_strip(context, state, input[i], target_frame);
ibuf[i] = seq_render_strip(context, state, input[0], target_frame);
}
else { /* Other effects. */
if (input[i]) {
@ -2960,7 +2952,7 @@ static ImBuf *seq_render_effect_strip_impl(const SeqRenderData *context,
}
}
if (ibuf[0] && ibuf[1]) {
if (ibuf[0] && (ibuf[1] || BKE_sequence_effect_get_num_inputs(seq->type) == 1)) {
if (sh.multithreaded) {
out = BKE_sequencer_effect_execute_threaded(
&sh, context, seq, cfra, fac, facf, ibuf[0], ibuf[1], ibuf[2]);

View File

@ -673,6 +673,14 @@ int seq_effect_find_selected(Scene *scene,
*r_selseq2 = seq2;
*r_selseq3 = seq3;
/* TODO(Richard): This function needs some refactoring, this is just quick hack for T73828. */
if (BKE_sequence_effect_get_num_inputs(type) < 3) {
*r_selseq3 = NULL;
}
if (BKE_sequence_effect_get_num_inputs(type) < 2) {
*r_selseq2 = NULL;
}
return 1;
}
@ -2222,6 +2230,11 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op)
Sequence *seq1, *seq2, *seq3, *last_seq = BKE_sequencer_active_get(scene);
const char *error_msg;
if (BKE_sequence_effect_get_num_inputs(last_seq->type) != 0) {
BKE_report(op->reports, RPT_ERROR, "Cannot reassign inputs: strip has no inputs");
return OPERATOR_CANCELLED;
}
if (!seq_effect_find_selected(
scene, last_seq, last_seq->type, &seq1, &seq2, &seq3, &error_msg)) {
BKE_report(op->reports, RPT_ERROR, error_msg);