Fix T52332: crash when duplicating sequencer strips.

Bug introduced in recent ID copying refactor.

This commit basically sanitizes seq strip copying behavior, by making
destination scene pointer mandatory (and source one a const one).
Nothing then prevents you from using same pointer as source and
destination!
This commit is contained in:
2017-08-10 12:56:32 +02:00
parent 5b6ead05bd
commit ca3f601f93
3 changed files with 20 additions and 16 deletions

View File

@@ -5371,9 +5371,8 @@ Sequence *BKE_sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoad
return seq;
}
static Sequence *seq_dupli(Scene *scene, Scene *scene_to, Sequence *seq, int dupe_flag, const int flag)
static Sequence *seq_dupli(const Scene *scene, Scene *scene_to, Sequence *seq, int dupe_flag, const int flag)
{
Scene *sce_audio = scene_to ? scene_to : scene;
Sequence *seqn = MEM_dupallocN(seq);
seq->tmp = seqn;
@@ -5416,7 +5415,7 @@ static Sequence *seq_dupli(Scene *scene, Scene *scene_to, Sequence *seq, int dup
else if (seq->type == SEQ_TYPE_SCENE) {
seqn->strip->stripdata = NULL;
if (seq->scene_sound)
seqn->scene_sound = BKE_sound_scene_add_scene_sound_defaults(sce_audio, seqn);
seqn->scene_sound = BKE_sound_scene_add_scene_sound_defaults(scene_to, seqn);
}
else if (seq->type == SEQ_TYPE_MOVIECLIP) {
/* avoid assert */
@@ -5433,7 +5432,7 @@ static Sequence *seq_dupli(Scene *scene, Scene *scene_to, Sequence *seq, int dup
seqn->strip->stripdata =
MEM_dupallocN(seq->strip->stripdata);
if (seq->scene_sound)
seqn->scene_sound = BKE_sound_add_scene_sound_defaults(sce_audio, seqn);
seqn->scene_sound = BKE_sound_add_scene_sound_defaults(scene_to, seqn);
if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
id_us_plus((ID *)seqn->sound);
@@ -5457,11 +5456,15 @@ static Sequence *seq_dupli(Scene *scene, Scene *scene_to, Sequence *seq, int dup
BLI_assert(0);
}
if (dupe_flag & SEQ_DUPE_UNIQUE_NAME)
BKE_sequence_base_unique_name_recursive(&scene->ed->seqbase, seqn);
if (scene == scene_to) {
if (dupe_flag & SEQ_DUPE_UNIQUE_NAME) {
BKE_sequence_base_unique_name_recursive(&scene_to->ed->seqbase, seqn);
}
if (dupe_flag & SEQ_DUPE_ANIM)
BKE_sequencer_dupe_animdata(scene, seq->name + 2, seqn->name + 2);
if (dupe_flag & SEQ_DUPE_ANIM) {
BKE_sequencer_dupe_animdata(scene_to, seq->name + 2, seqn->name + 2);
}
}
return seqn;
}
@@ -5488,7 +5491,7 @@ static void seq_new_fix_links_recursive(Sequence *seq)
}
}
Sequence *BKE_sequence_dupli_recursive(Scene *scene, Scene *scene_to, Sequence *seq, int dupe_flag)
Sequence *BKE_sequence_dupli_recursive(const Scene *scene, Scene *scene_to, Sequence *seq, int dupe_flag)
{
Sequence *seqn;
@@ -5522,7 +5525,7 @@ void BKE_sequence_base_dupli_recursive(
for (seq = seqbase->first; seq; seq = seq->next) {
seq->tmp = NULL;
if ((seq->flag & SELECT) || (dupe_flag & SEQ_DUPE_ALL)) {
seqn = seq_dupli((Scene *)scene, scene_to, seq, dupe_flag, flag);
seqn = seq_dupli(scene, scene_to, seq, dupe_flag, flag);
if (seqn) { /*should never fail */
if (dupe_flag & SEQ_DUPE_CONTEXT) {
seq->flag &= ~SEQ_ALLSEL;