[Bf-blender-cvs] [2e207f9] multiview: Sequencer Proxy: movies sequences in a working state, aka everything working

Dalai Felinto noreply at git.blender.org
Wed Jan 21 19:32:08 CET 2015


Commit: 2e207f9154d2e9714f34d03d4b27a72ed7db26a6
Author: Dalai Felinto
Date:   Wed Jan 21 14:02:06 2015 -0200
Branches: multiview
https://developer.blender.org/rB2e207f9154d2e9714f34d03d4b27a72ed7db26a6

Sequencer Proxy: movies sequences in a working state, aka everything working

Proxies in the Sequencer are fully working with Multiview.
The code can be cleaned up a bit, but at least it's entirely functional.

Note, for images we generate one proxy image per view (per frame), while
for movies we generate one proxy movie per movie (so an anaglyph movie
will generate only one proxy).

Tested cases:
* Image sequence - mono
* Image sequence - 3d top-bottom encoded
* Image sequence - 3d left-right pair
* Movie sequence - mono
* Movie sequence - 3d top-bottom encoded
* Movie sequence - 3d left-right pair

===================================================================

M	source/blender/blenkernel/BKE_sequencer.h
M	source/blender/blenkernel/intern/sequencer.c
M	source/blender/editors/space_sequencer/sequencer_edit.c
M	source/blender/imbuf/IMB_imbuf.h
M	source/blender/imbuf/intern/IMB_anim.h
M	source/blender/imbuf/intern/anim_movie.c
M	source/blender/imbuf/intern/indexer.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index 17a0b4c..c698f9f 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -239,7 +239,7 @@ struct StripElem *BKE_sequencer_give_stripelem(struct Sequence *seq, int cfra);
 void BKE_sequencer_update_changed_seq_and_deps(struct Scene *scene, struct Sequence *changed_seq, int len_change, int ibuf_change);
 bool BKE_sequencer_input_have_to_preprocess(const SeqRenderData *context, struct Sequence *seq, float cfra);
 
-struct SeqIndexBuildContext *BKE_sequencer_proxy_rebuild_context(struct Main *bmain, struct Scene *scene, struct Sequence *seq);
+void BKE_sequencer_proxy_rebuild_context(struct Main *bmain, struct Scene *scene, struct Sequence *seq, ListBase *queue);
 void BKE_sequencer_proxy_rebuild(struct SeqIndexBuildContext *context, short *stop, short *do_update, float *progress);
 void BKE_sequencer_proxy_rebuild_finish(struct SeqIndexBuildContext *context, bool stop);
 
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 2caf2b7..6dbe441 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -89,6 +89,7 @@ static ImBuf *seq_render_strip(const SeqRenderData *context, Sequence *seq, floa
 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);
+static void seq_anim_add_suffix(Scene *scene, struct anim *anim, const size_t view_id);
 
 /* **** XXX ******** */
 #define SELECT 1
@@ -855,6 +856,8 @@ void BKE_sequence_reload_new_file(Scene *scene, Sequence *seq, const bool lock_r
 					seq_multiview_name(scene, i, prefix, ext, str, FILE_MAX);
 					anim = openanim(str, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0),
 					                seq->streamindex, seq->strip->colorspace_settings.name);
