Mercurial > mplayer.hg
annotate libvo/vo_xmga.c @ 20826:bad45d01be6a
Remove loader_objfix.sh hack, it's only needed for very old OpenBSD versions.
author | diego |
---|---|
date | Fri, 10 Nov 2006 18:28:53 +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 } |