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:
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
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue