[Bf-blender-cvs] [f2fb9a0c59a] master: Fix T94768: Crash in VSE prefetching

Richard Antalik noreply at git.blender.org
Tue Jan 11 06:18:37 CET 2022


Commit: f2fb9a0c59ab64358301e4d98ba35b5f122a0eaf
Author: Richard Antalik
Date:   Tue Jan 11 06:12:15 2022 +0100
Branches: master
https://developer.blender.org/rBf2fb9a0c59ab64358301e4d98ba35b5f122a0eaf

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.

===================================================================

M	source/blender/editors/space_sequencer/sequencer_edit.c
M	source/blender/sequencer/intern/prefetch.c

===================================================================

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);



More information about the Bf-blender-cvs mailing list