Fix T91972: Meta changes length when adding strip

`SequencesMeta.new_movie()` API function caused meta strip to change
length. Similar issue has been fixed in transform code by checking
if `MetaStack` exists. `MetaStack` is not used when changing data in
python.

Provide `seqbase` to `SEQ_time_update_sequence()` so the function can
check if change happens inside of meta strip.

This patch also merges `seq_time_update_sequence_bounds()` into
`SEQ_time_update_sequence()`. This is because same issue applies for
both functions and it is confusing to have more time update
functions.re if this will lead anywhere.

Reviewed By: sergey

Differential Revision: https://developer.blender.org/D12763
This commit is contained in:
Richard Antalik 2021-10-07 00:10:37 +02:00
parent 306e9bff46
commit 877ba6b251
Notes: blender-bot 2023-02-13 17:49:07 +01:00
Referenced by issue #91972, new_movie function causes meta strip to change length
Referenced by issue #91004, VSE: Missing meta update
14 changed files with 132 additions and 79 deletions

View File

@ -1111,7 +1111,7 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
/* Adjust length. */
if (load_data.image.len == 1) {
SEQ_transform_set_right_handle_frame(seq, load_data.image.end_frame);
SEQ_time_update_sequence(scene, seq);
SEQ_time_update_sequence(scene, SEQ_active_seqbase_get(ed), seq);
}
seq_load_apply_generic_options(C, op, seq);

View File

