From f3018322c097fe9893f73e2f66c1cd87ed30660c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 5 Mar 2018 16:00:27 +1100 Subject: Fix T53478, T53430: Sequencer cut edge case fails Previous fix for T53430 caused T54200. The edge case for soft & hard cuts weren't working, where the strip used start/end-still & the frame was placed exactly on the start/end of of the sequence content. T54200 fixed the end-still case but broke hard-cuts for all other cases. This fixes the case for soft/hard cuts with/without start/end-still. --- .../editors/space_sequencer/sequencer_edit.c | 76 ++++++++++++++++------ 1 file changed, 55 insertions(+), 21 deletions(-) (limited to 'source/blender/editors/space_sequencer') diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 4e487770a91..90737b20672 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -671,6 +671,10 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, int cutframe) Sequence *seqn = NULL; bool skip_dup = false; + /* The frame is exactly on the endpoint, + * this needs special handling for soft cut (not needed for hard cut). */ + const bool is_end_exact = ((seq->start + seq->len) == cutframe); + /* backup values */ ts.start = seq->start; ts.machine = seq->machine; @@ -683,7 +687,7 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, int cutframe) ts.anim_startofs = seq->anim_startofs; ts.anim_endofs = seq->anim_endofs; ts.len = seq->len; - + /* First Strip! */ /* strips with extended stillfames before */ @@ -695,7 +699,9 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, int cutframe) BKE_sequence_calc(scene, seq); } - if ((seq->startstill) && (cutframe < seq->start)) { + /* Important to offset the start when 'cutframe == seq->start' + * because we need at least one frame of content after start/end still have clipped it. */ + if ((seq->startstill) && (cutframe <= seq->start)) { /* don't do funny things with METAs ... */ if (seq->type == SEQ_TYPE_META) { skip_dup = true; @@ -709,13 +715,17 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, int cutframe) } } /* normal strip */ - else if ((cutframe >= seq->start) && (cutframe <= (seq->start + seq->len))) { + else if ((is_end_exact == false) && + ((cutframe >= seq->start) && (cutframe <= (seq->start + seq->len)))) + { seq->endofs = 0; seq->endstill = 0; seq->anim_endofs += (seq->start + seq->len) - cutframe; } /* strips with extended stillframes after */ - else if (((seq->start + seq->len) < cutframe) && (seq->endstill)) { + else if ((is_end_exact == true) || + (((seq->start + seq->len) < cutframe) && (seq->endstill))) + { seq->endstill -= seq->enddisp - cutframe; /* don't do funny things with METAs ... */ if (seq->type == SEQ_TYPE_META) { @@ -733,7 +743,11 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, int cutframe) if (seqn) { seqn->flag |= SELECT; - + + /* Important not to re-assign this (unlike soft-cut) */ +#if 0 + is_end_exact = ((seqn->start + seqn->len) == cutframe); +#endif /* Second Strip! */ /* strips with extended stillframes before */ if ((seqn->startstill) && (cutframe == seqn->start + 1)) { @@ -742,9 +756,11 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, int cutframe) seqn->anim_endofs = ts.anim_endofs; seqn->endstill = ts.endstill; } - + /* normal strip */ - else if ((cutframe >= seqn->start) && (cutframe <= (seqn->start + seqn->len))) { + else if ((is_end_exact == false) && + ((cutframe >= seqn->start) && (cutframe <= (seqn->start + seqn->len)))) + { seqn->start = cutframe; seqn->startstill = 0; seqn->startofs = 0; @@ -753,16 +769,18 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, int cutframe) seqn->anim_endofs = ts.anim_endofs; seqn->endstill = ts.endstill; } - + /* strips with extended stillframes after */ - else if (((seqn->start + seqn->len) < cutframe) && (seqn->endstill)) { + else if ((is_end_exact == true) || + (((seqn->start + seqn->len) < cutframe) && (seqn->endstill))) + { seqn->start = cutframe; seqn->startofs = 0; seqn->anim_startofs += ts.len - 1; seqn->endstill = ts.enddisp - cutframe - 1; seqn->startstill = 0; } - + BKE_sequence_reload_new_file(scene, seqn, false); BKE_sequence_calc(scene, seqn); } @@ -775,6 +793,10 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence *seq, int cutframe) Sequence *seqn = NULL; bool skip_dup = false; + /* The frame is exactly on the endpoint, + * this needs special handling for soft cut (not needed for hard cut). */ + bool is_end_exact = ((seq->start + seq->len) == cutframe); + /* backup values */ ts.start = seq->start; ts.machine = seq->machine; @@ -787,11 +809,13 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence *seq, int cutframe) ts.anim_startofs = seq->anim_startofs; ts.anim_endofs = seq->anim_endofs; ts.len = seq->len; - + /* First Strip! */ /* strips with extended stillfames before */ - - if ((seq->startstill) && (cutframe < seq->start)) { + + /* Important to offset the start when 'cutframe == seq->start' + * because we need at least one frame of content after start/end still have clipped it. */ + if ((seq->startstill) && (cutframe <= seq->start)) { /* don't do funny things with METAs ... */ if (seq->type == SEQ_TYPE_META) { skip_dup = true; @@ -805,11 +829,15 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence *seq, int cutframe) } } /* normal strip */ - else if ((cutframe >= seq->start) && (cutframe <= (seq->start + seq->len))) { + else if ((is_end_exact == false) && + (cutframe >= seq->start) && (cutframe <= (seq->start + seq->len))) + { seq->endofs = (seq->start + seq->len) - cutframe; } /* strips with extended stillframes after */ - else if (((seq->start + seq->len) < cutframe) && (seq->endstill)) { + else if ((is_end_exact == true) || + (((seq->start + seq->len) < cutframe) && (seq->endstill))) + { seq->endstill -= seq->enddisp - cutframe; /* don't do funny things with METAs ... */ if (seq->type == SEQ_TYPE_META) { @@ -826,7 +854,9 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence *seq, int cutframe) if (seqn) { seqn->flag |= SELECT; - + + is_end_exact = ((seqn->start + seqn->len) == cutframe); + /* Second Strip! */ /* strips with extended stillframes before */ if ((seqn->startstill) && (cutframe == seqn->start + 1)) { @@ -835,23 +865,27 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence *seq, int cutframe) seqn->endofs = ts.endofs; seqn->endstill = ts.endstill; } - + /* normal strip */ - else if ((cutframe >= seqn->start) && (cutframe <= (seqn->start + seqn->len))) { + else if ((is_end_exact == false) && + (cutframe >= seqn->start) && (cutframe <= (seqn->start + seqn->len))) + { seqn->startstill = 0; seqn->startofs = cutframe - ts.start; seqn->endofs = ts.endofs; seqn->endstill = ts.endstill; } - + /* strips with extended stillframes after */ - else if (((seqn->start + seqn->len) < cutframe) && (seqn->endstill)) { + else if ((is_end_exact == true) || + (((seqn->start + seqn->len) < cutframe) && (seqn->endstill))) + { seqn->start = cutframe - ts.len + 1; seqn->startofs = ts.len - 1; seqn->endstill = ts.enddisp - cutframe - 1; seqn->startstill = 0; } - + BKE_sequence_calc(scene, seqn); } return seqn; -- cgit v1.2.3