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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to