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