From 98990f6ba439b496e8680d5043ebb18365b9e054 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Fri, 1 May 2020 21:16:50 +0200 Subject: Fix T76033: VSE crash with prefetch, disk cache and meta strips `BKE_sequencer_prefetch_get_original_sequence()` didn't look in metas and returned NULL. This caused crash in disk cache that was trying to read seq->name. Add function that will look in meta strips recursively and condition that seq must not be NULL. Reviewed By: brecht Maniphest Tasks: T76033 Differential Revision: https://developer.blender.org/D7597 --- source/blender/blenkernel/intern/seqcache.c | 8 ++++++++ source/blender/blenkernel/intern/seqprefetch.c | 28 +++++++++++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/intern/seqcache.c b/source/blender/blenkernel/intern/seqcache.c index f999a98faac..8a8b4d98c63 100644 --- a/source/blender/blenkernel/intern/seqcache.c +++ b/source/blender/blenkernel/intern/seqcache.c @@ -1225,6 +1225,10 @@ struct ImBuf *BKE_sequencer_cache_get( seq = BKE_sequencer_prefetch_get_original_sequence(seq, scene); } + if (!seq) { + return NULL; + } + if (!scene->ed->cache) { seq_cache_create(context->bmain, scene); } @@ -1287,6 +1291,10 @@ bool BKE_sequencer_cache_put_if_possible(const SeqRenderData *context, seq = BKE_sequencer_prefetch_get_original_sequence(seq, scene); } + if (!seq) { + return NULL; + } + if (BKE_sequencer_cache_recycle_item(scene)) { BKE_sequencer_cache_put(context, seq, cfra, type, ibuf, cost, skip_disk_cache); return true; diff --git a/source/blender/blenkernel/intern/seqprefetch.c b/source/blender/blenkernel/intern/seqprefetch.c index 67ed40cd48f..dabfd26f5b0 100644 --- a/source/blender/blenkernel/intern/seqprefetch.c +++ b/source/blender/blenkernel/intern/seqprefetch.c @@ -134,19 +134,29 @@ static bool seq_prefetch_job_is_waiting(Scene *scene) return pfjob->waiting; } -/* for cache context swapping */ -Sequence *BKE_sequencer_prefetch_get_original_sequence(Sequence *seq, Scene *scene) +static Sequence *sequencer_prefetch_get_original_sequence(Sequence *seq, ListBase *seqbase) { - Editing *ed = scene->ed; - ListBase *seqbase = &ed->seqbase; - Sequence *seq_orig = NULL; - - for (seq_orig = (Sequence *)seqbase->first; seq_orig; seq_orig = seq_orig->next) { + LISTBASE_FOREACH (Sequence *, seq_orig, seqbase) { if (strcmp(seq->name, seq_orig->name) == 0) { - break; + return seq_orig; + } + + if (seq_orig->type == SEQ_TYPE_META) { + Sequence *match = sequencer_prefetch_get_original_sequence(seq, &seq_orig->seqbase); + if (match != NULL) { + return match; + } } } - return seq_orig; + + return NULL; +} + +/* for cache context swapping */ +Sequence *BKE_sequencer_prefetch_get_original_sequence(Sequence *seq, Scene *scene) +{ + Editing *ed = scene->ed; + return sequencer_prefetch_get_original_sequence(seq, &ed->seqbase); } /* for cache context swapping */ -- cgit v1.2.3