Mercurial > mplayer.hg
annotate libvo/vo_xmga.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 |
---|---|
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 |
9380 | 41 #include "../osdep/timer.h" |
100 | 42 static unsigned int timer=0; |
43 static unsigned int timerd=0; | |
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 |
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
47 #include "../Gui/interface.h" |
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 |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
8017
diff
changeset
|
50 static vo_info_t info = |
1 | 51 { |
7680 | 52 "Matrox G200/G4x0/G550 overlay in X11 window (using /dev/mga_vid)", |
1 | 53 "xmga", |
54 "Zoltan Ponekker <pontscho@makacs.poliod.hu>", | |
55 "" | |
56 }; | |
57 | |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
8017
diff
changeset
|
58 LIBVO_EXTERN( xmga ) |
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
8017
diff
changeset
|
59 |
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
8017
diff
changeset
|
60 |
1 | 61 static XGCValues wGCV; |
62 | |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7124
diff
changeset
|
63 static uint32_t mDepth; |
1 | 64 static XWindowAttributes attribs; |
10988 | 65 static int colorkey; |
1 | 66 |
67 static uint32_t mvHeight; | |
68 static uint32_t mvWidth; | |
69 | |
70 static Window mRoot; | |
71 | |
72 static XSetWindowAttributes xWAttribs; | |
73 | |
6311
da2dda48b7ec
add mute support ( step 1 ) and fixed panscan bugs (1000l for me)
pontscho
parents:
6307
diff
changeset
|
74 static int inited=0; |
da2dda48b7ec
add mute support ( step 1 ) and fixed panscan bugs (1000l for me)
pontscho
parents:
6307
diff
changeset
|
75 |
4981 | 76 #define VO_XMGA |
1 | 77 #include "mga_common.c" |
4981 | 78 #undef VO_XMGA |
1 | 79 |
80 static void mDrawColorKey( void ) | |
81 { | |
4795 | 82 XSetBackground( mDisplay,vo_gc,0 ); |
83 XClearWindow( mDisplay,vo_window ); | |
10988 | 84 XSetForeground( mDisplay,vo_gc,colorkey ); |
4981 | 85 XFillRectangle( mDisplay,vo_window,vo_gc,drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight) ); |
1 | 86 XFlush( mDisplay ); |
87 } | |
88 | |
31 | 89 static void check_events(void) |
1 | 90 { |
4303 | 91 int e=vo_x11_check_events(mDisplay); |
92 if ( !(e&VO_EVENT_RESIZE) && !(e&VO_EVENT_EXPOSE) ) return; | |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
93 set_window(); |
6043 | 94 mDrawColorKey(); |
6296 | 95 if ( ioctl( f,MGA_VID_CONFIG,&mga_vid_config ) ) mp_msg(MSGT_VO,MSGL_WARN,"Error in mga_vid_config ioctl (wrong mga_vid.o version?)" ); |
1 | 96 } |
97 | |
31 | 98 static void flip_page(void){ |
182 | 99 #ifdef SHOW_TIME |
100 | 100 unsigned int t; |
101 t=GetTimer(); | |
6296 | 102 mp_msg(MSGT_VO,MSGL_STATUS," [timer: %08X diff: %6d dd: %6d ] \n",t,t-timer,(t-timer)-timerd); |
100 | 103 timerd=t-timer; |
104 timer=t; | |
182 | 105 #endif |
100 | 106 |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1210
diff
changeset
|
107 vo_mga_flip_page(); |
31 | 108 } |
1 | 109 |
7124
eca7dbad0166
finally removed query_vaa, bes_da and vo_tune_info - the obsoleted libvo api
alex
parents:
6953
diff
changeset
|
110 static uint32_t config( uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) |
1 | 111 { |
112 char * mTitle=(title == NULL) ? "XMGA render" : title; | |
113 XVisualInfo vinfo; | |
114 unsigned long xswamask; | |
10988 | 115 int r, g, b; |
1 | 116 |
7679 | 117 if(mga_init(width,height,format)) return -1; // ioctl errors? |
1 | 118 |
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
|
119 aspect_save_orig(width,height); |
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2057
diff
changeset
|
120 aspect_save_prescale(d_width,d_height); |
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2057
diff
changeset
|
121 aspect_save_screenres(vo_screenwidth,vo_screenheight); |
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2057
diff
changeset
|
122 |
1 | 123 mvWidth=width; mvHeight=height; |
124 | |
6307 | 125 vo_panscan_x=vo_panscan_y=vo_panscan_amount=0; |
126 | |
7679 | 127 vo_dx=( vo_screenwidth - d_width ) / 2; |
128 vo_dy=( vo_screenheight - d_height ) / 2; | |
10729 | 129 geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth, vo_screenheight); |
4981 | 130 vo_dwidth=d_width; vo_dheight=d_height; |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
131 vo_mouse_autohide=1; |
1 | 132 |
10988 | 133 r = (vo_colorkey & 0x00ff0000) >> 16; |
134 g = (vo_colorkey & 0x0000ff00) >> 8; | |
135 b = vo_colorkey & 0x000000ff; | |
1 | 136 switch ( vo_depthonscreen ) |
137 { | |
10988 | 138 case 32: colorkey = vo_colorkey; break; |
139 case 24: colorkey = vo_colorkey & 0x00ffffff; break; | |
140 case 16: colorkey = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3); break; | |
141 case 15: colorkey = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3); break; | |
6296 | 142 default: mp_msg(MSGT_VO,MSGL_ERR,"Sorry, this (%d) color depth not supported.\n",vo_depthonscreen ); return -1; |
1 | 143 } |
10988 | 144 mp_msg(MSGT_VO, MSGL_INFO, "Using colorkey: %x\n", colorkey); |
1 | 145 |
5158 | 146 inited=1; |
147 | |
10729 | 148 aspect(&d_width,&d_height,A_NOZOOM); |
5985 | 149 |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
150 #ifdef HAVE_NEW_GUI |
5985 | 151 if(use_gui) |
152 guiGetEvent( guiSetShVideo,0 ); // the GUI will set up / resize the window | |
153 else | |
154 #endif | |
723 | 155 { |
6043 | 156 if ( flags&1 ) aspect(&dwidth,&dheight,A_ZOOM); |
723 | 157 |
6043 | 158 XGetWindowAttributes( mDisplay,mRootWin,&attribs ); |
723 | 159 mDepth=attribs.depth; |
160 if ( mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32 ) mDepth=24; | |
161 XMatchVisualInfo( mDisplay,mScreen,mDepth,TrueColor,&vinfo ); | |
6043 | 162 xWAttribs.colormap=XCreateColormap( mDisplay,mRootWin,vinfo.visual,AllocNone ); |
723 | 163 xWAttribs.background_pixel=0; |
164 xWAttribs.border_pixel=0; | |
6043 | 165 xWAttribs.event_mask=StructureNotifyMask | ExposureMask | KeyPressMask | |
166 ((WinID==0)?0:(ButtonPressMask | ButtonReleaseMask | PointerMotionMask | PropertyChangeMask)); | |
723 | 167 xswamask=CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; |
1 | 168 |
3847 | 169 if ( WinID>=0 ){ |
6043 | 170 |
171 vo_window = WinID ? ((Window)WinID) : mRootWin; | |
172 if ( WinID ) | |
173 { | |
174 XUnmapWindow( mDisplay,vo_window ); | |
175 XChangeWindowAttributes( mDisplay,vo_window,xswamask,&xWAttribs); | |
6953
ce67cc1f0beb
ignore BadAccess error at XSelectInput() (grabbing mouse etc) with warning
arpi
parents:
6755
diff
changeset
|
176 vo_x11_selectinput_witherr( mDisplay,vo_window,StructureNotifyMask | KeyPressMask | PropertyChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask ); |
6043 | 177 } else XSelectInput( mDisplay,vo_window,ExposureMask ); |
178 | |
7679 | 179 } else { |
180 | |
7777 | 181 if ( vo_window == None ) |
182 { | |
183 vo_window=XCreateWindow( mDisplay,mRootWin, | |
6043 | 184 vo_dx,vo_dy, |
185 vo_dwidth,vo_dheight, | |
186 xWAttribs.border_pixel, | |
187 mDepth, | |
188 InputOutput, | |
189 vinfo.visual,xswamask,&xWAttribs ); | |
190 | |
7777 | 191 vo_x11_classhint( mDisplay,vo_window,"xmga" ); |
192 vo_hidecursor(mDisplay,vo_window); | |
193 vo_x11_sizehint( vo_dx,vo_dy,vo_dwidth,vo_dheight,0 ); | |
723 | 194 |
7777 | 195 XStoreName( mDisplay,vo_window,mTitle ); |
196 XMapWindow( mDisplay,vo_window ); | |
6043 | 197 |
7777 | 198 if ( flags&1 ) vo_x11_fullscreen(); |
5999 | 199 |
3990 | 200 #ifdef HAVE_XINERAMA |
7777 | 201 vo_x11_xinerama_move(mDisplay,vo_window); |
3990 | 202 #endif |
7777 | 203 } else if ( !(flags&1) ) XMoveResizeWindow( mDisplay,vo_window,vo_dx,vo_dy,vo_dwidth,vo_dheight ); |
6043 | 204 } |
7679 | 205 |
7777 | 206 if ( vo_gc != None ) XFreeGC( mDisplay,vo_gc ); |
6043 | 207 vo_gc=XCreateGC( mDisplay,vo_window,GCForeground,&wGCV ); |
7679 | 208 |
209 } // !GUI | |
1 | 210 |
6043 | 211 if ( ( flags&1 )&&( !WinID ) ) { vo_dx=0; vo_dy=0; vo_dwidth=vo_screenwidth; vo_dheight=vo_screenheight; vo_fs=1; } |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
212 |
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
213 panscan_calc(); |
7679 | 214 |
215 mga_vid_config.colkey_on=1; | |
10988 | 216 mga_vid_config.colkey_red=r; |
217 mga_vid_config.colkey_green=g; | |
218 mga_vid_config.colkey_blue=b; | |
7679 | 219 |
220 set_window(); // set up mga_vid_config.dest_width etc | |
1 | 221 |
6755 | 222 saver_off(mDisplay); |
223 | |
11542 | 224 if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop); |
225 | |
6755 | 226 XFlush( mDisplay ); |
227 XSync( mDisplay,False ); | |
7777 | 228 |
229 ioctl(f,MGA_VID_ON,0); | |
6755 | 230 |
7679 | 231 return 0; |
1 | 232 } |
233 | |
7679 | 234 static void uninit(void){ |
235 mp_msg(MSGT_VO,MSGL_V,"vo: uninit!\n"); | |
236 mga_uninit(); | |
237 if(!inited) return; // no window? | |
5158 | 238 inited=0; |
4316 | 239 saver_on(mDisplay); |
7679 | 240 vo_x11_uninit(); // destroy the window |
1 | 241 } |
4352 | 242 |