[Bf-blender-cvs] [4d4841f] multiview: Support for Movie Multiview Output (Individual Images or Stereo 3D)

Dalai Felinto noreply at git.blender.org
Wed Aug 13 12:16:01 CEST 2014


Commit: 4d4841f810c6a03ccb9fc30f90b4bb7cf87b1b4d
Author: Dalai Felinto
Date:   Tue Aug 12 19:57:31 2014 +0200
Branches: multiview
https://developer.blender.org/rB4d4841f810c6a03ccb9fc30f90b4bb7cf87b1b4d

Support for Movie Multiview Output (Individual Images or Stereo 3D)

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

M	source/blender/render/intern/source/pipeline.c

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

diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index e706bc5..b79b291 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -133,8 +133,7 @@ Render R;
 
 /* ********* alloc and free ******** */
 
-static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovieHandle *mh, const char *name_override, const char *view);
-
+static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovieHandle **mh, const size_t totvideos, const char *name_override);
 static void render_free_stereo(Render *re);
 
 static volatile int g_break = 0;
@@ -226,32 +225,6 @@ RenderLayer *RE_GetRenderLayer(RenderResult *rr, const char *name)
 	}
 }
 
-/* returns whether or not we will save individual views */
-static bool dont_write_individual_views(Render *re, RenderData *rd)
-{
-	ImageFormatData *format = &rd->im_format;
-	SceneRenderView *srv;
-
-	if(!re)
-		return true;
-
-	if (format->imtype == R_IMF_IMTYPE_MULTIVIEW)
-		return true;
-
-	if ((rd->scemode & R_MULTIVIEW) == 0)
-		return true;
-
-	for (srv= (SceneRenderView *) rd->views.first; srv; srv = srv->next) {
-
-		if (srv->viewflag & SCE_VIEW_DISABLE)
-			continue;
-
-		return false;
-	}
-
-	return true;
-}
-
 RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
 {
 	return render_result_new_from_exr(exrhandle, colorspace, predivide, rectx, recty);
@@ -2988,34 +2961,11 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *sr
 			}
 			else {
 				char name[FILE_MAX];
-				const int numviews = BLI_countlist(&re->result->views);
-
-				/* mono render, or exr multiview */
-				if (numviews < 2 || (scene->r.im_format.imtype == R_IMF_IMTYPE_MULTIVIEW)) {
-
-					BKE_makepicstring(name, scene->r.pic, bmain->name, scene->r.cfra,
-					                  &scene->r.im_format, (scene->r.scemode & R_EXTENSION) != 0, false, "");
-
-					/* reports only used for Movie */
-					do_write_image_or_movie(re, bmain, scene, NULL, name, "");
+				BKE_makepicstring(name, scene->r.pic, bmain->name, scene->r.cfra,
+				                  &scene->r.im_format, (scene->r.scemode & R_EXTENSION) != 0, false, "");
 
-				} else {
-					/* multiview, saving individual images */
-					SceneRenderView *srv;
-					RenderView *rv;
-					char suffix[FILE_MAX];
-
-					for (rv = (RenderView *) re->result->views.first; rv; rv = rv->next) {
-						srv = BLI_findstring(&scene->r.views, rv->name, offsetof(SceneRenderView, name));
-
-						BLI_strncpy(suffix, srv->suffix, sizeof(suffix));
-						BKE_makepicstring(name, scene->r.pic, bmain->name, scene->r.cfra,
-						                  &scene->r.im_format, (scene->r.scemode & R_EXTENSION) != 0, false, suffix);
-
-						/* reports only used for Movie */
-						do_write_image_or_movie(re, bmain, scene, NULL, name, srv->name);
-					}
-				}
+				/* reports only used for Movie */
+				do_write_image_or_movie(re, bmain, scene, NULL, 0, name);
 			}
 		}
 
@@ -3050,47 +3000,92 @@ void RE_RenderFreestyleExternal(Render *re)
 }
 #endif
 
