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

Reply via email to