[Bf-blender-cvs] [52bc4bf] multiview: Sequencer: final bits of seq->anim stripped away (in favour of seq->anims)
Dalai Felinto
noreply at git.blender.org
Wed Nov 19 15:21:56 CET 2014
Commit: 52bc4bff6948d856da9e1cf874af8b8c94d9459e
Author: Dalai Felinto
Date: Wed Nov 19 11:41:56 2014 -0200
Branches: multiview
https://developer.blender.org/rB52bc4bff6948d856da9e1cf874af8b8c94d9459e
Sequencer: final bits of seq->anim stripped away (in favour of seq->anims)
Sequencer core todos:
====================
* Check on proxies
* I may need a permanent flag to indicate something is multiview/stereo,
to prevent overhead on rendering uncached. That should also prevent:
* Fix issue of mono-videos (when in multiview) not showing a valid view
for all the views.
* Add multiview option to rna_sequencer_api add_movie_strip
* (optional) Remove duplicate code of creating anims for all views
* Test, Test, Test
===================================================================
M source/blender/blenkernel/BKE_sequencer.h
M source/blender/blenkernel/intern/sequencer.c
M source/blender/makesdna/DNA_sequence_types.h
M source/blender/makesrna/intern/rna_color.c
M source/blender/makesrna/intern/rna_sequencer_api.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index 0e5e674..8f4dd71 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -224,6 +224,7 @@ void BKE_sequencer_base_clipboard_pointers_store(struct ListBase *seqbase);
void BKE_sequencer_base_clipboard_pointers_restore(struct ListBase *seqbase, struct Main *bmain);
void BKE_sequence_free(struct Scene *scene, struct Sequence *seq);
+void BKE_sequence_free_anim(struct Sequence *seq);
const char *BKE_sequence_give_name(struct Sequence *seq);
void BKE_sequence_calc(struct Scene *scene, struct Sequence *seq);
void BKE_sequence_calc_disp(struct Scene *scene, struct Sequence *seq);
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 79744e1..90a4293 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -88,6 +88,7 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context, ListBase *seq
static ImBuf *seq_render_strip(const SeqRenderData *context, Sequence *seq, float cfra);
static void seq_free_animdata(Scene *scene, Sequence *seq);
static ImBuf *seq_render_mask(const SeqRenderData *context, Mask *mask, float nr, bool make_float);
+static size_t seq_num_files(Scene *scene, char views_format);
/* **** XXX ******** */
#define SELECT 1
@@ -174,30 +175,13 @@ static void seq_free_strip(Strip *strip)
MEM_freeN(strip);
}
-/* Functions to free imbuf and anim data on changes */
-
-static void seq_free_anim(ListBase *anims)
-{
- while (anims->last) {
- StripAnim *sanim = anims->last;
- BLI_remlink(anims, sanim);
-
- if (sanim->anim) {
- IMB_free_anim(sanim->anim);
- sanim->anim = NULL;
- }
-
- MEM_freeN(sanim);
- }
-}
-
/* only give option to skip cache locally (static func) */
static void BKE_sequence_free_ex(Scene *scene, Sequence *seq, const bool do_cache)
{
if (seq->strip)
seq_free_strip(seq->strip);
- seq_free_anim(&seq->anims);
+ BKE_sequence_free_anim(seq);
if (seq->type & SEQ_TYPE_EFFECT) {
struct SeqEffectHandle sh = BKE_sequence_get_effect(seq);
@@ -252,6 +236,22 @@ void BKE_sequence_free(Scene *scene, Sequence *seq)
BKE_sequence_free_ex(scene, seq, true);
}
+/* Function to free imbuf and anim data on changes */
+void BKE_sequence_free_anim(Sequence *seq)
+{
+ while (seq->anims.last) {
+ StripAnim *sanim = seq->anims.last;
+ BLI_remlink(&seq->anims, sanim);
+
+ if (sanim->anim) {
+ IMB_free_anim(sanim->anim);
+ sanim->anim = NULL;
+ }
+
+ MEM_freeN(sanim);
+ }
+}
+
/* cache must be freed before calling this function
* since it leaves the seqbase in an invalid state */
static void seq_free_sequence_recurse(Scene *scene, Sequence *seq)
@@ -789,7 +789,7 @@ void BKE_sequence_calc(Scene *scene, Sequence *seq)
/* note: caller should run BKE_sequence_calc(scene, seq) after */
void BKE_sequence_reload_new_file(Scene *scene, Sequence *seq, const bool lock_range)
{
- char str[FILE_MAX];
+ char path[FILE_MAX];
int prev_startdisp = 0, prev_enddisp = 0;
/* note: don't rename the strip, will break animation curves */
@@ -822,23 +822,66 @@ void BKE_sequence_reload_new_file(Scene *scene, Sequence *seq, const bool lock_r
break;
}
case SEQ_TYPE_MOVIE:
- // XXX MV SEQ MOV
- BLI_join_dirfile(str, sizeof(str), seq->strip->dir,
+ {
+ StripAnim *sanim;
+ const bool is_multiview = (scene->r.scemode & R_MULTIVIEW) != 0;
+
+ BLI_join_dirfile(path, sizeof(path), seq->strip->dir,
seq->strip->stripdata->name);
- BLI_path_abs(str, G.main->name);
+ BLI_path_abs(path, G.main->name);
+
+ BKE_sequence_free_anim(seq);
+
+ if (is_multiview && (seq->views_format == R_IMF_VIEWS_INDIVIDUAL)) {
+ char prefix[FILE_MAX] = {'\0'};
+ char *ext = NULL;
+ size_t totfiles = seq_num_files(scene, seq->views_format);
+ int i = 0;
+
+ BKE_scene_view_get_prefix(scene, path, prefix, &ext);
+
+ if (prefix[0] == '\0')
+ goto monoview;
+
+ for (i = 0; i < totfiles; i++) {
+ struct anim *anim;
+ const char *viewname = BKE_scene_render_view_name(&scene->r, i);
+ const char *suffix = BKE_scene_view_get_suffix(&scene->r, viewname);
+ char str[FILE_MAX] = {'\0'};
+
+ sprintf(str, "%s%s%s", prefix, suffix, ext);
- if (seq->anim) IMB_free_anim(seq->anim);
+ anim = openanim(str, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0),
+ seq->streamindex, seq->strip->colorspace_settings.name);
+ if (anim) {
+ sanim = MEM_mallocN(sizeof(StripAnim), "Strip Anim");
+ BLI_addtail(&seq->anims, sanim);
+ sanim->anim = anim;
+ }
+ }
+ }
+ else {
+ struct anim *anim;
+monoview:
+ anim = openanim(path, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0),
+ seq->streamindex, seq->strip->colorspace_settings.name);
+ if (anim) {
+ sanim = MEM_mallocN(sizeof(StripAnim), "Strip Anim");
+ BLI_addtail(&seq->anims, sanim);
+ sanim->anim = anim;
+ }
+ }
- seq->anim = openanim(str, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0),
- seq->streamindex, seq->strip->colorspace_settings.name);
+ /* use the first video as reference for everything */
+ sanim = seq->anims.first;
- if (!seq->anim) {
+ if ((!sanim) || (!sanim->anim)) {
return;
}
- seq->len = IMB_anim_get_duration(seq->anim, seq->strip->proxy ? seq->strip->proxy->tc : IMB_TC_RECORD_RUN);
-
- seq->anim_preseek = IMB_anim_get_preseek(seq->anim);
+ seq->len = IMB_anim_get_duration(sanim->anim, seq->strip->proxy ? seq->strip->proxy->tc : IMB_TC_RECORD_RUN);
+
+ seq->anim_preseek = IMB_anim_get_preseek(sanim->anim);
seq->len -= seq->anim_startofs;
seq->len -= seq->anim_endofs;
@@ -846,6 +889,7 @@ void BKE_sequence_reload_new_file(Scene *scene, Sequence *seq, const bool lock_r
seq->len = 0;
}
break;
+ }
case SEQ_TYPE_MOVIECLIP:
if (seq->clip == NULL)
return;
@@ -1381,7 +1425,7 @@ static void seq_open_anim_file(Scene *scene, Sequence *seq)
}
/* reset all the previously created anims */
- seq_free_anim(&seq->anims);
+ BKE_sequence_free_anim(seq);
BLI_join_dirfile(name, sizeof(name),
seq->strip->dir, seq->strip->stripdata->name);
@@ -3554,7 +3598,7 @@ static void sequence_invalidate_cache(Scene *scene, Sequence *seq, bool invalida
* so for proper cache invalidation we need to
* re-open the animation.
*/
- seq_free_anim(&seq->anims);
+ BKE_sequence_free_anim(seq);
BKE_sequencer_cache_cleanup_sequence(seq);
}
@@ -3601,7 +3645,7 @@ void BKE_sequencer_free_imbuf(Scene *scene, ListBase *seqbase, bool for_render)
if (seq->strip) {
if (seq->type == SEQ_TYPE_MOVIE) {
- seq_free_anim(&seq->anims);
+ BKE_sequence_free_anim(seq);
}
if (seq->type == SEQ_TYPE_SPEED) {
BKE_sequence_effect_speed_rebuild_map(scene, seq, true);
@@ -3648,7 +3692,7 @@ static bool update_changed_seq_recurs(Scene *scene, Sequence *seq, Sequence *cha
if (free_imbuf) {
if (ibuf_change) {
if (seq->type == SEQ_TYPE_MOVIE)
- seq_free_anim(&seq->anims);
+ BKE_sequence_free_anim(seq);
if (seq->type == SEQ_TYPE_SPEED) {
BKE_sequence_effect_speed_rebuild_map(scene, seq, true);
}
@@ -4683,10 +4727,9 @@ Sequence *BKE_sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoad
char colorspace[64] = "\0"; /* MAX_COLORSPACE_NAME */
size_t totfiles = seq_num_files(scene, seq_load->views_format);
bool is_multiview = (scene->r.scemode & R_MULTIVIEW) != 0;
+ struct anim **anims;
int i;
- struct anim **anims = NULL;
-
BLI_strncpy(path, seq_load->path, sizeof(path));
BLI_path_abs(path, G.main->name);
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index be272a4..5c41989 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -157,9 +157,7 @@ typedef struct Sequence {
struct Object *scene_camera; /* override scene camera */
struct MovieClip *clip; /* for MOVIECLIP strips */
struct Mask *mask; /* for MASK strips */
-
- struct anim *anim; /* for MOVIE strips - DEPRECATED */
- ListBase anims;
+ ListBase anims; /* for MOVIE strips */
float effect_fader;
float speed_fader;
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c
index fa2a325..3598d9d 100644
--- a/source/blender/makesrna/intern/rna_color.c
+++ b/source/blender/makesrna/intern/rna_color.c
@@ -610,21 +610,14 @@ static void rna_ColorManagedColorspaceSettings_reload_update(Main *UNUSED(bmain)
}
if (seq_found) {
- if (seq->anim) {
- IMB_free_anim(seq->anim);
- seq->anim = NULL;
- }
-
+ BKE_sequence_free_anim(seq);
BKE_sequence_invalidate_cache(scene, seq);
BKE_sequencer_preprocessed_cache_cleanup_sequence(seq);
}
else {
SEQ_BEGIN(scene->ed, seq);
{
- if (seq->anim) {
- IMB_free_anim(seq->anim);
- seq->anim = NULL;
- }
+ BKE_sequence_free_anim(seq);
}
SEQ_END;
diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c
index 70370f1..dd39d5d 100644
--- a/source/blender/makesrna/intern/rna_sequencer_api.c
+++ b/source/blender/makesrna/intern/rna_sequencer_api.c
@@ -198,6 +198,7 @@ static Sequence *rna_Sequences_new_movie(ID *id, Editing *ed, ReportList *report
{
Scene *scene = (Scene *)id;
Sequence *seq;
+ StripAnim *sanim;
struct anim *an = openanim(file, IB_rect, 0, NULL);
@@ -207,7 +208,12 @@ static Sequence *rna_Sequences_new_movie(ID *id, Editing *ed, ReportList *report
}
seq = alloc_generic_sequence(ed, name, frame_start, channel, SEQ_TYPE_MOVIE, file);
- seq->anim = an;
+
+ /* multiview todo: allow for opening multiview strip XXX MV */
+ sanim = MEM_mallocN(sizeof(StripAnim), "Strip Anim");
+ BLI_addtail(&seq->anims, sanim);
+ sanim->anim = an;
+
seq->anim_preseek = IMB_anim_get_preseek(an);
seq->len = IMB_anim_get_duration(an,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list