Mercurial > mplayer.hg
annotate libvo/vo_gl.c @ 25317:7f3cb5408f28
Fixed VIDIX color bug that was introduced when Radeon VIDIX driver
was synchronized with vidix.sf.net.
The red color was saturating.
Corrected value fixes the issue and restore the color to the level
it used to have before synchronization.
Meaning of the value remains unknow but was retrieved from
register's value of a Radeon 9000 card, so it may need further testing.
Patch by Guillaume Lecerf (foxcore at gmail dot com)
author | ben |
---|---|
date | Mon, 10 Dec 2007 19:27:46 +0000 |
parents | c9e9ac2008c2 |
children | 765211fd3efb |
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 |
23077 | 17 #include "gui/interface.h" |
13843 | 18 #endif |
19578 | 19 #include "libass/ass.h" |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
20 #include "libass/ass_mp.h" |
31 | 21 |
25216 | 22 static const vo_info_t info = |
1 | 23 { |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
24 "X11 (OpenGL)", |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
25 "gl", |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
26 "Arpad Gereoffy <arpi@esp-team.scene.hu>", |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
27 "" |
1 | 28 }; |
29 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
30 const LIBVO_EXTERN(gl) |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7931
diff
changeset
|
31 |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
32 #ifdef GL_WIN32 |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
33 static int gl_vinfo = 0; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
34 static HGLRC gl_context = 0; |
21631 | 35 #define update_xinerama_info w32_update_xinerama_info |
36 #define vo_init vo_w32_init | |
37 #define vo_window vo_w32_window | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
38 #else |
13843 | 39 static XVisualInfo *gl_vinfo = NULL; |
40 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
|
41 static int wsGLXAttrib[] = { GLX_RGBA, |
1 | 42 GLX_RED_SIZE,1, |
43 GLX_GREEN_SIZE,1, | |
44 GLX_BLUE_SIZE,1, | |
45 GLX_DOUBLEBUFFER, | |
46 None }; | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
47 #endif |
1 | 48 |
13599 | 49 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
|
50 static int scaled_osd; |
14269 | 51 //! How many parts the OSD may consist of at most |
13585 | 52 #define MAX_OSD_PARTS 20 |
14269 | 53 //! Textures for OSD |
13599 | 54 static GLuint osdtex[MAX_OSD_PARTS]; |
13585 | 55 #ifndef FAST_OSD |
14269 | 56 //! Alpha textures for OSD |
13599 | 57 static GLuint osdatex[MAX_OSD_PARTS]; |
13585 | 58 #endif |
19578 | 59 static GLuint *eosdtex; |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
60 static GLuint largeeosdtex[2]; |
14269 | 61 //! Display lists that draw the OSD parts |
13599 | 62 static GLuint osdDispList[MAX_OSD_PARTS]; |
18719
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
63 #ifndef FAST_OSD |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
64 static GLuint osdaDispList[MAX_OSD_PARTS]; |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
65 #endif |
19578 | 66 static GLuint eosdDispList; |
14269 | 67 //! How many parts the OSD currently consists of |
16433 | 68 static int osdtexCnt; |
19578 | 69 static int eosdtexCnt; |
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
|
70 static int osd_color; |
1 | 71 |
13601 | 72 static int use_aspect; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
73 static int use_yuv; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
74 static int lscale; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
75 static int cscale; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
76 static int yuvconvtype; |
16099 | 77 static int use_rectangle; |
78 static int err_shown; | |
1 | 79 static uint32_t image_width; |
80 static uint32_t image_height; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
81 static uint32_t image_format; |
12159 | 82 static int many_fmts; |
16235 | 83 static int use_glFinish; |
16268 | 84 static int swap_interval; |
16099 | 85 static GLenum gl_target; |
16303
a87c6cf3fe52
Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents:
16282
diff
changeset
|
86 static GLint gl_texfmt; |
12159 | 87 static GLenum gl_format; |
88 static GLenum gl_type; | |
16434 | 89 static GLuint gl_buffer; |
16099 | 90 static int gl_buffersize; |
23987
9ea121c8e2df
Handle case where get_image is called twice without a draw_image in-between
reimar
parents:
23878
diff
changeset
|
91 static void *gl_bufferptr; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
92 static GLuint fragprog; |
18896
4f6312855a7d
Do not assign same texture number to GL_TEXTURE_2D and GL_TEXTURE_RECT,
reimar
parents:
18878
diff
changeset
|
93 static GLuint default_texs[22]; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
94 static char *custom_prog; |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
95 static char *custom_tex; |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
96 static int custom_tlin; |
18963 | 97 static int custom_trect; |
1 | 98 |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
99 static int int_pause; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
100 static int eq_bri = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
101 static int eq_cont = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
102 static int eq_sat = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
103 static int eq_hue = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
104 static int eq_rgamma = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
105 static int eq_ggamma = 0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
106 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
|
107 |
16879
6ea220b10e8e
More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents:
16751
diff
changeset
|
108 static int texture_width; |
6ea220b10e8e
More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents:
16751
diff
changeset
|
109 static int texture_height; |
17220 | 110 static int mpi_flipped; |
18996 | 111 static int vo_flipped; |
22149
7b4f17dc2689
Avoid calling aspect on each frame and make ass subtitles work better with panscan
reimar
parents:
22087
diff
changeset
|
112 static int ass_border_x, ass_border_y; |
1 | 113 |
13237
f85c105bfeaa
improved suboption parsing, fixes also compiler warnings
reimar
parents:
13206
diff
changeset
|
114 static unsigned int slice_height = 1; |
8654
2c4cebb8637d
- optional slice height for -vo gl (example: -vo gl:32)
arpi
parents:
8148
diff
changeset
|
115 |
612 | 116 static void resize(int x,int y){ |
11988 | 117 mp_msg(MSGT_VO, MSGL_V, "[gl] Resize: %dx%d\n",x,y); |
15748 | 118 if (WinID >= 0) { |
119 int top = 0, left = 0, w = x, h = y; | |
120 geometry(&top, &left, &w, &h, vo_screenwidth, vo_screenheight); | |
121 glViewport(top, left, w, h); | |
122 } else | |
1 | 123 glViewport( 0, 0, x, y ); |
124 | |
125 glMatrixMode(GL_PROJECTION); | |
126 glLoadIdentity(); | |
13601 | 127 if (vo_fs && use_aspect) { |
128 int new_w, new_h; | |
129 GLdouble scale_x, scale_y; | |
130 aspect(&new_w, &new_h, A_ZOOM); | |
131 panscan_calc(); | |
132 new_w += vo_panscan_x; | |
133 new_h += vo_panscan_y; | |
134 scale_x = (GLdouble) new_w / (GLdouble) x; | |
135 scale_y = (GLdouble) new_h / (GLdouble) y; | |
136 glScaled(scale_x, scale_y, 1); | |
22149
7b4f17dc2689
Avoid calling aspect on each frame and make ass subtitles work better with panscan
reimar
parents:
22087
diff
changeset
|
137 ass_border_x = (vo_screenwidth - new_w) / 2; |
7b4f17dc2689
Avoid calling aspect on each frame and make ass subtitles work better with panscan
reimar
parents:
22087
diff
changeset
|
138 ass_border_y = (vo_screenheight - new_h) / 2; |
13601 | 139 } |
1 | 140 glOrtho(0, image_width, image_height, 0, -1,1); |
141 | |
142 glMatrixMode(GL_MODELVIEW); | |
143 glLoadIdentity(); | |
13585 | 144 |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
145 if (!scaled_osd) { |
15086
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
146 #ifdef HAVE_FREETYPE |
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
147 // adjust font size to display size |
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
148 force_load_font = 1; |
c9eee448e5b2
revert the previous commit, gl needs to reload the font immediately
henry
parents:
15080
diff
changeset
|
149 #endif |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
150 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
|
151 } |
16584 | 152 if (vo_fs && use_aspect && !vo_doublebuffering) |
153 glClear(GL_COLOR_BUFFER_BIT); | |
1 | 154 } |
155 | |
16099 | 156 static void texSize(int w, int h, int *texw, int *texh) { |
157 if (use_rectangle) { | |
158 *texw = w; *texh = h; | |
159 } else { | |
160 *texw = 32; | |
161 while (*texw < w) | |
162 *texw *= 2; | |
163 *texh = 32; | |
164 while (*texh < h) | |
165 *texh *= 2; | |
166 } | |
167 } | |
168 | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16593
diff
changeset
|
169 //! maximum size of custom fragment program |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
170 #define MAX_CUSTOM_PROG_SIZE (1024 * 1024) |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
171 static void update_yuvconv(void) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
172 float bri = eq_bri / 100.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
173 float cont = (eq_cont + 100) / 100.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
174 float hue = eq_hue / 100.0 * 3.1415927; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
175 float sat = (eq_sat + 100) / 100.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
176 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
|
177 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
|
178 float bgamma = exp(log(8.0) * eq_bgamma / 100.0); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
179 glSetupYUVConversion(gl_target, yuvconvtype, bri, cont, hue, sat, |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
180 rgamma, ggamma, bgamma, |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
181 texture_width, texture_height); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
182 if (custom_prog) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
183 FILE *f = fopen(custom_prog, "r"); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
184 if (!f) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
185 mp_msg(MSGT_VO, MSGL_WARN, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
186 "[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
|
187 else { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
188 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
|
189 fread(prog, 1, MAX_CUSTOM_PROG_SIZE, f); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
190 fclose(f); |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18619
diff
changeset
|
191 loadGPUProgram(GL_FRAGMENT_PROGRAM, prog); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
192 free(prog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
193 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
194 ProgramEnvParameter4f(GL_FRAGMENT_PROGRAM, 0, |
18960 | 195 1.0 / texture_width, 1.0 / texture_height, |
196 texture_width, texture_height); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
197 } |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
198 if (custom_tex) { |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
199 FILE *f = fopen(custom_tex, "r"); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
200 if (!f) |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
201 mp_msg(MSGT_VO, MSGL_WARN, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
202 "[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
|
203 else { |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
204 int width, height, maxval; |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
205 ActiveTexture(GL_TEXTURE3); |
18963 | 206 if (glCreatePPMTex(custom_trect?GL_TEXTURE_RECTANGLE:GL_TEXTURE_2D, 0, |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
207 custom_tlin?GL_LINEAR:GL_NEAREST, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
208 f, &width, &height, &maxval)) |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
209 ProgramEnvParameter4f(GL_FRAGMENT_PROGRAM, 1, |
18960 | 210 1.0 / width, 1.0 / height, width, height); |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
211 else |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
212 mp_msg(MSGT_VO, MSGL_WARN, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
213 "[gl] Error parsing customtex %s\n", custom_tex); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
214 fclose(f); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
215 ActiveTexture(GL_TEXTURE0); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
216 } |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
217 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
218 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
219 |
16436 | 220 /** |
221 * \brief remove all OSD textures and display-lists, thus clearing it. | |
222 */ | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
223 static void clearOSD(void) { |
16433 | 224 int i; |
17871
29cce29b0cd9
do not call glDeleteTextures with 0 count, Xgl does not like it.
reimar
parents:
17566
diff
changeset
|
225 if (!osdtexCnt) |
29cce29b0cd9
do not call glDeleteTextures with 0 count, Xgl does not like it.
reimar
parents:
17566
diff
changeset
|
226 return; |
16433 | 227 glDeleteTextures(osdtexCnt, osdtex); |
228 #ifndef FAST_OSD | |
229 glDeleteTextures(osdtexCnt, osdatex); | |
18719
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
230 for (i = 0; i < osdtexCnt; i++) |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
231 glDeleteLists(osdaDispList[i], 1); |
16433 | 232 #endif |
233 for (i = 0; i < osdtexCnt; i++) | |
234 glDeleteLists(osdDispList[i], 1); | |
235 osdtexCnt = 0; | |
236 } | |
237 | |
238 /** | |
19578 | 239 * \brief remove textures, display list and free memory used by EOSD |
240 */ | |
241 static void clearEOSD(void) { | |
19934 | 242 if (eosdDispList) |
243 glDeleteLists(eosdDispList, 1); | |
244 eosdDispList = 0; | |
245 if (eosdtexCnt) | |
246 glDeleteTextures(eosdtexCnt, eosdtex); | |
247 eosdtexCnt = 0; | |
19578 | 248 free(eosdtex); |
249 eosdtex = NULL; | |
250 } | |
251 | |
252 /** | |
253 * \brief construct display list from ass image list | |
254 * \param img image list to create OSD from. | |
255 * A value of NULL has the same effect as clearEOSD() | |
256 */ | |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
257 static void genEOSD(mp_eosd_images_t *imgs) { |
19578 | 258 int sx, sy; |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
259 int tinytexcur = 0; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
260 int smalltexcur = 0; |
19578 | 261 GLuint *curtex; |
262 GLint scale_type = (scaled_osd) ? GL_LINEAR : GL_NEAREST; | |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
263 ass_image_t *img = imgs->imgs; |
19578 | 264 ass_image_t *i; |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
265 |
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
266 if (imgs->changed == 0) // there are elements, but they are unchanged |
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
267 return; |
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
268 if (img && imgs->changed == 1) // there are elements, but they just moved |
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
269 goto skip_upload; |
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
270 |
19578 | 271 clearEOSD(); |
19935
698b1d68ac83
Make genEOSD behaviour with NULL data more explicit
reimar
parents:
19934
diff
changeset
|
272 if (!img) |
698b1d68ac83
Make genEOSD behaviour with NULL data more explicit
reimar
parents:
19934
diff
changeset
|
273 return; |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
274 if (!largeeosdtex[0]) { |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
275 glGenTextures(2, largeeosdtex); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
276 BindTexture(gl_target, largeeosdtex[0]); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
277 glCreateClearTex(gl_target, GL_ALPHA, scale_type, 512, 512, 0); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
278 BindTexture(gl_target, largeeosdtex[1]); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
279 glCreateClearTex(gl_target, GL_ALPHA, scale_type, 512, 512, 0); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
280 } |
19578 | 281 for (i = img; i; i = i->next) |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
282 { |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
283 if (i->w <= 0 || i->h <= 0 || i->stride < i->w) |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
284 continue; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
285 if (i->w < 16 && i->h < 16 && tinytexcur < 1024) |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
286 tinytexcur++; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
287 else if (i->w < 32 && i->h < 32 && smalltexcur < 256) |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
288 smalltexcur++; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
289 else |
19939 | 290 eosdtexCnt++; |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
291 } |
20084 | 292 mp_msg(MSGT_VO, MSGL_DBG2, "EOSD counts (tiny, small, all): %i, %i, %i\n", |
293 tinytexcur, smalltexcur, eosdtexCnt); | |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
294 if (eosdtexCnt) { |
19939 | 295 eosdtex = calloc(eosdtexCnt, sizeof(GLuint)); |
296 glGenTextures(eosdtexCnt, eosdtex); | |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
297 } |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
298 tinytexcur = smalltexcur = 0; |
19937
34796c9b8667
Cosmetics: move curtex++ out of for () into code body, needed for coming patch
reimar
parents:
19936
diff
changeset
|
299 for (i = img, curtex = eosdtex; i; i = i->next) { |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
300 int x = 0, y = 0; |
19578 | 301 if (i->w <= 0 || i->h <= 0 || i->stride < i->w) { |
302 mp_msg(MSGT_VO, MSGL_V, "Invalid dimensions OSD for part!\n"); | |
303 continue; | |
304 } | |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
305 if (i->w < 16 && i->h < 16 && tinytexcur < 1024) { |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
306 x = (tinytexcur & 31) << 4; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
307 y = (tinytexcur >> 5) << 4; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
308 BindTexture(gl_target, largeeosdtex[0]); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
309 tinytexcur++; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
310 } else if (i->w < 32 && i->h < 32 && smalltexcur < 256) { |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
311 x = (smalltexcur & 15) << 5; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
312 y = (smalltexcur >> 4) << 5; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
313 BindTexture(gl_target, largeeosdtex[1]); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
314 smalltexcur++; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
315 } else { |
19939 | 316 texSize(i->w, i->h, &sx, &sy); |
317 BindTexture(gl_target, *curtex++); | |
318 glCreateClearTex(gl_target, GL_ALPHA, scale_type, sx, sy, 0); | |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
319 } |
19578 | 320 glUploadTex(gl_target, GL_ALPHA, GL_UNSIGNED_BYTE, i->bitmap, i->stride, |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
321 x, y, i->w, i->h, 0); |
19578 | 322 } |
323 eosdDispList = glGenLists(1); | |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
324 skip_upload: |
19578 | 325 glNewList(eosdDispList, GL_COMPILE); |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
326 tinytexcur = smalltexcur = 0; |
19937
34796c9b8667
Cosmetics: move curtex++ out of for () into code body, needed for coming patch
reimar
parents:
19936
diff
changeset
|
327 for (i = img, curtex = eosdtex; i; i = i->next) { |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
328 int x = 0, y = 0; |
19578 | 329 if (i->w <= 0 || i->h <= 0 || i->stride < i->w) |
330 continue; | |
331 glColor4ub(i->color >> 24, (i->color >> 16) & 0xff, (i->color >> 8) & 0xff, 255 - (i->color & 0xff)); | |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
332 if (i->w < 16 && i->h < 16 && tinytexcur < 1024) { |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
333 x = (tinytexcur & 31) << 4; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
334 y = (tinytexcur >> 5) << 4; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
335 sx = sy = 512; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
336 BindTexture(gl_target, largeeosdtex[0]); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
337 tinytexcur++; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
338 } else if (i->w < 32 && i->h < 32 && smalltexcur < 256) { |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
339 x = (smalltexcur & 15) << 5; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
340 y = (smalltexcur >> 4) << 5; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
341 sx = sy = 512; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
342 BindTexture(gl_target, largeeosdtex[1]); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
343 smalltexcur++; |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
344 } else { |
19939 | 345 texSize(i->w, i->h, &sx, &sy); |
346 BindTexture(gl_target, *curtex++); | |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
347 } |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
348 glDrawTex(i->dst_x, i->dst_y, i->w, i->h, x, y, i->w, i->h, sx, sy, use_rectangle == 1, 0, 0); |
19578 | 349 } |
350 glEndList(); | |
351 BindTexture(gl_target, 0); | |
352 } | |
353 | |
354 /** | |
16433 | 355 * \brief uninitialize OpenGL context, freeing textures, buffers etc. |
356 */ | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17220
diff
changeset
|
357 static void uninitGl(void) { |
18871
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
358 int i = 0; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
359 if (DeletePrograms && fragprog) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
360 DeletePrograms(1, &fragprog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
361 fragprog = 0; |
18871
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
362 while (default_texs[i] != 0) |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
363 i++; |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
364 if (i) |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
365 glDeleteTextures(i, default_texs); |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
366 default_texs[0] = 0; |
16433 | 367 clearOSD(); |
19578 | 368 clearEOSD(); |
19938
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
369 if (largeeosdtex[0]) |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
370 glDeleteTextures(2, largeeosdtex); |
f862045246a9
Aggregate multiple small EOSD textures into one large since hundreds of
reimar
parents:
19937
diff
changeset
|
371 largeeosdtex[0] = 0; |
16433 | 372 if (DeleteBuffers && gl_buffer) |
373 DeleteBuffers(1, &gl_buffer); | |
374 gl_buffer = 0; gl_buffersize = 0; | |
23987
9ea121c8e2df
Handle case where get_image is called twice without a draw_image in-between
reimar
parents:
23878
diff
changeset
|
375 gl_bufferptr = NULL; |
16433 | 376 err_shown = 0; |
377 } | |
378 | |
13843 | 379 /** |
380 * \brief Initialize a (new or reused) OpenGL context. | |
16433 | 381 * set global gl-related variables to their default values |
13843 | 382 */ |
383 static int initGl(uint32_t d_width, uint32_t d_height) { | |
16099 | 384 texSize(image_width, image_height, &texture_width, &texture_height); |
13843 | 385 |
386 glDisable(GL_BLEND); | |
387 glDisable(GL_DEPTH_TEST); | |
388 glDepthMask(GL_FALSE); | |
389 glDisable(GL_CULL_FACE); | |
16099 | 390 glEnable(gl_target); |
16458 | 391 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
|
392 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); |
13843 | 393 |
394 mp_msg(MSGT_VO, MSGL_V, "[gl] Creating %dx%d texture...\n", | |
395 texture_width, texture_height); | |
396 | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
397 if (image_format == IMGFMT_YV12) { |
18871
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
398 int i; |
18896
4f6312855a7d
Do not assign same texture number to GL_TEXTURE_2D and GL_TEXTURE_RECT,
reimar
parents:
18878
diff
changeset
|
399 glGenTextures(21, default_texs); |
4f6312855a7d
Do not assign same texture number to GL_TEXTURE_2D and GL_TEXTURE_RECT,
reimar
parents:
18878
diff
changeset
|
400 default_texs[21] = 0; |
18871
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
401 for (i = 0; i < 7; i++) { |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
402 ActiveTexture(GL_TEXTURE1 + i); |
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
403 BindTexture(GL_TEXTURE_2D, default_texs[i]); |
18896
4f6312855a7d
Do not assign same texture number to GL_TEXTURE_2D and GL_TEXTURE_RECT,
reimar
parents:
18878
diff
changeset
|
404 BindTexture(GL_TEXTURE_RECTANGLE, default_texs[i + 7]); |
4f6312855a7d
Do not assign same texture number to GL_TEXTURE_2D and GL_TEXTURE_RECT,
reimar
parents:
18878
diff
changeset
|
405 BindTexture(GL_TEXTURE_3D, default_texs[i + 14]); |
18871
32743cc5f380
Make sure all texture units have a different texture bound.
reimar
parents:
18788
diff
changeset
|
406 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
407 ActiveTexture(GL_TEXTURE1); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
408 glCreateClearTex(gl_target, gl_texfmt, GL_LINEAR, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
409 texture_width / 2, texture_height / 2, 128); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
410 ActiveTexture(GL_TEXTURE2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
411 glCreateClearTex(gl_target, gl_texfmt, GL_LINEAR, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
412 texture_width / 2, texture_height / 2, 128); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
413 switch (use_yuv) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
414 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
415 case YUV_CONVERSION_FRAGMENT_POW: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
416 case YUV_CONVERSION_FRAGMENT: |
18579
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18116
diff
changeset
|
417 if (!GenPrograms || !BindProgram) { |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18116
diff
changeset
|
418 mp_msg(MSGT_VO, MSGL_ERR, "[gl] fragment program functions missing!\n"); |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18116
diff
changeset
|
419 break; |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18116
diff
changeset
|
420 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
421 GenPrograms(1, &fragprog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
422 BindProgram(GL_FRAGMENT_PROGRAM, fragprog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
423 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
424 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
425 ActiveTexture(GL_TEXTURE0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
426 BindTexture(gl_target, 0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
427 update_yuvconv(); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
428 } |
16117 | 429 glCreateClearTex(gl_target, gl_texfmt, GL_LINEAR, |
430 texture_width, texture_height, 0); | |
13843 | 431 |
432 resize(d_width, d_height); | |
433 | |
434 glClearColor( 0.0f,0.0f,0.0f,0.0f ); | |
435 glClear( GL_COLOR_BUFFER_BIT ); | |
16271 | 436 if (SwapInterval && swap_interval >= 0) |
16268 | 437 SwapInterval(swap_interval); |
13920 | 438 return 1; |
13843 | 439 } |
440 | |
1 | 441 /* connect to server, create and map window, |
442 * allocate colors and (shared) memory | |
443 */ | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
444 static int |
7124
eca7dbad0166
finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents:
7111
diff
changeset
|
445 config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) |
1 | 446 { |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
447 image_height = height; |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
448 image_width = width; |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
449 image_format = format; |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
450 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
|
451 |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
452 int_pause = 0; |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
453 vo_flipped = !!(flags & VOFLAG_FLIPPING); |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10138
diff
changeset
|
454 |
13843 | 455 #ifdef HAVE_NEW_GUI |
456 if (use_gui) { | |
457 // GUI creates and manages window for us | |
458 guiGetEvent(guiSetShVideo, 0); | |
18949 | 459 #ifndef GL_WIN32 |
15748 | 460 goto glconfig; |
18949 | 461 #endif |
13843 | 462 } |
463 #endif | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
464 #ifdef GL_WIN32 |
18079
f57317460375
fixes and cleanup for windows fullscreen switching (restore old position,
reimar
parents:
17956
diff
changeset
|
465 if (!vo_w32_config(d_width, d_height, flags)) |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
466 return -1; |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
467 #else |
15748 | 468 if (WinID >= 0) { |
469 vo_window = WinID ? (Window)WinID : mRootWin; | |
16239 | 470 vo_x11_selectinput_witherr(mDisplay, vo_window, |
471 StructureNotifyMask | KeyPressMask | PointerMotionMask | | |
472 ButtonPressMask | ButtonReleaseMask | ExposureMask); | |
15748 | 473 goto glconfig; |
474 } | |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23505
diff
changeset
|
475 { |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23505
diff
changeset
|
476 XVisualInfo *vinfo=glXChooseVisual( mDisplay,mScreen,wsGLXAttrib ); |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
477 if (vinfo == NULL) |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
478 { |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
479 mp_msg(MSGT_VO, MSGL_ERR, "[gl] no GLX support present\n"); |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
480 return -1; |
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
481 } |
1137
4c7b219e126c
patch: some X11 compliance fixed: set ClassHint and better fullscreen mode
arpi_esp
parents:
1109
diff
changeset
|
482 |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23505
diff
changeset
|
483 vo_x11_create_vo_window(vinfo, vo_dx, vo_dy, d_width, d_height, flags, |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23505
diff
changeset
|
484 XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone), |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23505
diff
changeset
|
485 "gl", title); |
13843 | 486 } |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
487 #endif |
15748 | 488 |
489 glconfig: | |
16433 | 490 if (vo_config_count) |
491 uninitGl(); | |
13843 | 492 setGlWindow(&gl_vinfo, &gl_context, vo_window); |
493 initGl(vo_dwidth, vo_dheight); | |
11542 | 494 |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
495 return 0; |
1 | 496 } |
497 | |
31 | 498 static void check_events(void) |
1 | 499 { |
17116 | 500 int e=vo_check_events(); |
31 | 501 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
|
502 if(e&VO_EVENT_EXPOSE && int_pause) flip_page(); |
31 | 503 } |
1 | 504 |
13585 | 505 /** |
506 * Creates the textures and the display list needed for displaying | |
507 * an OSD part. | |
508 * Callback function for vo_draw_text(). | |
509 */ | |
510 static void create_osd_texture(int x0, int y0, int w, int h, | |
511 unsigned char *src, unsigned char *srca, | |
512 int stride) | |
513 { | |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
13601
diff
changeset
|
514 // 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
|
515 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
|
516 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
|
517 |
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
518 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
|
519 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
|
520 return; |
3bf109509189
extra checks on size of OSD parts (though IMHO these values should never be bad)
reimar
parents:
17871
diff
changeset
|
521 } |
16099 | 522 texSize(w, h, &sx, &sy); |
13585 | 523 |
524 if (osdtexCnt >= MAX_OSD_PARTS) { | |
525 mp_msg(MSGT_VO, MSGL_ERR, "Too many OSD parts, contact the developers!\n"); | |
526 return; | |
527 } | |
528 | |
529 // create Textures for OSD part | |
530 glGenTextures(1, &osdtex[osdtexCnt]); | |
16099 | 531 BindTexture(gl_target, osdtex[osdtexCnt]); |
16117 | 532 glCreateClearTex(gl_target, GL_LUMINANCE, scale_type, sx, sy, 0); |
533 glUploadTex(gl_target, GL_LUMINANCE, GL_UNSIGNED_BYTE, src, stride, | |
534 0, 0, w, h, 0); | |
13585 | 535 |
536 #ifndef FAST_OSD | |
537 glGenTextures(1, &osdatex[osdtexCnt]); | |
16099 | 538 BindTexture(gl_target, osdatex[osdtexCnt]); |
16584 | 539 glCreateClearTex(gl_target, GL_ALPHA, scale_type, sx, sy, 255); |
16117 | 540 { |
16221 | 541 int i; |
18878 | 542 char *tmp = malloc(stride * h); |
16272 | 543 // convert alpha from weird MPlayer scale. |
544 // in-place is not possible since it is reused for future OSDs | |
20420
0c63edaa7714
Fix single-black-pixel-in-upper-left-corner bug (how do people notice a single
reimar
parents:
20084
diff
changeset
|
545 for (i = h * stride - 1; i >= 0; i--) |
16272 | 546 tmp[i] = srca[i] - 1; |
16117 | 547 glUploadTex(gl_target, GL_ALPHA, GL_UNSIGNED_BYTE, tmp, stride, |
548 0, 0, w, h, 0); | |
549 free(tmp); | |
550 } | |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
13601
diff
changeset
|
551 #endif |
13585 | 552 |
16099 | 553 BindTexture(gl_target, 0); |
13585 | 554 |
555 // Create a list for rendering this OSD part | |
18719
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
556 #ifndef FAST_OSD |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
557 osdaDispList[osdtexCnt] = glGenLists(1); |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
558 glNewList(osdaDispList[osdtexCnt], GL_COMPILE); |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
559 // render alpha |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
560 BindTexture(gl_target, osdatex[osdtexCnt]); |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
561 glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0, 0); |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
562 glEndList(); |
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
563 #endif |
13585 | 564 osdDispList[osdtexCnt] = glGenLists(1); |
565 glNewList(osdDispList[osdtexCnt], GL_COMPILE); | |
566 // render OSD | |
16099 | 567 BindTexture(gl_target, osdtex[osdtexCnt]); |
17220 | 568 glDrawTex(x0, y0, w, h, 0, 0, w, h, sx, sy, use_rectangle == 1, 0, 0); |
13585 | 569 glEndList(); |
570 | |
571 osdtexCnt++; | |
572 } | |
573 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1302
diff
changeset
|
574 static void draw_osd(void) |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1302
diff
changeset
|
575 { |
13585 | 576 if (!use_osd) return; |
577 if (vo_osd_changed(0)) { | |
16221 | 578 int osd_h, osd_w; |
16433 | 579 clearOSD(); |
13660
b34c5aa5f798
OSD variant for vo_gl.c that behaves more like the one of other vos.
reimar
parents:
13653
diff
changeset
|
580 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
|
581 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
|
582 vo_draw_text(osd_w, osd_h, create_osd_texture); |
13585 | 583 } |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1302
diff
changeset
|
584 } |
31 | 585 |
586 static void | |
587 flip_page(void) | |
588 { | |
1 | 589 // glEnable(GL_TEXTURE_2D); |
590 // glBindTexture(GL_TEXTURE_2D, texture_id); | |
591 | |
592 glColor3f(1,1,1); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
593 if (image_format == IMGFMT_YV12) |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
594 glEnableYUVConversion(gl_target, yuvconvtype); |
16584 | 595 glDrawTex(0, 0, image_width, image_height, |
596 0, 0, image_width, image_height, | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
597 texture_width, texture_height, |
18996 | 598 use_rectangle == 1, image_format == IMGFMT_YV12, |
599 mpi_flipped ^ vo_flipped); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
600 if (image_format == IMGFMT_YV12) |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
601 glDisableYUVConversion(gl_target, yuvconvtype); |
1 | 602 |
19936
f810e12fce63
use eosdDispList != 0 to check if eosd should be drawn instead of eosdtexCnt > 0
reimar
parents:
19935
diff
changeset
|
603 if (osdtexCnt > 0 || eosdDispList) { |
13585 | 604 // 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
|
605 if (!scaled_osd) { |
19939 | 606 glMatrixMode(GL_PROJECTION); |
607 glPushMatrix(); | |
608 glLoadIdentity(); | |
609 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
|
610 } |
13585 | 611 glEnable(GL_BLEND); |
19936
f810e12fce63
use eosdDispList != 0 to check if eosd should be drawn instead of eosdtexCnt > 0
reimar
parents:
19935
diff
changeset
|
612 if (eosdDispList) { |
19578 | 613 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
614 glCallList(eosdDispList); | |
615 } | |
19579 | 616 if (osdtexCnt > 0) { |
617 glColor4ub((osd_color >> 16) & 0xff, (osd_color >> 8) & 0xff, osd_color & 0xff, 0xff); | |
618 // draw OSD | |
18719
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
619 #ifndef FAST_OSD |
19579 | 620 glBlendFunc(GL_ZERO, GL_SRC_ALPHA); |
621 glCallLists(osdtexCnt, GL_UNSIGNED_INT, osdaDispList); | |
18719
5d01eb066fa3
Reduce number of OpenGL state changes when drawing OSD by first drawing alpha.
reimar
parents:
18695
diff
changeset
|
622 #endif |
19579 | 623 glBlendFunc(GL_ONE, GL_ONE); |
624 glCallLists(osdtexCnt, GL_UNSIGNED_INT, osdDispList); | |
625 } | |
13585 | 626 // set rendering parameters back to defaults |
627 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
|
628 if (!scaled_osd) |
19939 | 629 glPopMatrix(); |
16099 | 630 BindTexture(gl_target, 0); |
13585 | 631 } |
632 | |
16235 | 633 if (use_glFinish) |
1 | 634 glFinish(); |
16458 | 635 if (vo_doublebuffering) |
17116 | 636 swapGlBuffers(); |
17117 | 637 else if (!use_glFinish) |
638 glFlush(); | |
6095 | 639 |
16458 | 640 if (vo_fs && use_aspect && vo_doublebuffering) |
13601 | 641 glClear(GL_COLOR_BUFFER_BIT); |
1 | 642 } |
643 | |
644 //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
|
645 static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) |
1 | 646 { |
17220 | 647 mpi_flipped = (stride[0] < 0); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
648 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
|
649 x, y, w, h, slice_height); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
650 if (image_format == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
651 ActiveTexture(GL_TEXTURE1); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
652 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
|
653 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
|
654 ActiveTexture(GL_TEXTURE2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
655 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
|
656 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
|
657 ActiveTexture(GL_TEXTURE0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
658 } |
19580
dd2312f887a6
Cosmetics: reindent, remove tabs and break overlong lines.
reimar
parents:
19579
diff
changeset
|
659 return 0; |
1 | 660 } |
661 | |
16099 | 662 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
|
663 if (!GenBuffers || !BindBuffer || !BufferData || !MapBuffer) { |
16099 | 664 if (!err_shown) |
665 mp_msg(MSGT_VO, MSGL_ERR, "[gl] extensions missing for dr\n" | |
666 "Expect a _major_ speed penalty\n"); | |
16113 | 667 err_shown = 1; |
16099 | 668 return VO_FALSE; |
669 } | |
670 if (mpi->flags & MP_IMGFLAG_READABLE) return VO_FALSE; | |
16117 | 671 if (mpi->type == MP_IMGTYPE_IP || mpi->type == MP_IMGTYPE_IPB) |
672 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
|
673 if (!gl_buffer) |
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16221
diff
changeset
|
674 GenBuffers(1, &gl_buffer); |
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16221
diff
changeset
|
675 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer); |
16099 | 676 mpi->stride[0] = mpi->width * mpi->bpp / 8; |
677 if (mpi->stride[0] * mpi->h > gl_buffersize) { | |
678 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
|
679 NULL, GL_DYNAMIC_DRAW); |
16099 | 680 gl_buffersize = mpi->stride[0] * mpi->h; |
681 } | |
23987
9ea121c8e2df
Handle case where get_image is called twice without a draw_image in-between
reimar
parents:
23878
diff
changeset
|
682 if (!gl_bufferptr) |
9ea121c8e2df
Handle case where get_image is called twice without a draw_image in-between
reimar
parents:
23878
diff
changeset
|
683 gl_bufferptr = MapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); |
9ea121c8e2df
Handle case where get_image is called twice without a draw_image in-between
reimar
parents:
23878
diff
changeset
|
684 mpi->planes[0] = gl_bufferptr; |
16099 | 685 BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); |
16113 | 686 if (mpi->planes[0] == NULL) { |
687 if (!err_shown) | |
688 mp_msg(MSGT_VO, MSGL_ERR, "[gl] could not aquire buffer for dr\n" | |
689 "Expect a _major_ speed penalty\n"); | |
690 err_shown = 1; | |
691 return VO_FALSE; | |
692 } | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
693 if (mpi->imgfmt == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
694 // YV12 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
695 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
|
696 mpi->stride[0] = mpi->width; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
697 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
|
698 mpi->stride[1] = mpi->width >> 1; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
699 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
|
700 mpi->stride[2] = mpi->width >> 1; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
701 } |
16099 | 702 mpi->flags |= MP_IMGFLAG_DIRECT; |
703 return VO_TRUE; | |
704 } | |
705 | |
16092 | 706 static uint32_t draw_image(mp_image_t *mpi) { |
16117 | 707 int slice = slice_height; |
18995 | 708 int stride[3] = {mpi->stride[0], mpi->stride[1], mpi->stride[2]}; |
709 unsigned char *planes[3] = {mpi->planes[0], mpi->planes[1], mpi->planes[2]}; | |
16092 | 710 if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK) |
711 return VO_TRUE; | |
18995 | 712 mpi_flipped = (stride[0] < 0); |
16099 | 713 if (mpi->flags & MP_IMGFLAG_DIRECT) { |
18995 | 714 intptr_t base = (intptr_t)planes[0]; |
715 if (mpi_flipped) | |
716 base += (mpi->h - 1) * stride[0]; | |
717 planes[0] -= base; | |
718 planes[1] -= base; | |
719 planes[2] -= base; | |
16233
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16221
diff
changeset
|
720 BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer); |
16099 | 721 UnmapBuffer(GL_PIXEL_UNPACK_BUFFER); |
23987
9ea121c8e2df
Handle case where get_image is called twice without a draw_image in-between
reimar
parents:
23878
diff
changeset
|
722 gl_bufferptr = NULL; |
16117 | 723 slice = 0; // always "upload" full texture |
16099 | 724 } |
18995 | 725 glUploadTex(gl_target, gl_format, gl_type, planes[0], stride[0], |
16117 | 726 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
|
727 if (mpi->imgfmt == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
728 ActiveTexture(GL_TEXTURE1); |
18995 | 729 glUploadTex(gl_target, gl_format, gl_type, planes[1], stride[1], |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
730 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
|
731 ActiveTexture(GL_TEXTURE2); |
18995 | 732 glUploadTex(gl_target, gl_format, gl_type, planes[2], stride[2], |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
733 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
|
734 ActiveTexture(GL_TEXTURE0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
735 } |
16099 | 736 if (mpi->flags & MP_IMGFLAG_DIRECT) |
737 BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); | |
16092 | 738 return VO_TRUE; |
739 } | |
1 | 740 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
741 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
|
742 draw_frame(uint8_t *src[]) |
1 | 743 { |
16092 | 744 return VO_ERROR; |
1 | 745 } |
746 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
747 static int |
1 | 748 query_format(uint32_t format) |
749 { | |
16092 | 750 int caps = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | |
18996 | 751 VFCAP_FLIP | |
16092 | 752 VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_ACCEPT_STRIDE; |
13585 | 753 if (use_osd) |
23135
960434b7d963
Do not set VFCAP_EOSD_UNSCALED if we use scaled-osd
reimar
parents:
23134
diff
changeset
|
754 caps |= VFCAP_OSD | VFCAP_EOSD | (scaled_osd ? 0 : VFCAP_EOSD_UNSCALED); |
13206
6e8d1ac141fc
Using updated colorspace specifications from colorspaces.txt.
reimar
parents:
13188
diff
changeset
|
755 if ((format == IMGFMT_RGB24) || (format == IMGFMT_RGBA)) |
13585 | 756 return caps; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
757 if (use_yuv && format == IMGFMT_YV12) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
758 return caps; |
19356
595ac8077dc5
Disable Y800 colorspace support, otherwise mplayer uses it even when it's not supposed to.
reimar
parents:
18996
diff
changeset
|
759 // HACK, otherwise we get only b&w with some filters (e.g. -vf eq) |
595ac8077dc5
Disable Y800 colorspace support, otherwise mplayer uses it even when it's not supposed to.
reimar
parents:
18996
diff
changeset
|
760 // ideally MPlayer should be fixed instead not to use Y800 when it has the choice |
595ac8077dc5
Disable Y800 colorspace support, otherwise mplayer uses it even when it's not supposed to.
reimar
parents:
18996
diff
changeset
|
761 if (!use_yuv && (format == IMGFMT_Y8 || format == IMGFMT_Y800)) |
595ac8077dc5
Disable Y800 colorspace support, otherwise mplayer uses it even when it's not supposed to.
reimar
parents:
18996
diff
changeset
|
762 return 0; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13993
diff
changeset
|
763 if (many_fmts && |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13993
diff
changeset
|
764 glFindFormat(format, NULL, NULL, NULL, NULL)) |
13585 | 765 return caps; |
1 | 766 return 0; |
767 } | |
768 | |
769 | |
770 static void | |
771 uninit(void) | |
772 { | |
6095 | 773 if ( !vo_config_count ) return; |
16433 | 774 uninitGl(); |
13843 | 775 releaseGlContext(&gl_vinfo, &gl_context); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
776 if (custom_prog) free(custom_prog); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
777 custom_prog = NULL; |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
778 if (custom_tex) free(custom_tex); |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
779 custom_tex = NULL; |
17116 | 780 vo_uninit(); |
1 | 781 } |
4352 | 782 |
14286 | 783 static opt_t subopts[] = { |
784 {"manyfmts", OPT_ARG_BOOL, &many_fmts, NULL}, | |
785 {"osd", OPT_ARG_BOOL, &use_osd, NULL}, | |
786 {"scaled-osd", OPT_ARG_BOOL, &scaled_osd, NULL}, | |
787 {"aspect", OPT_ARG_BOOL, &use_aspect, NULL}, | |
788 {"slice-height", OPT_ARG_INT, &slice_height, (opt_test_f)int_non_neg}, | |
16099 | 789 {"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
|
790 {"yuv", OPT_ARG_INT, &use_yuv, (opt_test_f)int_non_neg}, |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
791 {"lscale", OPT_ARG_INT, &lscale, (opt_test_f)int_non_neg}, |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
792 {"cscale", OPT_ARG_INT, &cscale, (opt_test_f)int_non_neg}, |
16235 | 793 {"glfinish", OPT_ARG_BOOL, &use_glFinish, NULL}, |
16268 | 794 {"swapinterval", OPT_ARG_INT, &swap_interval,NULL}, |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
795 {"customprog", OPT_ARG_MSTRZ,&custom_prog, NULL}, |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
796 {"customtex", OPT_ARG_MSTRZ,&custom_tex, NULL}, |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
797 {"customtlin", OPT_ARG_BOOL, &custom_tlin, NULL}, |
18963 | 798 {"customtrect", OPT_ARG_BOOL, &custom_trect, 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
|
799 {"osdcolor", OPT_ARG_INT, &osd_color, NULL}, |
14286 | 800 {NULL} |
801 }; | |
802 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
803 static int preinit(const char *arg) |
4352 | 804 { |
14286 | 805 // set defaults |
16012 | 806 many_fmts = 1; |
13585 | 807 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
|
808 scaled_osd = 0; |
13601 | 809 use_aspect = 1; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
810 use_yuv = 0; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
811 lscale = 0; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
812 cscale = 0; |
16099 | 813 use_rectangle = 0; |
16235 | 814 use_glFinish = 0; |
16268 | 815 swap_interval = 1; |
23878
e64c59f73527
Set -vo gl slice-height default to 0, the current default of 4 seems
reimar
parents:
23655
diff
changeset
|
816 slice_height = 0; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
817 custom_prog = NULL; |
16593
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
818 custom_tex = NULL; |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
819 custom_tlin = 1; |
18963 | 820 custom_trect = 0; |
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
|
821 osd_color = 0xffffff; |
14286 | 822 if (subopt_parse(arg, subopts) != 0) { |
13237
f85c105bfeaa
improved suboption parsing, fixes also compiler warnings
reimar
parents:
13206
diff
changeset
|
823 mp_msg(MSGT_VO, MSGL_FATAL, |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
824 "\n-vo gl command line help:\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
825 "Example: mplayer -vo gl:slice-height=4\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
826 "\nOptions:\n" |
22087 | 827 " nomanyfmts\n" |
828 " Disable extended color formats for OpenGL 1.2 and later\n" | |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
829 " slice-height=<0-...>\n" |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
830 " Slice size for texture transfer, 0 for whole image\n" |
13585 | 831 " noosd\n" |
832 " Do not use OpenGL OSD code\n" | |
13601 | 833 " noaspect\n" |
834 " Do not do aspect scaling\n" | |
16099 | 835 " rectangle=<0,1,2>\n" |
836 " 0: use power-of-two textures\n" | |
837 " 1: use texture_rectangle\n" | |
838 " 2: use texture_non_power_of_two\n" | |
16235 | 839 " glfinish\n" |
840 " Call glFinish() before swapping buffers\n" | |
16268 | 841 " swapinterval=<n>\n" |
842 " Interval in displayed frames between to buffer swaps.\n" | |
843 " 1 is equivalent to enable VSYNC, 0 to disable VSYNC.\n" | |
844 " 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
|
845 " yuv=<n>\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
846 " 0: use software YUV to RGB conversion.\n" |
16626 | 847 " 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
|
848 " 2: use fragment program.\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
849 " 3: use fragment program with gamma correction.\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
850 " 4: use fragment program with gamma correction via lookup.\n" |
16626 | 851 " 5: use ATI-specific method (for older cards).\n" |
22087 | 852 " 6: use lookup via 3D texture.\n" |
18695 | 853 " lscale=<n>\n" |
854 " 0: use standard bilinear scaling for luma.\n" | |
855 " 1: use improved bicubic scaling for luma.\n" | |
22489 | 856 " 2: use cubic in X, linear in Y direction scaling for luma.\n" |
18695 | 857 " cscale=<n>\n" |
858 " as lscale but for chroma (2x slower with little visible effect).\n" | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
859 " customprog=<filename>\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
860 " use a custom YUV conversion program\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
861 " customtex=<filename>\n" |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
862 " 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
|
863 " nocustomtlin\n" |
1c13fb2ba5a9
Allow specifying a custom (ppm) texture for texture unit 3
reimar
parents:
16586
diff
changeset
|
864 " use GL_NEAREST scaling for customtex texture\n" |
18963 | 865 " customtrect\n" |
866 " use texture_rectangle 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
|
867 " 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
|
868 " use the given color for the OSD\n" |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
869 "\n" ); |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
870 return -1; |
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
871 } |
16099 | 872 if (use_rectangle == 1) |
873 gl_target = GL_TEXTURE_RECTANGLE; | |
874 else | |
875 gl_target = GL_TEXTURE_2D; | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
876 yuvconvtype = use_yuv | lscale << YUV_LUM_SCALER_SHIFT | cscale << YUV_CHROM_SCALER_SHIFT; |
12212
2e8b305586a0
fixed suboption parsing, added help for suboptions
reimar
parents:
12159
diff
changeset
|
877 if (many_fmts) |
16751 | 878 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
|
879 "Use -vo gl:nomanyfmts if playback fails.\n"); |
16751 | 880 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
|
881 "(0 means image height).\n", slice_height); |
7931 | 882 if( !vo_init() ) return -1; // Can't open X11 |
7777 | 883 |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4658
diff
changeset
|
884 return 0; |
4352 | 885 } |
886 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16117
diff
changeset
|
887 static int control(uint32_t request, void *data, ...) |
4352 | 888 { |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
889 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
|
890 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
|
891 case VOCTRL_RESUME: return (int_pause=0); |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
892 case VOCTRL_QUERY_FORMAT: |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
893 return query_format(*((uint32_t*)data)); |
16099 | 894 case VOCTRL_GET_IMAGE: |
895 return get_image(data); | |
16092 | 896 case VOCTRL_DRAW_IMAGE: |
897 return draw_image(data); | |
19578 | 898 case VOCTRL_DRAW_EOSD: |
21506
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
899 if (!data) |
8174acbf0633
Speed up ASS subtitles display by detecting changes between two consecutive
eugeni
parents:
20420
diff
changeset
|
900 return VO_FALSE; |
19578 | 901 genEOSD(data); |
902 return VO_TRUE; | |
903 case VOCTRL_GET_EOSD_RES: | |
904 { | |
905 mp_eosd_res_t *r = data; | |
906 r->mt = r->mb = r->ml = r->mr = 0; | |
907 if (scaled_osd) {r->w = image_width; r->h = image_height;} | |
908 else if (vo_fs) { | |
909 r->w = vo_screenwidth; r->h = vo_screenheight; | |
24787
02535b3216c5
Avoid text deformation and subtitles moving outside the screen in pan-and-scan
eugeni
parents:
23987
diff
changeset
|
910 r->ml = r->mr = ass_border_x; |
02535b3216c5
Avoid text deformation and subtitles moving outside the screen in pan-and-scan
eugeni
parents:
23987
diff
changeset
|
911 r->mt = r->mb = ass_border_y; |
19578 | 912 } else { |
913 r->w = vo_dwidth; r->h = vo_dheight; | |
914 } | |
915 } | |
916 return VO_TRUE; | |
13843 | 917 case VOCTRL_GUISUPPORT: |
918 return VO_TRUE; | |
11542 | 919 case VOCTRL_ONTOP: |
17116 | 920 vo_ontop(); |
11542 | 921 return VO_TRUE; |
6095 | 922 case VOCTRL_FULLSCREEN: |
17116 | 923 vo_fullscreen(); |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
924 resize(vo_dwidth, vo_dheight); |
6095 | 925 return VO_TRUE; |
17006
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
926 #ifdef GL_WIN32 |
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
927 case VOCTRL_BORDER: |
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
928 vo_w32_border(); |
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
929 return VO_TRUE; |
852499addaa8
Enable border toggling for gl and gl2 under windows.
reimar
parents:
16880
diff
changeset
|
930 #endif |
13601 | 931 case VOCTRL_GET_PANSCAN: |
932 if (!use_aspect) return VO_NOTIMPL; | |
933 return VO_TRUE; | |
934 case VOCTRL_SET_PANSCAN: | |
935 if (!use_aspect) return VO_NOTIMPL; | |
936 resize (vo_dwidth, vo_dheight); | |
937 return VO_TRUE; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
938 case VOCTRL_GET_EQUALIZER: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
939 if (image_format == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
940 va_list va; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
941 int *value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
942 va_start(va, data); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
943 value = va_arg(va, int *); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
944 va_end(va); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
945 if (strcasecmp(data, "brightness") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
946 *value = eq_bri; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
947 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
|
948 } else if (strcasecmp(data, "contrast") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
949 *value = eq_cont; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
950 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
|
951 } else if (strcasecmp(data, "saturation") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
952 *value = eq_sat; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
953 } else if (strcasecmp(data, "hue") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
954 *value = eq_hue; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
955 } else if (strcasecmp(data, "gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
956 *value = eq_rgamma; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
957 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
958 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
959 } else if (strcasecmp(data, "red_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
960 *value = eq_rgamma; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
961 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
962 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
963 } else if (strcasecmp(data, "green_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
964 *value = eq_ggamma; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
965 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
966 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
967 } else if (strcasecmp(data, "blue_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
968 *value = eq_bgamma; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
969 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
970 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
971 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
972 return VO_TRUE; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
973 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
974 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
975 case VOCTRL_SET_EQUALIZER: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
976 if (image_format == IMGFMT_YV12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
977 va_list va; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
978 int value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
979 va_start(va, data); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
980 value = va_arg(va, int); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
981 va_end(va); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
982 if (strcasecmp(data, "brightness") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
983 eq_bri = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
984 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
|
985 } else if (strcasecmp(data, "contrast") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
986 eq_cont = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
987 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
|
988 } else if (strcasecmp(data, "saturation") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
989 eq_sat = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
990 } else if (strcasecmp(data, "hue") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
991 eq_hue = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
992 } else if (strcasecmp(data, "gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
993 eq_rgamma = eq_ggamma = eq_bgamma = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
994 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
995 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
996 } else if (strcasecmp(data, "red_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
997 eq_rgamma = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
998 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
999 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1000 } else if (strcasecmp(data, "green_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1001 eq_ggamma = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1002 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1003 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1004 } else if (strcasecmp(data, "blue_gamma") == 0) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1005 eq_bgamma = value; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1006 if (use_yuv == YUV_CONVERSION_COMBINERS || |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1007 use_yuv == YUV_CONVERSION_FRAGMENT) break; // not supported |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1008 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1009 update_yuvconv(); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1010 return VO_TRUE; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1011 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1012 break; |
22232 | 1013 case VOCTRL_UPDATE_SCREENINFO: |
1014 update_xinerama_info(); | |
1015 return VO_TRUE; | |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
1016 } |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4448
diff
changeset
|
1017 return VO_NOTIMPL; |
4352 | 1018 } |