Mercurial > mplayer.hg
annotate libvo/vo_xv.c @ 14742:76d461a061df
Unified colorkey code for vo xv and vo xvmc.
Made the code also more flexible.
Colorkey drawing is now by default done as
proposed by Marko Macek.
Patch also approved by iive.
author | al |
---|---|
date | Sun, 20 Feb 2005 22:43:25 +0000 |
parents | 3dbebe82fc37 |
children | b0b668d69632 |
rev | line source |
---|---|
7757 | 1 /* vo_xv.c, X11 Xv interface */ |
676
428755f858f7
multi buffering added (modify NUM_BUFFERS in the source)
arpi_esp
parents:
616
diff
changeset
|
2 |
1265 | 3 // Number of buffers _FOR_DOUBLEBUFFERING_MODE_ |
4 // 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
|
5 #define NUM_BUFFERS 3 |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
6 |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
7 /* |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
8 Buffer allocation: |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
9 |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
10 -nodr: |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
11 1: TEMP |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
12 2: 2*TEMP |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
13 |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
14 -dr: |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
15 1: TEMP |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
16 3: 2*STATIC+TEMP |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
17 */ |
ecc71f27bfd7
DR1 IP/IPB supoprt (I/P only with -double) -- OSD *must be* disabled! :)
arpi
parents:
6755
diff
changeset
|
18 |
1 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 | |
23 #include "config.h" | |
5935 | 24 #include "mp_msg.h" |
1 | 25 #include "video_out.h" |
26 #include "video_out_internal.h" | |
27 | |
28 | |
29 #include <X11/Xlib.h> | |
30 #include <X11/Xutil.h> | |
31 #include <errno.h> | |
32 | |
31 | 33 #include "x11_common.h" |
34 | |
354 | 35 #include "fastmemcpy.h" |
616 | 36 #include "sub.h" |
2054 | 37 #include "aspect.h" |
350 | 38 |
14742 | 39 #include "subopt-helper.h" |
40 | |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
41 #ifdef HAVE_NEW_GUI |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13242
diff
changeset
|
42 #include "Gui/interface.h" |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
43 #endif |
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
44 |
12582 | 45 static vo_info_t info = { |
46 "X11/Xv", | |
47 "xv", | |
48 "Gerd Knorr <kraxel@goldbach.in-berlin.de> and others", | |
49 "" | |
1 | 50 }; |
51 | |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
7857
diff
changeset
|
52 LIBVO_EXTERN(xv) |
6719
5291d74a60c9
xv support under cygwin - patch by Sycotic Smith <sycotic at linuxmail.org>
alex
parents:
6417
diff
changeset
|
53 #ifdef HAVE_SHM |
1 | 54 #include <sys/ipc.h> |
55 #include <sys/shm.h> | |
56 #include <X11/extensions/XShm.h> | |
6416 | 57 /* since it doesn't seem to be defined on some platforms */ |
12582 | 58 int XShmGetEventBase(Display *); |
6416 | 59 |
60 static XShmSegmentInfo Shminfo[NUM_BUFFERS]; | |
6417
44bca09c1edd
100l accidently removed a line too much (Shmem_Flag)
atmos4
parents:
6416
diff
changeset
|
61 static int Shmem_Flag; |
6416 | 62 #endif |
63 | |
10855 | 64 // Note: depends on the inclusion of X11/extensions/XShm.h |
65 #include <X11/extensions/Xv.h> | |
66 #include <X11/extensions/Xvlib.h> | |
67 | |
68 // FIXME: dynamically allocate this stuff | |
69 static void allocate_xvimage(int); | |
12582 | 70 static unsigned int ver, rel, req, ev, err; |
14742 | 71 static unsigned int formats, adaptors, xv_format; |
12582 | 72 static XvAdaptorInfo *ai = NULL; |
13953 | 73 static XvImageFormatValues *fo=NULL; |
10855 | 74 |
12582 | 75 static int current_buf = 0; |
76 static int current_ip_buf = 0; | |
77 static int num_buffers = 1; // default | |
78 static XvImage *xvimage[NUM_BUFFERS]; | |
10855 | 79 |
80 | |
1 | 81 static uint32_t image_width; |
82 static uint32_t image_height; | |
83 static uint32_t image_format; | |
4629 | 84 static int flip_flag; |
1 | 85 |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10359
diff
changeset
|
86 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
|
87 |
12582 | 88 static Window mRoot; |
89 static uint32_t drwX, drwY, drwBorderWidth, drwDepth; | |
90 static uint32_t dwidth, dheight; | |
1 | 91 |
12582 | 92 static void (*draw_alpha_fnc) (int x0, int y0, int w, int h, |
93 unsigned char *src, unsigned char *srca, | |
94 int stride); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
95 |
12582 | 96 static void draw_alpha_yv12(int x0, int y0, int w, int h, |
97 unsigned char *src, unsigned char *srca, | |
98 int stride) | |
99 { | |
100 x0 += image_width * (vo_panscan_x >> 1) / (vo_dwidth + vo_panscan_x); | |
101 vo_draw_alpha_yv12(w, h, src, srca, stride, | |
102 xvimage[current_buf]->data + | |
103 xvimage[current_buf]->offsets[0] + | |
104 xvimage[current_buf]->pitches[0] * y0 + x0, | |
105 xvimage[current_buf]->pitches[0]); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
106 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
107 |
12582 | 108 static void draw_alpha_yuy2(int x0, int y0, int w, int h, |
109 unsigned char *src, unsigned char *srca, | |
110 int stride) | |
111 { | |
112 x0 += image_width * (vo_panscan_x >> 1) / (vo_dwidth + vo_panscan_x); | |
113 vo_draw_alpha_yuy2(w, h, src, srca, stride, | |
114 xvimage[current_buf]->data + | |
115 xvimage[current_buf]->offsets[0] + | |
116 xvimage[current_buf]->pitches[0] * y0 + 2 * x0, | |
117 xvimage[current_buf]->pitches[0]); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
118 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
119 |
12582 | 120 static void draw_alpha_uyvy(int x0, int y0, int w, int h, |
121 unsigned char *src, unsigned char *srca, | |
122 int stride) | |
123 { | |
124 x0 += image_width * (vo_panscan_x >> 1) / (vo_dwidth + vo_panscan_x); | |
125 vo_draw_alpha_yuy2(w, h, src, srca, stride, | |
126 xvimage[current_buf]->data + | |
127 xvimage[current_buf]->offsets[0] + | |
128 xvimage[current_buf]->pitches[0] * y0 + 2 * x0 + 1, | |
129 xvimage[current_buf]->pitches[0]); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
130 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
131 |
12582 | 132 static void draw_alpha_null(int x0, int y0, int w, int h, |
133 unsigned char *src, unsigned char *srca, | |
134 int stride) | |
135 { | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
136 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
137 |
6786 | 138 |
7757 | 139 static void deallocate_xvimage(int foo); |
140 | |
182 | 141 /* |
142 * connect to server, create and map window, | |
1 | 143 * allocate colors and (shared) memory |
144 */ | |
12582 | 145 static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, |
146 uint32_t d_height, uint32_t flags, char *title, | |
147 uint32_t format) | |
1 | 148 { |
922
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
844
diff
changeset
|
149 // int screen; |
12582 | 150 char *hello = (title == NULL) ? "Xv render" : title; |
151 | |
922
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
844
diff
changeset
|
152 // char *name = ":0.0"; |
12582 | 153 XSizeHints hint; |
154 XVisualInfo vinfo; | |
155 XGCValues xgcv; | |
156 XSetWindowAttributes xswa; | |
157 XWindowAttributes attribs; | |
158 unsigned long xswamask; | |
159 int depth; | |
160 | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi B«±jar <tiarda@yahoo.es>
arpi
parents:
4406
diff
changeset
|
161 #ifdef HAVE_XF86VM |
12582 | 162 int vm = 0; |
163 unsigned int modeline_width, modeline_height; | |
164 static uint32_t vm_width; | |
165 static uint32_t vm_height; | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi B«±jar <tiarda@yahoo.es>
arpi
parents:
4406
diff
changeset
|
166 #endif |
1 | 167 |
12582 | 168 panscan_init(); |
6304
ee65527096c2
pan&scan support with -vo xv by ?? <mplayer@svennevid.net>
arpi
parents:
6295
diff
changeset
|
169 |
12582 | 170 aspect_save_orig(width, height); |
171 aspect_save_prescale(d_width, d_height); | |
172 | |
173 image_height = height; | |
174 image_width = width; | |
175 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
|
176 |
12582 | 177 vo_mouse_autohide = 1; |
178 | |
179 int_pause = 0; | |
1 | 180 |
12582 | 181 vo_dx = (vo_screenwidth - d_width) / 2; |
182 vo_dy = (vo_screenheight - d_height) / 2; | |
183 geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth, | |
184 vo_screenheight); | |
185 vo_dwidth = d_width; | |
186 vo_dheight = d_height; | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10359
diff
changeset
|
187 |
4978 | 188 #ifdef HAVE_XF86VM |
12582 | 189 if (flags & 0x02) |
190 vm = 1; | |
4978 | 191 #endif |
12582 | 192 flip_flag = flags & 8; |
193 num_buffers = | |
194 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
|
195 |
12582 | 196 /* check image formats */ |
197 { | |
198 unsigned int i; | |
10855 | 199 |
12582 | 200 xv_format = 0; |
201 for (i = 0; i < formats; i++) | |
202 { | |
203 mp_msg(MSGT_VO, MSGL_V, | |
204 "Xvideo image format: 0x%x (%4.4s) %s\n", fo[i].id, | |
205 (char *) &fo[i].id, | |
206 (fo[i].format == XvPacked) ? "packed" : "planar"); | |
207 if (fo[i].id == format) | |
208 xv_format = fo[i].id; | |
209 } | |
210 if (!xv_format) | |
211 return -1; | |
212 } | |
213 aspect_save_screenres(vo_screenwidth, vo_screenheight); | |
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
|
214 |
1775 | 215 #ifdef HAVE_NEW_GUI |
12582 | 216 if (use_gui) |
217 guiGetEvent(guiSetShVideo, 0); // let the GUI to setup/resize our window | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi B«±jar <tiarda@yahoo.es>
arpi
parents:
4406
diff
changeset
|
218 else |
1ceadec3ea67
using the common -vm code, patch by Santi B«±jar <tiarda@yahoo.es>
arpi
parents:
4406
diff
changeset
|
219 #endif |
723 | 220 { |
12582 | 221 hint.x = vo_dx; |
222 hint.y = vo_dy; | |
223 aspect(&d_width, &d_height, A_NOZOOM); | |
224 hint.width = d_width; | |
225 hint.height = d_height; | |
226 #ifdef HAVE_XF86VM | |
227 if (vm) | |
228 { | |
229 if ((d_width == 0) && (d_height == 0)) | |
230 { | |
231 vm_width = image_width; | |
232 vm_height = image_height; | |
233 } else | |
234 { | |
235 vm_width = d_width; | |
236 vm_height = d_height; | |
237 } | |
238 vo_vm_switch(vm_width, vm_height, &modeline_width, | |
239 &modeline_height); | |
240 hint.x = (vo_screenwidth - modeline_width) / 2; | |
241 hint.y = (vo_screenheight - modeline_height) / 2; | |
242 hint.width = modeline_width; | |
243 hint.height = modeline_height; | |
244 aspect_save_screenres(modeline_width, modeline_height); | |
245 } else | |
246 #endif | |
247 if (vo_fs) | |
248 { | |
2054 | 249 #ifdef X11_FULLSCREEN |
12582 | 250 /* this code replaces X11_FULLSCREEN hack in mplayer.c |
251 * aspect() is available through aspect.h for all vos. | |
252 * besides zooming should only be done with -zoom, | |
253 * but I leave the old -fs behaviour so users don't get | |
254 * irritated for now (and send lots o' mails ;) ::atmos | |
255 */ | |
2031
624df8ea0e0e
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
1924
diff
changeset
|
256 |
12582 | 257 aspect(&d_width, &d_height, A_ZOOM); |
2031
624df8ea0e0e
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
1924
diff
changeset
|
258 #endif |
624df8ea0e0e
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
1924
diff
changeset
|
259 |
12582 | 260 } |
5945 | 261 // dwidth=d_width; dheight=d_height; //XXX: what are the copy vars used for? |
12582 | 262 vo_dwidth = d_width; |
263 vo_dheight = d_height; | |
264 hint.flags = PPosition | PSize /* | PBaseSize */ ; | |
265 hint.base_width = hint.width; | |
266 hint.base_height = hint.height; | |
267 XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), | |
268 &attribs); | |
269 depth = attribs.depth; | |
270 if (depth != 15 && depth != 16 && depth != 24 && depth != 32) | |
271 depth = 24; | |
272 XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); | |
723 | 273 |
12582 | 274 xswa.background_pixel = 0; |
14742 | 275 if (xv_ck_info.method == CK_METHOD_BACKGROUND) |
276 { | |
277 xswa.background_pixel = xv_colorkey; | |
278 } | |
12582 | 279 xswa.border_pixel = 0; |
280 xswamask = CWBackPixel | CWBorderPixel; | |
1 | 281 |
12582 | 282 if (WinID >= 0) |
283 { | |
284 vo_window = WinID ? ((Window) WinID) : mRootWin; | |
285 if (WinID) | |
286 { | |
287 XUnmapWindow(mDisplay, vo_window); | |
288 XChangeWindowAttributes(mDisplay, vo_window, xswamask, | |
289 &xswa); | |
290 vo_x11_selectinput_witherr(mDisplay, vo_window, | |
291 StructureNotifyMask | | |
292 KeyPressMask | | |
293 PropertyChangeMask | | |
294 PointerMotionMask | | |
295 ButtonPressMask | | |
296 ButtonReleaseMask | | |
297 ExposureMask); | |
298 XMapWindow(mDisplay, vo_window); | |
299 } else | |
300 { | |
301 drwX = vo_dx; | |
302 drwY = vo_dy; | |
303 } | |
304 } else if (vo_window == None) | |
305 { | |
306 vo_window = | |
307 vo_x11_create_smooth_window(mDisplay, mRootWin, | |
308 vinfo.visual, hint.x, hint.y, | |
309 hint.width, hint.height, depth, | |
310 CopyFromParent); | |
14742 | 311 XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa); |
3830 | 312 |
12582 | 313 vo_x11_classhint(mDisplay, vo_window, "xv"); |
314 vo_hidecursor(mDisplay, vo_window); | |
3830 | 315 |
12582 | 316 vo_x11_selectinput_witherr(mDisplay, vo_window, |
317 StructureNotifyMask | KeyPressMask | | |
318 PropertyChangeMask | ((WinID == 0) ? | |
319 0 | |
320 : | |
321 (PointerMotionMask | |
322 | | |
323 ButtonPressMask | |
324 | | |
325 ButtonReleaseMask | |
326 | | |
327 ExposureMask))); | |
328 XSetStandardProperties(mDisplay, vo_window, hello, hello, None, | |
329 NULL, 0, &hint); | |
330 XSetWMNormalHints(mDisplay, vo_window, &hint); | |
331 XMapWindow(mDisplay, vo_window); | |
332 if (flags & 1) | |
333 vo_x11_fullscreen(); | |
334 else | |
335 { | |
3990 | 336 #ifdef HAVE_XINERAMA |
12582 | 337 vo_x11_xinerama_move(mDisplay, vo_window); |
3990 | 338 #endif |
12582 | 339 vo_x11_sizehint(hint.x, hint.y, hint.width, hint.height, |
340 0); | |
341 } | |
342 } else | |
343 { | |
344 // vo_fs set means we were already at fullscreen | |
345 vo_x11_sizehint(hint.x, hint.y, hint.width, hint.height, 0); | |
346 if (!vo_fs) | |
347 XMoveResizeWindow(mDisplay, vo_window, hint.x, hint.y, | |
348 hint.width, hint.height); | |
349 if (flags & 1 && !vo_fs) | |
350 vo_x11_fullscreen(); // handle -fs on non-first file | |
351 } | |
352 | |
9161 | 353 // vo_x11_sizehint( hint.x, hint.y, hint.width, hint.height,0 ); |
12582 | 354 |
355 if (vo_gc != None) | |
356 XFreeGC(mDisplay, vo_gc); | |
357 vo_gc = XCreateGC(mDisplay, vo_window, 0L, &xgcv); | |
358 XSync(mDisplay, False); | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi B«±jar <tiarda@yahoo.es>
arpi
parents:
4406
diff
changeset
|
359 #ifdef HAVE_XF86VM |
12582 | 360 if (vm) |
361 { | |
362 /* Grab the mouse pointer in our window */ | |
363 if (vo_grabpointer) | |
364 XGrabPointer(mDisplay, vo_window, True, 0, | |
365 GrabModeAsync, GrabModeAsync, | |
366 vo_window, None, CurrentTime); | |
367 XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); | |
368 } | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi B«±jar <tiarda@yahoo.es>
arpi
parents:
4406
diff
changeset
|
369 #endif |
12582 | 370 } |
371 | |
372 mp_msg(MSGT_VO, MSGL_V, "using Xvideo port %d for hw scaling\n", | |
373 xv_port); | |
1 | 374 |
12582 | 375 switch (xv_format) |
376 { | |
377 case IMGFMT_YV12: | |
378 case IMGFMT_I420: | |
379 case IMGFMT_IYUV: | |
380 draw_alpha_fnc = draw_alpha_yv12; | |
381 break; | |
382 case IMGFMT_YUY2: | |
383 case IMGFMT_YVYU: | |
384 draw_alpha_fnc = draw_alpha_yuy2; | |
385 break; | |
386 case IMGFMT_UYVY: | |
387 draw_alpha_fnc = draw_alpha_uyvy; | |
388 break; | |
389 default: | |
390 draw_alpha_fnc = draw_alpha_null; | |
391 } | |
182 | 392 |
12582 | 393 if (vo_config_count) |
394 for (current_buf = 0; current_buf < num_buffers; ++current_buf) | |
395 deallocate_xvimage(current_buf); | |
7757 | 396 |
12582 | 397 for (current_buf = 0; current_buf < num_buffers; ++current_buf) |
398 allocate_xvimage(current_buf); | |
676
428755f858f7
multi buffering added (modify NUM_BUFFERS in the source)
arpi_esp
parents:
616
diff
changeset
|
399 |
12582 | 400 current_buf = 0; |
401 current_ip_buf = 0; | |
1 | 402 |
6764
7755d1d59394
fix hue bug with nvidia's shit. i teszted with g400,radeon7500,tnt2ultra,geforce2mx200
pontscho
parents:
6760
diff
changeset
|
403 #if 0 |
12582 | 404 set_gamma_correction(); |
6764
7755d1d59394
fix hue bug with nvidia's shit. i teszted with g400,radeon7500,tnt2ultra,geforce2mx200
pontscho
parents:
6760
diff
changeset
|
405 #endif |
1818 | 406 |
12582 | 407 aspect(&vo_dwidth, &vo_dheight, A_NOZOOM); |
408 if (((flags & 1) && (WinID <= 0)) || vo_fs) | |
409 { | |
410 aspect(&vo_dwidth, &vo_dheight, A_ZOOM); | |
411 drwX = | |
412 (vo_screenwidth - | |
413 (vo_dwidth > | |
414 vo_screenwidth ? vo_screenwidth : vo_dwidth)) / 2; | |
415 drwY = | |
416 (vo_screenheight - | |
417 (vo_dheight > | |
418 vo_screenheight ? vo_screenheight : vo_dheight)) / 2; | |
419 vo_dwidth = | |
420 (vo_dwidth > vo_screenwidth ? vo_screenwidth : vo_dwidth); | |
421 vo_dheight = | |
422 (vo_dheight > vo_screenheight ? vo_screenheight : vo_dheight); | |
423 mp_msg(MSGT_VO, MSGL_V, "[xv-fs] dx: %d dy: %d dw: %d dh: %d\n", | |
424 drwX, drwY, vo_dwidth, vo_dheight); | |
425 } | |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6366
diff
changeset
|
426 |
12582 | 427 panscan_calc(); |
9381
007a1bdce1f4
reversed small part of the r1.135 commit, it broke -fs (random black screen)
arpi
parents:
9326
diff
changeset
|
428 |
12582 | 429 XClearWindow(mDisplay, vo_window); |
9381
007a1bdce1f4
reversed small part of the r1.135 commit, it broke -fs (random black screen)
arpi
parents:
9326
diff
changeset
|
430 #if 0 |
9161 | 431 #ifdef HAVE_SHM |
12582 | 432 if (Shmem_Flag) |
433 { | |
434 XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, | |
435 xvimage[current_buf], 0, 0, image_width, | |
436 image_height, drwX, drwY, 1, 1, False); | |
437 XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, | |
438 xvimage[current_buf], 0, 0, image_width, | |
439 image_height, drwX, drwY, vo_dwidth, | |
440 (vo_fs ? vo_dheight - 1 : vo_dheight), False); | |
441 } else | |
9161 | 442 #endif |
12582 | 443 { |
444 XvPutImage(mDisplay, xv_port, vo_window, vo_gc, | |
445 xvimage[current_buf], 0, 0, image_width, image_height, | |
446 drwX, drwY, 1, 1); | |
447 XvPutImage(mDisplay, xv_port, vo_window, vo_gc, | |
448 xvimage[current_buf], 0, 0, image_width, image_height, | |
449 drwX, drwY, vo_dwidth, | |
450 (vo_fs ? vo_dheight - 1 : vo_dheight)); | |
451 } | |
9381
007a1bdce1f4
reversed small part of the r1.135 commit, it broke -fs (random black screen)
arpi
parents:
9326
diff
changeset
|
452 #endif |
12582 | 453 |
454 mp_msg(MSGT_VO, MSGL_V, "[xv] dx: %d dy: %d dw: %d dh: %d\n", drwX, | |
455 drwY, vo_dwidth, vo_dheight); | |
5945 | 456 |
12582 | 457 if (vo_ontop) |
458 vo_x11_setlayer(mDisplay, vo_window, vo_ontop); | |
11542 | 459 |
12582 | 460 return 0; |
1 | 461 } |
462 | |
182 | 463 static void allocate_xvimage(int foo) |
1 | 464 { |
12582 | 465 /* |
466 * allocate XvImages. FIXME: no error checking, without | |
467 * mit-shm this will bomb... trzing to fix ::atmos | |
468 */ | |
6416 | 469 #ifdef HAVE_SHM |
12582 | 470 if (mLocalDisplay && XShmQueryExtension(mDisplay)) |
471 Shmem_Flag = 1; | |
472 else | |
473 { | |
474 Shmem_Flag = 0; | |
475 mp_msg(MSGT_VO, MSGL_INFO, | |
476 "Shared memory not supported\nReverting to normal Xv\n"); | |
477 } | |
478 if (Shmem_Flag) | |
479 { | |
480 xvimage[foo] = | |
481 (XvImage *) XvShmCreateImage(mDisplay, xv_port, xv_format, | |
482 NULL, image_width, image_height, | |
483 &Shminfo[foo]); | |
1 | 484 |
12582 | 485 Shminfo[foo].shmid = |
486 shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | 0777); | |
487 Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0); | |
488 Shminfo[foo].readOnly = False; | |
1 | 489 |
12582 | 490 xvimage[foo]->data = Shminfo[foo].shmaddr; |
491 XShmAttach(mDisplay, &Shminfo[foo]); | |
492 XSync(mDisplay, False); | |
493 shmctl(Shminfo[foo].shmid, IPC_RMID, 0); | |
494 } else | |
6416 | 495 #endif |
12582 | 496 { |
497 xvimage[foo] = | |
498 (XvImage *) XvCreateImage(mDisplay, xv_port, xv_format, NULL, | |
499 image_width, image_height); | |
500 xvimage[foo]->data = malloc(xvimage[foo]->data_size); | |
501 XSync(mDisplay, False); | |
502 } | |
503 memset(xvimage[foo]->data, 128, xvimage[foo]->data_size); | |
504 return; | |
1 | 505 } |
506 | |
1794 | 507 static void deallocate_xvimage(int foo) |
508 { | |
6416 | 509 #ifdef HAVE_SHM |
12582 | 510 if (Shmem_Flag) |
511 { | |
512 XShmDetach(mDisplay, &Shminfo[foo]); | |
513 shmdt(Shminfo[foo].shmaddr); | |
514 } else | |
6416 | 515 #endif |
12582 | 516 { |
517 free(xvimage[foo]->data); | |
518 } | |
519 XFree(xvimage[foo]); | |
520 | |
521 XSync(mDisplay, False); | |
522 return; | |
1794 | 523 } |
524 | |
31 | 525 static void check_events(void) |
1 | 526 { |
12582 | 527 int e = vo_x11_check_events(mDisplay); |
528 | |
529 if (e & VO_EVENT_RESIZE) | |
530 { | |
531 XGetGeometry(mDisplay, vo_window, &mRoot, &drwX, &drwY, &vo_dwidth, | |
532 &vo_dheight, &drwBorderWidth, &drwDepth); | |
533 drwX = drwY = 0; | |
534 mp_msg(MSGT_VO, MSGL_V, "[xv] dx: %d dy: %d dw: %d dh: %d\n", drwX, | |
535 drwY, 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:
10359
diff
changeset
|
536 |
12582 | 537 aspect(&dwidth, &dheight, A_NOZOOM); |
538 if (vo_fs) | |
539 { | |
540 aspect(&dwidth, &dheight, A_ZOOM); | |
541 drwX = | |
542 (vo_screenwidth - | |
543 (dwidth > vo_screenwidth ? vo_screenwidth : dwidth)) / 2; | |
544 drwY = | |
545 (vo_screenheight - | |
546 (dheight > | |
547 vo_screenheight ? vo_screenheight : dheight)) / 2; | |
548 vo_dwidth = | |
549 (dwidth > vo_screenwidth ? vo_screenwidth : dwidth); | |
550 vo_dheight = | |
551 (dheight > vo_screenheight ? vo_screenheight : dheight); | |
552 mp_msg(MSGT_VO, MSGL_V, | |
553 "[xv-fs] dx: %d dy: %d dw: %d dh: %d\n", drwX, drwY, | |
554 vo_dwidth, vo_dheight); | |
555 } | |
556 } | |
1 | 557 |
14742 | 558 if (e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE) |
559 { | |
560 vo_xv_draw_colorkey(drwX,drwY,vo_dwidth,vo_dheight); | |
561 } | |
562 | |
12582 | 563 if ((e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE) && int_pause) |
564 flip_page(); | |
1 | 565 } |
566 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1265
diff
changeset
|
567 static void draw_osd(void) |
12582 | 568 { |
569 vo_draw_text(image_width - | |
570 image_width * vo_panscan_x / (vo_dwidth + vo_panscan_x), | |
571 image_height, draw_alpha_fnc); | |
572 } | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1265
diff
changeset
|
573 |
182 | 574 static void flip_page(void) |
1 | 575 { |
6304
ee65527096c2
pan&scan support with -vo xv by ?? <mplayer@svennevid.net>
arpi
parents:
6295
diff
changeset
|
576 |
6416 | 577 #ifdef HAVE_SHM |
12582 | 578 if (Shmem_Flag) |
579 { | |
580 XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, | |
581 xvimage[current_buf], 0, 0, image_width, | |
582 image_height, drwX - (vo_panscan_x >> 1), | |
583 drwY - (vo_panscan_y >> 1), vo_dwidth + vo_panscan_x, | |
13242
185d052020e5
We don't need to support the old nvidia binary driver bug any longer.
al
parents:
13056
diff
changeset
|
584 vo_dheight + vo_panscan_y, |
12582 | 585 False); |
586 } else | |
6416 | 587 #endif |
12582 | 588 { |
589 XvPutImage(mDisplay, xv_port, vo_window, vo_gc, | |
590 xvimage[current_buf], 0, 0, image_width, image_height, | |
591 drwX - (vo_panscan_x >> 1), drwY - (vo_panscan_y >> 1), | |
592 vo_dwidth + vo_panscan_x, | |
13242
185d052020e5
We don't need to support the old nvidia binary driver bug any longer.
al
parents:
13056
diff
changeset
|
593 vo_dheight + vo_panscan_y); |
12582 | 594 } |
595 if (num_buffers > 1) | |
596 { | |
597 current_buf = | |
598 vo_directrendering ? 0 : ((current_buf + 1) % num_buffers); | |
599 XFlush(mDisplay); | |
600 } else | |
601 XSync(mDisplay, False); | |
602 return; | |
1 | 603 } |
604 | |
12582 | 605 static uint32_t draw_slice(uint8_t * image[], int stride[], int w, int h, |
606 int x, int y) | |
1 | 607 { |
12582 | 608 uint8_t *dst; |
182 | 609 |
12582 | 610 dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[0] + |
611 xvimage[current_buf]->pitches[0] * y + x; | |
612 memcpy_pic(dst, image[0], w, h, xvimage[current_buf]->pitches[0], | |
613 stride[0]); | |
182 | 614 |
12582 | 615 x /= 2; |
616 y /= 2; | |
617 w /= 2; | |
618 h /= 2; | |
1 | 619 |
12582 | 620 dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[1] + |
621 xvimage[current_buf]->pitches[1] * y + x; | |
622 if (image_format != IMGFMT_YV12) | |
623 memcpy_pic(dst, image[1], w, h, xvimage[current_buf]->pitches[1], | |
624 stride[1]); | |
625 else | |
626 memcpy_pic(dst, image[2], w, h, xvimage[current_buf]->pitches[1], | |
627 stride[2]); | |
5316 | 628 |
12582 | 629 dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[2] + |
630 xvimage[current_buf]->pitches[2] * y + x; | |
631 if (image_format == IMGFMT_YV12) | |
632 memcpy_pic(dst, image[1], w, h, xvimage[current_buf]->pitches[1], | |
633 stride[1]); | |
634 else | |
635 memcpy_pic(dst, image[2], w, h, xvimage[current_buf]->pitches[1], | |
636 stride[2]); | |
6231 | 637 |
12582 | 638 return 0; |
1 | 639 } |
640 | |
12582 | 641 static uint32_t draw_frame(uint8_t * src[]) |
642 { | |
7684 | 643 printf("draw_frame() called!!!!!!"); |
644 return -1; | |
1 | 645 } |
646 | |
12582 | 647 static uint32_t draw_image(mp_image_t * mpi) |
648 { | |
649 if (mpi->flags & MP_IMGFLAG_DIRECT) | |
650 { | |
651 // direct rendering: | |
652 current_buf = (int) (mpi->priv); // hack! | |
653 return VO_TRUE; | |
6760 | 654 } |
12582 | 655 if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK) |
656 return VO_TRUE; // done | |
657 if (mpi->flags & MP_IMGFLAG_PLANAR) | |
658 { | |
659 draw_slice(mpi->planes, mpi->stride, mpi->w, mpi->h, 0, 0); | |
660 return VO_TRUE; | |
7684 | 661 } |
12582 | 662 if (mpi->flags & MP_IMGFLAG_YUV) |
663 { | |
664 // packed YUV: | |
665 memcpy_pic(xvimage[current_buf]->data + | |
666 xvimage[current_buf]->offsets[0], mpi->planes[0], | |
667 mpi->w * (mpi->bpp / 8), mpi->h, | |
668 xvimage[current_buf]->pitches[0], mpi->stride[0]); | |
669 return VO_TRUE; | |
7684 | 670 } |
12582 | 671 return VO_FALSE; // not (yet) supported |
6760 | 672 } |
673 | |
12582 | 674 static uint32_t get_image(mp_image_t * mpi) |
675 { | |
676 int buf = current_buf; // we shouldn't change current_buf unless we do DR! | |
677 | |
678 if (mpi->type == MP_IMGTYPE_STATIC && num_buffers > 1) | |
679 return VO_FALSE; // it is not static | |
680 if (mpi->imgfmt != image_format) | |
681 return VO_FALSE; // needs conversion :( | |
4980 | 682 // if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; // slow video ram |
12582 | 683 if (mpi->flags & MP_IMGFLAG_READABLE && |
684 (mpi->type == MP_IMGTYPE_IPB || mpi->type == MP_IMGTYPE_IP)) | |
685 { | |
686 // reference (I/P) frame of IP or IPB: | |
687 if (num_buffers < 2) | |
688 return VO_FALSE; // not enough | |
689 current_ip_buf ^= 1; | |
690 // for IPB with 2 buffers we can DR only one of the 2 P frames: | |
691 if (mpi->type == MP_IMGTYPE_IPB && num_buffers < 3 | |
692 && current_ip_buf) | |
693 return VO_FALSE; | |
694 buf = current_ip_buf; | |
695 if (mpi->type == MP_IMGTYPE_IPB) | |
696 ++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
|
697 } |
12582 | 698 if (mpi->height > xvimage[buf]->height) |
699 return VO_FALSE; //buffer to small | |
700 if (mpi->width * (mpi->bpp / 8) > xvimage[buf]->pitches[0]) | |
701 return VO_FALSE; //buffer to small | |
702 if ((mpi->flags & (MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_ACCEPT_WIDTH)) | |
703 || (mpi->width * (mpi->bpp / 8) == xvimage[buf]->pitches[0])) | |
704 { | |
705 current_buf = buf; | |
706 mpi->planes[0] = | |
707 xvimage[current_buf]->data + xvimage[current_buf]->offsets[0]; | |
708 mpi->stride[0] = xvimage[current_buf]->pitches[0]; | |
709 mpi->width = mpi->stride[0] / (mpi->bpp / 8); | |
710 if (mpi->flags & MP_IMGFLAG_PLANAR) | |
711 { | |
712 if (mpi->flags & MP_IMGFLAG_SWAPPED) | |
713 { | |
714 // I420 | |
715 mpi->planes[1] = | |
716 xvimage[current_buf]->data + | |
717 xvimage[current_buf]->offsets[1]; | |
718 mpi->planes[2] = | |
719 xvimage[current_buf]->data + | |
720 xvimage[current_buf]->offsets[2]; | |
721 mpi->stride[1] = xvimage[current_buf]->pitches[1]; | |
722 mpi->stride[2] = xvimage[current_buf]->pitches[2]; | |
723 } else | |
724 { | |
725 // YV12 | |
726 mpi->planes[1] = | |
727 xvimage[current_buf]->data + | |
728 xvimage[current_buf]->offsets[2]; | |
729 mpi->planes[2] = | |
730 xvimage[current_buf]->data + | |
731 xvimage[current_buf]->offsets[1]; | |
732 mpi->stride[1] = xvimage[current_buf]->pitches[2]; | |
733 mpi->stride[2] = xvimage[current_buf]->pitches[1]; | |
734 } | |
735 } | |
736 mpi->flags |= MP_IMGFLAG_DIRECT; | |
737 mpi->priv = (void *) current_buf; | |
738 // printf("mga: get_image() SUCCESS -> Direct Rendering ENABLED\n"); | |
739 return VO_TRUE; | |
4980 | 740 } |
741 return VO_FALSE; | |
742 } | |
743 | |
182 | 744 static uint32_t query_format(uint32_t format) |
1 | 745 { |
10855 | 746 uint32_t i; |
12582 | 747 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 |
748 | |
749 /* check image formats */ | |
750 for (i = 0; i < formats; i++) | |
751 { | |
752 if (fo[i].id == format) | |
753 return flag; //xv_format = fo[i].id; | |
754 } | |
755 return 0; | |
1 | 756 } |
757 | |
12582 | 758 static void uninit(void) |
1852 | 759 { |
12582 | 760 int i; |
761 | |
762 if (!vo_config_count) | |
763 return; | |
764 XvFreeAdaptorInfo(ai); | |
765 ai = NULL; | |
13953 | 766 if(fo){ |
767 XFree(fo); | |
768 fo=NULL; | |
769 } | |
12582 | 770 for (i = 0; i < num_buffers; i++) |
771 deallocate_xvimage(i); | |
6016 | 772 #ifdef HAVE_XF86VM |
12582 | 773 vo_vm_close(mDisplay); |
6016 | 774 #endif |
12582 | 775 vo_x11_uninit(); |
322
4e69a8e2700a
Screensaver and monitor powersafe function is switched off when playing a
laaz
parents:
249
diff
changeset
|
776 } |
1 | 777 |
4352 | 778 static uint32_t preinit(const char *arg) |
779 { | |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
780 XvPortID xv_p; |
12582 | 781 int busy_ports = 0; |
10855 | 782 unsigned int i; |
14742 | 783 strarg_t ck_src_arg = { 0, NULL }; |
784 strarg_t ck_method_arg = { 0, NULL }; | |
785 | |
786 opt_t subopts[] = | |
787 { | |
788 /* name arg type arg var test */ | |
789 { "port", OPT_ARG_INT, &xv_port, (opt_test_f)int_pos }, | |
790 { "ck", OPT_ARG_STR, &ck_src_arg, xv_test_ck }, | |
791 { "ck-method", OPT_ARG_STR, &ck_method_arg, xv_test_ckm }, | |
792 { NULL } | |
793 }; | |
12582 | 794 |
10826 | 795 xv_port = 0; |
796 | |
14742 | 797 /* parse suboptions */ |
798 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
|
799 { |
14742 | 800 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
|
801 } |
14742 | 802 |
803 /* modify colorkey settings according to the given options */ | |
804 xv_setup_colorkeyhandling( ck_method_arg.str, ck_src_arg.str ); | |
805 | |
12582 | 806 if (!vo_init()) |
807 return -1; | |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
808 |
12582 | 809 /* check for Xvideo extension */ |
810 if (Success != XvQueryExtension(mDisplay, &ver, &rel, &req, &ev, &err)) | |
811 { | |
812 mp_msg(MSGT_VO, MSGL_ERR, | |
813 "Sorry, Xv not supported by this X11 version/driver\n"); | |
814 mp_msg(MSGT_VO, MSGL_ERR, | |
815 "******** Try with -vo x11 or -vo sdl *********\n"); | |
816 return -1; | |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
817 } |
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
818 |
12582 | 819 /* check for Xvideo support */ |
820 if (Success != | |
821 XvQueryAdaptors(mDisplay, DefaultRootWindow(mDisplay), &adaptors, | |
822 &ai)) | |
823 { | |
824 mp_msg(MSGT_VO, MSGL_ERR, "Xv: XvQueryAdaptors failed\n"); | |
825 return -1; | |
826 } | |
827 | |
828 /* check adaptors */ | |
829 if (xv_port) | |
830 { | |
10839 | 831 int port_found; |
12582 | 832 |
833 for (port_found = 0, i = 0; !port_found && i < adaptors; i++) | |
834 { | |
835 if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask)) | |
836 { | |
837 for (xv_p = ai[i].base_id; | |
838 xv_p < ai[i].base_id + ai[i].num_ports; ++xv_p) | |
839 { | |
840 if (xv_p == xv_port) | |
841 { | |
10839 | 842 port_found = 1; |
843 break; | |
844 } | |
845 } | |
846 } | |
847 } | |
12582 | 848 if (port_found) |
849 { | |
10839 | 850 if (XvGrabPort(mDisplay, xv_port, CurrentTime)) |
851 xv_port = 0; | |
12582 | 852 } else |
853 { | |
854 mp_msg(MSGT_VO, MSGL_WARN, | |
855 "Xv: Invalid port parameter, overriding with port 0\n"); | |
10839 | 856 xv_port = 0; |
857 } | |
10826 | 858 } |
12582 | 859 |
860 for (i = 0; i < adaptors && xv_port == 0; i++) | |
861 { | |
862 if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask)) | |
863 { | |
864 for (xv_p = ai[i].base_id; | |
865 xv_p < ai[i].base_id + ai[i].num_ports; ++xv_p) | |
866 if (!XvGrabPort(mDisplay, xv_p, CurrentTime)) | |
867 { | |
868 xv_port = xv_p; | |
869 break; | |
870 } else | |
871 { | |
872 mp_msg(MSGT_VO, MSGL_WARN, | |
873 "Xv: could not grab port %i\n", (int) xv_p); | |
874 ++busy_ports; | |
875 } | |
876 } | |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
877 } |
12582 | 878 if (!xv_port) |
879 { | |
880 if (busy_ports) | |
881 mp_msg(MSGT_VO, MSGL_ERR, | |
882 "Could not find free Xvideo port - maybe another process is already using it.\n" | |
883 "Close all video applications, and try again. If that does not help,\n" | |
884 "see 'mplayer -vo help' for other (non-xv) video out drivers.\n"); | |
885 else | |
886 mp_msg(MSGT_VO, MSGL_ERR, | |
887 "It seems there is no Xvideo support for your video card available.\n" | |
13914 | 888 "Run 'xvinfo' to verify its Xv support and read DOCS/HTML/en/video.html#xv!\n" |
12582 | 889 "See 'mplayer -vo help' for other (non-xv) video out drivers. Try -vo x11\n"); |
890 return -1; | |
5509
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
891 } |
1e90dd889c34
initialization moved to preinit(), query_format now really checks for supported formats
arpi
parents:
5466
diff
changeset
|
892 |
14742 | 893 if ( !vo_xv_init_colorkey() ) |
7857
3c690d2ad1ac
MPlayer being unable to display video properly on many nVidia graphics cards.
arpi
parents:
7848
diff
changeset
|
894 { |
14742 | 895 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
|
896 } |
3c690d2ad1ac
MPlayer being unable to display video properly on many nVidia graphics cards.
arpi
parents:
7848
diff
changeset
|
897 |
12582 | 898 fo = XvListImageFormats(mDisplay, xv_port, (int *) &formats); |
5566 | 899 |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4658
diff
changeset
|
900 return 0; |
4352 | 901 } |
1 | 902 |
4596 | 903 static uint32_t control(uint32_t request, void *data, ...) |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
904 { |
12582 | 905 switch (request) |
906 { | |
907 case VOCTRL_PAUSE: | |
908 return (int_pause = 1); | |
909 case VOCTRL_RESUME: | |
910 return (int_pause = 0); | |
911 case VOCTRL_QUERY_FORMAT: | |
912 return query_format(*((uint32_t *) data)); | |
913 case VOCTRL_GET_IMAGE: | |
914 return get_image(data); | |
915 case VOCTRL_DRAW_IMAGE: | |
916 return draw_image(data); | |
917 case VOCTRL_GUISUPPORT: | |
918 return VO_TRUE; | |
919 case VOCTRL_GET_PANSCAN: | |
920 if (!vo_config_count || !vo_fs) | |
921 return VO_FALSE; | |
922 return VO_TRUE; | |
923 case VOCTRL_FULLSCREEN: | |
924 vo_x11_fullscreen(); | |
925 /* indended, fallthrough to update panscan on fullscreen/windowed switch */ | |
926 case VOCTRL_SET_PANSCAN: | |
927 if ((vo_fs && (vo_panscan != vo_panscan_amount)) | |
928 || (!vo_fs && vo_panscan_amount)) | |
929 { | |
930 int old_y = vo_panscan_y; | |
931 | |
932 panscan_calc(); | |
933 | |
934 if (old_y != vo_panscan_y) | |
935 { | |
936 vo_x11_clearwindow_part(mDisplay, vo_window, | |
937 vo_dwidth + vo_panscan_x - 1, | |
938 vo_dheight + vo_panscan_y - 1, | |
939 1); | |
940 flip_page(); | |
941 } | |
942 } | |
943 return VO_TRUE; | |
944 case VOCTRL_SET_EQUALIZER: | |
945 { | |
946 va_list ap; | |
947 int value; | |
948 | |
949 va_start(ap, data); | |
950 value = va_arg(ap, int); | |
951 | |
952 va_end(ap); | |
953 | |
954 return (vo_xv_set_eq(xv_port, data, value)); | |
955 } | |
956 case VOCTRL_GET_EQUALIZER: | |
957 { | |
958 va_list ap; | |
959 int *value; | |
960 | |
961 va_start(ap, data); | |
962 value = va_arg(ap, int *); | |
963 | |
964 va_end(ap); | |
965 | |
966 return (vo_xv_get_eq(xv_port, data, value)); | |
967 } | |
968 case VOCTRL_ONTOP: | |
969 vo_x11_ontop(); | |
970 return VO_TRUE; | |
971 } | |
972 return VO_NOTIMPL; | |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4433
diff
changeset
|
973 } |