Mercurial > mplayer.hg
annotate libvo/vo_gl.c @ 18049:77a3b0d11ca5
Limit the number of entires to the amount that does fit into the chunk.
the function need rewrite as it assumes quite many things that are not guaranteed by the specifications.
author | iive |
---|---|
date | Thu, 06 Apr 2006 20:04:02 +0000 |
parents | 0c5b35855061 |
children | f57317460375 |
rev | line source |
---|---|
1 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
4 #include <math.h> |
1 | 5 |
16221 | 6 #include "config.h" |
11988 | 7 #include "mp_msg.h" |
14286 | 8 #include "subopt-helper.h" |
1 | 9 #include "video_out.h" |
10 #include "video_out_internal.h" | |
13585 | 11 #include "font_load.h" |
12 #include "sub.h" | |
1 | 13 |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
13601
diff
changeset
|
14 #include "gl_common.h" |
2057 | 15 #include "aspect.h" |
13843 | 16 #ifdef HAVE_NEW_GUI |
17 #include "Gui/interface.h" | |
18 #endif | |
31 | 19 |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7931
diff
changeset
|
20 static vo_info_t info = |
1 | 21 { |
22 "X11 (OpenGL)", | |
23 "gl", | |
24 "Arpad Gereoffy <arpi@esp-team.scene.hu>", | |
25 "" | |
26 }; | |
27 | |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7931
diff
changeset
|
28 LIBVO_EXTERN(gl) |
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7931
diff
changeset
|
29 |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
30 #ifdef GL_WIN32 |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
31 static int gl_vinfo = 0; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
32 static HGLRC gl_context = 0; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
33 #else |
13843 | 34 static XVisualInfo *gl_vinfo = NULL; |
35 static GLXContext gl_context = 0; | |
2041
ba8a225d1a18
now using x11_common stuff for X11 opening and w/h/bpp query
arpi
parents:
2040
diff
changeset
|
36 static int wsGLXAttrib[] = { GLX_RGBA, |
1 | 37 GLX_RED_SIZE,1, |
38 GLX_GREEN_SIZE,1, | |
39 GLX_BLUE_SIZE,1, | |
40 GLX_DOUBLEBUFFER, | |
41 None }; | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
42 #endif |
1 | 43 |
13599 | 44 static int use_osd; |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
45 static int scaled_osd; |
14269 | 46 //! How many parts the OSD may consist of at most |
13585 | 47 #define MAX_OSD_PARTS 20 |
14269 | 48 //! Textures for OSD |
13599 | 49 static GLuint osdtex[MAX_OSD_PARTS]; |
13585 | 50 #ifndef FAST_OSD |
14269 | 51 //! Alpha textures for OSD |
13599 | 52 static GLuint osdatex[MAX_OSD_PARTS]; |
13585 | 53 #endif |
14269 | 54 //! Display lists that draw the OSD parts |
13599 | 55 static GLuint osdDispList[MAX_OSD_PARTS]; |
14269 | 56 //! How many parts the OSD currently consists of |
16433 | 57 static int osdtexCnt; |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
58 static int osd_color; |
1 | 59 |
13601 | 60 static int use_aspect; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
61 static int use_yuv; |
16099 | 62 static int use_rectangle; |
63 static int err_shown; | |
1 | 64 static uint32_t image_width; |
65 static uint32_t image_height; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
66 static uint32_t image_format; |
12159 | 67 static int many_fmts; |
16235 | 68 static int use_glFinish; |
16268 | 69 static int swap_interval; |
16099 | 70 static GLenum gl_target; |
16303
a87c6cf3fe52
Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents:
16282
diff
changeset
|
71 static GLint gl_texfmt; |
12159 | 72 static GLenum gl_format; |
73 static GLenum gl_type; | |
16434 | 74 static GLuint gl_buffer; |
16099 | 75 static int gl_buffersize; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
76 static GLuint fragprog; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
77 static GLuint uvtexs[2]; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
78 static GLuint lookupTex; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
79 static char *custom_prog; |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
80 static char *custom_tex; |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
81 static int custom_tlin; |
1 | 82 |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
83 static int int_pause; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
84 static int eq_bri = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
85 static int eq_cont = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
86 static int eq_sat = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
87 static int eq_hue = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
88 static int eq_rgamma = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
89 static int eq_ggamma = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
90 static int eq_bgamma = 0; |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
91 |
16879
6ea220b10e8e
More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents:
16751
diff
changeset
|
92 static int texture_width; |
6ea220b10e8e
More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents:
16751
diff
changeset
|
93 static int texture_height; |
17220 | 94 static int mpi_flipped; |
1 | 95 |
13237
f85c105bfeaa
improved suboption parsing, fixes also compiler warnings
reimar
parents:
13206
diff
changeset
|
96 static unsigned int slice_height = 1; |
8654
2c4cebb8637d
- optional slice height for -vo gl (example: -vo gl:32)
arpi
parents:
8148
diff
changeset
|
97 |
612 | 98 static void resize(int x,int y){ |
11988 | 99 mp_msg(MSGT_VO, MSGL_V, "[gl] Resize: %dx%d\n",x,y); |
15748 | 100 if (WinID >= 0) { |
101 int top = 0, left = 0, w = x, h = y; | |
102 geometry(&top, &left, &w, &h, vo_screenwidth, vo_screenheight); | |
103 glViewport(top, left, w, h); | |
104 } else | |
1 | 105 glViewport( 0, 0, x, y ); |
106 | |
107 glMatrixMode(GL_PROJECTION); | |
108 glLoadIdentity(); | |
13601 | 109 if (vo_fs && use_aspect) { |
110 int new_w, new_h; | |
111 GLdouble scale_x, scale_y; | |
112 aspect(&new_w, &new_h, A_ZOOM); | |
113 panscan_calc(); | |
114 new_w += vo_panscan_x; | |
115 new_h += vo_panscan_y; | |
116 scale_x = (GLdouble) new_w / (GLdouble) x; | |
117 scale_y = (GLdouble) new_h / (GLdouble) y; | |
118 glScaled(scale_x, scale_y, 1); | |
119 } | |
1 | 120 glOrtho(0, image_width, image_height, 0, -1,1); |
121 | |
122 glMatrixMode(GL_MODELVIEW); | |
123 glLoadIdentity(); | |
13585 | 124 |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
125 if (!scaled_osd) { |
15086
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
126 #ifdef HAVE_FREETYPE |
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
127 // adjust font size to display size |
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
128 force_load_font = 1; |
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
129 #endif |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
130 vo_osd_changed(OSDTYPE_OSD); |
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
131 } |
16584 | 132 if (vo_fs && use_aspect && !vo_doublebuffering) |
133 glClear(GL_COLOR_BUFFER_BIT); | |
1 | 134 } |
135 | |
16099 | 136 static void texSize(int w, int h, int *texw, int *texh) { |
137 if (use_rectangle) { | |
138 *texw = w; *texh = h; | |
139 } else { | |
140 *texw = 32; | |
141 while (*texw < w) | |
142 *texw *= 2; | |
143 *texh = 32; | |
144 while (*texh < h) | |
145 *texh *= 2; | |
146 } | |
147 } | |
148 | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16593
diff
changeset
|
149 //! maximum size of custom fragment program |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
150 #define MAX_CUSTOM_PROG_SIZE (1024 * 1024) |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
151 static void update_yuvconv(void) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
152 float bri = eq_bri / 100.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
153 float cont = (eq_cont + 100) / 100.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
154 float hue = eq_hue / 100.0 * 3.1415927; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
155 float sat = (eq_sat + 100) / 100.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
156 float rgamma = exp(log(8.0) * eq_rgamma / 100.0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
157 float ggamma = exp(log(8.0) * eq_ggamma / 100.0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
158 float bgamma = exp(log(8.0) * eq_bgamma / 100.0); |
16586 | 159 glSetupYUVConversion(gl_target, use_yuv, bri, cont, hue, sat, |
160 rgamma, ggamma, bgamma); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
161 if (custom_prog) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
162 FILE *f = fopen(custom_prog, "r"); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
163 if (!f) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
164 mp_msg(MSGT_VO, MSGL_WARN, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
165 "[gl] Could not read customprog %s\n", custom_prog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
166 else { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
167 int i; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
168 char *prog = calloc(1, MAX_CUSTOM_PROG_SIZE + 1); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
169 fread(prog, 1, MAX_CUSTOM_PROG_SIZE, f); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
170 fclose(f); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
171 ProgramString(GL_FRAGMENT_PROGRAM, GL_PROGRAM_FORMAT_ASCII, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
172 strlen(prog), prog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
173 glGetIntegerv(GL_PROGRAM_ERROR_POSITION, &i); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
174 if (i != -1) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
175 mp_msg(MSGT_VO, MSGL_ERR, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
176 "[gl] Error in custom program at pos %i (%.20s)\n", i, &prog[i]); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
177 free(prog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
178 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
179 ProgramEnvParameter4f(GL_FRAGMENT_PROGRAM, 0, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
180 1.0 / texture_width, 1.0 / texture_height, 0, 0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
181 } |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
182 if (custom_tex) { |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
183 FILE *f = fopen(custom_tex, "r"); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
184 if (!f) |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
185 mp_msg(MSGT_VO, MSGL_WARN, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
186 "[gl] Could not read customtex %s\n", custom_tex); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
187 else { |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
188 int width, height, maxval; |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
189 ActiveTexture(GL_TEXTURE3); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
190 if (glCreatePPMTex(GL_TEXTURE_2D, 3, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
191 custom_tlin?GL_LINEAR:GL_NEAREST, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
192 f, &width, &height, &maxval)) |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
193 ProgramEnvParameter4f(GL_FRAGMENT_PROGRAM, 1, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
194 1.0 / width, 1.0 / height, 1.0 / maxval, 0); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
195 else |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
196 mp_msg(MSGT_VO, MSGL_WARN, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
197 "[gl] Error parsing customtex %s\n", custom_tex); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
198 fclose(f); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
199 ActiveTexture(GL_TEXTURE0); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
200 } |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
201 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
202 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
203 |
16436 | 204 /** |
205 * \brief remove all OSD textures and display-lists, thus clearing it. | |
206 */ | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
207 static void clearOSD(void) { |
16433 | 208 int i; |
17871
29cce29b0cd9
do not call glDeleteTextures with 0 count, Xgl does not like it.
reimar
parents:
17566
diff
changeset
|
209 if (!osdtexCnt) |
29cce29b0cd9
do not call glDeleteTextures with 0 count, Xgl does not like it.
reimar
parents:
17566
diff
changeset
|
210 return; |
16433 | 211 glDeleteTextures(osdtexCnt, osdtex); |
212 #ifndef FAST_OSD | |
213 glDeleteTextures(osdtexCnt, osdatex); | |
214 #endif | |
215 for (i = 0; i < osdtexCnt; i++) | |
216 glDeleteLists(osdDispList[i], 1); | |
217 osdtexCnt = 0; | |
218 } | |
219 | |
220 /** | |
221 * \brief uninitialize OpenGL context, freeing textures, buffers etc. | |
222 */ | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
223 static void uninitGl(void) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
224 if (DeletePrograms && fragprog) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
225 DeletePrograms(1, &fragprog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
226 fragprog = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
227 if (uvtexs[0] || uvtexs[1]) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
228 glDeleteTextures(2, uvtexs); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
229 uvtexs[0] = uvtexs[1] = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
230 if (lookupTex) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
231 glDeleteTextures(1, &lookupTex); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
232 lookupTex = 0; |
16433 | 233 clearOSD(); |
234 if (DeleteBuffers && gl_buffer) | |
235 DeleteBuffers(1, &gl_buffer); | |
236 gl_buffer = 0; gl_buffersize = 0; | |
237 err_shown = 0; | |
238 } | |
239 | |
13843 | 240 /** |
241 * \brief Initialize a (new or reused) OpenGL context. | |
16433 | 242 * set global gl-related variables to their default values |
13843 | 243 */ |
244 static int initGl(uint32_t d_width, uint32_t d_height) { | |
16433 | 245 osdtexCnt = 0; gl_buffer = 0; gl_buffersize = 0; err_shown = 0; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
246 fragprog = 0; uvtexs[0] = 0; uvtexs[1] = 0; lookupTex = 0; |
16099 | 247 texSize(image_width, image_height, &texture_width, &texture_height); |
13843 | 248 |
249 glDisable(GL_BLEND); | |
250 glDisable(GL_DEPTH_TEST); | |
251 glDepthMask(GL_FALSE); | |
252 glDisable(GL_CULL_FACE); | |
16099 | 253 glEnable(gl_target); |
16458 | 254 glDrawBuffer(vo_doublebuffering?GL_BACK:GL_FRONT); |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
255 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); |
13843 | 256 |
257 mp_msg(MSGT_VO, MSGL_V, "[gl] Creating %dx%d texture...\n", | |
258 texture_width, texture_height); | |
259 | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
260 if (image_format == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
261 glGenTextures(2, uvtexs); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
262 ActiveTexture(GL_TEXTURE1); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
263 BindTexture(gl_target, uvtexs[0]); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
264 glCreateClearTex(gl_target, gl_texfmt, GL_LINEAR, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
265 texture_width / 2, texture_height / 2, 128); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
266 ActiveTexture(GL_TEXTURE2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
267 BindTexture(gl_target, uvtexs[1]); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
268 glCreateClearTex(gl_target, gl_texfmt, GL_LINEAR, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
269 texture_width / 2, texture_height / 2, 128); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
270 switch (use_yuv) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
271 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
272 glGenTextures(1, &lookupTex); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
273 ActiveTexture(GL_TEXTURE3); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
274 glBindTexture(GL_TEXTURE_2D, lookupTex); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
275 case YUV_CONVERSION_FRAGMENT_POW: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
276 case YUV_CONVERSION_FRAGMENT: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
277 GenPrograms(1, &fragprog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
278 BindProgram(GL_FRAGMENT_PROGRAM, fragprog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
279 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
280 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
281 ActiveTexture(GL_TEXTURE0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
282 BindTexture(gl_target, 0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
283 update_yuvconv(); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
284 } |
16117 | 285 glCreateClearTex(gl_target, gl_texfmt, GL_LINEAR, |
286 texture_width, texture_height, 0); | |
13843 | 287 |
288 resize(d_width, d_height); | |
289 | |
290 glClearColor( 0.0f,0.0f,0.0f,0.0f ); | |
291 glClear( GL_COLOR_BUFFER_BIT ); | |
16271 | 292 if (SwapInterval && swap_interval >= 0) |
16268 | 293 SwapInterval(swap_interval); |
13920 | 294 return 1; |
13843 | 295 } |
296 | |
1 | 297 /* connect to server, create and map window, |
298 * allocate colors and (shared) memory | |
299 */ | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
300 static int |
7124
eca7dbad0166
finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents:
7111
diff
changeset
|
301 config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) |
1 | 302 { |
303 image_height = height; | |
304 image_width = width; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
305 image_format = format; |
16474 | 306 glFindFormat(format, NULL, &gl_texfmt, &gl_format, &gl_type); |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
307 |
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
308 int_pause = 0; |
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
309 |
13601 | 310 panscan_init(); |
2249
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2057
diff
changeset
|
311 aspect_save_orig(width,height); |
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2057
diff
changeset
|
312 aspect_save_prescale(d_width,d_height); |
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2057
diff
changeset
|
313 aspect_save_screenres(vo_screenwidth,vo_screenheight); |
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2057
diff
changeset
|
314 |
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2057
diff
changeset
|
315 aspect(&d_width,&d_height,A_NOZOOM); |
17127
f650267ecc3a
signed division must be used for calculation vo_dx and vo_dy.
reimar
parents:
17117
diff
changeset
|
316 vo_dx = (int)(vo_screenwidth - d_width) / 2; |
f650267ecc3a
signed division must be used for calculation vo_dx and vo_dy.
reimar
parents:
17117
diff
changeset
|
317 vo_dy = (int)(vo_screenheight - d_height) / 2; |
15589 | 318 geometry(&vo_dx, &vo_dy, &d_width, &d_height, |
319 vo_screenwidth, vo_screenheight); | |
13843 | 320 #ifdef HAVE_NEW_GUI |
321 if (use_gui) { | |
322 // GUI creates and manages window for us | |
323 vo_dwidth = d_width; | |
324 vo_dheight= d_height; | |
325 guiGetEvent(guiSetShVideo, 0); | |
15748 | 326 goto glconfig; |
13843 | 327 } |
328 #endif | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
329 #ifdef GL_WIN32 |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
330 o_dwidth = d_width; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
331 o_dheight = d_height; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
332 vo_fs = flags & VOFLAG_FULLSCREEN; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
333 vo_vm = flags & VOFLAG_MODESWITCHING; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
334 vo_dwidth = d_width; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
335 vo_dheight = d_height; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
336 if (!createRenderingContext()) |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
337 return -1; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
338 #else |
15748 | 339 if (WinID >= 0) { |
340 vo_window = WinID ? (Window)WinID : mRootWin; | |
16239 | 341 vo_x11_selectinput_witherr(mDisplay, vo_window, |
342 StructureNotifyMask | KeyPressMask | PointerMotionMask | | |
343 ButtonPressMask | ButtonReleaseMask | ExposureMask); | |
15748 | 344 goto glconfig; |
345 } | |
13843 | 346 if ( vo_window == None ) { |
347 unsigned int fg, bg; | |
348 XSizeHints hint; | |
349 XVisualInfo *vinfo; | |
350 XEvent xev; | |
351 | |
13871 | 352 vo_fs = VO_FALSE; |
13843 | 353 |
15589 | 354 hint.x = vo_dx; |
355 hint.y = vo_dy; | |
1 | 356 hint.width = d_width; |
357 hint.height = d_height; | |
358 hint.flags = PPosition | PSize; | |
359 | |
360 /* Get some colors */ | |
361 | |
2041
ba8a225d1a18
now using x11_common stuff for X11 opening and w/h/bpp query
arpi
parents:
2040
diff
changeset
|
362 bg = WhitePixel(mDisplay, mScreen); |
ba8a225d1a18
now using x11_common stuff for X11 opening and w/h/bpp query
arpi
parents:
2040
diff
changeset
|
363 fg = BlackPixel(mDisplay, mScreen); |
1 | 364 |
365 /* Make the window */ | |
366 | |
2041
ba8a225d1a18
now using x11_common stuff for X11 opening and w/h/bpp query
arpi
parents:
2040
diff
changeset
|
367 vinfo=glXChooseVisual( mDisplay,mScreen,wsGLXAttrib ); |
1290 | 368 if (vinfo == NULL) |
369 { | |
11988 | 370 mp_msg(MSGT_VO, MSGL_ERR, "[gl] no GLX support present\n"); |
1290 | 371 return -1; |
372 } | |
1 | 373 |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
374 |
1137
4c7b219e126c
patch: some X11 compliance fixed: set ClassHint and better fullscreen mode
arpi_esp
parents:
1109
diff
changeset
|
375 |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
376 vo_window = vo_x11_create_smooth_window(mDisplay, mRootWin, vinfo->visual, hint.x, hint.y, hint.width, hint.height, |
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
377 vinfo->depth, XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone)); |
1 | 378 |
7777 | 379 vo_x11_classhint( mDisplay,vo_window,"gl" ); |
380 vo_hidecursor(mDisplay,vo_window); | |
1 | 381 |
7777 | 382 XSelectInput(mDisplay, vo_window, StructureNotifyMask); |
383 /* Tell other applications about this window */ | |
10138
5e286cc6ad21
Removed YUV (YV12) and BGR support, leaving the native RGB support. Also cleaned some other parts.
alex
parents:
8654
diff
changeset
|
384 XSetStandardProperties(mDisplay, vo_window, title, title, None, NULL, 0, &hint); |
7777 | 385 /* Map window. */ |
386 XMapWindow(mDisplay, vo_window); | |
4017 | 387 #ifdef HAVE_XINERAMA |
7777 | 388 vo_x11_xinerama_move(mDisplay,vo_window); |
4017 | 389 #endif |
1 | 390 |
7777 | 391 /* Wait for map. */ |
392 do | |
393 { | |
2041
ba8a225d1a18
now using x11_common stuff for X11 opening and w/h/bpp query
arpi
parents:
2040
diff
changeset
|
394 XNextEvent(mDisplay, &xev); |
7777 | 395 } |
396 while (xev.type != MapNotify || xev.xmap.event != vo_window); | |
1 | 397 |
7777 | 398 XSelectInput(mDisplay, vo_window, NoEventMask); |
1 | 399 |
2041
ba8a225d1a18
now using x11_common stuff for X11 opening and w/h/bpp query
arpi
parents:
2040
diff
changeset
|
400 XSync(mDisplay, False); |
1 | 401 |
6953
ce67cc1f0beb
ignore BadAccess error at XSelectInput() (grabbing mouse etc) with warning
arpi
parents:
6212
diff
changeset
|
402 vo_x11_selectinput_witherr(mDisplay, vo_window, StructureNotifyMask | KeyPressMask | PointerMotionMask |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
403 | ButtonPressMask | ButtonReleaseMask | ExposureMask |
4658 | 404 ); |
13843 | 405 } |
406 if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop); | |
13575 | 407 |
15589 | 408 vo_x11_nofs_sizepos(vo_dx, vo_dy, d_width, d_height); |
13843 | 409 if (vo_fs ^ (flags & VOFLAG_FULLSCREEN)) |
410 vo_x11_fullscreen(); | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
411 #endif |
15748 | 412 |
413 glconfig: | |
16433 | 414 if (vo_config_count) |
415 uninitGl(); | |
13843 | 416 setGlWindow(&gl_vinfo, &gl_context, vo_window); |
417 initGl(vo_dwidth, vo_dheight); | |
11542 | 418 |
1 | 419 return 0; |
420 } | |
421 | |
31 | 422 static void check_events(void) |
1 | 423 { |
17116 | 424 int e=vo_check_events(); |
31 | 425 if(e&VO_EVENT_RESIZE) resize(vo_dwidth,vo_dheight); |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
426 if(e&VO_EVENT_EXPOSE && int_pause) flip_page(); |
31 | 427 } |
1 | 428 |
13585 | 429 /** |
430 * Creates the textures and the display list needed for displaying | |
431 * an OSD part. | |
432 * Callback function for vo_draw_text(). | |
433 */ | |
434 static void create_osd_texture(int x0, int y0, int w, int h, | |
435 unsigned char *src, unsigned char *srca, | |
436 int stride) | |
437 { | |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
13601
diff
changeset
|
438 // initialize to 8 to avoid special-casing on alignment |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
13601
diff
changeset
|
439 int sx = 8, sy = 8; |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
440 GLint scale_type = (scaled_osd) ? GL_LINEAR : GL_NEAREST; |
17875
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
441 |
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
442 if (w <= 0 || h <= 0 || stride < w) { |
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
443 mp_msg(MSGT_VO, MSGL_V, "Invalid dimensions OSD for part!\n"); |
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
444 return; |
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
445 } |
16099 | 446 texSize(w, h, &sx, &sy); |
13585 | 447 |
448 if (osdtexCnt >= MAX_OSD_PARTS) { | |
449 mp_msg(MSGT_VO, MSGL_ERR, "Too many OSD parts, contact the developers!\n"); | |
450 return; | |
451 } | |
452 | |
453 // create Textures for OSD part | |
454 glGenTextures(1, &osdtex[osdtexCnt]); | |
16099 | 455 BindTexture(gl_target, osdtex[osdtexCnt]); |
16117 | 456 glCreateClearTex(gl_target, GL_LUMINANCE, scale_type, sx, sy, 0); |
457 glUploadTex(gl_target, GL_LUMINANCE, GL_UNSIGNED_BYTE, src, stride, | |
458 0, 0, w, h, 0); | |
13585 | 459 |
460 #ifndef FAST_OSD | |
461 glGenTextures(1, &osdatex[osdtexCnt]); | |
16099 | 462 BindTexture(gl_target, osdatex[osdtexCnt]); |
16584 | 463 glCreateClearTex(gl_target, GL_ALPHA, scale_type, sx, sy, 255); |
16117 | 464 { |
16221 | 465 int i; |
16117 | 466 char *tmp = (char *)malloc(stride * h); |
16272 | 467 // convert alpha from weird MPlayer scale. |
468 // in-place is not possible since it is reused for future OSDs | |
17875
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
469 for (i = h * stride - 1; i > 0; i--) |
16272 | 470 tmp[i] = srca[i] - 1; |
16117 | 471 glUploadTex(gl_target, GL_ALPHA, GL_UNSIGNED_BYTE, tmp, stride, |
472 0, 0, w, h, 0); | |
473 free(tmp); | |
474 } | |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
13601
diff
changeset
|
475 #endif |
13585 | 476 |
16099 | 477 BindTexture(gl_target, 0); |
13585 | 478 |
479 // Create a list for rendering this OSD part | |
480 osdDispList[osdtexCnt] = glGenLists(1); | |
481 glNewList(osdDispList[osdtexCnt], GL_COMPILE); | |
482 #ifndef FAST_OSD | |
483 // render alpha | |
484 glBlendFunc(GL_ZERO, GL_SRC_ALPHA); | |
16099 | 485 BindTexture(gl_target, osdatex[osdtexCnt]); |
17220 | 486 glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0, 0); |
13585 | 487 #endif |
488 // render OSD | |
489 glBlendFunc (GL_ONE, GL_ONE); | |
16099 | 490 BindTexture(gl_target, osdtex[osdtexCnt]); |
17220 | 491 glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0, 0); |
13585 | 492 glEndList(); |
493 | |
494 osdtexCnt++; | |
495 } | |
496 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1302
diff
changeset
|
497 static void draw_osd(void) |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1302
diff
changeset
|
498 { |
13585 | 499 if (!use_osd) return; |
500 if (vo_osd_changed(0)) { | |
16221 | 501 int osd_h, osd_w; |
16433 | 502 clearOSD(); |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
503 osd_w = (scaled_osd) ? image_width : vo_dwidth; |
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
504 osd_h = (scaled_osd) ? image_height : vo_dheight; |
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
505 vo_draw_text(osd_w, osd_h, create_osd_texture); |
13585 | 506 } |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1302
diff
changeset
|
507 } |
31 | 508 |
509 static void | |
510 flip_page(void) | |
511 { | |
1 | 512 // glEnable(GL_TEXTURE_2D); |
513 // glBindTexture(GL_TEXTURE_2D, texture_id); | |
514 | |
515 glColor3f(1,1,1); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
516 if (image_format == IMGFMT_YV12) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
517 glEnableYUVConversion(gl_target, use_yuv); |
16584 | 518 glDrawTex(0, 0, image_width, image_height, |
519 0, 0, image_width, image_height, | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
520 texture_width, texture_height, |
17220 | 521 use_rectangle == 1, image_format == IMGFMT_YV12, mpi_flipped); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
522 if (image_format == IMGFMT_YV12) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
523 glDisableYUVConversion(gl_target, use_yuv); |
1 | 524 |
13585 | 525 if (osdtexCnt > 0) { |
526 // set special rendering parameters | |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
527 if (!scaled_osd) { |
13585 | 528 glMatrixMode(GL_PROJECTION); |
529 glPushMatrix(); | |
530 glLoadIdentity(); | |
531 glOrtho(0, vo_dwidth, vo_dheight, 0, -1, 1); | |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
532 } |
13585 | 533 glEnable(GL_BLEND); |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
534 glColor4ub((osd_color >> 16) & 0xff, (osd_color >> 8) & 0xff, osd_color & 0xff, 0xff); |
13585 | 535 // draw OSD |
536 glCallLists(osdtexCnt, GL_UNSIGNED_INT, osdDispList); | |
537 // set rendering parameters back to defaults | |
538 glDisable (GL_BLEND); | |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
539 if (!scaled_osd) |
13585 | 540 glPopMatrix(); |
16099 | 541 BindTexture(gl_target, 0); |
13585 | 542 } |
543 | |
16235 | 544 if (use_glFinish) |
1 | 545 glFinish(); |
16458 | 546 if (vo_doublebuffering) |
17116 | 547 swapGlBuffers(); |
17117 | 548 else if (!use_glFinish) |
549 glFlush(); | |
6095 | 550 |
16458 | 551 if (vo_fs && use_aspect && vo_doublebuffering) |
13601 | 552 glClear(GL_COLOR_BUFFER_BIT); |
1 | 553 } |
554 | |
555 //static inline uint32_t draw_slice_x11(uint8_t *src[], uint32_t slice_num) | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
556 static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) |
1 | 557 { |
17220 | 558 mpi_flipped = (stride[0] < 0); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
559 glUploadTex(gl_target, gl_format, gl_type, src[0], stride[0], |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
560 x, y, w, h, slice_height); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
561 if (image_format == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
562 ActiveTexture(GL_TEXTURE1); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
563 glUploadTex(gl_target, gl_format, gl_type, src[1], stride[1], |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
564 x / 2, y / 2, w / 2, h / 2, slice_height); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
565 ActiveTexture(GL_TEXTURE2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
566 glUploadTex(gl_target, gl_format, gl_type, src[2], stride[2], |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
567 x / 2, y / 2, w / 2, h / 2, slice_height); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
568 ActiveTexture(GL_TEXTURE0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
569 } |
1 | 570 return 0; |
571 } | |
572 | |
16099 | 573 static uint32_t get_image(mp_image_t *mpi) { |
16233
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16221
diff
changeset
|
574 if (!GenBuffers || !BindBuffer || !BufferData || !MapBuffer) { |
16099 | 575 if (!err_shown) |
576 mp_msg(MSGT_VO, MSGL_ERR, "[gl] extensions missing for dr\n" | |
577 "Expect a _major_ speed penalty\n"); | |
16113 | 578 err_shown = 1; |
16099 | 579 return VO_FALSE; |
580 } | |
581 if (mpi->flags & MP_IMGFLAG_READABLE) return VO_FALSE; | |
16117 | 582 if (mpi->type == MP_IMGTYPE_IP || mpi->type == MP_IMGTYPE_IPB) |
583 return VO_FALSE; // we can not provide readable buffers | |
16233
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16221
diff
changeset
|
584 if (!gl_buffer) |
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16221
diff
changeset
|
585 GenBuffers(1, &gl_buffer); |
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16221
diff
changeset
|
586 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer); |
16099 | 587 mpi->stride[0] = mpi->width * mpi->bpp / 8; |
588 if (mpi->stride[0] * mpi->h > gl_buffersize) { | |
589 BufferData(GL_PIXEL_UNPACK_BUFFER, mpi->stride[0] * mpi->h, | |
16237
b951a75d4f83
Our buffer usage actually fits better to GL_DYNAMIC_DRAW than GL_STREAM_DRAW.
reimar
parents:
16236
diff
changeset
|
590 NULL, GL_DYNAMIC_DRAW); |
16099 | 591 gl_buffersize = mpi->stride[0] * mpi->h; |
592 } | |
16117 | 593 UnmapBuffer(GL_PIXEL_UNPACK_BUFFER); // HACK, needed for some MPEG4 files?? |
16099 | 594 mpi->planes[0] = MapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); |
595 BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); | |
16113 | 596 if (mpi->planes[0] == NULL) { |
597 if (!err_shown) | |
598 mp_msg(MSGT_VO, MSGL_ERR, "[gl] could not aquire buffer for dr\n" | |
599 "Expect a _major_ speed penalty\n"); | |
600 err_shown = 1; | |
601 return VO_FALSE; | |
602 } | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
603 if (mpi->imgfmt == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
604 // YV12 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
605 mpi->flags |= MP_IMGFLAG_COMMON_STRIDE | MP_IMGFLAG_COMMON_PLANE; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
606 mpi->stride[0] = mpi->width; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
607 mpi->planes[1] = mpi->planes[0] + mpi->stride[0] * mpi->height; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
608 mpi->stride[1] = mpi->width >> 1; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
609 mpi->planes[2] = mpi->planes[1] + mpi->stride[1] * (mpi->height >> 1); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
610 mpi->stride[2] = mpi->width >> 1; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
611 } |
16099 | 612 mpi->flags |= MP_IMGFLAG_DIRECT; |
613 return VO_TRUE; | |
614 } | |
615 | |
16092 | 616 static uint32_t draw_image(mp_image_t *mpi) { |
16879
6ea220b10e8e
More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents:
16751
diff
changeset
|
617 unsigned char *data = mpi->planes[0]; |
16117 | 618 int slice = slice_height; |
16092 | 619 if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK) |
620 return VO_TRUE; | |
16099 | 621 if (mpi->flags & MP_IMGFLAG_DIRECT) { |
622 data = NULL; | |
16233
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16221
diff
changeset
|
623 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer); |
16099 | 624 UnmapBuffer(GL_PIXEL_UNPACK_BUFFER); |
16117 | 625 slice = 0; // always "upload" full texture |
16099 | 626 } |
17220 | 627 mpi_flipped = (mpi->stride[0] < 0); |
16117 | 628 glUploadTex(gl_target, gl_format, gl_type, data, mpi->stride[0], |
629 mpi->x, mpi->y, mpi->w, mpi->h, slice); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
630 if (mpi->imgfmt == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
631 data += mpi->planes[1] - mpi->planes[0]; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
632 ActiveTexture(GL_TEXTURE1); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
633 glUploadTex(gl_target, gl_format, gl_type, data, mpi->stride[1], |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
634 mpi->x / 2, mpi->y / 2, mpi->w / 2, mpi->h / 2, slice); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
635 data += mpi->planes[2] - mpi->planes[1]; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
636 ActiveTexture(GL_TEXTURE2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
637 glUploadTex(gl_target, gl_format, gl_type, data, mpi->stride[2], |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
638 mpi->x / 2, mpi->y / 2, mpi->w / 2, mpi->h / 2, slice); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
639 ActiveTexture(GL_TEXTURE0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
640 } |
16099 | 641 if (mpi->flags & MP_IMGFLAG_DIRECT) |
642 BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); | |
16092 | 643 return VO_TRUE; |
644 } | |
1 | 645 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
646 static int |
10138
5e286cc6ad21
Removed YUV (YV12) and BGR support, leaving the native RGB support. Also cleaned some other parts.
alex
parents:
8654
diff
changeset
|
647 draw_frame(uint8_t *src[]) |
1 | 648 { |
16092 | 649 return VO_ERROR; |
1 | 650 } |
651 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
652 static int |
1 | 653 query_format(uint32_t format) |
654 { | |
16092 | 655 int caps = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | |
656 VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_ACCEPT_STRIDE; | |
13585 | 657 if (use_osd) |
658 caps |= VFCAP_OSD; | |
13206
6e8d1ac141fc
Using updated colorspace specifications from colorspaces.txt.
reimar
parents:
13188
diff
changeset
|
659 if ((format == IMGFMT_RGB24) || (format == IMGFMT_RGBA)) |
13585 | 660 return caps; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
661 if (use_yuv && format == IMGFMT_YV12) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
662 return caps; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13993
diff
changeset
|
663 if (many_fmts && |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13993
diff
changeset
|
664 glFindFormat(format, NULL, NULL, NULL, NULL)) |
13585 | 665 return caps; |
1 | 666 return 0; |
667 } | |
668 | |
669 | |
670 static void | |
671 uninit(void) | |
672 { | |
6095 | 673 if ( !vo_config_count ) return; |
16433 | 674 uninitGl(); |
13843 | 675 releaseGlContext(&gl_vinfo, &gl_context); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
676 if (custom_prog) free(custom_prog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
677 custom_prog = NULL; |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
678 if (custom_tex) free(custom_tex); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
679 custom_tex = NULL; |
17116 | 680 vo_uninit(); |
1 | 681 } |
4352 | 682 |
14286 | 683 static opt_t subopts[] = { |
684 {"manyfmts", OPT_ARG_BOOL, &many_fmts, NULL}, | |
685 {"osd", OPT_ARG_BOOL, &use_osd, NULL}, | |
686 {"scaled-osd", OPT_ARG_BOOL, &scaled_osd, NULL}, | |
687 {"aspect", OPT_ARG_BOOL, &use_aspect, NULL}, | |
688 {"slice-height", OPT_ARG_INT, &slice_height, (opt_test_f)int_non_neg}, | |
16099 | 689 {"rectangle", OPT_ARG_INT, &use_rectangle,(opt_test_f)int_non_neg}, |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
690 {"yuv", OPT_ARG_INT, &use_yuv, (opt_test_f)int_non_neg}, |
16235 | 691 {"glfinish", OPT_ARG_BOOL, &use_glFinish, NULL}, |
16268 | 692 {"swapinterval", OPT_ARG_INT, &swap_interval,NULL}, |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
693 {"customprog", OPT_ARG_MSTRZ,&custom_prog, NULL}, |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
694 {"customtex", OPT_ARG_MSTRZ,&custom_tex, NULL}, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
695 {"customtlin", OPT_ARG_BOOL, &custom_tlin, NULL}, |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
696 {"osdcolor", OPT_ARG_INT, &osd_color, NULL}, |
14286 | 697 {NULL} |
698 }; | |
699 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
700 static int preinit(const char *arg) |
4352 | 701 { |
14286 | 702 // set defaults |
16012 | 703 many_fmts = 1; |
13585 | 704 use_osd = 1; |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
705 scaled_osd = 0; |
13601 | 706 use_aspect = 1; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
707 use_yuv = 0; |
16099 | 708 use_rectangle = 0; |
16235 | 709 use_glFinish = 0; |
16268 | 710 swap_interval = 1; |
17027
04d66a417413
Use slice-height 16 as default for yuv colorspaces (only relevant if decoder
reimar
parents:
17006
diff
changeset
|
711 slice_height = -1; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
712 custom_prog = NULL; |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
713 custom_tex = NULL; |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
714 custom_tlin = 1; |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
715 osd_color = 0xffffff; |
14286 | 716 if (subopt_parse(arg, subopts) != 0) { |
13237
f85c105bfeaa
improved suboption parsing, fixes also compiler warnings
reimar
parents:
13206
diff
changeset
|
717 mp_msg(MSGT_VO, MSGL_FATAL, |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
718 "\n-vo gl command line help:\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
719 "Example: mplayer -vo gl:slice-height=4\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
720 "\nOptions:\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
721 " manyfmts\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
722 " Enable extended color formats for OpenGL 1.2 and later\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
723 " slice-height=<0-...>\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
724 " Slice size for texture transfer, 0 for whole image\n" |
13585 | 725 " noosd\n" |
726 " Do not use OpenGL OSD code\n" | |
13601 | 727 " noaspect\n" |
728 " Do not do aspect scaling\n" | |
16099 | 729 " rectangle=<0,1,2>\n" |
730 " 0: use power-of-two textures\n" | |
731 " 1: use texture_rectangle\n" | |
732 " 2: use texture_non_power_of_two\n" | |
16235 | 733 " glfinish\n" |
734 " Call glFinish() before swapping buffers\n" | |
16268 | 735 " swapinterval=<n>\n" |
736 " Interval in displayed frames between to buffer swaps.\n" | |
737 " 1 is equivalent to enable VSYNC, 0 to disable VSYNC.\n" | |
738 " Requires GLX_SGI_swap_control support to work.\n" | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
739 " yuv=<n>\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
740 " 0: use software YUV to RGB conversion.\n" |
16626 | 741 " 1: use register combiners (nVidia only, for older cards).\n" |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
742 " 2: use fragment program.\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
743 " 3: use fragment program with gamma correction.\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
744 " 4: use fragment program with gamma correction via lookup.\n" |
16626 | 745 " 5: use ATI-specific method (for older cards).\n" |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
746 " customprog=<filename>\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
747 " use a custom YUV conversion program\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
748 " customtex=<filename>\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
749 " use a custom YUV conversion lookup texture\n" |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
750 " nocustomtlin\n" |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
751 " use GL_NEAREST scaling for customtex texture\n" |
17956
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
752 " osdcolor=<0xRRGGBB>\n" |
0c5b35855061
support custom OSD colour for vo_gl.c. Based on patch by Tomas Janousek tomi at nomi cz
reimar
parents:
17875
diff
changeset
|
753 " use the given color for the OSD\n" |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
754 "\n" ); |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
755 return -1; |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
756 } |
16099 | 757 if (use_rectangle == 1) |
758 gl_target = GL_TEXTURE_RECTANGLE; | |
759 else | |
760 gl_target = GL_TEXTURE_2D; | |
17027
04d66a417413
Use slice-height 16 as default for yuv colorspaces (only relevant if decoder
reimar
parents:
17006
diff
changeset
|
761 if (slice_height == -1) |
04d66a417413
Use slice-height 16 as default for yuv colorspaces (only relevant if decoder
reimar
parents:
17006
diff
changeset
|
762 slice_height = use_yuv ? 16 : 4; |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
763 if (many_fmts) |
16751 | 764 mp_msg (MSGT_VO, MSGL_INFO, "[gl] using extended formats. " |
16880
1267964a4dfa
10l typo, nomanyfmts should be used against playback problems.
reimar
parents:
16879
diff
changeset
|
765 "Use -vo gl:nomanyfmts if playback fails.\n"); |
16751 | 766 mp_msg (MSGT_VO, MSGL_V, "[gl] Using %d as slice height " |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
767 "(0 means image height).\n", slice_height); |
7931 | 768 if( !vo_init() ) return -1; // Can't open X11 |
7777 | 769 |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4658
diff
changeset
|
770 return 0; |
4352 | 771 } |
772 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
773 static int control(uint32_t request, void *data, ...) |
4352 | 774 { |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
775 switch (request) { |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
776 case VOCTRL_PAUSE: return (int_pause=1); |
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
777 case VOCTRL_RESUME: return (int_pause=0); |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
778 case VOCTRL_QUERY_FORMAT: |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
779 return query_format(*((uint32_t*)data)); |
16099 | 780 case VOCTRL_GET_IMAGE: |
781 return get_image(data); | |
16092 | 782 case VOCTRL_DRAW_IMAGE: |
783 return draw_image(data); | |
13843 | 784 case VOCTRL_GUISUPPORT: |
785 return VO_TRUE; | |
11542 | 786 case VOCTRL_ONTOP: |
17116 | 787 vo_ontop(); |
11542 | 788 return VO_TRUE; |
6095 | 789 case VOCTRL_FULLSCREEN: |
17116 | 790 vo_fullscreen(); |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
791 resize(vo_dwidth, vo_dheight); |
6095 | 792 return VO_TRUE; |
17006
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
793 #ifdef GL_WIN32 |
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
794 case VOCTRL_BORDER: |
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
795 vo_w32_border(); |
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
796 return VO_TRUE; |
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
797 #endif |
13601 | 798 case VOCTRL_GET_PANSCAN: |
799 if (!use_aspect) return VO_NOTIMPL; | |
800 return VO_TRUE; | |
801 case VOCTRL_SET_PANSCAN: | |
802 if (!use_aspect) return VO_NOTIMPL; | |
803 resize (vo_dwidth, vo_dheight); | |
804 return VO_TRUE; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
805 case VOCTRL_GET_EQUALIZER: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
806 if (image_format == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
807 va_list va; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
808 int *value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
809 va_start(va, data); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
810 value = va_arg(va, int *); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
811 va_end(va); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
812 if (strcasecmp(data, "brightness") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
813 *value = eq_bri; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
814 if (use_yuv == YUV_CONVERSION_COMBINERS) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
815 } else if (strcasecmp(data, "contrast") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
816 *value = eq_cont; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
817 if (use_yuv == YUV_CONVERSION_COMBINERS) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
818 } else if (strcasecmp(data, "saturation") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
819 *value = eq_sat; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
820 } else if (strcasecmp(data, "hue") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
821 *value = eq_hue; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
822 } else if (strcasecmp(data, "gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
823 *value = eq_rgamma; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
824 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
825 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
826 } else if (strcasecmp(data, "red_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
827 *value = eq_rgamma; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
828 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
829 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
830 } else if (strcasecmp(data, "green_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
831 *value = eq_ggamma; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
832 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
833 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
834 } else if (strcasecmp(data, "blue_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
835 *value = eq_bgamma; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
836 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
837 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
838 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
839 return VO_TRUE; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
840 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
841 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
842 case VOCTRL_SET_EQUALIZER: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
843 if (image_format == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
844 va_list va; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
845 int value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
846 va_start(va, data); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
847 value = va_arg(va, int); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
848 va_end(va); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
849 if (strcasecmp(data, "brightness") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
850 eq_bri = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
851 if (use_yuv == YUV_CONVERSION_COMBINERS) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
852 } else if (strcasecmp(data, "contrast") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
853 eq_cont = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
854 if (use_yuv == YUV_CONVERSION_COMBINERS) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
855 } else if (strcasecmp(data, "saturation") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
856 eq_sat = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
857 } else if (strcasecmp(data, "hue") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
858 eq_hue = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
859 } else if (strcasecmp(data, "gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
860 eq_rgamma = eq_ggamma = eq_bgamma = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
861 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
862 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
863 } else if (strcasecmp(data, "red_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
864 eq_rgamma = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
865 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
866 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
867 } else if (strcasecmp(data, "green_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
868 eq_ggamma = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
869 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
870 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
871 } else if (strcasecmp(data, "blue_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
872 eq_bgamma = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
873 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
874 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
875 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
876 update_yuvconv(); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
877 return VO_TRUE; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
878 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
879 break; |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
880 } |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
881 return VO_NOTIMPL; |
4352 | 882 } |