Mercurial > mplayer.hg
annotate libvo/vo_xvidix.c @ 13007:2a91140108fe
Credit for DTS
author | rtognimp |
---|---|
date | Thu, 12 Aug 2004 12:37:32 +0000 |
parents | 3cd9add91f97 |
children | 1c2f6de431bf |
rev | line source |
---|---|
4123 | 1 /* |
2 VIDIX accelerated overlay in a X window | |
3 | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
4 (C) Alex Beregszaszi & Zoltan Ponekker & Nick Kurshev |
4123 | 5 |
6 WS window manager by Pontscho/Fresh! | |
7 | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
8 Based on vo_gl.c and vo_vesa.c and vo_xmga.c (.so mastah! ;)) |
4123 | 9 */ |
10 | |
11 #include <stdio.h> | |
12 #include <stdlib.h> | |
13 #include <string.h> | |
14 #include <math.h> | |
15 #include <errno.h> | |
16 | |
17 #include "config.h" | |
18 #include "video_out.h" | |
19 #include "video_out_internal.h" | |
20 | |
21 #include <X11/Xlib.h> | |
22 #include <X11/Xutil.h> | |
23 //#include <X11/keysym.h> | |
24 | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
25 #ifdef HAVE_XINERAMA |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
26 #include <X11/extensions/Xinerama.h> |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
27 #endif |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
28 |
4123 | 29 #include "x11_common.h" |
30 #include "aspect.h" | |
31 #include "mp_msg.h" | |
32 | |
33 #include "vosub_vidix.h" | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
34 #include "../vidix/vidixlib.h" |
4123 | 35 |
6009 | 36 #ifdef HAVE_NEW_GUI |
37 #include "../Gui/interface.h" | |
38 #endif | |
39 | |
4123 | 40 |
12582 | 41 static vo_info_t info = { |
4123 | 42 "X11 (VIDIX)", |
43 "xvidix", | |
44 "Alex Beregszaszi", | |
45 "" | |
46 }; | |
47 | |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
8123
diff
changeset
|
48 LIBVO_EXTERN(xvidix) |
12582 | 49 #define UNUSED(x) ((void)(x)) /* Removes warning about unused arguments */ |
4123 | 50 /* X11 related variables */ |
4363 | 51 /* Colorkey handling */ |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
52 static XGCValues mGCV; |
10988 | 53 static int colorkey; |
4363 | 54 static vidix_grkey_t gr_key; |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
55 |
4363 | 56 /* VIDIX related */ |
57 static char *vidix_name; | |
4123 | 58 |
59 /* Image parameters */ | |
60 static uint32_t image_width; | |
61 static uint32_t image_height; | |
62 static uint32_t image_format; | |
63 | |
64 /* Window parameters */ | |
6299
4446af3c1a75
set_window() fixing detection of changement of the window position
attila
parents:
6095
diff
changeset
|
65 static uint32_t window_x, window_y; |
4123 | 66 static uint32_t window_width, window_height; |
67 | |
4363 | 68 /* used by XGetGeometry & XTranslateCoordinates for moving/resizing window */ |
4123 | 69 static uint32_t drwX, drwY, drwWidth, drwHeight, drwBorderWidth, |
4981 | 70 drwDepth, drwcX, drwcY, dwidth, dheight; |
4123 | 71 |
12582 | 72 extern void set_video_eq(int cap); |
6755 | 73 |
8991 | 74 #ifdef HAVE_XINERAMA |
75 extern int xinerama_screen; | |
76 #endif | |
77 | |
7124
eca7dbad0166
finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents:
6953
diff
changeset
|
78 static void set_window(int force_update) |
4123 | 79 { |
6095 | 80 Window mRoot; |
12582 | 81 |
82 if (WinID) | |
83 { | |
84 XGetGeometry(mDisplay, vo_window, &mRoot, &drwX, &drwY, &drwWidth, | |
85 &drwHeight, &drwBorderWidth, &drwDepth); | |
86 drwX = drwY = 0; | |
6307 | 87 |
12582 | 88 XTranslateCoordinates(mDisplay, vo_window, mRoot, 0, 0, |
89 &drwcX, &drwcY, &mRoot); | |
90 aspect(&dwidth, &dheight, A_NOZOOM); | |
91 if (!vo_fs) | |
92 mp_msg(MSGT_VO, MSGL_V, | |
93 "[xvidix] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n", | |
94 drwcX, drwcY, drwX, drwY, drwWidth, drwHeight); | |
4123 | 95 |
12582 | 96 /* following stuff copied from vo_xmga.c */ |
97 } else | |
98 { | |
99 aspect(&dwidth, &dheight, A_NOZOOM); | |
100 drwcX = drwX = vo_dx; | |
101 drwcY = drwY = vo_dy; | |
102 drwWidth = vo_dwidth; | |
103 drwHeight = vo_dheight; | |
104 } | |
6043 | 105 |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
106 #if X11_FULLSCREEN |
4981 | 107 if (vo_fs) |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
108 { |
12582 | 109 aspect(&dwidth, &dheight, A_ZOOM); |
110 drwX = | |
111 (vo_screenwidth - | |
112 (dwidth > vo_screenwidth ? vo_screenwidth : dwidth)) / 2; | |
113 drwcX = drwX; | |
114 drwY = | |
115 (vo_screenheight - | |
116 (dheight > vo_screenheight ? vo_screenheight : dheight)) / 2; | |
117 drwcY = drwY; | |
118 drwWidth = (dwidth > vo_screenwidth ? vo_screenwidth : dwidth); | |
119 drwHeight = | |
120 (dheight > vo_screenheight ? vo_screenheight : dheight); | |
121 mp_msg(MSGT_VO, MSGL_V, | |
122 "[xvidix-fs] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n", | |
123 drwcX, drwcY, drwX, drwY, drwWidth, drwHeight); | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
124 } |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
125 #endif |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
126 |
12582 | 127 vo_dwidth = drwWidth; |
128 vo_dheight = drwHeight; | |
6307 | 129 |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
130 #ifdef HAVE_XINERAMA |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
131 if (XineramaIsActive(mDisplay)) |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
132 { |
12582 | 133 XineramaScreenInfo *screens; |
134 int num_screens; | |
135 int i = 0; | |
136 | |
137 screens = XineramaQueryScreens(mDisplay, &num_screens); | |
138 | |
139 /* find the screen we are on */ | |
140 while (i < num_screens && | |
141 ((screens[i].x_org < drwcX) || (screens[i].y_org < drwcY) || | |
142 (screens[i].x_org + screens[i].width >= drwcX) || | |
143 (screens[i].y_org + screens[i].height >= drwcY))) | |
144 { | |
145 i++; | |
146 } | |
8991 | 147 |
12582 | 148 if (i < num_screens) |
149 { | |
150 /* save the screen we are on */ | |
151 xinerama_screen = i; | |
152 } else | |
153 { | |
154 /* oops.. couldnt find the screen we are on | |
155 * because the upper left corner left the | |
156 * visual range. assume we are still on the | |
157 * same screen | |
158 */ | |
159 i = xinerama_screen; | |
160 } | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
161 |
12582 | 162 /* set drwcX and drwcY to the right values */ |
163 drwcX = drwcX - screens[i].x_org; | |
164 drwcY = drwcY - screens[i].y_org; | |
165 XFree(screens); | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
166 } |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
167 #endif |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
168 |
12582 | 169 if (vo_panscan > 0.0f && vo_fs) |
170 { | |
171 drwcX -= vo_panscan_x >> 1; | |
172 drwcY -= vo_panscan_y >> 1; | |
173 drwX -= vo_panscan_x >> 1; | |
174 drwY -= vo_panscan_y >> 1; | |
175 drwWidth += vo_panscan_x; | |
176 drwHeight += vo_panscan_y; | |
177 } | |
6307 | 178 |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
179 /* set new values in VIDIX */ |
6299
4446af3c1a75
set_window() fixing detection of changement of the window position
attila
parents:
6095
diff
changeset
|
180 if (force_update || (window_x != drwcX) || (window_y != drwcY) || |
12582 | 181 (window_width != drwWidth) || (window_height != drwHeight)) |
4123 | 182 { |
12582 | 183 // do a backup of window coordinates |
184 window_x = drwcX; | |
185 window_y = drwcY; | |
186 vo_dx = drwcX; | |
187 vo_dy = drwcY; | |
188 window_width = drwWidth; | |
189 window_height = drwHeight; | |
4198
7e2bf04c9a7c
added vidix_start() and vidix_stop() for better runtime-resize support ;)
alex
parents:
4194
diff
changeset
|
190 |
12582 | 191 /* FIXME: implement runtime resize/move if possible, this way is very ugly! */ |
192 vidix_stop(); | |
193 if (vidix_init(image_width, image_height, vo_dx, vo_dy, | |
194 window_width, window_height, image_format, | |
195 vo_depthonscreen, vo_screenwidth, | |
196 vo_screenheight) != 0) | |
4123 | 197 { |
12582 | 198 mp_msg(MSGT_VO, MSGL_FATAL, |
199 "Can't initialize VIDIX driver: %s\n", strerror(errno)); | |
200 abort(); | |
201 } | |
202 vidix_start(); | |
4123 | 203 } |
12582 | 204 |
205 mp_msg(MSGT_VO, MSGL_V, | |
206 "[xvidix] window properties: pos: %dx%d, size: %dx%d\n", vo_dx, | |
207 vo_dy, window_width, window_height); | |
4123 | 208 |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
209 /* mDrawColorKey: */ |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
210 |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
211 /* fill drawable with specified color */ |
11216 | 212 if (!(vo_colorkey & 0xff000000)) |
11158
85f4534d1edb
Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents:
10988
diff
changeset
|
213 { |
12582 | 214 XSetBackground(mDisplay, vo_gc, 0L); |
215 XClearWindow(mDisplay, vo_window); | |
216 XSetForeground(mDisplay, vo_gc, colorkey); | |
217 XFillRectangle(mDisplay, vo_window, vo_gc, drwX, drwY, drwWidth, | |
218 (vo_fs ? drwHeight - 1 : drwHeight)); | |
11158
85f4534d1edb
Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents:
10988
diff
changeset
|
219 } |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
220 /* flush, update drawable */ |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
221 XFlush(mDisplay); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
222 |
4123 | 223 return; |
224 } | |
225 | |
226 /* connect to server, create and map window, | |
227 * allocate colors and (shared) memory | |
228 */ | |
4433 | 229 static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, |
12582 | 230 uint32_t d_height, uint32_t flags, char *title, |
231 uint32_t format) | |
4123 | 232 { |
233 XVisualInfo vinfo; | |
12582 | 234 |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7931
diff
changeset
|
235 // XSizeHints hint; |
4123 | 236 XSetWindowAttributes xswa; |
237 unsigned long xswamask; | |
238 XWindowAttributes attribs; | |
10988 | 239 int window_depth, r, g, b; |
4125 | 240 |
5738 | 241 title = "MPlayer VIDIX X11 Overlay"; |
4123 | 242 |
6307 | 243 panscan_init(); |
244 | |
4123 | 245 image_height = height; |
246 image_width = width; | |
247 image_format = format; | |
12582 | 248 vo_mouse_autohide = 1; |
4459 | 249 |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
250 aspect_save_orig(width, height); |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
251 aspect_save_prescale(d_width, d_height); |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
252 aspect_save_screenres(vo_screenwidth, vo_screenheight); |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
253 |
6043 | 254 vo_dx = 0; |
255 vo_dy = 0; | |
12582 | 256 vo_dx = (vo_screenwidth - d_width) / 2; |
257 vo_dy = (vo_screenheight - d_height) / 2; | |
258 geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth, | |
259 vo_screenheight); | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
260 window_width = d_width; |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
261 window_height = d_height; |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
262 |
6009 | 263 // vo_fs = flags&0x01; |
264 // if (vo_fs) | |
265 // { vo_old_width=d_width; vo_old_height=d_height; } | |
4123 | 266 |
10988 | 267 r = (vo_colorkey & 0x00ff0000) >> 16; |
268 g = (vo_colorkey & 0x0000ff00) >> 8; | |
269 b = vo_colorkey & 0x000000ff; | |
12582 | 270 switch (vo_depthonscreen) |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
271 { |
12582 | 272 case 32: |
273 colorkey = vo_colorkey; | |
274 break; | |
275 case 24: | |
276 colorkey = vo_colorkey & 0x00ffffff; | |
277 break; | |
278 case 16: | |
279 colorkey = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3); | |
280 break; | |
281 case 15: | |
282 colorkey = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3); | |
283 break; | |
284 default: | |
285 mp_msg(MSGT_VO, MSGL_ERR, | |
286 "Sorry, this (%d) color depth is not supported\n", | |
287 vo_depthonscreen); | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
288 } |
10988 | 289 mp_msg(MSGT_VO, MSGL_INFO, "Using colorkey: %x\n", colorkey); |
4123 | 290 |
291 aspect(&d_width, &d_height, A_NOZOOM); | |
6043 | 292 |
12582 | 293 vo_dwidth = d_width; |
294 vo_dheight = d_height; | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
295 |
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
296 #ifdef HAVE_NEW_GUI |
12582 | 297 if (use_gui) |
298 guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window | |
299 else | |
300 { | |
4123 | 301 #endif |
302 | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
303 #ifdef X11_FULLSCREEN |
12582 | 304 if ((flags & 1) || (flags & 0x04)) |
305 aspect(&d_width, &d_height, A_ZOOM); | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
306 #endif |
12582 | 307 dwidth = d_width; |
308 dheight = d_height; | |
309 /* Make the window */ | |
310 XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), | |
311 &attribs); | |
4123 | 312 |
12582 | 313 /* from vo_x11 */ |
314 window_depth = attribs.depth; | |
315 if ((window_depth != 15) && (window_depth != 16) | |
316 && (window_depth != 24) && (window_depth != 32)) | |
317 window_depth = 24; | |
318 XMatchVisualInfo(mDisplay, mScreen, window_depth, TrueColor, | |
319 &vinfo); | |
4123 | 320 |
12582 | 321 xswa.background_pixel = BlackPixel(mDisplay, mScreen); |
322 xswa.border_pixel = 0; | |
323 xswa.colormap = | |
324 XCreateColormap(mDisplay, RootWindow(mDisplay, mScreen), | |
325 vinfo.visual, AllocNone); | |
326 xswa.event_mask = | |
327 StructureNotifyMask | ExposureMask | KeyPressMask | | |
328 PropertyChangeMask | ((WinID == 0) ? 0 | |
329 : (ButtonPressMask | ButtonReleaseMask | | |
330 PointerMotionMask)); | |
331 xswamask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; | |
4123 | 332 |
12582 | 333 if (WinID >= 0) |
334 { | |
335 vo_window = | |
336 WinID ? ((Window) WinID) : RootWindow(mDisplay, mScreen); | |
337 if (WinID) | |
338 { | |
339 XUnmapWindow(mDisplay, vo_window); | |
340 XChangeWindowAttributes(mDisplay, vo_window, xswamask, | |
341 &xswa); | |
342 vo_x11_selectinput_witherr(mDisplay, vo_window, | |
343 StructureNotifyMask | | |
344 KeyPressMask | | |
345 PropertyChangeMask | | |
346 PointerMotionMask | | |
347 ButtonPressMask | | |
348 ButtonReleaseMask | | |
349 ExposureMask); | |
350 } else | |
351 XSelectInput(mDisplay, vo_window, ExposureMask); | |
352 } else | |
353 { | |
354 if (vo_window == None) | |
355 { | |
356 vo_window = | |
357 XCreateWindow(mDisplay, RootWindow(mDisplay, mScreen), | |
358 vo_dx, vo_dy, window_width, | |
359 window_height, xswa.border_pixel, | |
360 vinfo.depth, InputOutput, vinfo.visual, | |
361 xswamask, &xswa); | |
4123 | 362 |
12582 | 363 vo_x11_classhint(mDisplay, vo_window, "xvidix"); |
364 vo_hidecursor(mDisplay, vo_window); | |
365 vo_x11_sizehint(vo_dx, vo_dy, vo_dwidth, vo_dheight, 0); | |
4123 | 366 |
12582 | 367 XStoreName(mDisplay, vo_window, title); |
368 XMapWindow(mDisplay, vo_window); | |
369 | |
370 if (flags & 1) | |
371 vo_x11_fullscreen(); | |
372 | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
373 #ifdef HAVE_XINERAMA |
12582 | 374 vo_x11_xinerama_move(mDisplay, vo_window); |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
375 #endif |
12582 | 376 } else if (!(flags & 1)) |
377 XMoveResizeWindow(mDisplay, vo_window, vo_dx, vo_dy, | |
378 vo_dwidth, vo_dheight); | |
379 } | |
380 | |
381 if (vo_gc != None) | |
382 XFreeGC(mDisplay, vo_gc); | |
383 vo_gc = XCreateGC(mDisplay, vo_window, GCForeground, &mGCV); | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
384 #ifdef HAVE_NEW_GUI |
12582 | 385 } |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
386 #endif |
4123 | 387 |
12582 | 388 if ((!WinID) && (flags & 1)) |
389 { | |
390 vo_dx = 0; | |
391 vo_dy = 0; | |
392 vo_dwidth = vo_screenwidth; | |
393 vo_dheight = vo_screenheight; | |
394 vo_fs = 1; | |
395 } | |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
396 |
4255 | 397 if (vidix_grkey_support()) |
398 { | |
12582 | 399 vidix_grkey_get(&gr_key); |
400 gr_key.key_op = KEYS_PUT; | |
401 if (!(vo_colorkey & 0xff000000)) | |
402 { | |
403 gr_key.ckey.op = CKEY_TRUE; | |
404 gr_key.ckey.red = r; | |
405 gr_key.ckey.green = g; | |
406 gr_key.ckey.blue = b; | |
407 } else | |
408 gr_key.ckey.op = CKEY_FALSE; | |
409 vidix_grkey_set(&gr_key); | |
4255 | 410 } |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
411 |
7124
eca7dbad0166
finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents:
6953
diff
changeset
|
412 set_window(1); |
6755 | 413 |
4805 | 414 XFlush(mDisplay); |
415 XSync(mDisplay, False); | |
4123 | 416 |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
417 panscan_calc(); |
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
418 |
12582 | 419 if (vo_ontop) |
420 vo_x11_setlayer(mDisplay, vo_window, vo_ontop); | |
11542 | 421 |
12582 | 422 return (0); |
4123 | 423 } |
424 | |
425 static void check_events(void) | |
426 { | |
427 const int event = vo_x11_check_events(mDisplay); | |
4125 | 428 |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
429 if ((event & VO_EVENT_RESIZE) || (event & VO_EVENT_EXPOSE)) |
12582 | 430 set_window(0); |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
431 |
4125 | 432 return; |
4123 | 433 } |
434 | |
435 /* draw_osd, flip_page, draw_slice, draw_frame should be | |
436 overwritten with vidix functions (vosub_vidix.c) */ | |
437 static void draw_osd(void) | |
438 { | |
12582 | 439 mp_msg(MSGT_VO, MSGL_FATAL, |
440 "[xvidix] error: didn't used vidix draw_osd!\n"); | |
4123 | 441 return; |
442 } | |
443 | |
444 static void flip_page(void) | |
445 { | |
12582 | 446 mp_msg(MSGT_VO, MSGL_FATAL, |
447 "[xvidix] error: didn't used vidix flip_page!\n"); | |
4123 | 448 return; |
449 } | |
450 | |
12582 | 451 static uint32_t draw_slice(uint8_t * src[], int stride[], |
452 int w, int h, int x, int y) | |
4123 | 453 { |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
454 UNUSED(src); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
455 UNUSED(stride); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
456 UNUSED(w); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
457 UNUSED(h); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
458 UNUSED(x); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
459 UNUSED(y); |
12582 | 460 mp_msg(MSGT_VO, MSGL_FATAL, |
461 "[xvidix] error: didn't used vidix draw_slice!\n"); | |
462 return (-1); | |
4123 | 463 } |
464 | |
12582 | 465 static uint32_t draw_frame(uint8_t * src[]) |
4123 | 466 { |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
467 UNUSED(src); |
12582 | 468 mp_msg(MSGT_VO, MSGL_FATAL, |
469 "[xvidix] error: didn't used vidix draw_frame!\n"); | |
470 return (-1); | |
4123 | 471 } |
472 | |
473 static uint32_t query_format(uint32_t format) | |
474 { | |
12582 | 475 return (vidix_query_fourcc(format)); |
4123 | 476 } |
477 | |
478 static void uninit(void) | |
479 { | |
12582 | 480 if (!vo_config_count) |
481 return; | |
4241
817742049fa0
updated based vo_xmga, using colorkey, working with gui, fixed xinerama and window moving/resizing
alex
parents:
4198
diff
changeset
|
482 vidix_term(); |
12582 | 483 |
8577 | 484 if (vidix_name) |
485 { | |
12582 | 486 free(vidix_name); |
487 vidix_name = NULL; | |
8577 | 488 } |
4441
90814d64a840
removed obosolete Terminate_Display_Process. using vo_x11_uninit. support UYVY format
alex
parents:
4434
diff
changeset
|
489 |
6095 | 490 vo_x11_uninit(); |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
491 } |
4352 | 492 |
493 static uint32_t preinit(const char *arg) | |
494 { | |
6016 | 495 |
4363 | 496 if (arg) |
497 vidix_name = strdup(arg); | |
498 else | |
499 { | |
12582 | 500 mp_msg(MSGT_VO, MSGL_INFO, |
501 "No vidix driver name provided, probing available ones (-v option for details)!\n"); | |
502 vidix_name = NULL; | |
4363 | 503 } |
504 | |
12582 | 505 if (!vo_init()) |
506 return (-1); | |
7777 | 507 |
4363 | 508 if (vidix_preinit(vidix_name, &video_out_xvidix) != 0) |
12582 | 509 return (1); |
4363 | 510 |
12582 | 511 return (0); |
4352 | 512 } |
513 | |
4596 | 514 static uint32_t control(uint32_t request, void *data, ...) |
4352 | 515 { |
12582 | 516 switch (request) |
517 { | |
518 case VOCTRL_QUERY_FORMAT: | |
519 return query_format(*((uint32_t *) data)); | |
520 case VOCTRL_GUISUPPORT: | |
521 return VO_TRUE; | |
522 case VOCTRL_GET_PANSCAN: | |
523 if (!vo_config_count || !vo_fs) | |
524 return VO_FALSE; | |
525 return VO_TRUE; | |
526 case VOCTRL_ONTOP: | |
527 vo_x11_ontop(); | |
528 return VO_TRUE; | |
529 case VOCTRL_FULLSCREEN: | |
530 vo_x11_fullscreen(); | |
531 case VOCTRL_SET_PANSCAN: | |
532 if (vo_fs && (vo_panscan != vo_panscan_amount)) | |
533 { | |
534 panscan_calc(); | |
535 set_window(0); | |
536 } | |
537 return VO_TRUE; | |
538 case VOCTRL_SET_EQUALIZER: | |
539 { | |
540 va_list ap; | |
541 int value; | |
6786 | 542 |
12582 | 543 va_start(ap, data); |
544 value = va_arg(ap, int); | |
545 | |
546 va_end(ap); | |
6786 | 547 |
12582 | 548 return vidix_control(request, data, (int *) value); |
549 } | |
550 case VOCTRL_GET_EQUALIZER: | |
551 { | |
552 va_list ap; | |
553 int *value; | |
554 | |
555 va_start(ap, data); | |
556 value = va_arg(ap, int *); | |
557 | |
558 va_end(ap); | |
559 | |
560 return vidix_control(request, data, value); | |
561 } | |
562 } | |
563 return vidix_control(request, data); | |
6531 | 564 // return VO_NOTIMPL; |
4352 | 565 } |