@ -329,6 +329,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
Scene *scene = CTX_data_scene(C);
Editing *ed = SEQ_editing_get(scene);
ListBase *seqbase = SEQ_active_seqbase_get(ed);
Sequence *seq;
int snap_frame;
@ -352,7 +353,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
SEQ_transform_handle_xlimits(seq, seq->flag & SEQ_LEFTSEL, seq->flag & SEQ_RIGHTSEL);
SEQ_transform_fix_single_image_seq_offsets(seq);
}
SEQ_time_update_sequence(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
}
}
@ -375,19 +376,19 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
if (!either_handle_selected) {
SEQ_offset_animdata(scene, seq, (snap_frame - seq->startdisp));
}
SEQ_time_update_sequence(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
}
else if (seq->seq2 && (seq->seq2->flag & SELECT)) {
if (!either_handle_selected) {
SEQ_offset_animdata(scene, seq, (snap_frame - seq->startdisp));
}
SEQ_time_update_sequence(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
}
else if (seq->seq3 && (seq->seq3->flag & SELECT)) {
if (!either_handle_selected) {
SEQ_offset_animdata(scene, seq, (snap_frame - seq->startdisp));
}
SEQ_time_update_sequence(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
}
}
}
@ -629,7 +630,8 @@ static bool sequencer_slip_recursively(Scene *scene, SlipData *data, int offset)
* we can skip calculating for effects.
* This way we can avoid an extra loop just for effects. */
if (!(seq->type & SEQ_TYPE_EFFECT)) {
SEQ_time_update_sequence(scene, seq);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene));
SEQ_time_update_sequence(scene, seqbase, seq);
}
}
if (changed) {
@ -810,7 +812,8 @@ static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *even
for (int i = 0; i < data->num_seq; i++) {
Sequence *seq = data->seq_array[i];
SEQ_add_reload_new_file(bmain, scene, seq, false);
SEQ_time_update_sequence(scene, seq);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene));
SEQ_time_update_sequence(scene, seqbase, seq);
}
MEM_freeN(data->seq_array);
@ -1763,7 +1766,8 @@ static int sequencer_offset_clear_exec(bContext *C, wmOperator *UNUSED(op))
/* Update lengths, etc. */
seq = ed->seqbasep->first;
while (seq) {
SEQ_time_update_sequence(scene, seq);
ListBase *seqbase = SEQ_active_seqbase_get(ed);
SEQ_time_update_sequence(scene, seqbase, seq);
seq = seq->next;
}
@ -1806,6 +1810,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
Editing *ed = SEQ_editing_get(scene);
ListBase *seqbase = SEQ_active_seqbase_get(ed);
Sequence *seq, *seq_new;
Strip *strip_new;
@ -1813,7 +1818,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
int start_ofs, timeline_frame, frame_end;
int step = RNA_int_get(op->ptr, "length");
seq = ed->seqbasep->first; /* Poll checks this is valid. */
seq = seqbase->first; /* Poll checks this is valid. */
SEQ_prefetch_stop(scene);
@ -1823,7 +1828,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
/* Remove seq so overlap tests don't conflict,
* see seq_free_sequence below for the real freeing. */
BLI_remlink(ed->seqbasep, seq);
BLI_remlink(seqbase, seq);
/* TODO: remove f-curve and assign to split image strips.
* The old animation system would remove the user of `seq->ipo`. */
@ -1834,8 +1839,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
/* New seq. */
se = SEQ_render_give_stripelem(seq, timeline_frame);
seq_new = SEQ_sequence_dupli_recursive(
scene, scene, ed->seqbasep, seq, SEQ_DUPE_UNIQUE_NAME);
seq_new = SEQ_sequence_dupli_recursive(scene, scene, seqbase, seq, SEQ_DUPE_UNIQUE_NAME);
seq_new->start = start_ofs;
seq_new->type = SEQ_TYPE_IMAGE;
@ -1853,12 +1857,12 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
BLI_strncpy(se_new->name, se->name, sizeof(se_new->name));
strip_new->stripdata = se_new;
SEQ_time_update_sequence(scene, seq_new);
SEQ_time_update_sequence(scene, seqbase, seq_new);
if (step > 1) {
seq_new->flag &= ~SEQ_OVERLAP;
if (SEQ_transform_test_overlap(ed->seqbasep, seq_new)) {
SEQ_transform_seqbase_shuffle(ed->seqbasep, seq_new, scene);
if (SEQ_transform_test_overlap(seqbase, seq_new)) {
SEQ_transform_seqbase_shuffle(seqbase, seq_new, scene);
}
}
@ -1877,7 +1881,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
}
}
SEQ_sort(SEQ_active_seqbase_get(ed));
SEQ_sort(seqbase);
WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
@ -1994,7 +1998,7 @@ static int sequencer_meta_make_exec(bContext *C, wmOperator *op)
SEQ_sequence_base_unique_name_recursive(scene, &ed->seqbase, seqm);
seqm->start = meta_start_frame;
seqm->len = meta_end_frame - meta_start_frame;
SEQ_time_update_sequence(scene, seqm);
SEQ_time_update_sequence(scene, active_seqbase, seqm);
SEQ_select_active_set(scene, seqm);
if (SEQ_transform_test_overlap(active_seqbase, seqm)) {
SEQ_transform_seqbase_shuffle(active_seqbase, seqm, scene);
@ -2167,17 +2171,18 @@ static const EnumPropertyItem prop_side_lr_types[] = {
static void swap_sequence(Scene *scene, Sequence *seqa, Sequence *seqb)
{
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene));
int gap = seqb->startdisp - seqa->enddisp;
int seq_a_start;
int seq_b_start;
seq_b_start = (seqb->start - seqb->startdisp) + seqa->startdisp;
SEQ_transform_translate_sequence(scene, seqb, seq_b_start - seqb->start);
SEQ_time_update_sequence(scene, seqb);
SEQ_time_update_sequence(scene, seqbase, seqb);
seq_a_start = (seqa->start - seqa->startdisp) + seqb->enddisp + gap;
SEQ_transform_translate_sequence(scene, seqa, seq_a_start - seqa->start);
SEQ_time_update_sequence(scene, seqa);
SEQ_time_update_sequence(scene, seqbase, seqa);
}
static Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, int sel)
@ -2236,6 +2241,7 @@ static int sequencer_swap_exec(bContext *C, wmOperator *op)
Scene *scene = CTX_data_scene(C);
Editing *ed = SEQ_editing_get(scene);
Sequence *active_seq = SEQ_select_active_get(scene);
ListBase *seqbase = SEQ_active_seqbase_get(ed);
Sequence *seq, *iseq;
int side = RNA_enum_get(op->ptr, "side");
@ -2267,20 +2273,20 @@ static int sequencer_swap_exec(bContext *C, wmOperator *op)
}
/* XXX: Should be a generic function. */
for (iseq = scene->ed->seqbasep->first; iseq; iseq = iseq->next) {
for (iseq = seqbase->first; iseq; iseq = iseq->next) {
if ((iseq->type & SEQ_TYPE_EFFECT) &&
(seq_is_parent(iseq, active_seq) || seq_is_parent(iseq, seq))) {
SEQ_time_update_sequence(scene, iseq);
SEQ_time_update_sequence(scene, seqbase, iseq);
}
}
/* Do this in a new loop since both effects need to be calculated first. */
for (iseq = scene->ed->seqbasep->first; iseq; iseq = iseq->next) {
for (iseq = seqbase->first; iseq; iseq = iseq->next) {
if ((iseq->type & SEQ_TYPE_EFFECT) &&
(seq_is_parent(iseq, active_seq) || seq_is_parent(iseq, seq))) {
/* This may now overlap. */
if (SEQ_transform_test_overlap(ed->seqbasep, iseq)) {
SEQ_transform_seqbase_shuffle(ed->seqbasep, iseq, scene);
if (SEQ_transform_test_overlap(seqbase, iseq)) {
SEQ_transform_seqbase_shuffle(seqbase, iseq, scene);
}
}
}
@ -2594,8 +2600,9 @@ static int sequencer_swap_data_exec(bContext *C, wmOperator *op)
seq_act->scene_sound = NULL;
seq_other->scene_sound = NULL;
SEQ_time_update_sequence(scene, seq_act);
SEQ_time_update_sequence(scene, seq_other);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene));
SEQ_time_update_sequence(scene, seqbase, seq_act);
SEQ_time_update_sequence(scene, seqbase, seq_other);
if (seq_act->sound) {
BKE_sound_add_scene_sound_defaults(scene, seq_act);
@ -2793,7 +2800,6 @@ static int sequencer_change_path_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
Editing *ed = SEQ_editing_get(scene);
Sequence *seq = SEQ_select_active_get(scene);
const bool is_relative_path = RNA_boolean_get(op->ptr, "relative_path");
const bool use_placeholders = RNA_boolean_get(op->ptr, "use_placeholders");
@ -2849,10 +2855,11 @@ static int sequencer_change_path_exec(bContext *C, wmOperator *op)
* Important not to set seq->len = len; allow the function to handle it. */
SEQ_add_reload_new_file(bmain, scene, seq, true);
SEQ_time_update_sequence(scene, seq);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene));
SEQ_time_update_sequence(scene, seqbase, seq);
/* Invalidate cache. */
SEQ_relations_free_imbuf(scene, &ed->seqbase, false);
SEQ_relations_free_imbuf(scene, seqbase, false);
}
else if (ELEM(seq->type, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD)) {
bSound *sound = seq->sound;

View File

@ -275,7 +275,7 @@ static void seq_transform_cancel(TransInfo *t, SeqCollection *transformed_strips
SEQ_transform_seqbase_shuffle(seqbase, seq, t->scene);
}
SEQ_time_update_sequence_bounds(t->scene, seq);
SEQ_time_update_sequence(t->scene, seqbase, seq);
}
}
@ -327,7 +327,8 @@ static void seq_transform_update_effects(TransInfo *t, SeqCollection *collection
Sequence *seq;
SEQ_ITERATOR_FOREACH (seq, collection) {
if ((seq->type & SEQ_TYPE_EFFECT) && (seq->seq1 || seq->seq2 || seq->seq3)) {
SEQ_time_update_sequence(t->scene, seq);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(t->scene));
SEQ_time_update_sequence(t->scene, seqbase, seq);
}
}
}
@ -487,7 +488,9 @@ static void seq_transform_handle_overwrite_trim(const TransInfo *t,
BLI_assert(overlap == STRIP_OVERLAP_RIGHT_SIDE);
SEQ_transform_set_right_handle_frame(seq, transformed->startdisp);
}
SEQ_time_update_sequence(t->scene, seq);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(t->scene));
SEQ_time_update_sequence(t->scene, seqbase, seq);
}
SEQ_collection_free(targets);
}
@ -704,7 +707,9 @@ BLI_INLINE void trans_update_seq(Scene *sce, Sequence *seq, int old_start, int s
/* Calculate this strip and all nested strips.
* Children are ALWAYS transformed first so we don't need to do this in another loop.
*/
SEQ_time_update_sequence(sce, seq);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(sce));
SEQ_time_update_sequence(sce, seqbase, seq);
if (sel_flag == SELECT) {
SEQ_offset_animdata(sce, seq, seq->start - old_start);
@ -744,13 +749,13 @@ static void flushTransSeq(TransInfo *t)
SEQ_transform_set_left_handle_frame(seq, new_frame);
SEQ_transform_handle_xlimits(seq, tdsq->flag & SEQ_LEFTSEL, tdsq->flag & SEQ_RIGHTSEL);
SEQ_transform_fix_single_image_seq_offsets(seq);
SEQ_time_update_sequence(t->scene, seq);
SEQ_time_update_sequence(t->scene, seqbasep, seq);
break;
case SEQ_RIGHTSEL: /* No vertical transform. */
SEQ_transform_set_right_handle_frame(seq, new_frame);
SEQ_transform_handle_xlimits(seq, tdsq->flag & SEQ_LEFTSEL, tdsq->flag & SEQ_RIGHTSEL);
SEQ_transform_fix_single_image_seq_offsets(seq);
SEQ_time_update_sequence(t->scene, seq);
SEQ_time_update_sequence(t->scene, seqbasep, seq);
break;
}
}
@ -759,7 +764,7 @@ static void flushTransSeq(TransInfo *t)
if (ELEM(t->mode, TFM_SEQ_SLIDE, TFM_TIME_TRANSLATE)) {
for (seq = seqbasep->first; seq; seq = seq->next) {
if (seq->seq1 || seq->seq2 || seq->seq3) {
SEQ_time_update_sequence(t->scene, seq);
SEQ_time_update_sequence(t->scene, seqbasep, seq);
}
}
}

