Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Antalik <richardantalik@gmail.com>2022-01-11 08:12:15 +0300
committerRichard Antalik <richardantalik@gmail.com>2022-01-11 08:12:15 +0300
commitf2fb9a0c59ab64358301e4d98ba35b5f122a0eaf (patch)
treec97fe4b4bf3a49498c3d66c4fcff335140f2c296
parentf134341e03b5fe3edd5112557bcf42f6667ba69d (diff)
Fix T94768: Crash in VSE prefetching
If timeline contains scene strip outside of edited meta strip, this will cause crash. This is because prefetchin ignored meta strips being edited when rendering, but did check for scene strips only inside edited meta strip. Change active seqbase pointer when entering meta strip. This makes it possible to prefetch only content that is being presented to user.
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c2
-rw-r--r--source/blender/sequencer/intern/prefetch.c17
2 files changed, 18 insertions, 1 deletions
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index e9f37fa6838..c1b483f27e8 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -1950,6 +1950,8 @@ static int sequencer_meta_toggle_exec(bContext *C, wmOperator *UNUSED(op))
Editing *ed = SEQ_editing_get(scene);
Sequence *active_seq = SEQ_select_active_get(scene);
+ SEQ_prefetch_stop(scene);
+
if (active_seq && active_seq->type == SEQ_TYPE_META && active_seq->flag & SELECT) {
/* Enter meta-strip. */
SEQ_meta_stack_alloc(ed, active_seq);
diff --git a/source/blender/sequencer/intern/prefetch.c b/source/blender/sequencer/intern/prefetch.c
index 0c45eb09492..42affae26ed 100644
--- a/source/blender/sequencer/intern/prefetch.c
+++ b/source/blender/sequencer/intern/prefetch.c
@@ -328,6 +328,20 @@ static void seq_prefetch_update_scene(Scene *scene)
seq_prefetch_init_depsgraph(pfjob);
}
+static void seq_prefetch_update_active_seqbase(PrefetchJob *pfjob)
+{
+ MetaStack *ms_orig = SEQ_meta_stack_active_get(SEQ_editing_get(pfjob->scene));
+ Editing *ed_eval = SEQ_editing_get(pfjob->scene_eval);
+
+ if (ms_orig != NULL) {
+ Sequence *meta_eval = seq_prefetch_get_original_sequence(ms_orig->parseq, pfjob->scene_eval);
+ SEQ_seqbase_active_set(ed_eval, &meta_eval->seqbase);
+ }
+ else {
+ SEQ_seqbase_active_set(ed_eval, &ed_eval->seqbase);
+ }
+}
+
static void seq_prefetch_resume(Scene *scene)
{
PrefetchJob *pfjob = seq_prefetch_job_get(scene);
@@ -486,7 +500,7 @@ static void *seq_prefetch_frames(void *job)
*/
pfjob->scene_eval->ed->prefetch_job = pfjob;
- ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(pfjob->scene));
+ ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(pfjob->scene_eval));
if (seq_prefetch_must_skip_frame(pfjob, seqbase)) {
pfjob->num_frames_prefetched++;
continue;
@@ -549,6 +563,7 @@ static PrefetchJob *seq_prefetch_start_ex(const SeqRenderData *context, float cf
seq_prefetch_update_scene(context->scene);
seq_prefetch_update_context(context);
+ seq_prefetch_update_active_seqbase(pfjob);
BLI_threadpool_remove(&pfjob->threads, pfjob);
BLI_threadpool_insert(&pfjob->threads, pfjob);