From 66eedc542b7fb01b310afecb2b20382e9afaf8d7 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Tue, 7 Mar 2023 20:25:27 +0100 Subject: [PATCH] VSE: Use flag for strips with single frame of content. Previously `SEQ_transform_single_image_check` function was used to check if image or effect strip has only one frame of content. Now these strips are flagged with `SEQ_SINGLE_FRAME_CONTENT`. While previously this was implicit property of strip, benefit of having explicit flag is that this property can be decoupled from strip length. --- .../blenloader/intern/versioning_300.cc | 19 +++++++++++++++++++ .../editors/space_sequencer/sequencer_edit.c | 8 ++++++++ source/blender/makesdna/DNA_sequence_types.h | 2 +- source/blender/sequencer/intern/strip_add.c | 5 +++++ source/blender/sequencer/intern/strip_time.c | 2 +- .../sequencer/intern/strip_transform.c | 4 +--- 6 files changed, 35 insertions(+), 5 deletions(-) diff --git a/source/blender/blenloader/intern/versioning_300.cc b/source/blender/blenloader/intern/versioning_300.cc index 0eb71f7d7c8..7d6eb591923 100644 --- a/source/blender/blenloader/intern/versioning_300.cc +++ b/source/blender/blenloader/intern/versioning_300.cc @@ -76,6 +76,7 @@ #include "readfile.h" #include "SEQ_channels.h" +#include "SEQ_effects.h" #include "SEQ_iterator.h" #include "SEQ_retiming.h" #include "SEQ_sequencer.h" @@ -1637,6 +1638,16 @@ static bool version_fix_delete_flag(Sequence *seq, void * /*user_data*/) return true; } +static bool version_set_seq_single_frame_content(Sequence *seq, void * /*user_data*/) +{ + if ((seq->len == 1) && + (seq->type == SEQ_TYPE_IMAGE || + ((seq->type & SEQ_TYPE_EFFECT) && SEQ_effect_get_num_inputs(seq->type) == 0))) { + seq->flag |= SEQ_SINGLE_FRAME_CONTENT; + } + return true; +} + /* Those `version_liboverride_rnacollections_*` functions mimic the old, pre-3.0 code to find * anchor and source items in the given list of modifiers, constraints etc., using only the * `subitem_local` data of the override property operation. @@ -4027,6 +4038,14 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain) } } + /* Use `SEQ_SINGLE_FRAME_CONTENT` flag instead of weird function to check if strip has multiple + * frames. */ + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + Editing *ed = SEQ_editing_get(scene); + if (ed != nullptr) { + SEQ_for_each_callback(&ed->seqbase, version_set_seq_single_frame_content, nullptr); + } + } /* Keep this block, even when empty. */ } } diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 1c5063b8aac..b61612bf7fc 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -1851,6 +1851,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op) seq_new->start = start_ofs; seq_new->type = SEQ_TYPE_IMAGE; seq_new->len = 1; + seq->flag |= SEQ_SINGLE_FRAME_CONTENT; seq_new->endofs = 1 - step; /* New strip. */ @@ -2918,6 +2919,13 @@ static int sequencer_change_path_exec(bContext *C, wmOperator *op) RNA_END; } + if (len == 1) { + seq->flag |= SEQ_SINGLE_FRAME_CONTENT; + } + else { + seq->flag &= ~SEQ_SINGLE_FRAME_CONTENT; + } + /* Reset these else we won't see all the images. */ seq->anim_startofs = seq->anim_endofs = 0; diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index e64f3f1ab24..a601ed4ee25 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -580,7 +580,7 @@ enum { SEQ_USE_PROXY = (1 << 15), SEQ_IGNORE_CHANNEL_LOCK = (1 << 16), SEQ_AUTO_PLAYBACK_RATE = (1 << 17), - SEQ_FLAG_UNUSED_18 = (1 << 18), /* cleared */ + SEQ_SINGLE_FRAME_CONTENT = (1 << 18), SEQ_FLAG_UNUSED_19 = (1 << 19), /* cleared */ SEQ_FLAG_UNUSED_21 = (1 << 21), /* cleared */ diff --git a/source/blender/sequencer/intern/strip_add.c b/source/blender/sequencer/intern/strip_add.c index 89da6bb1769..1ab81719299 100644 --- a/source/blender/sequencer/intern/strip_add.c +++ b/source/blender/sequencer/intern/strip_add.c @@ -176,6 +176,7 @@ Sequence *SEQ_add_effect_strip(Scene *scene, ListBase *seqbase, struct SeqLoadDa if (!load_data->effect.seq1) { seq->len = 1; /* Effect is generator, set non zero length. */ + seq->flag |= SEQ_SINGLE_FRAME_CONTENT; SEQ_time_right_handle_frame_set(scene, seq, load_data->effect.end_frame); } @@ -235,6 +236,10 @@ Sequence *SEQ_add_image_strip(Main *bmain, Scene *scene, ListBase *seqbase, SeqL Strip *strip = seq->strip; strip->stripdata = MEM_callocN(load_data->image.len * sizeof(StripElem), "stripelem"); + if (seq->len == 1) { + seq->flag |= SEQ_SINGLE_FRAME_CONTENT; + } + /* Multiview settings. */ if (load_data->use_multiview) { seq->flag |= SEQ_USE_VIEWS; diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c index 60950c614a1..2aad71798df 100644 --- a/source/blender/sequencer/intern/strip_time.c +++ b/source/blender/sequencer/intern/strip_time.c @@ -77,7 +77,7 @@ float seq_give_frame_index(const Scene *scene, Sequence *seq, float timeline_fra return -1; } - if (seq->len == 1 && seq->type == SEQ_TYPE_IMAGE) { + if (seq->type == SEQ_TYPE_IMAGE && SEQ_transform_single_image_check(seq)) { return 0; } diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c index c81482c878c..c8ee4e58b4a 100644 --- a/source/blender/sequencer/intern/strip_transform.c +++ b/source/blender/sequencer/intern/strip_transform.c @@ -36,9 +36,7 @@ static CLG_LogRef LOG = {"seq.strip_transform"}; bool SEQ_transform_single_image_check(Sequence *seq) { - return ((seq->len == 1) && - (seq->type == SEQ_TYPE_IMAGE || - ((seq->type & SEQ_TYPE_EFFECT) && SEQ_effect_get_num_inputs(seq->type) == 0))); + return (seq->flag & SEQ_SINGLE_FRAME_CONTENT) != 0; } bool SEQ_transform_seqbase_isolated_sel_check(ListBase *seqbase)