+					seq_anim_add_suffix(scene, anim, i);
+
 					if (anim) {
 						sanim = MEM_mallocN(sizeof(StripAnim), "Strip Anim");
 						BLI_addtail(&seq->anims, sanim);
@@ -1358,6 +1361,7 @@ typedef struct SeqIndexBuildContext {
 	int tc_flags;
 	int size_flags;
 	int quality;
+	size_t view_id;
 
 	Main *bmain;
 	Scene *scene;
@@ -1453,14 +1457,15 @@ static void seq_open_anim_file(Scene *scene, Sequence *seq)
 		for (i = 0; i < totfiles; i++) {
 			const char *suffix = BKE_scene_view_id_suffix_get(&scene->r, i);
 			char str[FILE_MAX] = {'\0'};
-
 			StripAnim *sanim = MEM_mallocN(sizeof(StripAnim), "Strip Anim");
+
 			BLI_addtail(&seq->anims, sanim);
 
 			BLI_snprintf(str, sizeof(str), "%s%s%s", prefix, suffix, ext);
 
 			sanim->anim = openanim(str, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0),
 			                       seq->streamindex, seq->strip->colorspace_settings.name);
+			seq_anim_add_suffix(scene, sanim->anim, i);
 
 			if (sanim->anim == NULL) {
 				sanim->anim = openanim(name, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0),
@@ -1663,46 +1668,89 @@ static void seq_proxy_build_frame(const SeqRenderData *context, Sequence *seq, i
 	IMB_freeImBuf(ibuf);
 }
 
-SeqIndexBuildContext *BKE_sequencer_proxy_rebuild_context(Main *bmain, Scene *scene, Sequence *seq)
+static size_t seq_proxy_context_count(Sequence *seq, Scene *scene)
+{
+	size_t num_views = 1;
+
+	if ((scene->r.scemode & R_MULTIVIEW) == 0)
+		return 1;
+
+	switch (seq->type) {
+		case SEQ_TYPE_MOVIE:
+		{
+			num_views = BLI_listbase_count(&seq->anims);
+			break;
+		}
+		case SEQ_TYPE_IMAGE:
+		{
+			switch (seq->views_format) {
+				case R_IMF_VIEWS_INDIVIDUAL:
+					num_views = BKE_scene_num_views_get(&scene->r);
+					break;
+				case R_IMF_VIEWS_STEREO_3D:
+					num_views = 2;
+					break;
+				case R_IMF_VIEWS_MULTIVIEW:
+				/* not supported at the moment */
+				/* fall through */
+				default:
+					num_views = 1;
+			}
+			break;
+		}
+	}
+
+	return num_views;
+}
+
+void BKE_sequencer_proxy_rebuild_context(Main *bmain, Scene *scene, Sequence *seq, ListBase *queue)
 {
 	SeqIndexBuildContext *context;
 	Sequence *nseq;
+	LinkData *link;
+	size_t i;
+	size_t num_files;
 
 	if (!seq->strip || !seq->strip->proxy) {
-		return NULL;
+		return;
 	}
 
 	if (!(seq->flag & SEQ_USE_PROXY)) {
-		return NULL;
+		return;
 	}
 
-	context = MEM_callocN(sizeof(SeqIndexBuildContext), "seq proxy rebuild context");
+	num_files = seq_proxy_context_count(seq, scene);
 
-	nseq = BKE_sequence_dupli_recursive(scene, scene, seq, 0);
+	for (i = 0; i < num_files; i++) {
+		context = MEM_callocN(sizeof(SeqIndexBuildContext), "seq proxy rebuild context");
 
-	context->tc_flags   = nseq->strip->proxy->build_tc_flags;
-	context->size_flags = nseq->strip->proxy->build_size_flags;
-	context->quality    = nseq->strip->proxy->quality;
+		nseq = BKE_sequence_dupli_recursive(scene, scene, seq, 0);
 
-	context->bmain = bmain;
-	context->scene = scene;
-	context->orig_seq = seq;
-	context->seq = nseq;
+		context->tc_flags   = nseq->strip->proxy->build_tc_flags;
+		context->size_flags = nseq->strip->proxy->build_size_flags;
+		context->quality    = nseq->strip->proxy->quality;
 
-	if (nseq->type == SEQ_TYPE_MOVIE) {
-		StripAnim *sanim;
+		context->bmain = bmain;
+		context->scene = scene;
+		context->orig_seq = seq;
+		context->seq = nseq;
+		context->view_id = i; /* only for images */
 
-		seq_open_anim_file(scene, nseq);
+		link = BLI_genericNodeN(context);
+		BLI_addtail(queue, link);
+
+		if (nseq->type == SEQ_TYPE_MOVIE) {
+			StripAnim *sanim;
+
+			seq_open_anim_file(scene, nseq);
+			sanim = BLI_findlink(&nseq->anims,  i);
 
-		for (sanim = nseq->anims.last; sanim; sanim = sanim->prev) {
 			if (sanim->anim) {
 				context->index_context = IMB_anim_index_rebuild_context(sanim->anim,
 				        context->tc_flags, context->size_flags, context->quality);
 			}
 		}
 	}
-
-	return context;
 }
 
 void BKE_sequencer_proxy_rebuild(SeqIndexBuildContext *context, short *stop, short *do_update, float *progress)
@@ -1712,8 +1760,6 @@ void BKE_sequencer_proxy_rebuild(SeqIndexBuildContext *context, short *stop, sho
 	Scene *scene = context->scene;
 	Main *bmain = context->bmain;
 	int cfra;
-	const size_t num_views = BKE_scene_num_views_get(&scene->r);
-	size_t view_id;
 
 	if (seq->type == SEQ_TYPE_MOVIE) {
 		if (context->index_context) {
@@ -1742,32 +1788,25 @@ void BKE_sequencer_proxy_rebuild(SeqIndexBuildContext *context, short *stop, sho
 
 	render_context.skip_cache = true;
 	render_context.is_proxy_render = true;
+	render_context.view_id = context->view_id;
 
-	for (view_id = 0; view_id < num_views; view_id++) {
-		render_context.view_id = view_id;
-
-		for (cfra = seq->startdisp + seq->startstill;  cfra < seq->enddisp - seq->endstill; cfra++) {
-			if (context->size_flags & IMB_PROXY_25) {
-				seq_proxy_build_frame(&render_context, seq, cfra, 25);
-			}
-			if (context->size_flags & IMB_PROXY_50) {
-				seq_proxy_build_frame(&render_context, seq, cfra, 50);
-			}
-			if (context->size_flags & IMB_PROXY_75) {
-				seq_proxy_build_frame(&render_context, seq, cfra, 75);
-			}
-			if (context->size_flags & IMB_PROXY_100) {
-				seq_proxy_build_frame(&render_context, seq, cfra, 100);
-			}
-
-			*progress = (float) (cfra - seq->startdisp - seq->startstill) / (seq->enddisp - seq->endstill - seq->startdisp - seq->startstill);
-			*progress = (*progress + (float) view_id) / num_views;
-			*do_update = true;
-
-			if (*stop || G.is_break)
-				break;
+	for (cfra = seq->startdisp + seq->startstill;  cfra < seq->enddisp - seq->endstill; cfra++) {
+		if (context->size_flags & IMB_PROXY_25) {
+			seq_proxy_build_frame(&render_context, seq, cfra, 25);
+		}
+		if (context->size_flags & IMB_PROXY_50) {
+			seq_proxy_build_frame(&render_context, seq, cfra, 50);
+		}
+		if (context->size_flags & IMB_PROXY_75) {
+			seq_proxy_build_frame(&render_context, seq, cfra, 75);
+		}
+		if (context->size_flags & IMB_PROXY_100) {
+			seq_proxy_build_frame(&render_context, seq, cfra, 100);
 		}
 
+		*progress = (float) (cfra - seq->startdisp - seq->startstill) / (seq->enddisp - seq->endstill - seq->startdisp - seq->startstill);
+		*do_update = true;
+
 		if (*stop || G.is_break)
 			break;
 	}
@@ -2994,7 +3033,7 @@ monoview_image:
 			seq_open_anim_file(context->scene, seq);
 
 			if (is_multiview) {
-				ImBuf **ibufs;
+				ImBuf **ibuf_arr;
 				size_t totviews;
 				size_t totfiles = seq_num_files(context->scene, seq->views_format);
 				int i;
@@ -3003,39 +3042,47 @@ monoview_image:
 					goto monoview_movie;
 
 				totviews = BKE_scene_num_views_get(&context->scene->r);
-				ibufs = MEM_callocN(sizeof(ImBuf *) * totviews, "Sequence Image Views Imbufs");
+				ibuf_arr = MEM_callocN(sizeof(ImBuf *) * totviews, "Sequence Image Views Imbufs");
 
 				for (i = 0, sanim = seq->anims.first; sanim; sanim = sanim->next, i++) {
 					if (sanim->anim) {
 						IMB_anim_set_preseek(sanim->anim, seq->anim_preseek);
 
-						ibufs[i] = IMB_anim_absolute(sanim->anim, nr + seq->anim_startofs,
+						ibuf_arr[i] = IMB_anim_absolute(sanim->anim, nr + seq->anim_startofs,
 						                             seq->strip->proxy ? seq->strip->proxy->tc : IMB_TC_RECORD_RUN,
 						                             seq_rendersize_to_proxysize(context->preview_render_size));
-						if (ibufs[i]) {
+						if (ibuf_arr[i]) {
 							/* we don't need both (speed reasons)! */
-							if (ibufs[i]->rect_float && ibufs[i]->rect)
-								imb_freerectImBuf(ibufs[i]);
+							if (ibuf_arr[i]->rect_float && ibuf_arr[i]->rect)
+								imb_freerectImBuf(ibuf_arr[i]);
 						}
 					}
 				}
 
-				if (seq->views_format == R_IMF_VIEWS_STEREO_3D)
-					IMB_ImBufFromStereo(seq->stereo3d_format, &ibufs[0], &ibufs[1]);
+				if (seq->views_format == R_IMF_VIEWS_STEREO_3D) {
+					if (ibuf_arr[0]) {
+						IMB_ImBufFromStereo(seq->stereo3d_format, &ibuf_arr[0], &ibuf_arr[1]);
+					}
+					else {
+						/* probably proxy hasn't been created yet */
+						MEM_freeN(ibuf_arr);
+						break;
+					}
+				}
 
 				for (i = 0; i < totviews; i++) {
 					SeqRenderData localcontext = *context;
 					localcontext.view_id = 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list