View File

@ -303,7 +303,7 @@ static void do_sequence_frame_change_update(Scene *scene, Sequence *seq)
Editing *ed = SEQ_editing_get(scene);
ListBase *seqbase = SEQ_get_seqbase_by_seq(&ed->seqbase, seq);
Sequence *tseq;
SEQ_time_update_sequence_bounds(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
/* ensure effects are always fit in length to their input */
@ -312,7 +312,7 @@ static void do_sequence_frame_change_update(Scene *scene, Sequence *seq)
*/
for (tseq = seqbase->first; tseq; tseq = tseq->next) {
if (tseq->seq1 || tseq->seq2 || tseq->seq3) {
SEQ_time_update_sequence(scene, tseq);
SEQ_time_update_sequence(scene, seqbase, tseq);
}
}
@ -756,13 +756,16 @@ static IDProperty **rna_Sequence_idprops(PointerRNA *ptr)
static bool rna_MovieSequence_reload_if_needed(ID *scene_id, Sequence *seq, Main *bmain)
{
Scene *scene = (Scene *)scene_id;
Editing *ed = SEQ_editing_get(scene);
ListBase *seqbase = SEQ_get_seqbase_by_seq(&ed->seqbase, seq);
bool has_reloaded;
bool can_produce_frames;
SEQ_add_movie_reload_if_needed(bmain, scene, seq, &has_reloaded, &can_produce_frames);
if (has_reloaded && can_produce_frames) {
SEQ_time_update_sequence(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
SEQ_relations_invalidate_cache_raw(scene, seq);
DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS);
@ -950,7 +953,9 @@ static void rna_Sequence_filepath_update(Main *bmain, Scene *UNUSED(scene), Poin
Scene *scene = (Scene *)ptr->owner_id;
Sequence *seq = (Sequence *)(ptr->data);
SEQ_add_reload_new_file(bmain, scene, seq, true);
SEQ_time_update_sequence(scene, seq);
Editing *ed = SEQ_editing_get(scene);
ListBase *seqbase = SEQ_get_seqbase_by_seq(&ed->seqbase, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
rna_Sequence_invalidate_raw_update(bmain, scene, ptr);
}

View File

@ -64,12 +64,16 @@
static void rna_Sequence_update_rnafunc(ID *id, Sequence *self, bool do_data)
{
Scene *scene = (Scene *)id;
Editing *ed = SEQ_editing_get(scene);
ListBase *seqbase = SEQ_get_seqbase_by_seq(&ed->seqbase, self);
if (do_data) {
SEQ_relations_update_changed_seq_and_deps((Scene *)id, self, true, true);
SEQ_relations_update_changed_seq_and_deps(scene, self, true, true);
// new_tstripdata(self); /* need 2.6x version of this. */
}
SEQ_time_update_sequence((Scene *)id, self);
SEQ_time_update_sequence_bounds((Scene *)id, self);
SEQ_time_update_sequence(scene, seqbase, self);
}
static void rna_Sequence_swap_internal(Sequence *seq_self,
@ -586,6 +590,8 @@ static void rna_Sequences_meta_remove(
static StripElem *rna_SequenceElements_append(ID *id, Sequence *seq, const char *filename)
{
Scene *scene = (Scene *)id;
Editing *ed = SEQ_editing_get(scene);
ListBase *seqbase = SEQ_get_seqbase_by_seq(&ed->seqbase, seq);
StripElem *se;
seq->strip->stripdata = se = MEM_reallocN(seq->strip->stripdata,
@ -594,7 +600,7 @@ static StripElem *rna_SequenceElements_append(ID *id, Sequence *seq, const char
BLI_strncpy(se->name, filename, sizeof(se->name));
seq->len++;
SEQ_time_update_sequence_bounds(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene);
return se;
@ -603,6 +609,8 @@ static StripElem *rna_SequenceElements_append(ID *id, Sequence *seq, const char
static void rna_SequenceElements_pop(ID *id, Sequence *seq, ReportList *reports, int index)
{
Scene *scene = (Scene *)id;
Editing *ed = SEQ_editing_get(scene);
ListBase *seqbase = SEQ_get_seqbase_by_seq(&ed->seqbase, seq);
StripElem *new_seq, *se;
if (seq->len == 1) {
@ -635,7 +643,7 @@ static void rna_SequenceElements_pop(ID *id, Sequence *seq, ReportList *reports,
MEM_freeN(seq->strip->stripdata);
seq->strip->stripdata = new_seq;
SEQ_time_update_sequence_bounds(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene);
}

View File

@ -42,8 +42,7 @@ int SEQ_time_find_next_prev_edit(struct Scene *scene,
const bool do_skip_mute,
const bool do_center,
const bool do_unselected);
void SEQ_time_update_sequence(struct Scene *scene, struct Sequence *seq);
void SEQ_time_update_sequence_bounds(struct Scene *scene, struct Sequence *seq);
void SEQ_time_update_sequence(struct Scene *scene, struct ListBase *seqbase, struct Sequence *seq);
bool SEQ_time_strip_intersects_frame(const struct Sequence *seq, const int timeline_frame);
void SEQ_time_update_meta_strip_range(struct Scene *scene, struct Sequence *seq_meta);

View File

@ -51,7 +51,7 @@ static bool sequencer_refresh_sound_length_recursive(Main *bmain, Scene *scene,
for (seq = seqbase->first; seq; seq = seq->next) {
if (seq->type == SEQ_TYPE_META) {
if (sequencer_refresh_sound_length_recursive(bmain, scene, &seq->seqbase)) {
SEQ_time_update_sequence(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
changed = true;
}
}
@ -67,7 +67,7 @@ static bool sequencer_refresh_sound_length_recursive(Main *bmain, Scene *scene,
seq->endofs *= fac;
seq->start += (old - seq->startofs); /* So that visual/"real" start frame does not change! */
SEQ_time_update_sequence(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
changed = true;
}
}

View File

@ -100,7 +100,7 @@ void SEQ_add_load_data_init(SeqLoadData *load_data,
static void seq_add_generic_update(Scene *scene, ListBase *seqbase, Sequence *seq)
{
SEQ_sequence_base_unique_name_recursive(scene, &scene->ed->seqbase, seq);
SEQ_time_update_sequence_bounds(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
SEQ_sort(seqbase);
SEQ_relations_invalidate_cache_composite(scene, seq);
}
@ -472,7 +472,7 @@ Sequence *SEQ_add_meta_strip(Scene *scene, ListBase *seqbase, SeqLoadData *load_
/* Set frames start and length. */
seqm->start = load_data->start_frame;
seqm->len = 1;
SEQ_time_update_sequence(scene, seqm);
SEQ_time_update_sequence(scene, seqbase, seqm);
return seqm;
}
@ -644,7 +644,9 @@ void SEQ_add_reload_new_file(Main *bmain, Scene *scene, Sequence *seq, const boo
if (lock_range) {
/* keep so we don't have to move the actual start and end points (only the data) */
SEQ_time_update_sequence_bounds(scene, seq);
Editing *ed = SEQ_editing_get(scene);
ListBase *seqbase = SEQ_get_seqbase_by_seq(&ed->seqbase, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
prev_startdisp = seq->startdisp;
prev_enddisp = seq->enddisp;
}
@ -794,7 +796,8 @@ void SEQ_add_reload_new_file(Main *bmain, Scene *scene, Sequence *seq, const boo
SEQ_transform_fix_single_image_seq_offsets(seq);
}
SEQ_time_update_sequence(scene, seq);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene));
SEQ_time_update_sequence(scene, seqbase, seq);
}
void SEQ_add_movie_reload_if_needed(struct Main *bmain,

View File

@ -267,8 +267,9 @@ bool SEQ_edit_move_strip_to_meta(Scene *scene,
SEQ_relations_invalidate_cache_preprocessed(scene, seq);
/* Update meta. */
ListBase *meta_seqbase = SEQ_get_seqbase_by_seq(&ed->seqbase, dst_seqm);
SEQ_time_update_meta_strip_range(scene, dst_seqm);
SEQ_time_update_sequence(scene, dst_seqm);
SEQ_time_update_sequence(scene, meta_seqbase, dst_seqm);
if (SEQ_transform_test_overlap(&dst_seqm->seqbase, seq)) {
SEQ_transform_seqbase_shuffle(&dst_seqm->seqbase, seq, scene);
}
@ -359,6 +360,7 @@ static bool seq_edit_split_effect_intersect_check(const Sequence *seq, const int
static void seq_edit_split_handle_strip_offsets(Main *bmain,
Scene *scene,
ListBase *seqbase,
Sequence *left_seq,
Sequence *right_seq,
const int timeline_frame,
@ -374,7 +376,7 @@ static void seq_edit_split_handle_strip_offsets(Main *bmain,
SEQ_add_reload_new_file(bmain, scene, right_seq, false);
break;
}
SEQ_time_update_sequence(scene, right_seq);
SEQ_time_update_sequence(scene, seqbase, right_seq);
}
if (seq_edit_split_effect_intersect_check(left_seq, timeline_frame)) {
@ -387,7 +389,7 @@ static void seq_edit_split_handle_strip_offsets(Main *bmain,
SEQ_add_reload_new_file(bmain, scene, left_seq, false);
break;
}
SEQ_time_update_sequence(scene, left_seq);
SEQ_time_update_sequence(scene, seqbase, left_seq);
}
}
@ -509,7 +511,8 @@ Sequence *SEQ_edit_strip_split(Main *bmain,
SEQ_collection_append_strip(right_seq, strips_to_delete);
}
seq_edit_split_handle_strip_offsets(bmain, scene, left_seq, right_seq, timeline_frame, method);
seq_edit_split_handle_strip_offsets(
bmain, scene, seqbase, left_seq, right_seq, timeline_frame, method);
left_seq = left_seq->next;
right_seq = right_seq->next;
}

View File

@ -330,7 +330,8 @@ static bool update_changed_seq_recurs(
}
if (len_change) {
SEQ_time_update_sequence(scene, seq);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene));
SEQ_time_update_sequence(scene, seqbase, seq);
}
}

View File

@ -148,7 +148,7 @@ void seq_update_sound_bounds_recursive(Scene *scene, Sequence *metaseq)
scene, metaseq, metaseq_start(metaseq), metaseq_end(metaseq));
}
void SEQ_time_update_sequence_bounds(Scene *scene, Sequence *seq)
static void seq_time_update_sequence_bounds(Scene *scene, Sequence *seq)
{
if (seq->startofs && seq->startstill) {
seq->startstill = 0;
@ -195,7 +195,7 @@ void SEQ_time_update_meta_strip_range(Scene *scene, Sequence *seq_meta)
SEQ_transform_set_right_handle_frame(seq_meta, seq_meta->enddisp);
}
void SEQ_time_update_sequence(Scene *scene, Sequence *seq)
void SEQ_time_update_sequence(Scene *scene, ListBase *seqbase, Sequence *seq)
{
Sequence *seqm;
@ -203,7 +203,7 @@ void SEQ_time_update_sequence(Scene *scene, Sequence *seq)
seqm = seq->seqbase.first;
while (seqm) {
if (seqm->seqbase.first) {
SEQ_time_update_sequence(scene, seqm);
SEQ_time_update_sequence(scene, &seqm->seqbase, seqm);
}
seqm = seqm->next;
}
@ -241,22 +241,25 @@ void SEQ_time_update_sequence(Scene *scene, Sequence *seq)
seq->len = seq->enddisp - seq->startdisp;
}
else {
SEQ_time_update_sequence_bounds(scene, seq);
seq_time_update_sequence_bounds(scene, seq);
}
}
else if (seq->type == SEQ_TYPE_META) {
seq_time_update_meta_strip(scene, seq);
}
else {
if (seq->type == SEQ_TYPE_META) {
seq_time_update_meta_strip(scene, seq);
}
Editing *ed = SEQ_editing_get(scene);
MetaStack *ms = SEQ_meta_stack_active_get(ed);
if (ms != NULL) {
SEQ_time_update_meta_strip_range(scene, ms->parseq);
}
SEQ_time_update_sequence_bounds(scene, seq);
seq_time_update_sequence_bounds(scene, seq);
}
Editing *ed = SEQ_editing_get(scene);
/* Strip is inside meta strip */
if (seqbase != &ed->seqbase) {
Sequence *meta = SEQ_get_meta_by_seqbase(&ed->seqbase, seqbase);
SEQ_time_update_meta_strip_range(scene, meta);
}
seq_time_update_sequence_bounds(scene, seq);
}
int SEQ_time_find_next_prev_edit(Scene *scene,

View File

@ -253,7 +253,8 @@ void SEQ_transform_translate_sequence(Scene *evil_scene, Sequence *seq, int delt
SEQ_transform_set_right_handle_frame(seq, seq->enddisp + delta);
}
SEQ_time_update_sequence(evil_scene, seq);
ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(evil_scene));
SEQ_time_update_sequence(evil_scene, seqbase, seq);
}
/* return 0 if there weren't enough space */
@ -266,7 +267,7 @@ bool SEQ_transform_seqbase_shuffle_ex(ListBase *seqbasep,
BLI_assert(ELEM(channel_delta, -1, 1));
test->machine += channel_delta;
SEQ_time_update_sequence(evil_scene, test);
SEQ_time_update_sequence(evil_scene, seqbasep, test);
while (SEQ_transform_test_overlap(seqbasep, test)) {
if ((channel_delta > 0) ? (test->machine >= MAXSEQ) : (test->machine < 1)) {
break;
@ -275,7 +276,7 @@ bool SEQ_transform_seqbase_shuffle_ex(ListBase *seqbasep,
test->machine += channel_delta;
/* XXX: I don't think this is needed since were only moving vertically, Campbell. */
SEQ_time_update_sequence(evil_scene, test);
SEQ_time_update_sequence(evil_scene, seqbasep, test);
}
if (!SEQ_valid_strip_channel(test)) {
@ -295,7 +296,7 @@ bool SEQ_transform_seqbase_shuffle_ex(ListBase *seqbasep,
new_frame = new_frame + (test->start - test->startdisp); /* adjust by the startdisp */
SEQ_transform_translate_sequence(evil_scene, test, new_frame - test->start);
SEQ_time_update_sequence(evil_scene, test);
SEQ_time_update_sequence(evil_scene, seqbasep, test);
return false;
}
@ -355,7 +356,7 @@ static int shuffle_seq_time_offset(SeqCollection *strips_to_shuffle,
}
SEQ_ITERATOR_FOREACH (seq, strips_to_shuffle) {
SEQ_time_update_sequence_bounds(scene, seq); /* corrects dummy startdisp/enddisp values */
SEQ_time_update_sequence(scene, seqbasep, seq); /* corrects dummy startdisp/enddisp values */
}
return tot_ofs;
@ -408,7 +409,7 @@ void SEQ_transform_offset_after_frame(Scene *scene,
LISTBASE_FOREACH (Sequence *, seq, seqbase) {
if (seq->startdisp >= timeline_frame) {
SEQ_transform_translate_sequence(scene, seq, delta);
SEQ_time_update_sequence(scene, seq);
SEQ_time_update_sequence(scene, seqbase, seq);
SEQ_relations_invalidate_cache_preprocessed(scene, seq);
}
}

View File

@ -450,6 +450,21 @@ ListBase *SEQ_get_seqbase_by_seq(ListBase *seqbase, Sequence *seq)
return NULL;
}
Sequence *SEQ_get_meta_by_seqbase(ListBase *seqbase_main, ListBase *meta_seqbase)
{
SeqCollection *strips = SEQ_query_all_strips_recursive(seqbase_main);
Sequence *seq;
SEQ_ITERATOR_FOREACH (seq, strips) {
if (seq->type == SEQ_TYPE_META && &seq->seqbase == meta_seqbase) {
break;
}
}
SEQ_collection_free(strips);
return seq;
}
/**
* Only use as last resort when the StripElem is available but no the Sequence.
* (needed for RNA)

View File

@ -28,9 +28,12 @@ extern "C" {
#endif
struct Scene;
struct ListBase;
bool sequencer_seq_generates_image(struct Sequence *seq);
void seq_open_anim_file(struct Scene *scene, struct Sequence *seq, bool openfile);
Sequence *SEQ_get_meta_by_seqbase(struct ListBase *seqbase_main, struct ListBase *meta_seqbase);
#ifdef __cplusplus
}
#endif