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