diff options
author | Richard Antalik <richardantalik@gmail.com> | 2022-04-21 01:05:57 +0300 |
---|---|---|
committer | Richard Antalik <richardantalik@gmail.com> | 2022-04-21 03:01:10 +0300 |
commit | 3cef9ebaf81053d80228f3ad43fa91e0ca75c542 (patch) | |
tree | e241f05b2773edce6cc9dfdf3e07f0653de1d5f5 /source/blender/sequencer/intern | |
parent | b67ccc333a5525f76f4e3adbb5b8115d5bba3c1a (diff) |
Fix T97356: Crash when adding adjustment layer strip
Crash was caused by incorrectly assuming, that rendered strip is meta
when editing code in bulk, but this wasn't true and strip had no
channels initialized, which caused crash on NULL dereference.
Correct approach is to find list of channels where on same level as
rendered strip, similar to how `SEQ_get_seqbase_by_seq` function works
for list of strips.
Diffstat (limited to 'source/blender/sequencer/intern')
-rw-r--r-- | source/blender/sequencer/intern/channels.c | 16 | ||||
-rw-r--r-- | source/blender/sequencer/intern/effects.c | 11 |
2 files changed, 21 insertions, 6 deletions
diff --git a/source/blender/sequencer/intern/channels.c b/source/blender/sequencer/intern/channels.c index e8e82af03f5..21e3461c7d0 100644 --- a/source/blender/sequencer/intern/channels.c +++ b/source/blender/sequencer/intern/channels.c @@ -81,3 +81,19 @@ bool SEQ_channel_is_muted(const SeqTimelineChannel *channel) { return (channel->flag & SEQ_CHANNEL_MUTE) != 0; } + +ListBase *SEQ_get_channels_by_seq(ListBase *seqbase, const Sequence *seq) +{ + ListBase *lb = NULL; + + LISTBASE_FOREACH (Sequence *, iseq, seqbase) { + if (seq == iseq) { + return seqbase; + } + if ((lb = SEQ_get_channels_by_seq(&iseq->seqbase, seq))) { + return lb; + } + } + + return NULL; +} diff --git a/source/blender/sequencer/intern/effects.c b/source/blender/sequencer/intern/effects.c index 0192f4f625c..f4fc79a6572 100644 --- a/source/blender/sequencer/intern/effects.c +++ b/source/blender/sequencer/intern/effects.c @@ -44,6 +44,7 @@ #include "RE_pipeline.h" +#include "SEQ_channels.h" #include "SEQ_effects.h" #include "SEQ_proxy.h" #include "SEQ_relations.h" @@ -2421,8 +2422,6 @@ static ImBuf *do_multicam(const SeqRenderData *context, { ImBuf *out; Editing *ed; - ListBase *seqbasep; - ListBase *channels = &seq->channels; if (seq->multicam_source == 0 || seq->multicam_source >= seq->machine) { return NULL; @@ -2432,7 +2431,8 @@ static ImBuf *do_multicam(const SeqRenderData *context, if (!ed) { return NULL; } - seqbasep = SEQ_get_seqbase_by_seq(&ed->seqbase, seq); + ListBase *seqbasep = SEQ_get_seqbase_by_seq(&ed->seqbase, seq); + ListBase *channels = SEQ_get_channels_by_seq(&ed->seqbase, seq); if (!seqbasep) { return NULL; } @@ -2463,13 +2463,12 @@ static int early_out_adjustment(Sequence *UNUSED(seq), float UNUSED(fac)) static ImBuf *do_adjustment_impl(const SeqRenderData *context, Sequence *seq, float timeline_frame) { Editing *ed; - ListBase *seqbasep; - ListBase *channels = &seq->channels; ImBuf *i = NULL; ed = context->scene->ed; - seqbasep = SEQ_get_seqbase_by_seq(&ed->seqbase, seq); + ListBase *seqbasep = SEQ_get_seqbase_by_seq(&ed->seqbase, seq); + ListBase *channels = SEQ_get_channels_by_seq(&ed->seqbase, seq); /* Clamp timeline_frame to strip range so it behaves as if it had "still frame" offset (last * frame is static after end of strip). This is how most strips behave. This way transition |