Revision: 24561 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24561 Author: campbellbarton Date: 2009-11-14 20:26:58 +0100 (Sat, 14 Nov 2009)
Log Message: ----------- sequencer support for loading multiple movie and sounds at once. - more api like functions for adding movie, sound & images (easier to use from pyrna api) - operators share more settings - renamed get_last_seq() to active_seq_get() - same for set. Modified Paths: -------------- trunk/blender/source/blender/blenkernel/BKE_sequence.h trunk/blender/source/blender/blenkernel/intern/sequence.c trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c trunk/blender/source/blender/editors/space_sequencer/sequencer_intern.h trunk/blender/source/blender/editors/space_sequencer/sequencer_select.c Modified: trunk/blender/source/blender/blenkernel/BKE_sequence.h =================================================================== --- trunk/blender/source/blender/blenkernel/BKE_sequence.h 2009-11-14 15:31:52 UTC (rev 24560) +++ trunk/blender/source/blender/blenkernel/BKE_sequence.h 2009-11-14 19:26:58 UTC (rev 24561) @@ -189,4 +189,36 @@ void clear_scene_in_allseqs(struct Scene *sce); +struct Sequence *active_seq_get(struct Scene *scene); +void active_seq_set(struct Scene *scene, struct Sequence *seq); +/* api for adding new sequence strips */ +typedef struct SeqLoadInfo { + int start_frame; + int channel; + int flag; /* use sound, replace sel */ + int type; + int tot_success; + int tot_error; + int len; /* only for image strips */ + char path[512]; + char name[32]; +} SeqLoadInfo; + +/* SeqLoadInfo.flag */ +#define SEQ_LOAD_REPLACE_SEL 1<<0 +#define SEQ_LOAD_FRAME_ADVANCE 1<<1 +#define SEQ_LOAD_MOVIE_SOUND 1<<2 +#define SEQ_LOAD_SOUND_CACHE 1<<3 + +/* use as an api function */ +typedef struct Sequence *(*SeqLoadFunc)(struct bContext *, ListBase *, struct SeqLoadInfo *); + +struct Sequence *alloc_sequence(ListBase *lb, int cfra, int machine); + +void seq_load_apply(struct Scene *scene, struct Sequence *seq, struct SeqLoadInfo *seq_load); + +struct Sequence *sequencer_add_image_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load); +struct Sequence *sequencer_add_sound_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load); +struct Sequence *sequencer_add_movie_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load); + Modified: trunk/blender/source/blender/blenkernel/intern/sequence.c =================================================================== --- trunk/blender/source/blender/blenkernel/intern/sequence.c 2009-11-14 15:31:52 UTC (rev 24560) +++ trunk/blender/source/blender/blenkernel/intern/sequence.c 2009-11-14 19:26:58 UTC (rev 24561) @@ -3510,3 +3510,193 @@ seq->sound_handle->changed = -1; } } + +Sequence *active_seq_get(Scene *scene) +{ + Editing *ed= seq_give_editing(scene, FALSE); + if(ed==NULL) return NULL; + return ed->act_seq; +} + +void active_seq_set(Scene *scene, Sequence *seq) +{ + Editing *ed= seq_give_editing(scene, FALSE); + if(ed==NULL) return; + + ed->act_seq= seq; +} + +/* api like funcs for adding */ + +void seq_load_apply(Scene *scene, Sequence *seq, SeqLoadInfo *seq_load) +{ + if(seq) { + strcpy(seq->name, seq_load->name); + + if(seq_load->flag & SEQ_LOAD_FRAME_ADVANCE) { + seq_load->start_frame += (seq->enddisp - seq->startdisp); + } + + if(seq_load->flag & SEQ_LOAD_REPLACE_SEL) { + seq_load->flag |= 1; /* SELECT */ + active_seq_set(scene, seq); + } + + if(seq_load->flag & SEQ_LOAD_SOUND_CACHE) { + if(seq->sound) + sound_cache(seq->sound, 0); + } + + seq_load->tot_success++; + } + else { + seq_load->tot_error++; + } +} + +Sequence *alloc_sequence(ListBase *lb, int cfra, int machine) +{ + Sequence *seq; + + seq= MEM_callocN( sizeof(Sequence), "addseq"); + BLI_addtail(lb, seq); + + *( (short *)seq->name )= ID_SEQ; + seq->name[2]= 0; + + seq->flag= 1; /* SELECT */ + seq->start= cfra; + seq->machine= machine; + seq->mul= 1.0; + seq->blend_opacity = 100.0; + + return seq; +} + +/* NOTE: this function doesn't fill in iamge names */ +Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo *seq_load) +{ + Scene *scene= CTX_data_scene(C); /* only for active seq */ + Sequence *seq; + Strip *strip; + StripElem *se; + + seq = alloc_sequence(seqbasep, seq_load->start_frame, seq_load->channel); + seq->type= SEQ_IMAGE; + + /* basic defaults */ + seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); + + strip->len = seq->len = seq_load->len ? seq_load->len : 1; + strip->us= 1; + strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem"); + BLI_split_dirfile_basic(seq_load->path, strip->dir, se->name); + + seq_load_apply(scene, seq, seq_load); + + return seq; +} + +Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo *seq_load) +{ + Scene *scene= CTX_data_scene(C); /* only for sound */ + Editing *ed= seq_give_editing(scene, TRUE); + bSound *sound; + + Sequence *seq; /* generic strip vars */ + Strip *strip; + StripElem *se; + + AUD_SoundInfo info; + + sound = sound_new_file(CTX_data_main(C), seq_load->path); + + if (sound==NULL || sound->handle == NULL) { + //if(op) + // BKE_report(op->reports, RPT_ERROR, "Unsupported audio format"); + return NULL; + } + + info = AUD_getInfo(sound->handle); + + if (info.specs.format == AUD_FORMAT_INVALID) { + sound_delete(C, sound); + //if(op) + // BKE_report(op->reports, RPT_ERROR, "Unsupported audio format"); + return NULL; + } + + seq = alloc_sequence(seqbasep, seq_load->start_frame, seq_load->channel); + + seq->type= SEQ_SOUND; + seq->sound= sound; + + /* basic defaults */ + seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); + strip->len = seq->len = (int) (info.length * FPS); + strip->us= 1; + + strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem"); + + BLI_split_dirfile_basic(seq_load->path, strip->dir, se->name); + + seq->sound_handle = sound_new_handle(scene, sound, seq_load->start_frame, seq_load->start_frame + strip->len, 0); + + calc_sequence_disp(seq); + + /* last active name */ + strncpy(ed->act_sounddir, strip->dir, FILE_MAXDIR-1); + + seq_load_apply(scene, seq, seq_load); + + return seq; +} + +Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo *seq_load) +{ + Scene *scene= CTX_data_scene(C); /* only for sound */ + + Sequence *seq, *soundseq; /* generic strip vars */ + Strip *strip; + StripElem *se; + + struct anim *an; + + an = openanim(seq_load->path, IB_rect); + + if(an==NULL) + return NULL; + + seq = alloc_sequence(seqbasep, seq_load->start_frame, seq_load->channel); + + seq->type= SEQ_MOVIE; + seq->anim= an; + seq->anim_preseek = IMB_anim_get_preseek(an); + + /* basic defaults */ + seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); + strip->len = seq->len = IMB_anim_get_duration( an ); + strip->us= 1; + + strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem"); + + BLI_split_dirfile_basic(seq_load->path, strip->dir, se->name); + + calc_sequence_disp(seq); + + + if(seq_load->flag & SEQ_LOAD_MOVIE_SOUND) { + int start_frame_back= seq_load->start_frame; + seq_load->channel++; + + soundseq = sequencer_add_sound_strip(C, seqbasep, seq_load); + + seq_load->start_frame= start_frame_back; + seq_load->channel--; + } + + /* can be NULL */ + seq_load_apply(scene, seq, seq_load); + + return seq; +} Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c =================================================================== --- trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c 2009-11-14 15:31:52 UTC (rev 24560) +++ trunk/blender/source/blender/editors/space_sequencer/sequencer_add.c 2009-11-14 19:26:58 UTC (rev 24561) @@ -100,6 +100,7 @@ /* avoid passing multiple args and be more verbose */ #define SEQPROP_STARTFRAME 1<<0 #define SEQPROP_ENDFRAME 1<<1 +#define SEQPROP_FILES 1<<2 static void sequencer_generic_props__internal(wmOperatorType *ot, int flag) { @@ -114,6 +115,9 @@ RNA_def_int(ot->srna, "channel", 1, 1, MAXSEQ, "Channel", "Channel to place this strip into", 1, MAXSEQ); RNA_def_boolean(ot->srna, "replace_sel", 1, "Replace Selection", "replace the current selection"); + + if(flag & SEQPROP_FILES) + RNA_def_collection_runtime(ot->srna, "files", &RNA_OperatorFileListElement, "Files", ""); } static void sequencer_generic_invoke_xy__internal(bContext *C, wmOperator *op, wmEvent *event, int flag) @@ -138,6 +142,31 @@ } +static void seq_load_operator_info(SeqLoadInfo *seq_load, wmOperator *op) +{ + memset(seq_load, 0, sizeof(SeqLoadInfo)); + + seq_load->start_frame= RNA_int_get(op->ptr, "start_frame"); + seq_load->channel= RNA_int_get(op->ptr, "channel"); + seq_load->len= 1; // images only! + + RNA_string_get(op->ptr, "name", seq_load->name); + + RNA_string_get(op->ptr, "path", seq_load->path); /* full path, file is set by the caller */ + + if (RNA_struct_find_property(op->ptr, "replace_sel") && RNA_boolean_get(op->ptr, "replace_sel")) + seq_load->flag |= SEQ_LOAD_REPLACE_SEL; + + if (RNA_struct_find_property(op->ptr, "cache") && RNA_boolean_get(op->ptr, "cache")) + seq_load->flag |= SEQ_LOAD_SOUND_CACHE; + + if (RNA_struct_find_property(op->ptr, "sound") && RNA_boolean_get(op->ptr, "sound")) + seq_load->flag |= SEQ_LOAD_MOVIE_SOUND; + + /* always use this for ops */ + seq_load->flag |= SEQ_LOAD_FRAME_ADVANCE; +} + /* add scene operator */ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op) { @@ -185,7 +214,7 @@ if (RNA_boolean_get(op->ptr, "replace_sel")) { deselect_all_seq(scene); - set_last_seq(scene, seq); + active_seq_set(scene, seq); seq->flag |= SELECT; } @@ -227,127 +256,57 @@ RNA_def_string(ot->srna, "scene", "", MAX_ID_NAME-2, "Scene Name", "Scene name to add as a strip"); } -static Sequence* sequencer_add_sound_strip(bContext *C, wmOperator *op, int start_frame, int channel, char* filename) +static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoadFunc seq_load_func) { - Scene *scene= CTX_data_scene(C); + Scene *scene= CTX_data_scene(C); /* only for sound */ Editing *ed= seq_give_editing(scene, TRUE); + SeqLoadInfo seq_load; + Sequence *seq; + int tot_files; - bSound *sound; + seq_load_operator_info(&seq_load, op); - Sequence *seq; /* generic strip vars */ - Strip *strip; - StripElem *se; + if (seq_load.flag & SEQ_LOAD_REPLACE_SEL) + deselect_all_seq(scene); - AUD_SoundInfo info; + tot_files= RNA_property_collection_length(op->ptr, RNA_struct_find_property(op->ptr, "files")); - sound = sound_new_file(CTX_data_main(C), filename); + if(tot_files) { + /* multiple files */ + char dir_only[FILE_MAX]; + char file_only[FILE_MAX]; - if (sound==NULL || sound->handle == NULL) { - if(op) - BKE_report(op->reports, RPT_ERROR, "Unsupported audio format"); - return NULL; - } + BLI_split_dirfile_basic(seq_load.path, dir_only, NULL); - info = AUD_getInfo(sound->handle); + RNA_BEGIN(op->ptr, itemptr, "files") { + RNA_string_get(&itemptr, "name", file_only); + BLI_join_dirfile(seq_load.path, dir_only, file_only); - if (info.specs.format == AUD_FORMAT_INVALID) { - sound_delete(C, sound); - if(op) - BKE_report(op->reports, RPT_ERROR, "Unsupported audio format"); - return NULL; @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs