Mercurial > mplayer.hg
annotate libvo/vo_xmga.c @ 7030:660a8439c679
10l
author | michael |
---|---|
date | Fri, 16 Aug 2002 22:39:02 +0000 |
parents | ce67cc1f0beb |
children | eca7dbad0166 |
rev | line source |
---|---|
100 | 1 |
2 //#define SHOW_TIME | |
1 | 3 |
4 /* | |
5 * video_out_xmga.c | |
6 * | |
7 * Copyright (C) Zoltan Ponekker - Jan 2001 | |
8 * | |
9 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. | |
10 * | |
11 * mpeg2dec is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2, or (at your option) | |
14 * any later version. | |
15 * | |
16 * mpeg2dec is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with GNU Make; see the file COPYING. If not, write to | |
23 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | |
24 * | |
25 */ | |
26 | |
27 #include <stdio.h> | |
28 #include <stdlib.h> | |
29 #include <string.h> | |
30 | |
31 #include "config.h" | |
6296 | 32 #include "mp_msg.h" |
33 | |
1 | 34 #include "video_out.h" |
35 #include "video_out_internal.h" | |
36 | |
37 LIBVO_EXTERN( xmga ) | |
38 | |
39 #include <sys/ioctl.h> | |
40 #include <unistd.h> | |
41 #include <fcntl.h> | |
42 #include <sys/mman.h> | |
43 | |
44 #include "drivers/mga_vid.h" | |
45 | |
46 #include <X11/Xlib.h> | |
47 #include <X11/Xutil.h> | |
48 #include <errno.h> | |
49 | |
4017 | 50 #ifdef HAVE_XINERAMA |
51 #include <X11/extensions/Xinerama.h> | |
52 #endif | |
53 | |
31 | 54 #include "x11_common.h" |
616 | 55 #include "sub.h" |
2057 | 56 #include "aspect.h" |
31 | 57 |
182 | 58 #ifdef SHOW_TIME |
100 | 59 #include "../linux/timer.h" |
60 static unsigned int timer=0; | |
61 static unsigned int timerd=0; | |
62 #endif | |
63 | |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
64 #ifdef HAVE_NEW_GUI |
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
65 #include "../Gui/interface.h" |
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
66 #endif |
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
67 |
1 | 68 static vo_info_t vo_info = |
69 { | |
4993 | 70 "X11 (Matrox G200/G4x0/G550 overlay in window using /dev/mga_vid)", |
1 | 71 "xmga", |
72 "Zoltan Ponekker <pontscho@makacs.poliod.hu>", | |
73 "" | |
74 }; | |
75 | |
76 static XGCValues wGCV; | |
77 | |
78 static XImage * myximage; | |
79 | |
80 static uint32_t mDepth, bpp, mode; | |
81 static XWindowAttributes attribs; | |
82 static uint32_t fgColor; | |
83 | |
84 static uint32_t mvHeight; | |
85 static uint32_t mvWidth; | |
86 | |
87 static Window mRoot; | |
88 static uint32_t drwX,drwY,drwWidth,drwHeight,drwBorderWidth,drwDepth; | |
4981 | 89 static uint32_t drwcX,drwcY,dwidth,dheight; |
1 | 90 |
91 static XSetWindowAttributes xWAttribs; | |
92 | |
6311
da2dda48b7ec
add mute support ( step 1 ) and fixed panscan bugs (1000l for me)
pontscho
parents:
6307
diff
changeset
|
93 static int inited=0; |
da2dda48b7ec
add mute support ( step 1 ) and fixed panscan bugs (1000l for me)
pontscho
parents:
6307
diff
changeset
|
94 |
4981 | 95 #define VO_XMGA |
1 | 96 #include "mga_common.c" |
4981 | 97 #undef VO_XMGA |
1 | 98 |
99 static void mDrawColorKey( void ) | |
100 { | |
4795 | 101 XSetBackground( mDisplay,vo_gc,0 ); |
102 XClearWindow( mDisplay,vo_window ); | |
103 XSetForeground( mDisplay,vo_gc,fgColor ); | |
4981 | 104 XFillRectangle( mDisplay,vo_window,vo_gc,drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight) ); |
1 | 105 XFlush( mDisplay ); |
106 } | |
107 | |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
108 static void set_window( void ){ |
120 | 109 |
6043 | 110 if ( WinID ) |
111 { | |
112 XGetGeometry( mDisplay,vo_window,&mRoot,&drwX,&drwY,&drwWidth,&drwHeight,&drwBorderWidth,&drwDepth ); | |
6296 | 113 mp_msg(MSGT_VO,MSGL_V,"[xmga] x: %d y: %d w: %d h: %d\n",drwX,drwY,drwWidth,drwHeight ); |
6043 | 114 drwX=0; drwY=0; |
115 XTranslateCoordinates( mDisplay,vo_window,mRoot,0,0,&drwcX,&drwcY,&mRoot ); | |
6296 | 116 mp_msg(MSGT_VO,MSGL_V,"[xmga] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); |
6043 | 117 } |
118 else { drwX=drwcX=vo_dx; drwY=drwcY=vo_dy; drwWidth=vo_dwidth; drwHeight=vo_dheight; } | |
1852 | 119 |
3558 | 120 aspect(&dwidth,&dheight,A_NOZOOM); |
4981 | 121 if ( vo_fs ) |
120 | 122 { |
3558 | 123 aspect(&dwidth,&dheight,A_ZOOM); |
120 | 124 drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2; |
125 drwcX+=drwX; | |
126 drwY=( vo_screenheight - (dheight > vo_screenheight?vo_screenheight:dheight) ) / 2; | |
127 drwcY+=drwY; | |
128 drwWidth=(dwidth > vo_screenwidth?vo_screenwidth:dwidth); | |
129 drwHeight=(dheight > vo_screenheight?vo_screenheight:dheight); | |
6296 | 130 mp_msg(MSGT_VO,MSGL_V,"[xmga-fs] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); |
120 | 131 } |
6307 | 132 vo_dwidth=drwWidth; vo_dheight=drwHeight; |
120 | 133 |
4017 | 134 #ifdef HAVE_XINERAMA |
135 if(XineramaIsActive(mDisplay)) | |
136 { | |
137 XineramaScreenInfo *screens; | |
138 int num_screens; | |
139 int i; | |
140 | |
141 screens = XineramaQueryScreens(mDisplay,&num_screens); | |
142 | |
143 /* find the screen we are on */ | |
144 i = 0; | |
145 while(!(screens[i].x_org <= drwcX && screens[i].y_org <= drwcY && | |
146 screens[i].x_org + screens[i].width >= drwcX && | |
147 screens[i].y_org + screens[i].height >= drwcY )) | |
148 { | |
149 i++; | |
150 } | |
151 | |
152 /* set drwcX and drwcY to the right values */ | |
153 drwcX = drwcX - screens[i].x_org; | |
154 drwcY = drwcY - screens[i].y_org; | |
155 XFree(screens); | |
156 } | |
157 | |
158 #endif | |
6307 | 159 |
160 mDrawColorKey(); | |
161 | |
120 | 162 mga_vid_config.x_org=drwcX; |
163 mga_vid_config.y_org=drwcY; | |
164 mga_vid_config.dest_width=drwWidth; | |
165 mga_vid_config.dest_height=drwHeight; | |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
166 if ( vo_panscan > 0.0f && vo_fs ) |
6307 | 167 { |
168 drwX-=vo_panscan_x>>1; | |
169 drwY-=vo_panscan_y>>1; | |
170 drwWidth+=vo_panscan_x; | |
171 drwHeight+=vo_panscan_y; | |
172 | |
173 mga_vid_config.x_org-=vo_panscan_x>>1; | |
174 mga_vid_config.y_org-=vo_panscan_y>>1; | |
175 mga_vid_config.dest_width=drwWidth; | |
176 mga_vid_config.dest_height=drwHeight; | |
177 mDrawColorKey(); | |
178 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?)" ); | |
179 } | |
120 | 180 } |
181 | |
31 | 182 static void check_events(void) |
1 | 183 { |
4303 | 184 int e=vo_x11_check_events(mDisplay); |
185 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
|
186 set_window(); |
6043 | 187 mDrawColorKey(); |
6296 | 188 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 | 189 } |
190 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1210
diff
changeset
|
191 static void draw_osd(void) |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1210
diff
changeset
|
192 { vo_draw_text(mga_vid_config.src_width,mga_vid_config.src_height,draw_alpha);} |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1210
diff
changeset
|
193 |
31 | 194 static void flip_page(void){ |
182 | 195 #ifdef SHOW_TIME |
100 | 196 unsigned int t; |
197 t=GetTimer(); | |
6296 | 198 mp_msg(MSGT_VO,MSGL_STATUS," [timer: %08X diff: %6d dd: %6d ] \n",t,t-timer,(t-timer)-timerd); |
100 | 199 timerd=t-timer; |
200 timer=t; | |
182 | 201 #endif |
100 | 202 |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1210
diff
changeset
|
203 vo_mga_flip_page(); |
31 | 204 } |
1 | 205 |
6043 | 206 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,const vo_tune_info_t* info) |
1 | 207 { |
208 char * mTitle=(title == NULL) ? "XMGA render" : title; | |
209 XVisualInfo vinfo; | |
210 | |
211 unsigned long xswamask; | |
212 | |
6016 | 213 if (!vo_init()) return -1; |
214 | |
5007 | 215 width+=width&1; |
216 | |
1 | 217 switch(format) |
218 { | |
182 | 219 case IMGFMT_YV12: |
5007 | 220 height+=height&1; |
5317 | 221 mga_vid_config.format=MGA_VID_FORMAT_IYUV; |
182 | 222 mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height + ( ( ( width + 31 ) & ~31 ) * height ) / 2; |
56 | 223 break; |
470 | 224 case IMGFMT_I420: |
225 case IMGFMT_IYUV: | |
5007 | 226 height+=height&1; |
5317 | 227 mga_vid_config.format=MGA_VID_FORMAT_YV12; |
470 | 228 mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height + ( ( ( width + 31 ) & ~31 ) * height ) / 2; |
229 break; | |
56 | 230 case IMGFMT_YUY2: |
231 mga_vid_config.format=MGA_VID_FORMAT_YUY2; | |
182 | 232 mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height * 2; |
56 | 233 break; |
448
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
384
diff
changeset
|
234 case IMGFMT_UYVY: |
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
384
diff
changeset
|
235 mga_vid_config.format=MGA_VID_FORMAT_UYVY; |
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
384
diff
changeset
|
236 mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height * 2; |
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
384
diff
changeset
|
237 break; |
6296 | 238 default: |
239 mp_msg(MSGT_VO,MSGL_ERR,"mga: invalid output format %0X\n",format); | |
240 return -1; | |
1 | 241 } |
242 | |
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
|
243 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
|
244 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
|
245 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
|
246 |
1 | 247 mvWidth=width; mvHeight=height; |
248 | |
6307 | 249 vo_panscan_x=vo_panscan_y=vo_panscan_amount=0; |
250 | |
6043 | 251 vo_dx=( vo_screenwidth - d_width ) / 2; vo_dy=( vo_screenheight - d_height ) / 2; |
4981 | 252 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
|
253 vo_mouse_autohide=1; |
1 | 254 |
255 switch ( vo_depthonscreen ) | |
256 { | |
257 case 32: | |
258 case 24: fgColor=0x00ff00ffL; break; | |
259 case 16: fgColor=0xf81fL; break; | |
260 case 15: fgColor=0x7c1fL; break; | |
6296 | 261 default: mp_msg(MSGT_VO,MSGL_ERR,"Sorry, this (%d) color depth not supported.\n",vo_depthonscreen ); return -1; |
1 | 262 } |
263 | |
5158 | 264 inited=1; |
265 | |
6016 | 266 aspect(&vo_dwidth,&vo_dheight,A_NOZOOM); |
5985 | 267 |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
268 #ifdef HAVE_NEW_GUI |
5985 | 269 if(use_gui) |
270 guiGetEvent( guiSetShVideo,0 ); // the GUI will set up / resize the window | |
271 else | |
272 #endif | |
723 | 273 { |
2039 | 274 #ifdef X11_FULLSCREEN |
6043 | 275 if ( flags&1 ) aspect(&dwidth,&dheight,A_ZOOM); |
2039 | 276 #endif |
723 | 277 |
6043 | 278 XGetWindowAttributes( mDisplay,mRootWin,&attribs ); |
723 | 279 mDepth=attribs.depth; |
280 if ( mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32 ) mDepth=24; | |
281 XMatchVisualInfo( mDisplay,mScreen,mDepth,TrueColor,&vinfo ); | |
6043 | 282 xWAttribs.colormap=XCreateColormap( mDisplay,mRootWin,vinfo.visual,AllocNone ); |
723 | 283 xWAttribs.background_pixel=0; |
284 xWAttribs.border_pixel=0; | |
6043 | 285 xWAttribs.event_mask=StructureNotifyMask | ExposureMask | KeyPressMask | |
286 ((WinID==0)?0:(ButtonPressMask | ButtonReleaseMask | PointerMotionMask | PropertyChangeMask)); | |
723 | 287 xswamask=CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; |
1 | 288 |
3847 | 289 if ( WinID>=0 ){ |
6043 | 290 |
291 vo_window = WinID ? ((Window)WinID) : mRootWin; | |
292 if ( WinID ) | |
293 { | |
294 XUnmapWindow( mDisplay,vo_window ); | |
295 XChangeWindowAttributes( mDisplay,vo_window,xswamask,&xWAttribs); | |
6953
ce67cc1f0beb
ignore BadAccess error at XSelectInput() (grabbing mouse etc) with warning
arpi
parents:
6755
diff
changeset
|
296 vo_x11_selectinput_witherr( mDisplay,vo_window,StructureNotifyMask | KeyPressMask | PropertyChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask ); |
6043 | 297 } else XSelectInput( mDisplay,vo_window,ExposureMask ); |
298 | |
3847 | 299 } else |
6043 | 300 { |
301 vo_window=XCreateWindow( mDisplay,mRootWin, | |
302 vo_dx,vo_dy, | |
303 vo_dwidth,vo_dheight, | |
304 xWAttribs.border_pixel, | |
305 mDepth, | |
306 InputOutput, | |
307 vinfo.visual,xswamask,&xWAttribs ); | |
308 | |
309 vo_x11_classhint( mDisplay,vo_window,"xmga" ); | |
310 vo_hidecursor(mDisplay,vo_window); | |
311 vo_x11_sizehint( vo_dx,vo_dy,vo_dwidth,vo_dheight,0 ); | |
723 | 312 |
6043 | 313 XStoreName( mDisplay,vo_window,mTitle ); |
314 XMapWindow( mDisplay,vo_window ); | |
315 | |
316 if ( flags&1 ) vo_x11_fullscreen(); | |
5999 | 317 |
3990 | 318 #ifdef HAVE_XINERAMA |
6043 | 319 vo_x11_xinerama_move(mDisplay,vo_window); |
3990 | 320 #endif |
6043 | 321 } |
322 vo_gc=XCreateGC( mDisplay,vo_window,GCForeground,&wGCV ); | |
5985 | 323 } |
1 | 324 |
6043 | 325 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
|
326 |
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
327 panscan_calc(); |
6043 | 328 |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6311
diff
changeset
|
329 set_window(); |
1 | 330 |
6755 | 331 saver_off(mDisplay); |
332 | |
333 XFlush( mDisplay ); | |
334 XSync( mDisplay,False ); | |
335 | |
1 | 336 mga_vid_config.src_width=width; |
337 mga_vid_config.src_height=height; | |
338 | |
339 mga_vid_config.colkey_on=1; | |
340 mga_vid_config.colkey_red=255; | |
341 mga_vid_config.colkey_green=0; | |
342 mga_vid_config.colkey_blue=255; | |
6755 | 343 |
344 mga_vid_config.version=MGA_VID_VERSION; | |
1 | 345 |
6755 | 346 return mga_init(); |
1 | 347 } |
348 | |
349 static const vo_info_t* get_info( void ) | |
350 { return &vo_info; } | |
351 | |
352 | |
353 static void | |
354 uninit(void) | |
355 { | |
5158 | 356 if(!inited) return; |
357 inited=0; | |
358 mga_uninit(); | |
4316 | 359 saver_on(mDisplay); |
6095 | 360 vo_x11_uninit(); |
6296 | 361 mp_msg(MSGT_VO,MSGL_V,"vo: uninit!\n"); |
1 | 362 } |
4352 | 363 |