-static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovieHandle *mh, const char *name_override, const char *view)
+static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovieHandle **mh, const size_t totvideos, const char *name_override)
 {
 	char name[FILE_MAX];
 	RenderResult rres;
 	Object *camera = RE_GetCamera(re);
 	double render_time;
-	int ok = true;
-	int view_id;
+	int ok = 1;
+	bool is_mono;
 	
-	view_id = render_result_get_view_id(re, view);
-	RE_AcquireResultImage(re, &rres, view_id);
+	RE_AcquireResultImage(re, &rres, -1);
+	is_mono = BLI_countlist(&rres.views) < 2;
 
 	/* write movie or image */
 	if (BKE_imtype_is_movie(scene->r.im_format.imtype)) {
-		bool do_free = false;
-		ImBuf *ibuf = render_result_rect_to_ibuf(&rres, &scene->r, 0);
+		if ((is_mono) ||
+		    (scene->r.im_format.views_output == R_IMF_VIEWS_INDIVIDUAL))
+		{
+			size_t view_id;
+			for (view_id = 0; view_id < totvideos; view_id++) {
+				bool do_free = false;
+				ImBuf *ibuf = render_result_rect_to_ibuf(&rres, &scene->r, view_id);
+
+				/* note; the way it gets 32 bits rects is weak... */
+				if (ibuf->rect == NULL) {
+					ibuf->rect = MEM_mapallocN(sizeof(int) * rres.rectx * rres.recty, "temp 32 bits rect");
+					ibuf->mall |= IB_rect;
+					RE_AcquiredResultGet32(re, &rres, ibuf->rect, view_id);
+					do_free = true;
+				}
 
-		/* note; the way it gets 32 bits rects is weak... */
-		if (ibuf->rect == NULL) {
-			ibuf->rect = MEM_mapallocN(sizeof(int) * rres.rectx * rres.recty, "temp 32 bits rect");
-			ibuf->mall |= IB_rect;
-			RE_AcquiredResultGet32(re, &rres, ibuf->rect, 0);
-			do_free = true;
-		}
+				IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings,
+													&scene->display_settings, &scene->r.im_format);
+
+				ok = mh[view_id]->append_movie(&re->r, scene->r.sfra, scene->r.cfra, (int *) ibuf->rect,
+									  ibuf->x, ibuf->y, re->reports);
+				if (do_free) {
+					MEM_freeN(ibuf->rect);
+					ibuf->rect = NULL;
+					ibuf->mall &= ~IB_rect;
+				}
 
+				/* imbuf knows which rects are not part of ibuf */
+				IMB_freeImBuf(ibuf);
+			}
+			printf("Append frame %d", scene->r.cfra);
+		}
+		else { /* R_IMF_VIEWS_STEREO_3D */
+			const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
+			ImBuf *ibuf[3] = {NULL};
+			bool do_free[2] = {false, false};
+			size_t i;
+
+			BLI_assert((totvideos == 1) && (scene->r.im_format.views_output == R_IMF_VIEWS_STEREO_3D));
+
+			for (i = 0; i < 2; i++) {
+				int view_id = BLI_findstringindex(&rres.views, names[i], offsetof(RenderView, name));
+				ibuf[i] = render_result_rect_to_ibuf(&rres, &scene->r, view_id);
+
+				/* note; the way it gets 32 bits rects is weak... */
+				if (ibuf[i]->rect == NULL) {
+					ibuf[i]->rect = MEM_mapallocN(sizeof(int) * rres.rectx * rres.recty, "temp 32 bits rect");
+					ibuf[i]->mall |= IB_rect;
+					RE_AcquiredResultGet32(re, &rres, ibuf[i]->rect, view_id);
+					do_free[i] = true;
+				}
 
-		IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings,
-		                                    &scene->display_settings, &scene->r.im_format);
+				IMB_colormanagement_imbuf_for_write(ibuf[i], true, false, &scene->view_settings,
+													&scene->display_settings, &scene->r.im_format);
+			}
 
-		ok = mh->append_movie(&re->r, scene->r.sfra, scene->r.cfra, (int *) ibuf->rect,
-		                      ibuf->x, ibuf->y, re->reports);
-		if (do_free) {
-			MEM_freeN(ibuf->rect);
-			ibuf->rect = NULL;
-			ibuf->mall &= ~IB_rect;
-		}
+			ibuf[2] = IMB_stereoImBuf(&scene->r.im_format, ibuf[0], ibuf[1]);
 
-		/* imbuf knows which rects are not part of ibuf */
-		IMB_freeImBuf(ibuf);
+			ok = mh[0]->append_movie(&re->r, scene->r.sfra, scene->r.cfra, (int *) ibuf[2]->rect,
+								  ibuf[2]->x, ibuf[2]->y, re->reports);
 
-		printf("Append frame %d", scene->r.cfra);
+			for (i = 0; i < 2; i++) {
+				if (do_free[i]) {
+					MEM_freeN(ibuf[i]->rect);
+					ibuf[i]->rect = NULL;
+					ibuf[i]->mall &= ~IB_rect;
+				}
+
+				/* imbuf knows which rects are not part of ibuf */
+				IMB_freeImBuf(ibuf[i]);
+			}
+		}
 	}
 	else {
 		if (name_override)
@@ -3099,14 +3094,16 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
 			BKE_makepicstring(name, scene->r.pic, bmain->name, scene->r.cfra,
 			                  &scene->r.im_format, (scene->r.scemode & R_EXTENSION) != 0, true, "");
 		
-		if (ELEM(re->r.im_format.imtype, R_IMF_IMTYPE_MULTILAYER, R_IMF_IMTYPE_MULTIVIEW)) {
+		if (re->r.im_format.imtype == R_IMF_IMTYPE_MULTILAYER) {
 			if (re->result) {
-				RE_WriteRenderResult(re->reports, re->result, name, scene->r.im_format.exr_codec, (re->r.im_format.imtype == R_IMF_IMTYPE_MULTIVIEW), view);
+				//XXX MV TODO
+				RE_WriteRenderResult(re->reports, re->result, name, scene->r.im_format.exr_codec, false, "");
 				printf("Saved: %s", name);
 			}
 		}
 		else {
-			ImBuf *ibuf = render_result_rect_to_ibuf(&rres, &scene->r, view_id);
+			//XXX MV TODO
+			ImBuf *ibuf = render_result_rect_to_ibuf(&rres, &scene->r, 0);
 
 			IMB_colormanagement_imbuf_for_write(ibuf, true, false, &scene->view_settings,
 			                                    &scene->display_settings, &scene->r.im_format);
@@ -3141,8 +3138,6 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
 	}
 	
 	RE_ReleaseResultImage(re);
-	if (view_id == -1)
-		render_result_views_shallowdelete(&rres);
 
 	render_time = re->i.lastframetime;
 	re->i.lastframetime = PIL_check_seconds_timer() - re->i.starttime;
@@ -3161,18 +3156,78 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
 	return ok;
 }
 
+static void get_videos_dimensions(Render *re, RenderData *rd, size_t *r_width, size_t *r_height)
+{
+	size_t width, height;
+	if (re->r.mode & R_BORDER) {
+		if ((re->r.mode & R_CROP) == 0) {
+			width = re->winx;
+			height = re->winy;
+		}
+		else {
+			width = re->rectx;
+			height = re->recty;
+		}
+	}
+	else {
+		width = re->rectx;
+		height = re->recty;
+	}
+
+	if ((rd->scemode & R_MULTIVIEW) &&
+	    rd->im_format.views_output == R_IMF_VIEWS_STEREO_3D)
+	{
+		IMB_stereo_dimensions(rd->im_format.stereo_output.display_mode, width, height, r_width, r_height);
+	}
+	else {
+		*r_width = width;
+		*r_height = height;
+	}
+}
+
+static size_t get_videos_count(RenderData *rd)
+{
+	if (BKE_imtype_is_movie(rd->im_format.imtype) == false)
+		return 0;
+
+	if ((rd->scemode & R_MULTIVIEW) == 0)
+		return 1;
+
+	if (rd->im_format.views_output == R_IMF_VIEWS_STEREO_3D)
+		return 1;
+
+	/* R_IMF_VIEWS_INDIVIDUAL */
+	else {
+		SceneRenderView *srv;
+		size_t tot_views = 0;
+
+		for (srv = rd->views.first; srv; srv = srv->next)
+			if ((srv->viewflag & SCE_VIEW_DISABLE) == 0)
+				tot_views++;
+
+		return tot_views;
+	}
+}
+
 /* saves images to disk */
 void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_override,
                     unsigned int lay_override, int sfra, int efra, int tfra)
 {
 	RenderData rd = scene->r;
-	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list