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`.
This commit is contained in:
Richard Antalik 2022-05-17 21:08:49 +02:00
parent b48adbc9d7
commit 35e73aa347
Notes: blender-bot 2023-02-14 09:43:37 +01:00
Referenced by issue #98021, Regression: Blender crashes when using the VSE which contains a scene on the timeline that contains audio
Referenced by issue #56625, Bevel modifier UV problem with corners
4 changed files with 19 additions and 12 deletions

View File

@ -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 {

View File

@ -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.

View File

@ -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)) {

View File

@ -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;
}
}