[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