[Bf-blender-cvs] [35e73aa3472] blender-v3.2-release: Fix T98021: Crash when using scene strip as sequencer input

Richard Antalik noreply at git.blender.org
Tue May 17 21:22:53 CEST 2022


Commit: 35e73aa3472ab8c1e28feec1829fae79967322b5
Author: Richard Antalik
Date:   Tue May 17 21:08:49 2022 +0200
Branches: blender-v3.2-release
https://developer.blender.org/rB35e73aa3472ab8c1e28feec1829fae79967322b5

Fix T98021: Crash when using scene strip as sequencer input

Issue was caused by treating such strip as meta and using
`seq->channels` directly, which is not valid for scene strips.

Pointer to channels is now provided by function
`SEQ_get_seqbase_from_sequence`.

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

M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/sequencer/SEQ_utils.h
M	source/blender/sequencer/intern/render.c
M	source/blender/sequencer/intern/utils.c

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

diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 4cb41c702da..a561de1ef64 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -572,8 +572,6 @@ static void drawmeta_contents(Scene *scene,
                               float y2,
                               const bool show_strip_color_tag)
 {
-  Editing *ed = SEQ_editing_get(scene);
-  ListBase *channels = SEQ_channels_displayed_get(ed);
   Sequence *seq;
   uchar col[4];
 
@@ -582,11 +580,16 @@ static void drawmeta_contents(Scene *scene,
   int chan_range = 0;
   float draw_range = y2 - y1;
   float draw_height;
-  ListBase *seqbase;
+
+  Editing *ed = SEQ_editing_get(scene);
+  ListBase *channels = SEQ_channels_displayed_get(ed);
+  ListBase *meta_seqbase;
+  ListBase *meta_channels;
   int offset;
 
-  seqbase = SEQ_get_seqbase_from_sequence(seqm, &offset);
-  if (!seqbase || BLI_listbase_is_empty(seqbase)) {
+  meta_seqbase = SEQ_get_seqbase_from_sequence(seqm, &meta_channels, &offset);
+
+  if (!meta_seqbase || BLI_listbase_is_empty(meta_seqbase)) {
     return;
   }
 
@@ -599,7 +602,7 @@ static void drawmeta_contents(Scene *scene,
 
   GPU_blend(GPU_BLEND_ALPHA);
 
-  for (seq = seqbase->first; seq; seq = seq->next) {
+  for (seq = meta_seqbase->first; seq; seq = seq->next) {
     chan_min = min_ii(chan_min, seq->machine);
     chan_max = max_ii(chan_max, seq->machine);
   }
@@ -613,7 +616,7 @@ static void drawmeta_contents(Scene *scene,
   immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
 
   /* Draw only immediate children (1 level depth). */
-  for (seq = seqbase->first; seq; seq = seq->next) {
+  for (seq = meta_seqbase->first; seq; seq = seq->next) {
     const int startdisp = seq->startdisp + offset;
     const int enddisp = seq->enddisp + offset;
 
@@ -631,7 +634,7 @@ static void drawmeta_contents(Scene *scene,
         color3ubv_from_seq(scene, seq, show_strip_color_tag, col);
       }
 
-      if (SEQ_render_is_muted(channels, seqm) || SEQ_render_is_muted(&seqm->channels, seq)) {
+      if (SEQ_render_is_muted(channels, seqm) || SEQ_render_is_muted(meta_channels, seq)) {
         col[3] = 64;
       }
       else {
diff --git a/source/blender/sequencer/SEQ_utils.h b/source/blender/sequencer/SEQ_utils.h
index ec33bca87a3..ce3c81606ea 100644
--- a/source/blender/sequencer/SEQ_utils.h
+++ b/source/blender/sequencer/SEQ_utils.h
@@ -32,7 +32,9 @@ void SEQ_sequence_base_unique_name_recursive(struct Scene *scene,
                                              struct ListBase *seqbasep,
                                              struct Sequence *seq);
 const char *SEQ_sequence_give_name(struct Sequence *seq);
-struct ListBase *SEQ_get_seqbase_from_sequence(struct Sequence *seq, int *r_offset);
+struct ListBase *SEQ_get_seqbase_from_sequence(struct Sequence *seq,
+                                               struct ListBase **channels,
+                                               int *r_offset);
 const struct Sequence *SEQ_get_topmost_sequence(const struct Scene *scene, int frame);
 /**
  * In cases where we don't know the sequence's listbase.
diff --git a/source/blender/sequencer/intern/render.c b/source/blender/sequencer/intern/render.c
index 8d8a13be09e..1b9e89a35d5 100644
--- a/source/blender/sequencer/intern/render.c
+++ b/source/blender/sequencer/intern/render.c
@@ -1586,10 +1586,10 @@ static ImBuf *do_render_strip_seqbase(const SeqRenderData *context,
 {
   ImBuf *ibuf = NULL;
   ListBase *seqbase = NULL;
-  ListBase *channels = &seq->channels;
+  ListBase *channels = NULL;
   int offset;
 
-  seqbase = SEQ_get_seqbase_from_sequence(seq, &offset);
+  seqbase = SEQ_get_seqbase_from_sequence(seq, &channels, &offset);
 
   if (seqbase && !BLI_listbase_is_empty(seqbase)) {
 
diff --git a/source/blender/sequencer/intern/utils.c b/source/blender/sequencer/intern/utils.c
index da422c4228f..0cf47420d8f 100644
--- a/source/blender/sequencer/intern/utils.c
+++ b/source/blender/sequencer/intern/utils.c
@@ -225,13 +225,14 @@ const char *SEQ_sequence_give_name(Sequence *seq)
   return name;
 }
 
-ListBase *SEQ_get_seqbase_from_sequence(Sequence *seq, int *r_offset)
+ListBase *SEQ_get_seqbase_from_sequence(Sequence *seq, ListBase **r_channels, int *r_offset)
 {
   ListBase *seqbase = NULL;
 
   switch (seq->type) {
     case SEQ_TYPE_META: {
       seqbase = &seq->seqbase;
+      *r_channels = &seq->channels;
       *r_offset = seq->start;
       break;
     }
@@ -240,6 +241,7 @@ ListBase *SEQ_get_seqbase_from_sequence(Sequence *seq, int *r_offset)
         Editing *ed = SEQ_editing_get(seq->scene);
         if (ed) {
           seqbase = &ed->seqbase;
+          *r_channels = &ed->channels;
           *r_offset = seq->scene->r.sfra;
         }
       }



More information about the Bf-blender-cvs mailing list