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