Mercurial > mplayer.hg
annotate libvo/vo_xv.c @ 32777:9cc2689e5cd1
Fix r32587: the previous approach to return subtitles in time broke
DVB subtitles due to returning incomplete packets and even for
PGS subtitles resulted in incorrect pts values for the sub packets.
author | reimar |
---|---|
date | Sun, 06 Feb 2011 13:52:05 +0000 |
parents | fbe5c829c69b |
children | 899d817e56fc |
rev | line source |
---|---|
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
1 /* |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
2 * X11 Xv interface |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
3 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
4 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
5 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
6 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
9 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
10 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
11 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
14 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
15 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28250
diff
changeset
|
19 */ |
676
428755f858f7
multi buffering added (modify NUM_BUFFERS in the source)
arpi_esp
parents:
616
diff
changeset
|
20 |
1265 | 21 // Number of buffers _FOR_DOUBLEBUFFERING_MODE_ |
22 // Use option -double to enable double buffering! (default: single buffer) | |
6758
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
23 #define NUM_BUFFERS 3 |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
24 |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
25 /* |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
26 Buffer allocation: |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
27 |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
28 -nodr: |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
29 1: TEMP |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
30 2: 2*TEMP |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
31 |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
32 -dr: |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
33 1: TEMP |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
34 3: 2*STATIC+TEMP |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
35 */ |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
36 |
1 | 37 #include <stdio.h> |
38 #include <stdlib.h> | |
39 #include <string.h> | |
40 | |
41 #include "config.h" | |
5935 | 42 #include "mp_msg.h" |
16958 | 43 #include "help_mp.h" |
1 | 44 #include "video_out.h" |
45 #include "video_out_internal.h" | |
46 | |
47 | |
48 #include <X11/Xlib.h> | |
49 #include <X11/Xutil.h> | |
50 #include <errno.h> | |
51 | |
31 | 52 #include "x11_common.h" |
53 | |
354 | 54 #include "fastmemcpy.h" |
32467 | 55 #include "sub/sub.h" |
2054 | 56 #include "aspect.h" |
350 | 57 |
14742 | 58 #include "subopt-helper.h" |
59 | |
24133 | 60 #include "input/input.h" |
61 | |
25963 | 62 #include "libavutil/common.h" |
22461
c54ad95f852a
Factor out some duplicated code in vo_xv and vo_xvmc
reimar
parents:
22232
diff
changeset
|
63 |
25216 | 64 static const vo_info_t info = { |
12582 | 65 "X11/Xv", |
66 "xv", | |
67 "Gerd Knorr <kraxel@goldbach.in-berlin.de> and others", | |
68 "" | |
1 | 69 }; |
70 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
71 const LIBVO_EXTERN(xv) |
6719
5291d74a60c9
xv support under cygwin - patch by Sycotic Smith <sycotic at linuxmail.org>
alex
parents:
6417
diff
changeset
|
72 #ifdef HAVE_SHM |
1 | 73 #include <sys/ipc.h> |
74 #include <sys/shm.h> | |
75 #include <X11/extensions/XShm.h> | |
6416 | 76 |
77 static XShmSegmentInfo Shminfo[NUM_BUFFERS]; | |
6417
44bca09c1edd
100l accidently removed a line too much (Shmem_Flag)
atmos4
parents:
6416
diff
changeset
|
78 static int Shmem_Flag; |
6416 | 79 #endif |
80 | |
10855 | 81 // Note: depends on the inclusion of X11/extensions/XShm.h |
82 #include <X11/extensions/Xv.h> | |
83 #include <X11/extensions/Xvlib.h> | |
84 | |
85 // FIXME: dynamically allocate this stuff | |
86 static void allocate_xvimage(int); | |
12582 | 87 static unsigned int ver, rel, req, ev, err; |
14742 | 88 static unsigned int formats, adaptors, xv_format; |
12582 | 89 static XvAdaptorInfo *ai = NULL; |
13953 | 90 static XvImageFormatValues *fo=NULL; |
10855 | 91 |
12582 | 92 static int current_buf = 0; |
93 static int current_ip_buf = 0; | |
94 static int num_buffers = 1; // default | |
14782 | 95 static int visible_buf = -1; // -1 means: no buffer was drawn yet |
12582 | 96 static XvImage *xvimage[NUM_BUFFERS]; |
10855 | 97 |
98 | |
1 | 99 static uint32_t image_width; |
100 static uint32_t image_height; | |
101 static uint32_t image_format; | |
102 | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10359
diff
changeset
|
103 static int int_pause; |
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10359
diff
changeset
|
104 |
28511
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
105 static struct vo_rect src_rect; |
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
106 static struct vo_rect dst_rect; |
16958 | 107 static uint32_t max_width = 0, max_height = 0; // zero means: not set |
1 | 108 |
12582 | 109 static void (*draw_alpha_fnc) (int x0, int y0, int w, int h, |
110 unsigned char *src, unsigned char *srca, | |
111 int stride); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
112 |
31231
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
113 static void fixup_osd_position(int *x0, int *y0, int *w, int *h) |
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
114 { |
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
115 *x0 += image_width * (vo_panscan_x >> 1) / (vo_dwidth + vo_panscan_x); |
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
116 *w = av_clip(*w, 0, image_width); |
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
117 *h = av_clip(*h, 0, image_height); |
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
118 *x0 = FFMIN(*x0, image_width - *w); |
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
119 *y0 = FFMIN(*y0, image_height - *h); |
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
120 } |
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
121 |
12582 | 122 static void draw_alpha_yv12(int x0, int y0, int w, int h, |
123 unsigned char *src, unsigned char *srca, | |
124 int stride) | |
125 { | |
31231
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
126 fixup_osd_position(&x0, &y0, &w, &h); |
12582 | 127 vo_draw_alpha_yv12(w, h, src, srca, stride, |
128 xvimage[current_buf]->data + | |
129 xvimage[current_buf]->offsets[0] + | |
130 xvimage[current_buf]->pitches[0] * y0 + x0, | |
131 xvimage[current_buf]->pitches[0]); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
132 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
133 |
12582 | 134 static void draw_alpha_yuy2(int x0, int y0, int w, int h, |
135 unsigned char *src, unsigned char *srca, | |
136 int stride) | |
137 { | |
31231
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
138 fixup_osd_position(&x0, &y0, &w, &h); |
12582 | 139 vo_draw_alpha_yuy2(w, h, src, srca, stride, |
140 xvimage[current_buf]->data + | |
141 xvimage[current_buf]->offsets[0] + | |
142 xvimage[current_buf]->pitches[0] * y0 + 2 * x0, | |
143 xvimage[current_buf]->pitches[0]); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
144 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
145 |
12582 | 146 static void draw_alpha_uyvy(int x0, int y0, int w, int h, |
147 unsigned char *src, unsigned char *srca, | |
148 int stride) | |
149 { | |
31231
77bdb012aaae
Factor out some common code and ensure we will not try to draw OSD
reimar
parents:
30122
diff
changeset
|
150 fixup_osd_position(&x0, &y0, &w, &h); |
12582 | 151 vo_draw_alpha_yuy2(w, h, src, srca, stride, |
152 xvimage[current_buf]->data + | |
153 xvimage[current_buf]->offsets[0] + | |
154 xvimage[current_buf]->pitches[0] * y0 + 2 * x0 + 1, | |
155 xvimage[current_buf]->pitches[0]); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
156 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
157 |
12582 | 158 static void draw_alpha_null(int x0, int y0, int w, int h, |
159 unsigned char *src, unsigned char *srca, | |
160 int stride) | |
161 { | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
162 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
163 |
6786 | 164 |
7757 | 165 static void deallocate_xvimage(int foo); |
166 | |
28511
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
167 static void resize(void) |
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
168 { |
28598
4172d83194f2
Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents:
28511
diff
changeset
|
169 calc_src_dst_rects(image_width, image_height, &src_rect, &dst_rect, NULL, NULL); |
28511
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
170 vo_x11_clearwindow_part(mDisplay, vo_window, dst_rect.width, dst_rect.height, 1); |
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
171 vo_xv_draw_colorkey(dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height); |
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
172 } |
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
173 |
182 | 174 /* |
175 * connect to server, create and map window, | |
1 | 176 * allocate colors and (shared) memory |
177 */ | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15826
diff
changeset
|
178 static int config(uint32_t width, uint32_t height, uint32_t d_width, |
12582 | 179 uint32_t d_height, uint32_t flags, char *title, |
180 uint32_t format) | |
1 | 181 { |
12582 | 182 XVisualInfo vinfo; |
183 XSetWindowAttributes xswa; | |
184 XWindowAttributes attribs; | |
185 unsigned long xswamask; | |
186 int depth; | |
187 | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
188 #ifdef CONFIG_XF86VM |
27952
94bab93a8d17
Simplify handling of VOFLAG_MODESWITCHNG, merge assignment and declaration
reimar
parents:
27951
diff
changeset
|
189 int vm = flags & VOFLAG_MODESWITCHING; |
4426
1ceadec3ea67
using the common -vm code, patch by Santi B«±jar <tiarda@yahoo.es>
arpi
parents:
4406
diff
changeset
|
190 #endif |
1 | 191 |
12582 | 192 image_height = height; |
193 image_width = width; | |
194 image_format = format; | |
2249
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2055
diff
changeset
|
195 |
16958 | 196 if ((max_width != 0 && max_height != 0) && |
197 (image_width > max_width || image_height > max_height)) | |
198 { | |
20765 | 199 mp_msg( MSGT_VO, MSGL_ERR, MSGTR_VO_XV_ImagedimTooHigh, |
16958 | 200 image_width, image_height, max_width, max_height); |
201 return -1; | |
202 } | |
203 | |
12582 | 204 int_pause = 0; |
14782 | 205 visible_buf = -1; |
1 | 206 |
12582 | 207 num_buffers = |
208 vo_doublebuffering ? (vo_directrendering ? NUM_BUFFERS : 2) : 1; | |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
209 |
12582 | 210 /* check image formats */ |
211 { | |
212 unsigned int i; | |
10855 | 213 |
12582 | 214 xv_format = 0; |
215 for (i = 0; i < formats; i++) | |
216 { | |
217 mp_msg(MSGT_VO, MSGL_V, | |
218 "Xvideo image format: 0x%x (%4.4s) %s\n", fo[i].id, | |
219 (char *) &fo[i].id, | |
220 (fo[i].format == XvPacked) ? "packed" : "planar"); | |
221 if (fo[i].id == format) | |
222 xv_format = fo[i].id; | |
223 } | |
224 if (!xv_format) | |
225 return -1; | |
226 } | |
2249
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2055
diff
changeset
|
227 |
723 | 228 { |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
229 #ifdef CONFIG_XF86VM |
12582 | 230 if (vm) |
231 { | |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
232 vo_vm_switch(); |
27895
69b4b8d73b5e
Remove a nonsensical "else" for the video mode switching case.
reimar
parents:
27892
diff
changeset
|
233 } |
12582 | 234 #endif |
235 XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), | |
236 &attribs); | |
237 depth = attribs.depth; | |
238 if (depth != 15 && depth != 16 && depth != 24 && depth != 32) | |
239 depth = 24; | |
240 XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); | |
723 | 241 |
12582 | 242 xswa.background_pixel = 0; |
14742 | 243 if (xv_ck_info.method == CK_METHOD_BACKGROUND) |
244 { | |
245 xswa.background_pixel = xv_colorkey; | |
246 } | |
12582 | 247 xswa.border_pixel = 0; |
248 xswamask = CWBackPixel | CWBorderPixel; | |
1 | 249 |
27891
8742bcad99b5
Use vo_dwidth/vo_dheight for creating the windows instead of d_width/d_height.
reimar
parents:
27890
diff
changeset
|
250 vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, vo_dwidth, vo_dheight, |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23077
diff
changeset
|
251 flags, CopyFromParent, "xv", title); |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23077
diff
changeset
|
252 XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa); |
12582 | 253 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
254 #ifdef CONFIG_XF86VM |
12582 | 255 if (vm) |
256 { | |
257 /* Grab the mouse pointer in our window */ | |
258 if (vo_grabpointer) | |
259 XGrabPointer(mDisplay, vo_window, True, 0, | |
260 GrabModeAsync, GrabModeAsync, | |
261 vo_window, None, CurrentTime); | |
262 XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); | |
263 } | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi B«±jar <tiarda@yahoo.es>
arpi
parents:
4406
diff
changeset
|
264 #endif |
12582 | 265 } |
266 | |
267 mp_msg(MSGT_VO, MSGL_V, "using Xvideo port %d for hw scaling\n", | |
268 xv_port); | |
1 | 269 |
12582 | 270 switch (xv_format) |
271 { | |
272 case IMGFMT_YV12: | |
273 case IMGFMT_I420: | |
274 case IMGFMT_IYUV: | |
275 draw_alpha_fnc = draw_alpha_yv12; | |
276 break; | |
277 case IMGFMT_YUY2: | |
278 case IMGFMT_YVYU: | |
279 draw_alpha_fnc = draw_alpha_yuy2; | |
280 break; | |
281 case IMGFMT_UYVY: | |
282 draw_alpha_fnc = draw_alpha_uyvy; | |
283 break; | |
284 default: | |
285 draw_alpha_fnc = draw_alpha_null; | |
286 } | |
182 | 287 |
12582 | 288 if (vo_config_count) |
289 for (current_buf = 0; current_buf < num_buffers; ++current_buf) | |
290 deallocate_xvimage(current_buf); | |
7757 | 291 |
12582 | 292 for (current_buf = 0; current_buf < num_buffers; ++current_buf) |
293 allocate_xvimage(current_buf); | |
676
428755f858f7
multi buffering added (modify NUM_BUFFERS in the source)
arpi_esp
parents:
616
diff
changeset
|
294 |
12582 | 295 current_buf = 0; |
296 current_ip_buf = 0; | |
1 | 297 |
28511
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
298 resize(); |
5945 | 299 |
12582 | 300 return 0; |
1 | 301 } |
302 | |
182 | 303 static void allocate_xvimage(int foo) |
1 | 304 { |
12582 | 305 /* |
306 * allocate XvImages. FIXME: no error checking, without | |
307 * mit-shm this will bomb... trzing to fix ::atmos | |
308 */ | |
6416 | 309 #ifdef HAVE_SHM |
12582 | 310 if (mLocalDisplay && XShmQueryExtension(mDisplay)) |
311 Shmem_Flag = 1; | |
312 else | |
313 { | |
314 Shmem_Flag = 0; | |
315 mp_msg(MSGT_VO, MSGL_INFO, | |
20765 | 316 MSGTR_LIBVO_XV_SharedMemoryNotSupported); |
12582 | 317 } |
318 if (Shmem_Flag) | |
319 { | |
320 xvimage[foo] = | |
321 (XvImage *) XvShmCreateImage(mDisplay, xv_port, xv_format, | |
322 NULL, image_width, image_height, | |
323 &Shminfo[foo]); | |
1 | 324 |
12582 | 325 Shminfo[foo].shmid = |
326 shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | 0777); | |
327 Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0); | |
328 Shminfo[foo].readOnly = False; | |
1 | 329 |
12582 | 330 xvimage[foo]->data = Shminfo[foo].shmaddr; |
331 XShmAttach(mDisplay, &Shminfo[foo]); | |
332 XSync(mDisplay, False); | |
333 shmctl(Shminfo[foo].shmid, IPC_RMID, 0); | |
334 } else | |
6416 | 335 #endif |
12582 | 336 { |
337 xvimage[foo] = | |
338 (XvImage *) XvCreateImage(mDisplay, xv_port, xv_format, NULL, | |
339 image_width, image_height); | |
340 xvimage[foo]->data = malloc(xvimage[foo]->data_size); | |
341 XSync(mDisplay, False); | |
342 } | |
343 memset(xvimage[foo]->data, 128, xvimage[foo]->data_size); | |
344 return; | |
1 | 345 } |
346 | |
1794 | 347 static void deallocate_xvimage(int foo) |
348 { | |
6416 | 349 #ifdef HAVE_SHM |
12582 | 350 if (Shmem_Flag) |
351 { | |
352 XShmDetach(mDisplay, &Shminfo[foo]); | |
353 shmdt(Shminfo[foo].shmaddr); | |
354 } else | |
6416 | 355 #endif |
12582 | 356 { |
357 free(xvimage[foo]->data); | |
358 } | |
359 XFree(xvimage[foo]); | |
360 | |
361 XSync(mDisplay, False); | |
362 return; | |
1794 | 363 } |
364 | |
14782 | 365 static inline void put_xvimage( XvImage * xvi ) |
366 { | |
367 #ifdef HAVE_SHM | |
368 if (Shmem_Flag) | |
369 { | |
370 XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, | |
28511
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
371 xvi, |
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
372 src_rect.left, src_rect.top, src_rect.width, src_rect.height, |
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
373 dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height, |
14782 | 374 False); |
375 } else | |
376 #endif | |
377 { | |
378 XvPutImage(mDisplay, xv_port, vo_window, vo_gc, | |
28511
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
379 xvi, |
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
380 src_rect.left, src_rect.top, src_rect.width, src_rect.height, |
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
381 dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height); |
14782 | 382 } |
383 } | |
384 | |
31 | 385 static void check_events(void) |
1 | 386 { |
12582 | 387 int e = vo_x11_check_events(mDisplay); |
388 | |
14742 | 389 if (e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE) |
390 { | |
28511
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
391 resize(); |
14742 | 392 } |
393 | |
12582 | 394 if ((e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE) && int_pause) |
14782 | 395 { |
396 /* did we already draw a buffer */ | |
397 if ( visible_buf != -1 ) | |
398 { | |
399 /* redraw the last visible buffer */ | |
400 put_xvimage( xvimage[visible_buf] ); | |
401 } | |
402 } | |
1 | 403 } |
404 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1265
diff
changeset
|
405 static void draw_osd(void) |
12582 | 406 { |
407 vo_draw_text(image_width - | |
408 image_width * vo_panscan_x / (vo_dwidth + vo_panscan_x), | |
409 image_height, draw_alpha_fnc); | |
410 } | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1265
diff
changeset
|
411 |
182 | 412 static void flip_page(void) |
1 | 413 { |
14782 | 414 put_xvimage( xvimage[current_buf] ); |
6304
ee65527096c2
pan&scan support with -vo xv by ?? <mplayer@svennevid.net>
arpi
parents:
6295
diff
changeset
|
415 |
14782 | 416 /* remember the currently visible buffer */ |
417 visible_buf = current_buf; | |
418 | |
12582 | 419 if (num_buffers > 1) |
420 { | |
421 current_buf = | |
422 vo_directrendering ? 0 : ((current_buf + 1) % num_buffers); | |
423 XFlush(mDisplay); | |
424 } else | |
425 XSync(mDisplay, False); | |
426 return; | |
1 | 427 } |
428 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15826
diff
changeset
|
429 static int draw_slice(uint8_t * image[], int stride[], int w, int h, |
12582 | 430 int x, int y) |
1 | 431 { |
12582 | 432 uint8_t *dst; |
182 | 433 |
12582 | 434 dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[0] + |
435 xvimage[current_buf]->pitches[0] * y + x; | |
436 memcpy_pic(dst, image[0], w, h, xvimage[current_buf]->pitches[0], | |
437 stride[0]); | |
182 | 438 |
12582 | 439 x /= 2; |
440 y /= 2; | |
441 w /= 2; | |
442 h /= 2; | |
1 | 443 |
12582 | 444 dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[1] + |
445 xvimage[current_buf]->pitches[1] * y + x; | |
446 if (image_format != IMGFMT_YV12) | |
447 memcpy_pic(dst, image[1], w, h, xvimage[current_buf]->pitches[1], | |
448 stride[1]); | |
449 else | |
450 memcpy_pic(dst, image[2], w, h, xvimage[current_buf]->pitches[1], | |
451 stride[2]); | |
5316 | 452 |
12582 | 453 dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[2] + |
454 xvimage[current_buf]->pitches[2] * y + x; | |
455 if (image_format == IMGFMT_YV12) | |
456 memcpy_pic(dst, image[1], w, h, xvimage[current_buf]->pitches[1], | |
457 stride[1]); | |
458 else | |
459 memcpy_pic(dst, image[2], w, h, xvimage[current_buf]->pitches[1], | |
460 stride[2]); | |
6231 | 461 |
12582 | 462 return 0; |
1 | 463 } |
464 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15826
diff
changeset
|
465 static int draw_frame(uint8_t * src[]) |
12582 | 466 { |
27883
96831cf06109
Remove code from unused and since ages deprecated draw_frame function.
reimar
parents:
27882
diff
changeset
|
467 return VO_ERROR; |
1 | 468 } |
469 | |
12582 | 470 static uint32_t draw_image(mp_image_t * mpi) |
471 { | |
472 if (mpi->flags & MP_IMGFLAG_DIRECT) | |
473 { | |
474 // direct rendering: | |
475 current_buf = (int) (mpi->priv); // hack! | |
476 return VO_TRUE; | |
6760 | 477 } |
12582 | 478 if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK) |
479 return VO_TRUE; // done | |
480 if (mpi->flags & MP_IMGFLAG_PLANAR) | |
481 { | |
482 draw_slice(mpi->planes, mpi->stride, mpi->w, mpi->h, 0, 0); | |
483 return VO_TRUE; | |
7684 | 484 } |
12582 | 485 if (mpi->flags & MP_IMGFLAG_YUV) |
486 { | |
487 // packed YUV: | |
488 memcpy_pic(xvimage[current_buf]->data + | |
489 xvimage[current_buf]->offsets[0], mpi->planes[0], | |
490 mpi->w * (mpi->bpp / 8), mpi->h, | |
491 xvimage[current_buf]->pitches[0], mpi->stride[0]); | |
492 return VO_TRUE; | |
7684 | 493 } |
12582 | 494 return VO_FALSE; // not (yet) supported |
6760 | 495 } |
496 | |
12582 | 497 static uint32_t get_image(mp_image_t * mpi) |
498 { | |
499 int buf = current_buf; // we shouldn't change current_buf unless we do DR! | |
500 | |
501 if (mpi->type == MP_IMGTYPE_STATIC && num_buffers > 1) | |
502 return VO_FALSE; // it is not static | |
503 if (mpi->imgfmt != image_format) | |
504 return VO_FALSE; // needs conversion :( | |
4980 | 505 // if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; // slow video ram |
12582 | 506 if (mpi->flags & MP_IMGFLAG_READABLE && |
507 (mpi->type == MP_IMGTYPE_IPB || mpi->type == MP_IMGTYPE_IP)) | |
508 { | |
509 // reference (I/P) frame of IP or IPB: | |
510 if (num_buffers < 2) | |
511 return VO_FALSE; // not enough | |
512 current_ip_buf ^= 1; | |
513 // for IPB with 2 buffers we can DR only one of the 2 P frames: | |
514 if (mpi->type == MP_IMGTYPE_IPB && num_buffers < 3 | |
515 && current_ip_buf) | |
516 return VO_FALSE; | |
517 buf = current_ip_buf; | |
518 if (mpi->type == MP_IMGTYPE_IPB) | |
519 ++buf; // preserve space for B | |
6758
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
520 } |
12582 | 521 if (mpi->height > xvimage[buf]->height) |
522 return VO_FALSE; //buffer to small | |
523 if (mpi->width * (mpi->bpp / 8) > xvimage[buf]->pitches[0]) | |
524 return VO_FALSE; //buffer to small | |
525 if ((mpi->flags & (MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_ACCEPT_WIDTH)) | |
526 || (mpi->width * (mpi->bpp / 8) == xvimage[buf]->pitches[0])) | |
527 { | |
528 current_buf = buf; | |
529 mpi->planes[0] = | |
530 xvimage[current_buf]->data + xvimage[current_buf]->offsets[0]; | |
531 mpi->stride[0] = xvimage[current_buf]->pitches[0]; | |
532 mpi->width = mpi->stride[0] / (mpi->bpp / 8); | |
533 if (mpi->flags & MP_IMGFLAG_PLANAR) | |
534 { | |
535 if (mpi->flags & MP_IMGFLAG_SWAPPED) | |
536 { | |
537 // I420 | |
538 mpi->planes[1] = | |
539 xvimage[current_buf]->data + | |
540 xvimage[current_buf]->offsets[1]; | |
541 mpi->planes[2] = | |
542 xvimage[current_buf]->data + | |
543 xvimage[current_buf]->offsets[2]; | |
544 mpi->stride[1] = xvimage[current_buf]->pitches[1]; | |
545 mpi->stride[2] = xvimage[current_buf]->pitches[2]; | |
546 } else | |
547 { | |
548 // YV12 | |
549 mpi->planes[1] = | |
550 xvimage[current_buf]->data + | |
551 xvimage[current_buf]->offsets[2]; | |
552 mpi->planes[2] = | |
553 xvimage[current_buf]->data + | |
554 xvimage[current_buf]->offsets[1]; | |
555 mpi->stride[1] = xvimage[current_buf]->pitches[2]; | |
556 mpi->stride[2] = xvimage[current_buf]->pitches[1]; | |
557 } | |
558 } | |
559 mpi->flags |= MP_IMGFLAG_DIRECT; | |
560 mpi->priv = (void *) current_buf; | |
561 // printf("mga: get_image() SUCCESS -> Direct Rendering ENABLED\n"); | |
562 return VO_TRUE; | |
4980 | 563 } |
564 return VO_FALSE; | |
565 } | |
566 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15826
diff
changeset
|
567 static int query_format(uint32_t format) |
1 | 568 { |
10855 | 569 uint32_t i; |
12582 | 570 int flag = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_OSD | VFCAP_ACCEPT_STRIDE; // FIXME! check for DOWN |
571 | |
572 /* check image formats */ | |
573 for (i = 0; i < formats; i++) | |
574 { | |
575 if (fo[i].id == format) | |
576 return flag; //xv_format = fo[i].id; | |
577 } | |
578 return 0; | |
1 | 579 } |
580 | |
12582 | 581 static void uninit(void) |
1852 | 582 { |
12582 | 583 int i; |
584 | |
585 if (!vo_config_count) | |
586 return; | |
14782 | 587 visible_buf = -1; |
12582 | 588 XvFreeAdaptorInfo(ai); |
589 ai = NULL; | |
13953 | 590 if(fo){ |
591 XFree(fo); | |
592 fo=NULL; | |
593 } | |
12582 | 594 for (i = 0; i < num_buffers; i++) |
595 deallocate_xvimage(i); | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
596 #ifdef CONFIG_XF86VM |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
597 vo_vm_close(); |
6016 | 598 #endif |
24133 | 599 mp_input_rm_event_fd(ConnectionNumber(mDisplay)); |
12582 | 600 vo_x11_uninit(); |
322
4e69a8e2700a
Screensaver and monitor powersafe function is switched off when playing a
laaz
parents:
249
diff
changeset
|
601 } |
1 | 602 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15826
diff
changeset
|
603 static int preinit(const char *arg) |
4352 | 604 { |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
605 XvPortID xv_p; |
12582 | 606 int busy_ports = 0; |
10855 | 607 unsigned int i; |
14742 | 608 strarg_t ck_src_arg = { 0, NULL }; |
609 strarg_t ck_method_arg = { 0, NULL }; | |
26730
41794a5fb100
Add a new suboption to -vo xv and -vo xvmc that allows selection
ben
parents:
25963
diff
changeset
|
610 int xv_adaptor = -1; |
14742 | 611 |
28828
56eee6ffba9b
Make data related to suboption parsing const in libvo
reimar
parents:
28598
diff
changeset
|
612 const opt_t subopts[] = |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28829
diff
changeset
|
613 { |
14742 | 614 /* name arg type arg var test */ |
30122
1772a5171ac7
Fix function declarations to avoid casting function pointers.
reimar
parents:
29526
diff
changeset
|
615 { "port", OPT_ARG_INT, &xv_port, int_pos }, |
1772a5171ac7
Fix function declarations to avoid casting function pointers.
reimar
parents:
29526
diff
changeset
|
616 { "adaptor", OPT_ARG_INT, &xv_adaptor, int_non_neg }, |
14742 | 617 { "ck", OPT_ARG_STR, &ck_src_arg, xv_test_ck }, |
618 { "ck-method", OPT_ARG_STR, &ck_method_arg, xv_test_ckm }, | |
619 { NULL } | |
620 }; | |
12582 | 621 |
10826 | 622 xv_port = 0; |
623 | |
14742 | 624 /* parse suboptions */ |
625 if ( subopt_parse( arg, subopts ) != 0 ) | |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4658
diff
changeset
|
626 { |
14742 | 627 return -1; |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4658
diff
changeset
|
628 } |
14742 | 629 |
630 /* modify colorkey settings according to the given options */ | |
631 xv_setup_colorkeyhandling( ck_method_arg.str, ck_src_arg.str ); | |
632 | |
12582 | 633 if (!vo_init()) |
634 return -1; | |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
635 |
12582 | 636 /* check for Xvideo extension */ |
637 if (Success != XvQueryExtension(mDisplay, &ver, &rel, &req, &ev, &err)) | |
638 { | |
639 mp_msg(MSGT_VO, MSGL_ERR, | |
20765 | 640 MSGTR_LIBVO_XV_XvNotSupportedByX11); |
12582 | 641 return -1; |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
642 } |
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
643 |
12582 | 644 /* check for Xvideo support */ |
645 if (Success != | |
646 XvQueryAdaptors(mDisplay, DefaultRootWindow(mDisplay), &adaptors, | |
647 &ai)) | |
648 { | |
20765 | 649 mp_msg(MSGT_VO, MSGL_ERR, MSGTR_LIBVO_XV_XvQueryAdaptorsFailed); |
12582 | 650 return -1; |
651 } | |
652 | |
653 /* check adaptors */ | |
654 if (xv_port) | |
655 { | |
10839 | 656 int port_found; |
12582 | 657 |
658 for (port_found = 0, i = 0; !port_found && i < adaptors; i++) | |
659 { | |
660 if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask)) | |
661 { | |
662 for (xv_p = ai[i].base_id; | |
663 xv_p < ai[i].base_id + ai[i].num_ports; ++xv_p) | |
664 { | |
665 if (xv_p == xv_port) | |
666 { | |
10839 | 667 port_found = 1; |
668 break; | |
669 } | |
670 } | |
671 } | |
672 } | |
12582 | 673 if (port_found) |
674 { | |
10839 | 675 if (XvGrabPort(mDisplay, xv_port, CurrentTime)) |
676 xv_port = 0; | |
12582 | 677 } else |
678 { | |
679 mp_msg(MSGT_VO, MSGL_WARN, | |
20765 | 680 MSGTR_LIBVO_XV_InvalidPortParameter); |
10839 | 681 xv_port = 0; |
682 } | |
10826 | 683 } |
12582 | 684 |
685 for (i = 0; i < adaptors && xv_port == 0; i++) | |
686 { | |
26730
41794a5fb100
Add a new suboption to -vo xv and -vo xvmc that allows selection
ben
parents:
25963
diff
changeset
|
687 /* check if adaptor number has been specified */ |
41794a5fb100
Add a new suboption to -vo xv and -vo xvmc that allows selection
ben
parents:
25963
diff
changeset
|
688 if (xv_adaptor != -1 && xv_adaptor != i) |
41794a5fb100
Add a new suboption to -vo xv and -vo xvmc that allows selection
ben
parents:
25963
diff
changeset
|
689 continue; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28829
diff
changeset
|
690 |
12582 | 691 if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask)) |
692 { | |
693 for (xv_p = ai[i].base_id; | |
694 xv_p < ai[i].base_id + ai[i].num_ports; ++xv_p) | |
695 if (!XvGrabPort(mDisplay, xv_p, CurrentTime)) | |
696 { | |
697 xv_port = xv_p; | |
27031
0f7770b2230d
Move message about which adapter is used to verbose mode.
diego
parents:
26755
diff
changeset
|
698 mp_msg(MSGT_VO, MSGL_V, |
0f7770b2230d
Move message about which adapter is used to verbose mode.
diego
parents:
26755
diff
changeset
|
699 "[VO_XV] Using Xv Adapter #%d (%s)\n", |
0f7770b2230d
Move message about which adapter is used to verbose mode.
diego
parents:
26755
diff
changeset
|
700 i, ai[i].name); |
12582 | 701 break; |
702 } else | |
703 { | |
704 mp_msg(MSGT_VO, MSGL_WARN, | |
20765 | 705 MSGTR_LIBVO_XV_CouldNotGrabPort, (int) xv_p); |
12582 | 706 ++busy_ports; |
707 } | |
708 } | |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
709 } |
12582 | 710 if (!xv_port) |
711 { | |
712 if (busy_ports) | |
713 mp_msg(MSGT_VO, MSGL_ERR, | |
20765 | 714 MSGTR_LIBVO_XV_CouldNotFindFreePort); |
12582 | 715 else |
716 mp_msg(MSGT_VO, MSGL_ERR, | |
20765 | 717 MSGTR_LIBVO_XV_NoXvideoSupport); |
12582 | 718 return -1; |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
719 } |
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
720 |
14742 | 721 if ( !vo_xv_init_colorkey() ) |
7857
3c690d2ad1ac
MPlayer being unable to display video properly on many nVidia graphics cards.
arpi
parents:
7848
diff
changeset
|
722 { |
14742 | 723 return -1; // bail out, colorkey setup failed |
7857
3c690d2ad1ac
MPlayer being unable to display video properly on many nVidia graphics cards.
arpi
parents:
7848
diff
changeset
|
724 } |
15826
db966bdf6f5b
Try to set XV_SYNC_TO_VBLANK to enable vsync on non-overlay xv adapters.
reimar
parents:
15540
diff
changeset
|
725 vo_xv_enable_vsync(); |
16958 | 726 vo_xv_get_max_img_dim( &max_width, &max_height ); |
7857
3c690d2ad1ac
MPlayer being unable to display video properly on many nVidia graphics cards.
arpi
parents:
7848
diff
changeset
|
727 |
12582 | 728 fo = XvListImageFormats(mDisplay, xv_port, (int *) &formats); |
5566 | 729 |
24133 | 730 mp_input_add_event_fd(ConnectionNumber(mDisplay), check_events); |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4658
diff
changeset
|
731 return 0; |
4352 | 732 } |
1 | 733 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15826
diff
changeset
|
734 static int control(uint32_t request, void *data, ...) |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
735 { |
12582 | 736 switch (request) |
737 { | |
738 case VOCTRL_PAUSE: | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
26730
diff
changeset
|
739 return int_pause = 1; |
12582 | 740 case VOCTRL_RESUME: |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
26730
diff
changeset
|
741 return int_pause = 0; |
12582 | 742 case VOCTRL_QUERY_FORMAT: |
743 return query_format(*((uint32_t *) data)); | |
744 case VOCTRL_GET_IMAGE: | |
745 return get_image(data); | |
746 case VOCTRL_DRAW_IMAGE: | |
747 return draw_image(data); | |
748 case VOCTRL_GUISUPPORT: | |
749 return VO_TRUE; | |
750 case VOCTRL_GET_PANSCAN: | |
751 return VO_TRUE; | |
752 case VOCTRL_FULLSCREEN: | |
753 vo_x11_fullscreen(); | |
754 /* indended, fallthrough to update panscan on fullscreen/windowed switch */ | |
755 case VOCTRL_SET_PANSCAN: | |
28511
db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents:
28446
diff
changeset
|
756 resize(); |
12582 | 757 return VO_TRUE; |
758 case VOCTRL_SET_EQUALIZER: | |
759 { | |
760 va_list ap; | |
761 int value; | |
762 | |
763 va_start(ap, data); | |
764 value = va_arg(ap, int); | |
765 | |
766 va_end(ap); | |
767 | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
26730
diff
changeset
|
768 return vo_xv_set_eq(xv_port, data, value); |
12582 | 769 } |
770 case VOCTRL_GET_EQUALIZER: | |
771 { | |
772 va_list ap; | |
773 int *value; | |
774 | |
775 va_start(ap, data); | |
776 value = va_arg(ap, int *); | |
777 | |
778 va_end(ap); | |
779 | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
26730
diff
changeset
|
780 return vo_xv_get_eq(xv_port, data, value); |
12582 | 781 } |
782 case VOCTRL_ONTOP: | |
783 vo_x11_ontop(); | |
784 return VO_TRUE; | |
22232 | 785 case VOCTRL_UPDATE_SCREENINFO: |
786 update_xinerama_info(); | |
787 return VO_TRUE; | |
12582 | 788 } |
789 return VO_NOTIMPL; | |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
790 } |