forked from bartvdbraak/blender
[#22825] Copy Scenes with Audio Strip Crash.
This commit is contained in:
parent
c76d339b6c
commit
e88b8dac7b
@ -220,14 +220,14 @@ int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test, struct Scene
|
||||
int shuffle_seq_time(ListBase * seqbasep, struct Scene *evil_scene);
|
||||
int seqbase_isolated_sel_check(struct ListBase *seqbase);
|
||||
void free_imbuf_seq(struct Scene *scene, struct ListBase * seqbasep, int check_mem_usage, int keep_file_handles);
|
||||
struct Sequence *seq_dupli_recursive(struct Scene *scene, struct Sequence * seq, int dupe_flag);
|
||||
struct Sequence *seq_dupli_recursive(struct Scene *scene, struct Scene *scene_to, struct Sequence * seq, int dupe_flag);
|
||||
int seq_swap(struct Sequence *seq_a, struct Sequence *seq_b);
|
||||
|
||||
void seq_update_sound(struct Scene* scene, struct Sequence *seq);
|
||||
void seq_update_muting(struct Scene* scene, struct Editing *ed);
|
||||
void seqbase_sound_reload(struct Scene *scene, ListBase *seqbase);
|
||||
void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq);
|
||||
void seqbase_dupli_recursive(struct Scene *scene, ListBase *nseqbase, ListBase *seqbase, int dupe_flag);
|
||||
void seqbase_dupli_recursive(struct Scene *scene, struct Scene *scene_to, ListBase *nseqbase, ListBase *seqbase, int dupe_flag);
|
||||
|
||||
void clear_scene_in_allseqs(struct Main *bmain, struct Scene *sce);
|
||||
|
||||
|
@ -211,6 +211,9 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
|
||||
ID_NEW(scen->camera);
|
||||
}
|
||||
|
||||
/* before scene copy */
|
||||
sound_create_scene(scen);
|
||||
|
||||
/* world */
|
||||
if(type == SCE_COPY_FULL) {
|
||||
if(scen->world) {
|
||||
@ -221,12 +224,10 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
|
||||
if(sce->ed) {
|
||||
scen->ed= MEM_callocN( sizeof(Editing), "addseq");
|
||||
scen->ed->seqbasep= &scen->ed->seqbase;
|
||||
seqbase_dupli_recursive(sce, &scen->ed->seqbase, &sce->ed->seqbase, SEQ_DUPE_ALL);
|
||||
seqbase_dupli_recursive(sce, scen, &scen->ed->seqbase, &sce->ed->seqbase, SEQ_DUPE_ALL);
|
||||
}
|
||||
}
|
||||
|
||||
sound_create_scene(scen);
|
||||
|
||||
return scen;
|
||||
}
|
||||
|
||||
|
@ -3531,8 +3531,9 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
|
||||
}
|
||||
|
||||
|
||||
static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
|
||||
static Sequence *seq_dupli(struct Scene *scene, struct Scene *scene_to, Sequence *seq, int dupe_flag)
|
||||
{
|
||||
Scene *sce_audio= scene_to ? scene_to : scene;
|
||||
Sequence *seqn = MEM_dupallocN(seq);
|
||||
|
||||
seq->tmp = seqn;
|
||||
@ -3566,7 +3567,7 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
|
||||
} else if(seq->type == SEQ_SCENE) {
|
||||
seqn->strip->stripdata = 0;
|
||||
if(seq->scene_sound)
|
||||
seqn->scene_sound = sound_scene_add_scene_sound(scene, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
|
||||
seqn->scene_sound = sound_scene_add_scene_sound(sce_audio, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
|
||||
} else if(seq->type == SEQ_MOVIE) {
|
||||
seqn->strip->stripdata =
|
||||
MEM_dupallocN(seq->strip->stripdata);
|
||||
@ -3575,7 +3576,7 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
|
||||
seqn->strip->stripdata =
|
||||
MEM_dupallocN(seq->strip->stripdata);
|
||||
if(seq->scene_sound)
|
||||
seqn->scene_sound = sound_add_scene_sound(scene, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
|
||||
seqn->scene_sound = sound_add_scene_sound(sce_audio, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
|
||||
|
||||
seqn->sound->id.us++;
|
||||
} else if(seq->type == SEQ_IMAGE) {
|
||||
@ -3610,13 +3611,13 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
|
||||
return seqn;
|
||||
}
|
||||
|
||||
Sequence * seq_dupli_recursive(struct Scene *scene, Sequence * seq, int dupe_flag)
|
||||
Sequence * seq_dupli_recursive(struct Scene *scene, struct Scene *scene_to, Sequence * seq, int dupe_flag)
|
||||
{
|
||||
Sequence * seqn = seq_dupli(scene, seq, dupe_flag);
|
||||
Sequence * seqn = seq_dupli(scene, scene_to, seq, dupe_flag);
|
||||
if (seq->type == SEQ_META) {
|
||||
Sequence *s;
|
||||
for(s= seq->seqbase.first; s; s = s->next) {
|
||||
Sequence *n = seq_dupli_recursive(scene, s, dupe_flag);
|
||||
Sequence *n = seq_dupli_recursive(scene, scene_to, s, dupe_flag);
|
||||
if (n) {
|
||||
BLI_addtail(&seqn->seqbase, n);
|
||||
}
|
||||
@ -3625,7 +3626,7 @@ Sequence * seq_dupli_recursive(struct Scene *scene, Sequence * seq, int dupe_fla
|
||||
return seqn;
|
||||
}
|
||||
|
||||
void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase, int dupe_flag)
|
||||
void seqbase_dupli_recursive(Scene *scene, Scene *scene_to, ListBase *nseqbase, ListBase *seqbase, int dupe_flag)
|
||||
{
|
||||
Sequence *seq;
|
||||
Sequence *seqn = 0;
|
||||
@ -3634,7 +3635,7 @@ void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase
|
||||
for(seq= seqbase->first; seq; seq= seq->next) {
|
||||
seq->tmp= NULL;
|
||||
if((seq->flag & SELECT) || (dupe_flag & SEQ_DUPE_ALL)) {
|
||||
seqn = seq_dupli(scene, seq, dupe_flag);
|
||||
seqn = seq_dupli(scene, scene_to, seq, dupe_flag);
|
||||
if (seqn) { /*should never fail */
|
||||
if(dupe_flag & SEQ_DUPE_CONTEXT) {
|
||||
seq->flag &= ~SEQ_ALLSEL;
|
||||
@ -3643,7 +3644,7 @@ void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase
|
||||
|
||||
BLI_addtail(nseqbase, seqn);
|
||||
if(seq->type==SEQ_META)
|
||||
seqbase_dupli_recursive(scene, &seqn->seqbase, &seq->seqbase, dupe_flag);
|
||||
seqbase_dupli_recursive(scene, scene_to, &seqn->seqbase, &seq->seqbase, dupe_flag);
|
||||
|
||||
if(dupe_flag & SEQ_DUPE_CONTEXT) {
|
||||
if (seq == last_seq) {
|
||||
|
@ -788,7 +788,7 @@ static Sequence *cut_seq_hard(Main *bmain, Scene *scene, Sequence * seq, int cut
|
||||
|
||||
if (!skip_dup) {
|
||||
/* Duplicate AFTER the first change */
|
||||
seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
|
||||
seqn = seq_dupli_recursive(scene, NULL, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
|
||||
}
|
||||
|
||||
if (seqn) {
|
||||
@ -879,7 +879,7 @@ static Sequence *cut_seq_soft(Main *bmain, Scene *scene, Sequence * seq, int cut
|
||||
|
||||
if (!skip_dup) {
|
||||
/* Duplicate AFTER the first change */
|
||||
seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
|
||||
seqn = seq_dupli_recursive(scene, NULL, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
|
||||
}
|
||||
|
||||
if (seqn) {
|
||||
@ -1619,7 +1619,7 @@ static int sequencer_add_duplicate_exec(bContext *C, wmOperator *op)
|
||||
if(ed==NULL)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
seqbase_dupli_recursive(scene, &nseqbase, ed->seqbasep, SEQ_DUPE_CONTEXT);
|
||||
seqbase_dupli_recursive(scene, NULL, &nseqbase, ed->seqbasep, SEQ_DUPE_CONTEXT);
|
||||
|
||||
if(nseqbase.first) {
|
||||
Sequence * seq= nseqbase.first;
|
||||
@ -2595,7 +2595,7 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op)
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
seqbase_dupli_recursive(scene, &seqbase_clipboard, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME);
|
||||
seqbase_dupli_recursive(scene, NULL, &seqbase_clipboard, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME);
|
||||
seqbase_clipboard_frame= scene->r.cfra;
|
||||
|
||||
/* Need to remove anything that references the current scene */
|
||||
@ -2649,7 +2649,7 @@ static int sequencer_paste_exec(bContext *C, wmOperator *op)
|
||||
deselect_all_seq(scene);
|
||||
ofs = scene->r.cfra - seqbase_clipboard_frame;
|
||||
|
||||
seqbase_dupli_recursive(scene, &nseqbase, &seqbase_clipboard, SEQ_DUPE_UNIQUE_NAME);
|
||||
seqbase_dupli_recursive(scene, NULL, &nseqbase, &seqbase_clipboard, SEQ_DUPE_UNIQUE_NAME);
|
||||
|
||||
/* transform pasted strips before adding */
|
||||
if(ofs) {
|
||||
|
Loading…
Reference in New Issue
Block a user