[Bf-blender-cvs] [14da499] multiview: Import of all stereo encoded formats (anaglyph, interlace, top-bottom, ...)
Dalai Felinto
noreply at git.blender.org
Mon Sep 8 17:22:16 CEST 2014
Commit: 14da4996ccfbb8d6e6b4297766c1ecc7c278b59e
Author: Dalai Felinto
Date: Mon Sep 8 05:48:10 2014 +0200
Branches: multiview
https://developer.blender.org/rB14da4996ccfbb8d6e6b4297766c1ecc7c278b59e
Import of all stereo encoded formats (anaglyph, interlace, top-bottom, ...)
This is supported at the moment for single-layer formats only. It works
fine though. The user must be aware that some formats are
highly-destructive and won't never be recovered 1:1 (e.g., interlace and
anaglyph)
===================================================================
M source/blender/blenkernel/intern/image.c
M source/blender/blenkernel/intern/scene.c
M source/blender/imbuf/IMB_imbuf.h
M source/blender/imbuf/intern/stereoimbuf.c
M source/blender/render/intern/source/render_result.c
===================================================================
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 3abdb6d..7d97087 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -2764,12 +2764,8 @@ static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame)
ima->ok = 0;
}
- if (ima->views_format == R_IMF_VIEWS_STEREO_3D) {
- /** XXX MV S3D LOAD STEREO IMAGES
- * this will mean we will use ibuf[0] and make ibuf[0] = left, ibuf[1] = right
- * so from that point on we use totviews instead of totfiles for ibufs
- */
- }
+ if ((ima->flag & IMA_IS_STEREO) && ima->views_format == R_IMF_VIEWS_STEREO_3D)
+ IMB_ImBufFromStereo(ima->stereo3d_format, &ibuf[0], &ibuf[1]);
if (assign) {
if (!is_multiview)
@@ -2988,12 +2984,8 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
ima->ok = 0;
}
- if (ima->views_format == R_IMF_VIEWS_STEREO_3D) {
- /** XXX MV S3D LOAD STEREO IMAGES
- * this will mean we will use ibuf[0] and make ibuf[0] = left, ibuf[1] = right
- * so from that point on we use totviews instead of totfiles for ibufs
- */
- }
+ if ((ima->flag & IMA_IS_STEREO) && ima->views_format == R_IMF_VIEWS_STEREO_3D)
+ IMB_ImBufFromStereo(ima->stereo3d_format, &ibuf[0], &ibuf[1]);
if (assign) {
if (!is_multiview)
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 23b4c1a..2120644 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -2183,7 +2183,7 @@ size_t BKE_scene_view_get_id(const RenderData *rd, const char *viewname)
SceneRenderView *srv;
size_t nr;
- if ((rd->scemode & R_MULTIVIEW) == 0)
+ if ((!rd) || (rd->scemode & R_MULTIVIEW) == 0)
return 0;
if ((!viewname) || (!viewname[0]))
@@ -2207,7 +2207,7 @@ void BKE_scene_videos_dimensions(const RenderData *rd, const size_t width, const
if ((rd->scemode & R_MULTIVIEW) &&
rd->im_format.views_format == R_IMF_VIEWS_STEREO_3D)
{
- IMB_stereo_dimensions(rd->im_format.stereo3d_format.display_mode, ((rd->im_format.stereo3d_format.flag & S3D_UNSQUEEZED_FRAME) == 0), width, height, r_width, r_height);
+ IMB_stereo_write_dimensions(rd->im_format.stereo3d_format.display_mode, ((rd->im_format.stereo3d_format.flag & S3D_UNSQUEEZED_FRAME) == 0), width, height, r_width, r_height);
}
else {
*r_width = width;
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 14da688..d5305ef 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -91,6 +91,7 @@ struct ColorManagedDisplay;
* \attention defined in DNA_scene_types.h
*/
struct ImageFormatData;
+struct Stereo3dFormat;
/**
*
@@ -562,10 +563,11 @@ const char *IMB_ffmpeg_last_error(void);
*
* \attention Defined in stereoimbuf.c
*/
-void IMB_stereo_dimensions(const char mode, const bool is_squeezed, const size_t width, const size_t height, size_t *r_width, size_t *r_height);
+void IMB_stereo_write_dimensions(const char mode, const bool is_squeezed, const size_t width, const size_t height, size_t *r_width, size_t *r_height);
+void IMB_stereo_read_dimensions(const char mode, const bool is_squeezed, const size_t width, const size_t height, size_t *r_width, size_t *r_height);
int *IMB_stereo_from_rect(struct ImageFormatData *im_format, const size_t x, const size_t y, const size_t channels, int *left, int *right);
float *IMB_stereo_from_rectf(struct ImageFormatData *im_format, const size_t x, const size_t y, const size_t channels, float *left, float *right);
struct ImBuf *IMB_stereoImBuf(struct ImageFormatData *im_format, struct ImBuf *left, struct ImBuf *right);
-
+void IMB_ImBufFromStereo(struct Stereo3dFormat *s3d, struct ImBuf **left, struct ImBuf **right);
#endif
diff --git a/source/blender/imbuf/intern/stereoimbuf.c b/source/blender/imbuf/intern/stereoimbuf.c
index 5a951bd..d0eebe3 100644
--- a/source/blender/imbuf/intern/stereoimbuf.c
+++ b/source/blender/imbuf/intern/stereoimbuf.c
@@ -53,7 +53,8 @@
/* prototypes */
struct Stereo3DData;
-static void imb_stereo_doit(struct Stereo3DData *s3d_data, struct Stereo3dFormat *s3d);
+static void imb_stereo_write_doit(struct Stereo3DData *s3d_data, struct Stereo3dFormat *s3d);
+static void imb_stereo_read_doit(struct Stereo3DData *s3d_data, struct Stereo3dFormat *s3d);
typedef struct Stereo3DData {
float *rectf[3];
@@ -62,7 +63,7 @@ typedef struct Stereo3DData {
bool is_float;
} Stereo3DData;
-static void imb_stereo_anaglyph(Stereo3DData *s3d, enum eStereo3dAnaglyphType mode)
+static void imb_stereo_write_anaglyph(Stereo3DData *s3d, enum eStereo3dAnaglyphType mode)
{
int x, y;
size_t width = s3d->x;
@@ -160,7 +161,7 @@ static void imb_stereo_anaglyph(Stereo3DData *s3d, enum eStereo3dAnaglyphType mo
}
}
-static void imb_stereo_interlace(Stereo3DData *s3d, enum eStereo3dInterlaceType mode, const bool swap)
+static void imb_stereo_write_interlace(Stereo3DData *s3d, enum eStereo3dInterlaceType mode, const bool swap)
{
int x, y;
size_t width = s3d->x;
@@ -423,7 +424,8 @@ static void imb_stereo_interlace(Stereo3DData *s3d, enum eStereo3dInterlaceType
}
}
-static void imb_stereo_sidebyside(Stereo3DData *s3d, const bool crosseyed)
+/* stereo output (s3d->rectf[2]) is always unsqueezed */
+static void imb_stereo_write_sidebyside(Stereo3DData *s3d, const bool crosseyed)
{
int y;
size_t width = s3d->x;
@@ -438,13 +440,12 @@ static void imb_stereo_sidebyside(Stereo3DData *s3d, const bool crosseyed)
if (s3d->is_float){
float *rect_to = s3d->rectf[2];
- float *rect_left = s3d->rectf[0];
- float *rect_right= s3d->rectf[1];
+ const float *rect_left = s3d->rectf[0];
+ const float *rect_right= s3d->rectf[1];
- /* always RGBA input/output */
for (y = 0; y < height; y++) {
float *to = rect_to + stride_to * y * channels;
- float *from[2] = {
+ const float *from[2] = {
rect_left + stride_from * y * channels,
rect_right + stride_from * y * channels,
};
@@ -455,13 +456,12 @@ static void imb_stereo_sidebyside(Stereo3DData *s3d, const bool crosseyed)
}
else {
uchar *rect_to = s3d->rect[2];
- uchar *rect_left = s3d->rect[0];
- uchar *rect_right= s3d->rect[1];
+ const uchar *rect_left = s3d->rect[0];
+ const uchar *rect_right= s3d->rect[1];
- /* always RGBA input/output */
for (y = 0; y < height; y++) {
uchar *to = rect_to + stride_to * y * channels;
- uchar *from[2] = {
+ const uchar *from[2] = {
rect_left + stride_from * y * channels,
rect_right + stride_from * y * channels,
};
@@ -472,7 +472,8 @@ static void imb_stereo_sidebyside(Stereo3DData *s3d, const bool crosseyed)
}
}
-static void imb_stereo_topbottom(Stereo3DData *s3d)
+/* stereo output (s3d->rectf[2]) is always unsqueezed */
+static void imb_stereo_write_topbottom(Stereo3DData *s3d)
{
int y;
size_t width = s3d->x;
@@ -484,41 +485,41 @@ static void imb_stereo_topbottom(Stereo3DData *s3d)
if (s3d->is_float){
float *rect_to = s3d->rectf[2];
- float *rect_left = s3d->rectf[0];
- float *rect_right= s3d->rectf[1];
+ const float *rect_left = s3d->rectf[0];
+ const float *rect_right= s3d->rectf[1];
- /* always RGBA input/output */
for (y = 0; y < height; y++) {
float *to = rect_to + stride_to * y * channels;
- float *from[2] = {
+ const float *from[2] = {
rect_left + stride_from * y * channels,
rect_right + stride_from * y * channels,
};
memcpy(to, from[1], sizeof(float) * channels * stride_from);
- memcpy(to + channels * height * stride_to, from[0], sizeof(float) * channels * stride_from);
+ memcpy(to + channels * height * stride_from, from[0], sizeof(float) * channels * stride_from);
}
}
else {
uchar *rect_to = s3d->rect[2];
- uchar *rect_left = s3d->rect[0];
- uchar *rect_right= s3d->rect[1];
+ const uchar *rect_left = s3d->rect[0];
+ const uchar *rect_right= s3d->rect[1];
- /* always RGBA input/output */
for (y = 0; y < height; y++) {
uchar *to = rect_to + stride_to * y * channels;
- uchar *from[2] = {
+ const uchar *from[2] = {
rect_left + stride_from * y * channels,
rect_right + stride_from * y * channels,
};
memcpy(to, from[1], sizeof(uchar) * channels * stride_from);
- memcpy(to + channels * height * stride_to, from[0], sizeof(uchar) * channels * stride_from);
+ memcpy(to + channels * height * stride_from, from[0], sizeof(uchar) * channels * stride_from);
}
}
}
-void IMB_stereo_dimensions(const char mode, const bool is_squeezed, const size_t width, const size_t height, size_t *r_width, size_t *r_height)
+/**************************** dimension utils ****************************************/
+
+void IMB_stereo_write_dimensions(const char mode, const bool is_squeezed, const size_t width, const size_t height, size_t *r_width, size_t *r_height)
{
switch (mode) {
case S3D_DISPLAY_BLURAY:
@@ -549,7 +550,38 @@ void IMB_stereo_dimensions(const char mode, const bool is_squeezed, const size_t
}
}
-/**************************** squeeze frame ****************************************/
+void IMB_stereo_read_dimensions(const char mode, const bool is_squeezed, const size_t width, const size_t height, size_t *r_width, size_t *r_height)
+{
+ switch (mode) {
+ case S3D_DISPLAY_BLURAY:
+ {
+ //TODO need to find the dimensions, forgot how big the black bar has to be
+ break;
+ }
+ case S3D_DISPLAY_SIDEBYSIDE:
+ {
+ *r_width = is_squeezed ? width / 2 : width;
+ *r_height = height;
+ break;
+ }
+ case S3D_DISPLAY_TOPBOTTOM:
+ {
+ *r_width = width;
+ *r_height = is_squeezed ? height / 2 : height;
+ break;
+ }
+ case S3D_DISPLAY_ANAGLYPH:
+ case S3D_DISPLAY_INTERLACE:
+ default:
+ {
+ *r_width = width;
+ *r_height = height;
+ break;
+ }
+ }
+}
+
+/**************************** un/squeeze frame ****************************************/
static void imb_stereo_squeeze_ImBuf(ImBuf *ibuf, Stereo3dFormat *s3d, const size_t x, const size_t y)
{
@@ -562,6 +594,17 @@ static void imb_stereo_squeeze_ImBuf(ImBuf *ibuf, Stereo3dFormat *s3d, const siz
IMB_scaleImBuf_threaded(ibuf, x
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list