Mercurial > mplayer.hg
annotate libvo/vo_xmga.c @ 22265:02333de881a7
probe ~/.xmms/Plugins for plugins too, so users without root access on their
machine can install them in their homedir and, if necessary, override
system wide defaults.
patch by Nicolas George, nicolas george at ens fr
author | ivo |
---|---|
date | Tue, 20 Feb 2007 16:12:46 +0000 |
parents | 30d7ddf08889 |
children | 17bf4f4b0715 |
rev | line source |
---|---|
100 | 1 |
2 //#define SHOW_TIME | |
1 | 3 |
4 /* | |
7680 | 5 * vo_xmga.c |
1 | 6 * |
7 * Copyright (C) Zoltan Ponekker - Jan 2001 | |
8 * | |
9 */ | |
10 | |
11 #include <stdio.h> | |
12 #include <stdlib.h> | |
13 #include <string.h> | |
14 | |
15 #include "config.h" | |
6296 | 16 |
1 | 17 #include "video_out.h" |
18 #include "video_out_internal.h" | |
19 | |
20 | |
21 #include <sys/ioctl.h> | |
22 #include <unistd.h> | |
23 #include <fcntl.h> | |
24 #include <sys/mman.h> | |
25 | |
26 #include "drivers/mga_vid.h" | |
27 | |
28 #include <X11/Xlib.h> | |
29 #include <X11/Xutil.h> | |
30 #include <errno.h> | |
31 | |
4017 | 32 #ifdef HAVE_XINERAMA |
33 #include <X11/extensions/Xinerama.h> | |
34 #endif | |
35 | |
31 | 36 #include "x11_common.h" |
616 | 37 #include "sub.h" |
2057 | 38 #include "aspect.h" |
31 | 39 |
182 | 40 #ifdef SHOW_TIME |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
41 #include "osdep/timer.h" |
12582 | 42 static unsigned int timer = 0; |
43 static unsigned int timerd = 0; | |
100 | 44 #endif |
45 | |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
46 #ifdef HAVE_NEW_GUI |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
47 #include "Gui/interface.h" |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
48 #endif |
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
49 |
12582 | 50 static vo_info_t info = { |
51 "Matrox G200/G4x0/G550 overlay in X11 window (using /dev/mga_vid)", | |
52 "xmga", | |
53 "Zoltan Ponekker <pontscho@makacs.poliod.hu>", | |
54 "" | |
1 | 55 }; |
56 | |
12582 | 57 LIBVO_EXTERN(xmga) |
58 static XGCValues wGCV; | |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
8017
diff
changeset
|
59 |
12582 | 60 static uint32_t mDepth; |
61 static XWindowAttributes attribs; | |
10988 | 62 static int colorkey; |
1 | 63 |
12582 | 64 static uint32_t mvHeight; |
65 static uint32_t mvWidth; | |
1 | 66 |
12582 | 67 static Window mRoot; |
1 | 68 |
12582 | 69 static XSetWindowAttributes xWAttribs; |
1 | 70 |
12582 | 71 static int inited = 0; |
6311
da2dda48b7ec
add mute support ( step 1 ) and fixed panscan bugs (1000l for me)
pontscho
parents:
6307
diff
changeset
|
72 |
4981 | 73 #define VO_XMGA |
1 | 74 #include "mga_common.c" |
4981 | 75 #undef VO_XMGA |
1 | 76 |
12582 | 77 static void mDrawColorKey(void) |
1 | 78 { |
12582 | 79 XSetBackground(mDisplay, vo_gc, 0); |
80 XClearWindow(mDisplay, vo_window); | |
81 XSetForeground(mDisplay, vo_gc, colorkey); | |
82 XFillRectangle(mDisplay, vo_window, vo_gc, drwX, drwY, drwWidth, | |
83 (vo_fs ? drwHeight - 1 : drwHeight)); | |
84 XFlush(mDisplay); | |
1 | 85 } |
86 | |
31 | 87 static void check_events(void) |
1 | 88 { |
12582 | 89 int e = vo_x11_check_events(mDisplay); |
90 | |
91 if (!(e & VO_EVENT_RESIZE) && !(e & VO_EVENT_EXPOSE)) | |
92 return; | |
93 set_window(); | |
94 mDrawColorKey(); | |
95 if (ioctl(f, MGA_VID_CONFIG, &mga_vid_config)) | |
96 mp_msg(MSGT_VO, MSGL_WARN, | |
97 "Error in mga_vid_config ioctl (wrong mga_vid.o version?)"); | |
1 | 98 } |
99 | |
12582 | 100 static void flip_page(void) |
101 { | |
182 | 102 #ifdef SHOW_TIME |
100 | 103 unsigned int t; |
12582 | 104 |
105 t = GetTimer(); | |
106 mp_msg(MSGT_VO, MSGL_STATUS, | |
107 " [timer: %08X diff: %6d dd: %6d ] \n", t, t - timer, | |
108 (t - timer) - timerd); | |
109 timerd = t - timer; | |
110 timer = t; | |
182 | 111 #endif |
100 | 112 |
12582 | 113 vo_mga_flip_page(); |
31 | 114 } |
1 | 115 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
116 static int config(uint32_t width, uint32_t height, uint32_t d_width, |
12582 | 117 uint32_t d_height, uint32_t flags, char *title, |
118 uint32_t format) | |
1 | 119 { |
12582 | 120 char *mTitle = (title == NULL) ? "XMGA render" : title; |
121 XVisualInfo vinfo; | |
122 unsigned long xswamask; | |
123 int r, g, b; | |
124 | |
125 if (mga_init(width, height, format)) | |
126 return -1; // ioctl errors? | |
1 | 127 |
12582 | 128 aspect_save_orig(width, height); |
129 aspect_save_prescale(d_width, d_height); | |
18116 | 130 update_xinerama_info(); |
12582 | 131 |
132 mvWidth = width; | |
133 mvHeight = height; | |
1 | 134 |
12582 | 135 vo_panscan_x = vo_panscan_y = vo_panscan_amount = 0; |
2249
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2057
diff
changeset
|
136 |
18509
94965d83e2b6
do aspect correction of video size before calculating vo_dx and vo_dy.
reimar
parents:
18116
diff
changeset
|
137 aspect(&d_width, &d_height, A_NOZOOM); |
12582 | 138 vo_dx = (vo_screenwidth - d_width) / 2; |
139 vo_dy = (vo_screenheight - d_height) / 2; | |
140 geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth, | |
141 vo_screenheight); | |
18116 | 142 vo_dx += xinerama_x; |
143 vo_dy += xinerama_y; | |
12582 | 144 vo_dwidth = d_width; |
145 vo_dheight = d_height; | |
146 vo_mouse_autohide = 1; | |
6307 | 147 |
12582 | 148 r = (vo_colorkey & 0x00ff0000) >> 16; |
149 g = (vo_colorkey & 0x0000ff00) >> 8; | |
150 b = vo_colorkey & 0x000000ff; | |
151 switch (vo_depthonscreen) | |
152 { | |
153 case 32: | |
154 colorkey = vo_colorkey; | |
155 break; | |
156 case 24: | |
157 colorkey = vo_colorkey & 0x00ffffff; | |
158 break; | |
159 case 16: | |
160 colorkey = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3); | |
161 break; | |
162 case 15: | |
163 colorkey = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3); | |
164 break; | |
165 default: | |
166 mp_msg(MSGT_VO, MSGL_ERR, | |
167 "Sorry, this (%d) color depth not supported.\n", | |
168 vo_depthonscreen); | |
169 return -1; | |
170 } | |
13946 | 171 mp_msg(MSGT_VO, MSGL_V, "Using colorkey: %x\n", colorkey); |
1 | 172 |
12582 | 173 inited = 1; |
1 | 174 |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
175 #ifdef HAVE_NEW_GUI |
12582 | 176 if (use_gui) |
177 guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window | |
178 else | |
5985 | 179 #endif |
12582 | 180 { |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13946
diff
changeset
|
181 if (flags & VOFLAG_FULLSCREEN) |
12582 | 182 aspect(&dwidth, &dheight, A_ZOOM); |
723 | 183 |
12582 | 184 XGetWindowAttributes(mDisplay, mRootWin, &attribs); |
185 mDepth = attribs.depth; | |
186 if (mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32) | |
187 mDepth = 24; | |
188 XMatchVisualInfo(mDisplay, mScreen, mDepth, TrueColor, &vinfo); | |
189 xWAttribs.colormap = | |
190 XCreateColormap(mDisplay, mRootWin, vinfo.visual, AllocNone); | |
191 xWAttribs.background_pixel = 0; | |
192 xWAttribs.border_pixel = 0; | |
193 xWAttribs.event_mask = | |
194 StructureNotifyMask | ExposureMask | KeyPressMask | | |
195 ((WinID == | |
196 0) ? 0 : (ButtonPressMask | ButtonReleaseMask | | |
197 PointerMotionMask | PropertyChangeMask)); | |
198 xswamask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; | |
199 | |
200 if (WinID >= 0) | |
201 { | |
1 | 202 |
12582 | 203 vo_window = WinID ? ((Window) WinID) : mRootWin; |
204 if (WinID) | |
205 { | |
206 XUnmapWindow(mDisplay, vo_window); | |
207 XChangeWindowAttributes(mDisplay, vo_window, xswamask, | |
208 &xWAttribs); | |
209 vo_x11_selectinput_witherr(mDisplay, vo_window, | |
210 StructureNotifyMask | | |
211 KeyPressMask | | |
212 PropertyChangeMask | | |
213 PointerMotionMask | | |
214 ButtonPressMask | | |
215 ButtonReleaseMask | | |
216 ExposureMask); | |
15540 | 217 XMapWindow(mDisplay, vo_window); |
12582 | 218 } else |
219 XSelectInput(mDisplay, vo_window, ExposureMask); | |
220 | |
221 } else | |
222 { | |
7679 | 223 |
12582 | 224 if (vo_window == None) |
225 { | |
226 vo_window = XCreateWindow(mDisplay, mRootWin, | |
227 vo_dx, vo_dy, | |
228 vo_dwidth, vo_dheight, | |
229 xWAttribs.border_pixel, | |
230 mDepth, | |
231 InputOutput, | |
232 vinfo.visual, xswamask, | |
233 &xWAttribs); | |
723 | 234 |
12582 | 235 vo_x11_classhint(mDisplay, vo_window, "xmga"); |
236 vo_hidecursor(mDisplay, vo_window); | |
237 vo_x11_sizehint(vo_dx, vo_dy, vo_dwidth, vo_dheight, 0); | |
238 | |
239 XStoreName(mDisplay, vo_window, mTitle); | |
240 XMapWindow(mDisplay, vo_window); | |
18715
30d7ddf08889
Fix window position when changing videos while in fullscreen and for
reimar
parents:
18509
diff
changeset
|
241 vo_x11_nofs_sizepos(vo_dx, vo_dy, vo_dwidth, vo_dheight); |
12582 | 242 |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13946
diff
changeset
|
243 if (flags & VOFLAG_FULLSCREEN) |
12582 | 244 vo_x11_fullscreen(); |
5999 | 245 |
18715
30d7ddf08889
Fix window position when changing videos while in fullscreen and for
reimar
parents:
18509
diff
changeset
|
246 } else |
30d7ddf08889
Fix window position when changing videos while in fullscreen and for
reimar
parents:
18509
diff
changeset
|
247 vo_x11_nofs_sizepos(vo_dx, vo_dy, vo_dwidth, vo_dheight); |
12582 | 248 } |
7679 | 249 |
12582 | 250 if (vo_gc != None) |
251 XFreeGC(mDisplay, vo_gc); | |
252 vo_gc = XCreateGC(mDisplay, vo_window, GCForeground, &wGCV); | |
7679 | 253 |
12582 | 254 } // !GUI |
7679 | 255 |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13946
diff
changeset
|
256 if ((flags & VOFLAG_FULLSCREEN) && (!WinID)) |
12582 | 257 { |
258 vo_dx = 0; | |
259 vo_dy = 0; | |
260 vo_dwidth = vo_screenwidth; | |
261 vo_dheight = vo_screenheight; | |
262 vo_fs = 1; | |
263 } | |
7679 | 264 |
12582 | 265 panscan_calc(); |
6755 | 266 |
12582 | 267 mga_vid_config.colkey_on = 1; |
268 mga_vid_config.colkey_red = r; | |
269 mga_vid_config.colkey_green = g; | |
270 mga_vid_config.colkey_blue = b; | |
271 | |
272 set_window(); // set up mga_vid_config.dest_width etc | |
273 | |
274 if (vo_ontop) | |
275 vo_x11_setlayer(mDisplay, vo_window, vo_ontop); | |
6755 | 276 |
12582 | 277 XSync(mDisplay, False); |
278 | |
279 ioctl(f, MGA_VID_ON, 0); | |
280 | |
281 return 0; | |
1 | 282 } |
283 | |
12582 | 284 static void uninit(void) |
285 { | |
286 mp_msg(MSGT_VO, MSGL_V, "vo: uninit!\n"); | |
287 mga_uninit(); | |
288 if (!inited) | |
289 return; // no window? | |
290 inited = 0; | |
291 vo_x11_uninit(); // destroy the window | |
1 | 292 } |