Mercurial > mplayer.hg
annotate libvo/vo_xvidix.c @ 11619:179138947307
This patch contains bugfixes for the esd audio output driver that I
uncovered while trying to send sound to a remote esd server over a
wireless (11 mbs, just enough to handle to sound) link.
First, the sound was full "ticking" sounds. I found a bug that
prevented the "send the remainder of this block" code from ever being
called - so large chunks of audio were simply being ignored. Fixing
this bug removed the "ticking" from audio streams.
Fixing this bug, however, uncovered another problem - when the socket
buffer was full, doing a blocking write to finish the buffer would take
far too long and would turn video into a chunky mess. I'd imagine this
blocking write would be fine for an audio-only stream, but it turns out
to hold up the video far too much.
The solution in this patch is to write as much data as possible to the
socket, and then return as soon as possible, reporting the number of
bytes actually written accurately back to mplayer. I've tested it on
both local and remote esd servers, and it works well.
Patch by Benjamin Osheroff <ben@gimbo.net>
author | attila |
---|---|
date | Wed, 10 Dec 2003 12:19:13 +0000 |
parents | 85e503ddf65f |
children | 162c80b2d432 |
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 |
11542 | 371 if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop); |
372 | |
4123 | 373 saver_off(mDisplay); /* turning off screen saver */ |
374 | |
375 return(0); | |
376 } | |
377 | |
378 static void check_events(void) | |
379 { | |
380 const int event = vo_x11_check_events(mDisplay); | |
4125 | 381 |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
382 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
|
383 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
|
384 |
4125 | 385 return; |
4123 | 386 } |
387 | |
388 /* draw_osd, flip_page, draw_slice, draw_frame should be | |
389 overwritten with vidix functions (vosub_vidix.c) */ | |
390 static void draw_osd(void) | |
391 { | |
392 mp_msg(MSGT_VO, MSGL_FATAL, "[xvidix] error: didn't used vidix draw_osd!\n"); | |
393 return; | |
394 } | |
395 | |
396 static void flip_page(void) | |
397 { | |
398 mp_msg(MSGT_VO, MSGL_FATAL, "[xvidix] error: didn't used vidix flip_page!\n"); | |
399 return; | |
400 } | |
401 | |
402 static uint32_t draw_slice(uint8_t *src[], int stride[], | |
403 int w, int h, int x, int y) | |
404 { | |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
405 UNUSED(src); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
406 UNUSED(stride); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
407 UNUSED(w); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
408 UNUSED(h); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
409 UNUSED(x); |
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
410 UNUSED(y); |
4123 | 411 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
|
412 return(-1); |
4123 | 413 } |
414 | |
415 static uint32_t draw_frame(uint8_t *src[]) | |
416 { | |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
417 UNUSED(src); |
4123 | 418 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
|
419 return(-1); |
4123 | 420 } |
421 | |
422 static uint32_t query_format(uint32_t format) | |
423 { | |
4363 | 424 return(vidix_query_fourcc(format)); |
4123 | 425 } |
426 | |
427 static void uninit(void) | |
428 { | |
6563 | 429 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
|
430 vidix_term(); |
8577 | 431 |
432 if (vidix_name) | |
433 { | |
434 free(vidix_name); | |
435 vidix_name = NULL; | |
436 } | |
4441
90814d64a840
removed obosolete Terminate_Display_Process. using vo_x11_uninit. support UYVY format
alex
parents:
4434
diff
changeset
|
437 |
4316 | 438 saver_on(mDisplay); /* screen saver back on */ |
6095 | 439 vo_x11_uninit(); |
4271
2c7e6c87fb6f
reworked, picture moves when window moved, fullscreen working with gui, fixed some annoying bugs
alex
parents:
4255
diff
changeset
|
440 } |
4352 | 441 |
442 static uint32_t preinit(const char *arg) | |
443 { | |
6016 | 444 |
4363 | 445 if (arg) |
446 vidix_name = strdup(arg); | |
447 else | |
448 { | |
11462 | 449 mp_msg(MSGT_VO, MSGL_INFO, "No vidix driver name provided, probing available ones (-v option for details)!\n"); |
4363 | 450 vidix_name = NULL; |
451 } | |
452 | |
7931 | 453 if (!vo_init()) return(-1); |
7777 | 454 |
4363 | 455 if (vidix_preinit(vidix_name, &video_out_xvidix) != 0) |
456 return(1); | |
457 | |
458 return(0); | |
4352 | 459 } |
460 | |
4596 | 461 static uint32_t control(uint32_t request, void *data, ...) |
4352 | 462 { |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4570
diff
changeset
|
463 switch (request) { |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4570
diff
changeset
|
464 case VOCTRL_QUERY_FORMAT: |
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4570
diff
changeset
|
465 return query_format(*((uint32_t*)data)); |
5738 | 466 case VOCTRL_GUISUPPORT: |
467 return VO_TRUE; | |
6307 | 468 case VOCTRL_GET_PANSCAN: |
6311
da2dda48b7ec
add mute support ( step 1 ) and fixed panscan bugs (1000l for me)
pontscho
parents:
6307
diff
changeset
|
469 if ( !vo_config_count || !vo_fs ) return VO_FALSE; |
6307 | 470 return VO_TRUE; |
11542 | 471 case VOCTRL_ONTOP: |
472 vo_x11_ontop(); | |
473 return VO_TRUE; | |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
474 case VOCTRL_FULLSCREEN: |
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
475 vo_x11_fullscreen(); |
6307 | 476 case VOCTRL_SET_PANSCAN: |
477 if ( vo_fs && ( vo_panscan != vo_panscan_amount ) ) | |
478 { | |
479 panscan_calc(); | |
7124
eca7dbad0166
finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents:
6953
diff
changeset
|
480 set_window(0); |
6307 | 481 } |
482 return VO_TRUE; | |
6786 | 483 case VOCTRL_SET_EQUALIZER: |
484 { | |
485 va_list ap; | |
486 int value; | |
487 | |
488 va_start(ap, data); | |
489 value = va_arg(ap, int); | |
490 va_end(ap); | |
491 | |
492 return vidix_control(request, data, (int *)value); | |
493 } | |
494 case VOCTRL_GET_EQUALIZER: | |
495 { | |
496 va_list ap; | |
497 int *value; | |
498 | |
499 va_start(ap, data); | |
6843 | 500 value = va_arg(ap, int*); |
6786 | 501 va_end(ap); |
502 | |
503 return vidix_control(request, data, value); | |
504 } | |
4592
5fbfd8545c3b
query_ stuff replaced by new control() - patch by David Holm
arpi
parents:
4570
diff
changeset
|
505 } |
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
|
506 return vidix_control(request, data); |
6531 | 507 // return VO_NOTIMPL; |
4352 | 508 } |