[MPlayer-cvslog] r31633 - in trunk: DOCS/man/en/mplayer.1 libvo/gl_common.c libvo/gl_common.h libvo/vo_gl.c
reimar
subversion at mplayerhq.hu
Mon Jul 5 21:19:56 CEST 2010
Author: reimar
Date: Mon Jul 5 21:19:56 2010
New Revision: 31633
Log:
Add initial stereo support to -vo gl.
Modified:
trunk/libvo/gl_common.c
trunk/libvo/gl_common.h
trunk/libvo/vo_gl.c
Changes in other areas also in this revision:
Modified:
trunk/DOCS/man/en/mplayer.1
Modified: trunk/libvo/gl_common.c
==============================================================================
--- trunk/libvo/gl_common.c Mon Jul 5 20:24:02 2010 (r31632)
+++ trunk/libvo/gl_common.c Mon Jul 5 21:19:56 2010 (r31633)
@@ -92,6 +92,7 @@ void (GLAPIENTRY *mpglLightfv)(GLenum, G
void (GLAPIENTRY *mpglColorMaterial)(GLenum, GLenum);
void (GLAPIENTRY *mpglShadeModel)(GLenum);
void (GLAPIENTRY *mpglGetIntegerv)(GLenum, GLint *);
+void (GLAPIENTRY *mpglColorMask)(GLboolean, GLboolean, GLboolean, GLboolean);
/**
* \defgroup glextfunctions OpenGL extension functions
@@ -436,6 +437,7 @@ static const extfunc_desc_t extfuncs[] =
DEF_FUNC_DESC(ColorMaterial),
DEF_FUNC_DESC(ShadeModel),
DEF_FUNC_DESC(GetIntegerv),
+ DEF_FUNC_DESC(ColorMask),
// here start the real extensions
{&mpglGenBuffers, NULL, {"glGenBuffers", "glGenBuffersARB", NULL}},
@@ -1542,6 +1544,89 @@ void glDisableYUVConversion(GLenum targe
}
}
+void glEnable3DLeft(int type) {
+ GLint buffer;
+ switch (type) {
+ case GL_3D_RED_CYAN:
+ mpglColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE);
+ break;
+ case GL_3D_GREEN_MAGENTA:
+ mpglColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE);
+ break;
+ case GL_3D_QUADBUFFER:
+ mpglGetIntegerv(GL_DRAW_BUFFER, &buffer);
+ switch (buffer) {
+ case GL_FRONT:
+ case GL_FRONT_LEFT:
+ case GL_FRONT_RIGHT:
+ buffer = GL_FRONT_LEFT;
+ break;
+ case GL_BACK:
+ case GL_BACK_LEFT:
+ case GL_BACK_RIGHT:
+ buffer = GL_BACK_LEFT;
+ break;
+ }
+ mpglDrawBuffer(buffer);
+ break;
+ }
+}
+
+void glEnable3DRight(int type) {
+ GLint buffer;
+ switch (type) {
+ case GL_3D_RED_CYAN:
+ mpglColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE);
+ break;
+ case GL_3D_GREEN_MAGENTA:
+ mpglColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE);
+ break;
+ case GL_3D_QUADBUFFER:
+ mpglGetIntegerv(GL_DRAW_BUFFER, &buffer);
+ switch (buffer) {
+ case GL_FRONT:
+ case GL_FRONT_LEFT:
+ case GL_FRONT_RIGHT:
+ buffer = GL_FRONT_RIGHT;
+ break;
+ case GL_BACK:
+ case GL_BACK_LEFT:
+ case GL_BACK_RIGHT:
+ buffer = GL_BACK_RIGHT;
+ break;
+ }
+ mpglDrawBuffer(buffer);
+ break;
+ }
+}
+
+void glDisable3D(int type) {
+ GLint buffer;
+ switch (type) {
+ case GL_3D_RED_CYAN:
+ case GL_3D_GREEN_MAGENTA:
+ mpglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ break;
+ case GL_3D_QUADBUFFER:
+ mpglDrawBuffer(vo_doublebuffering ? GL_BACK : GL_FRONT);
+ mpglGetIntegerv(GL_DRAW_BUFFER, &buffer);
+ switch (buffer) {
+ case GL_FRONT:
+ case GL_FRONT_LEFT:
+ case GL_FRONT_RIGHT:
+ buffer = GL_FRONT;
+ break;
+ case GL_BACK:
+ case GL_BACK_LEFT:
+ case GL_BACK_RIGHT:
+ buffer = GL_BACK;
+ break;
+ }
+ mpglDrawBuffer(buffer);
+ break;
+ }
+}
+
/**
* \brief draw a texture part at given 2D coordinates
* \param x screen top coordinate
Modified: trunk/libvo/gl_common.h
==============================================================================
--- trunk/libvo/gl_common.h Mon Jul 5 20:24:02 2010 (r31632)
+++ trunk/libvo/gl_common.h Mon Jul 5 21:19:56 2010 (r31633)
@@ -363,6 +363,14 @@ void glSetupYUVConversion(gl_conversion_
void glEnableYUVConversion(GLenum target, int type);
void glDisableYUVConversion(GLenum target, int type);
+#define GL_3D_RED_CYAN 1
+#define GL_3D_GREEN_MAGENTA 2
+#define GL_3D_QUADBUFFER 3
+
+void glEnable3DLeft(int type);
+void glEnable3DRight(int type);
+void glDisable3D(int type);
+
/** \addtogroup glcontext
* \{ */
//! could not set new window, will continue drawing into the old one.
@@ -460,6 +468,7 @@ extern void (GLAPIENTRY *mpglLightfv)(GL
extern void (GLAPIENTRY *mpglColorMaterial)(GLenum, GLenum);
extern void (GLAPIENTRY *mpglShadeModel)(GLenum);
extern void (GLAPIENTRY *mpglGetIntegerv)(GLenum, GLint *);
+extern void (GLAPIENTRY *mpglColorMask)(GLboolean, GLboolean, GLboolean, GLboolean);
extern void (GLAPIENTRY *mpglGenBuffers)(GLsizei, GLuint *);
extern void (GLAPIENTRY *mpglDeleteBuffers)(GLsizei, const GLuint *);
Modified: trunk/libvo/vo_gl.c
==============================================================================
--- trunk/libvo/vo_gl.c Mon Jul 5 20:24:02 2010 (r31632)
+++ trunk/libvo/vo_gl.c Mon Jul 5 21:19:56 2010 (r31633)
@@ -155,6 +155,7 @@ static char *custom_tex;
static int custom_tlin;
static int custom_trect;
static int mipmap_gen;
+static int stereo_mode;
static int int_pause;
static int eq_bri = 0;
@@ -788,11 +789,27 @@ static void do_render(void) {
mpglColor3f(1,1,1);
if (is_yuv || custom_prog)
glEnableYUVConversion(gl_target, yuvconvtype);
+ if (stereo_mode) {
+ glEnable3DLeft(stereo_mode);
+ glDrawTex(0, 0, image_width, image_height,
+ 0, 0, image_width >> 1, image_height,
+ texture_width, texture_height,
+ use_rectangle == 1, is_yuv,
+ mpi_flipped ^ vo_flipped);
+ glEnable3DRight(stereo_mode);
+ glDrawTex(0, 0, image_width, image_height,
+ image_width >> 1, 0, image_width >> 1, image_height,
+ texture_width, texture_height,
+ use_rectangle == 1, is_yuv,
+ mpi_flipped ^ vo_flipped);
+ glDisable3D(stereo_mode);
+ } else {
glDrawTex(0, 0, image_width, image_height,
0, 0, image_width, image_height,
texture_width, texture_height,
use_rectangle == 1, is_yuv,
mpi_flipped ^ vo_flipped);
+ }
if (is_yuv || custom_prog)
glDisableYUVConversion(gl_target, yuvconvtype);
}
@@ -1098,6 +1115,7 @@ static const opt_t subopts[] = {
{"customtrect", OPT_ARG_BOOL, &custom_trect, NULL},
{"mipmapgen", OPT_ARG_BOOL, &mipmap_gen, NULL},
{"osdcolor", OPT_ARG_INT, &osd_color, NULL},
+ {"stereo", OPT_ARG_INT, &stereo_mode, NULL},
{NULL}
};
@@ -1129,6 +1147,7 @@ static int preinit_internal(const char *
custom_trect = 0;
mipmap_gen = 0;
osd_color = 0xffffff;
+ stereo_mode = 0;
if (subopt_parse(arg, subopts) != 0) {
mp_msg(MSGT_VO, MSGL_FATAL,
"\n-vo gl command line help:\n"
@@ -1202,6 +1221,11 @@ static int preinit_internal(const char *
" generate mipmaps for the video image (use with TXB in customprog)\n"
" osdcolor=<0xAARRGGBB>\n"
" use the given color for the OSD\n"
+ " stereo=<n>\n"
+ " 0: normal display\n"
+ " 1: side-by-side to red-cyan stereo\n"
+ " 2: side-by-side to green-magenta stereo\n"
+ " 3: side-by-side to quadbuffer stereo (broken?)\n"
"\n" );
return -1;
}
More information about the MPlayer-cvslog
mailing list