Mercurial > mplayer.hg
annotate libvo/vo_xmga.c @ 11553:656932ca58ab
vidix_get_image() fix
author | michael |
---|---|
date | Wed, 03 Dec 2003 17:44:15 +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 |