[Bf-blender-cvs] [5da3aecefd7] blender-v2.79b-release: Fix T53478, T53430: Sequencer cut edge case fails

Campbell Barton noreply at git.blender.org
Mon Mar 19 11:37:52 CET 2018


Commit: 5da3aecefd71b99b4e9e055d51dc3fd8913ad485
Author: Campbell Barton
Date:   Mon Mar 5 16:00:27 2018 +1100
Branches: blender-v2.79b-release
https://developer.blender.org/rB5da3aecefd71b99b4e9e055d51dc3fd8913ad485

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.

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

M	source/blender/editors/space_sequencer/sequencer_edit.c

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

diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 99c5c82eaab..8cdd6d27bd3 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -670,6 +670,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;
@@ -682,7 +686,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 */
 	
@@ -694,7 +698,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;
@@ -708,13 +714,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) {
@@ -732,7 +742,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)) {
@@ -741,9 +755,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;
@@ -752,16 +768,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);
 	}
@@ -774,6 +792,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;
@@ -786,11 +808,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;
@@ -804,11 +828,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) {
@@ -825,7 +853,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)) {
@@ -834,23 +864,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;



More information about the Bf-blender-cvs mailing list