summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-02-02 20:37:48 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-02-02 20:37:48 +0000
commitf8e4b8ec7c82b6cc2658b13399135cba3f4ec646 (patch)
treed8348938c7157b948dabe81c204695e1ebca37dd /libvo
parent18011824acbc4b7d6c104b4f7df50d5b9813be5e (diff)
downloadmpv-f8e4b8ec7c82b6cc2658b13399135cba3f4ec646.tar.bz2
mpv-f8e4b8ec7c82b6cc2658b13399135cba3f4ec646.tar.xz
Add support for autodetection during preinit and use that to detect a default
value for the yuv suboption. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30489 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vo_gl.c64
1 files changed, 42 insertions, 22 deletions
diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c
index 5a7868b656..5219b06cab 100644
--- a/libvo/vo_gl.c
+++ b/libvo/vo_gl.c
@@ -459,11 +459,12 @@ static void autodetectGlExtensions(void) {
if (ati_hack == -1) ati_hack = ati_broken_pbo;
if (force_pbo == -1) force_pbo = strstr(extensions, "_pixel_buffer_object") ? is_ati : 0;
if (use_rectangle == -1) use_rectangle = strstr(extensions, "_texture_non_power_of_two") ? 0 : 0;
+ if (use_yuv == -1) use_yuv = strstr(extensions, "GL_ARB_fragment_program") ? 2 : 0;
if (is_ati && (lscale == 1 || lscale == 2 || cscale == 1 || cscale == 2))
mp_msg(MSGT_VO, MSGL_WARN, "[gl] Selected scaling mode may be broken on ATI cards.\n"
"Tell _them_ to fix GL_REPEAT if you have issues.\n");
- mp_msg(MSGT_VO, MSGL_V, "[gl] Settings after autodetection: ati-hack = %i, force-pbo = %i, rectangle = %i\n",
- ati_hack, force_pbo, use_rectangle);
+ mp_msg(MSGT_VO, MSGL_V, "[gl] Settings after autodetection: ati-hack = %i, force-pbo = %i, rectangle = %i, yuv = %i\n",
+ ati_hack, force_pbo, use_rectangle, use_yuv);
}
/**
@@ -540,6 +541,30 @@ static int initGl(uint32_t d_width, uint32_t d_height) {
return 1;
}
+static int create_window(uint32_t d_width, uint32_t d_height, uint32_t flags, const char *title)
+{
+#ifdef CONFIG_GL_WIN32
+ if (glctx.type == GLTYPE_W32 && !vo_w32_config(d_width, d_height, flags))
+ return -1;
+#endif
+#ifdef CONFIG_GL_X11
+ if (glctx.type == GLTYPE_X11) {
+ XVisualInfo *vinfo=glXChooseVisual( mDisplay,mScreen,wsGLXAttrib );
+ if (vinfo == NULL)
+ {
+ mp_msg(MSGT_VO, MSGL_ERR, "[gl] no GLX support present\n");
+ return -1;
+ }
+ mp_msg(MSGT_VO, MSGL_V, "[gl] GLX chose visual with ID 0x%x\n", (int)vinfo->visualid);
+
+ vo_x11_create_vo_window(vinfo, vo_dx, vo_dy, d_width, d_height, flags,
+ XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone),
+ "gl", title);
+ }
+#endif
+ return 0;
+}
+
/* connect to server, create and map window,
* allocate colors and (shared) memory
*/
@@ -564,25 +589,8 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
goto glconfig;
}
#endif
-#ifdef CONFIG_GL_WIN32
- if (glctx.type == GLTYPE_W32 && !vo_w32_config(d_width, d_height, flags))
+ if (create_window(d_width, d_height, flags, title) < 0)
return -1;
-#endif
-#ifdef CONFIG_GL_X11
- if (glctx.type == GLTYPE_X11) {
- XVisualInfo *vinfo=glXChooseVisual( mDisplay,mScreen,wsGLXAttrib );
- if (vinfo == NULL)
- {
- mp_msg(MSGT_VO, MSGL_ERR, "[gl] no GLX support present\n");
- return -1;
- }
- mp_msg(MSGT_VO, MSGL_V, "[gl] GLX chose visual with ID 0x%x\n", (int)vinfo->visualid);
-
- vo_x11_create_vo_window(vinfo, vo_dx, vo_dy, d_width, d_height, flags,
- XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone),
- "gl", title);
- }
-#endif
glconfig:
if (vo_config_count)
@@ -1056,7 +1064,7 @@ static int preinit(const char *arg)
scaled_osd = 0;
use_aspect = 1;
use_ycbcr = 0;
- use_yuv = 0;
+ use_yuv = -1;
colorspace = -1;
levelconv = -1;
lscale = 0;
@@ -1156,9 +1164,21 @@ static int preinit(const char *arg)
"Use -vo gl:nomanyfmts if playback fails.\n");
mp_msg(MSGT_VO, MSGL_V, "[gl] Using %d as slice height "
"(0 means image height).\n", slice_height);
- if (!init_mpglcontext(&glctx, gltype)) return -1;
+ if (!init_mpglcontext(&glctx, gltype))
+ goto err_out;
+ if (use_yuv == -1) {
+ if (create_window(320, 200, 0, NULL) < 0)
+ goto err_out;
+ if (glctx.setGlWindow(&glctx) == SET_WINDOW_FAILED)
+ goto err_out;
+ autodetectGlExtensions();
+ }
return 0;
+
+err_out:
+ uninit();
+ return -1;
}
static const struct {