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