[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