Fix T101098: Moving meta strip can change its length

Caused by clamping handle translation to strip bounds in functions
`SEQ_time_*_handle_frame_set()` to prevent strip ending in invalid
state. Issue happens when meta strip is moved so quickly, such that
immediate offset is greater than strip length.

Currently meta strip bounds are updated when any contained strip changes
its position, but this update always preserves meta strip position.
Transforming meta strip is not possible directly and all contained
strips are moved instead. Therefore this is 2-step process and fix needs
to be applied on update function and on translation function.

Inline offset handling without clamping in function
`SEQ_time_update_meta_strip_range()`.
Add new function `seq_time_translate_handles()` to move both handles at
once in `SEQ_transform_translate_sequence()`.
This commit is contained in:
Richard Antalik 2022-09-17 03:38:38 +02:00 committed by Philipp Oeser
parent b50c1ca8fe
commit 41527ea89c
Notes: blender-bot 2023-11-20 12:14:32 +01:00
Referenced by issue #100749, Blender LTS: Maintenance Task 3.3
Referenced by issue #101098, vse group strips expanding in length on cancelled movement
3 changed files with 22 additions and 8 deletions

View File

@ -169,11 +169,16 @@ void SEQ_time_update_meta_strip_range(const Scene *scene, Sequence *seq_meta)
seq_meta->len -= seq_meta->anim_startofs;
seq_meta->len -= seq_meta->anim_endofs;
seq_update_sound_bounds_recursive(scene, seq_meta);
/* Functions `SEQ_time_*_handle_frame_set()` can not be used here, because they are clamped, so
* change must be done at once. */
seq_meta->startofs = strip_start - seq_meta->start;
seq_meta->startdisp = strip_start; /* Only to make files usable in older versions. */
seq_meta->endofs = seq_meta->start + SEQ_time_strip_length_get(scene, seq_meta) - strip_end;
seq_meta->enddisp = strip_end; /* Only to make files usable in older versions. */
/* Prevent meta-strip to move in timeline. */
SEQ_time_left_handle_frame_set(scene, seq_meta, strip_start);
SEQ_time_right_handle_frame_set(scene, seq_meta, strip_end);
seq_update_sound_bounds_recursive(scene, seq_meta);
SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq_meta));
seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq_meta));
}
void seq_time_effect_range_set(const Scene *scene, Sequence *seq)
@ -546,3 +551,14 @@ void SEQ_time_right_handle_frame_set(const Scene *scene, Sequence *seq, int val)
SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq));
seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq));
}
void seq_time_translate_handles(const Scene *scene, Sequence *seq, const int offset)
{
seq->startofs += offset;
seq->endofs -= offset;
seq->startdisp += offset; /* Only to make files usable in older versions. */
seq->enddisp -= offset; /* Only to make files usable in older versions. */
SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq));
seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq));
}

View File

@ -40,6 +40,7 @@ void seq_time_gap_info_get(const struct Scene *scene,
struct GapInfo *r_gap_info);
void seq_time_effect_range_set(const struct Scene *scene, Sequence *seq);
void seq_time_update_effects_strip_range(const struct Scene *scene, struct SeqCollection *effects);
void seq_time_translate_handles(const struct Scene *scene, struct Sequence *seq, const int offset);
#ifdef __cplusplus
}

View File

@ -146,10 +146,7 @@ void SEQ_transform_translate_sequence(Scene *evil_scene, Sequence *seq, int delt
SEQ_transform_translate_sequence(evil_scene, seq_child, delta);
}
/* Move meta start/end points. */
SEQ_time_left_handle_frame_set(
evil_scene, seq, SEQ_time_left_handle_frame_get(evil_scene, seq) + delta);
SEQ_time_right_handle_frame_set(
evil_scene, seq, SEQ_time_right_handle_frame_get(evil_scene, seq) + delta);
seq_time_translate_handles(evil_scene, seq, delta);
}
else { /* All other strip types. */
seq->start += delta;