Mercurial > mplayer.hg
annotate libvo/vo_xmga.c @ 2567:ea6158be8103
video frame reading cleanup
author | arpi |
---|---|
date | Tue, 30 Oct 2001 20:36:20 +0000 |
parents | 48f0ac1e9d13 |
children | 1dbf58c3d50c |
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" | |
32 #include "video_out.h" | |
33 #include "video_out_internal.h" | |
34 | |
35 LIBVO_EXTERN( xmga ) | |
36 | |
37 #include <sys/ioctl.h> | |
38 #include <unistd.h> | |
39 #include <fcntl.h> | |
40 #include <sys/mman.h> | |
41 | |
42 #include "drivers/mga_vid.h" | |
43 | |
44 #include <X11/Xlib.h> | |
45 #include <X11/Xutil.h> | |
46 #include <errno.h> | |
47 | |
31 | 48 #include "x11_common.h" |
616 | 49 #include "sub.h" |
2057 | 50 #include "aspect.h" |
31 | 51 |
182 | 52 #ifdef SHOW_TIME |
100 | 53 #include "../linux/timer.h" |
54 static unsigned int timer=0; | |
55 static unsigned int timerd=0; | |
56 #endif | |
57 | |
1 | 58 static vo_info_t vo_info = |
59 { | |
60 "X11 (Matrox G200/G400 overlay in window using /dev/mga_vid)", | |
61 "xmga", | |
62 "Zoltan Ponekker <pontscho@makacs.poliod.hu>", | |
63 "" | |
64 }; | |
65 | |
922
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
844
diff
changeset
|
66 //static Display * mDisplay; |
1 | 67 static Window mWindow; |
68 static GC mGC; | |
69 static XGCValues wGCV; | |
70 | |
71 static XImage * myximage; | |
72 | |
73 static uint32_t mDepth, bpp, mode; | |
74 static XWindowAttributes attribs; | |
75 static uint32_t X_already_started=0; | |
76 | |
77 static uint32_t wndHeight; | |
78 static uint32_t wndWidth; | |
79 static uint32_t wndX; | |
80 static uint32_t wndY; | |
81 | |
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; | |
89 static uint32_t drwcX,drwcY,dwidth,dheight,mFullscreen; | |
90 | |
1783 | 91 #ifdef HAVE_NEW_GUI |
723 | 92 static uint32_t mdwidth,mdheight; |
93 #endif | |
94 | |
1 | 95 static XSetWindowAttributes xWAttribs; |
96 | |
97 #include "mga_common.c" | |
98 | |
99 static void mDrawColorKey( void ) | |
100 { | |
101 XSetForeground( mDisplay,mGC,fgColor ); | |
102 XFillRectangle( mDisplay,mWindow,mGC,drwX,drwY,drwWidth,(mFullscreen?drwHeight - 1:drwHeight) ); | |
103 XFlush( mDisplay ); | |
104 } | |
105 | |
120 | 106 static void set_window(){ |
107 | |
1783 | 108 #ifdef HAVE_NEW_GUI |
723 | 109 if ( vo_window != None ) |
110 { | |
111 mFullscreen=0; | |
112 dwidth=mdwidth; dheight=mdheight; | |
1852 | 113 if ( ( vo_dwidth == vo_screenwidth )&&( vo_dheight == vo_screenheight ) ) |
723 | 114 { |
115 mFullscreen=1; | |
116 dwidth=vo_screenwidth; | |
117 dheight=vo_screenwidth * mdheight / mdwidth; | |
118 } | |
119 } | |
120 #endif | |
121 | |
1852 | 122 XGetGeometry( mDisplay,mWindow,&mRoot,&drwX,&drwY,&drwWidth,&drwHeight,&drwBorderWidth,&drwDepth ); |
123 drwX=0; drwY=0; // drwWidth=wndWidth; drwHeight=wndHeight; | |
124 XTranslateCoordinates( mDisplay,mWindow,mRoot,0,0,&drwcX,&drwcY,&mRoot ); | |
125 fprintf( stderr,"[xmga] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); | |
126 | |
120 | 127 if ( mFullscreen ) |
128 { | |
129 drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2; | |
130 drwcX+=drwX; | |
131 drwY=( vo_screenheight - (dheight > vo_screenheight?vo_screenheight:dheight) ) / 2; | |
132 drwcY+=drwY; | |
133 drwWidth=(dwidth > vo_screenwidth?vo_screenwidth:dwidth); | |
134 drwHeight=(dheight > vo_screenheight?vo_screenheight:dheight); | |
1852 | 135 fprintf( stderr,"[xmga-fs] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); |
120 | 136 } |
137 | |
138 mDrawColorKey(); | |
139 | |
140 mga_vid_config.x_org=drwcX; | |
141 mga_vid_config.y_org=drwcY; | |
142 mga_vid_config.dest_width=drwWidth; | |
143 mga_vid_config.dest_height=drwHeight; | |
144 | |
145 } | |
146 | |
31 | 147 static void check_events(void) |
1 | 148 { |
31 | 149 int e=vo_x11_check_events(mDisplay); |
1 | 150 |
31 | 151 if(e&VO_EVENT_RESIZE){ |
120 | 152 set_window(); |
1 | 153 if ( ioctl( f,MGA_VID_CONFIG,&mga_vid_config ) ) |
154 { | |
614 | 155 printf( "Error in mga_vid_config ioctl (wrong mga_vid.o version?)" ); |
31 | 156 // exit( 0 ); |
1 | 157 } |
31 | 158 |
159 } else | |
160 if(e&VO_EVENT_EXPOSE) mDrawColorKey(); | |
161 | |
1 | 162 } |
163 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1210
diff
changeset
|
164 static void draw_osd(void) |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1210
diff
changeset
|
165 { 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
|
166 |
31 | 167 static void flip_page(void){ |
182 | 168 #ifdef SHOW_TIME |
100 | 169 unsigned int t; |
170 t=GetTimer(); | |
171 printf(" [timer: %08X diff: %6d dd: %6d ] \n",t,t-timer,(t-timer)-timerd); | |
172 timerd=t-timer; | |
173 timer=t; | |
182 | 174 #endif |
100 | 175 |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1210
diff
changeset
|
176 vo_mga_flip_page(); |
31 | 177 } |
1 | 178 |
179 static uint32_t init( uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format ) | |
180 { | |
181 char * frame_mem; | |
56 | 182 // uint32_t frame_size; |
927 | 183 // int mScreen; |
1 | 184 unsigned int fg, bg; |
185 char * mTitle=(title == NULL) ? "XMGA render" : title; | |
186 char * name=":0.0"; | |
187 XSizeHints hint; | |
188 XVisualInfo vinfo; | |
189 XEvent xev; | |
190 | |
191 XGCValues xgcv; | |
192 unsigned long xswamask; | |
193 | |
1210 | 194 char *devname=vo_subdevice?vo_subdevice:"/dev/mga_vid"; |
195 | |
196 f = open(devname,O_RDWR); | |
197 if(f == -1) | |
198 { | |
1637 | 199 perror("open"); |
1210 | 200 printf("Couldn't open %s\n",devname); |
201 return(-1); | |
202 } | |
1 | 203 |
204 switch(format) | |
205 { | |
182 | 206 case IMGFMT_YV12: |
56 | 207 mga_vid_config.format=MGA_VID_FORMAT_YV12; |
182 | 208 mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height + ( ( ( width + 31 ) & ~31 ) * height ) / 2; |
56 | 209 break; |
470 | 210 case IMGFMT_I420: |
211 mga_vid_config.format=MGA_VID_FORMAT_I420; | |
212 mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height + ( ( ( width + 31 ) & ~31 ) * height ) / 2; | |
213 break; | |
214 case IMGFMT_IYUV: | |
215 mga_vid_config.format=MGA_VID_FORMAT_IYUV; | |
216 mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height + ( ( ( width + 31 ) & ~31 ) * height ) / 2; | |
217 break; | |
56 | 218 case IMGFMT_YUY2: |
219 mga_vid_config.format=MGA_VID_FORMAT_YUY2; | |
182 | 220 mga_vid_config.frame_size=( ( width + 31 ) & ~31 ) * height * 2; |
56 | 221 break; |
448
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
384
diff
changeset
|
222 case IMGFMT_UYVY: |
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
384
diff
changeset
|
223 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
|
224 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
|
225 break; |
614 | 226 default: printf("mga: invalid output format %0X\n",format); return (-1); |
1 | 227 } |
228 | |
229 if ( X_already_started ) return -1; | |
230 | |
922
db06ae8967eb
Centralized and cleaned up X11 connecting, fixed remote X11 playing, -display option for mplayer. SHOULD BE TESTED.
lgb
parents:
844
diff
changeset
|
231 if (!vo_init()) return -1; |
1 | 232 |
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
|
233 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
|
234 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
|
235 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
|
236 |
1 | 237 mvWidth=width; mvHeight=height; |
238 | |
239 wndX=0; wndY=0; | |
240 wndWidth=d_width; wndHeight=d_height; | |
1783 | 241 #ifdef HAVE_NEW_GUI |
1852 | 242 // mdwidth=d_width; mdheight=d_height; |
243 mdwidth=width; mdheight=height; | |
723 | 244 #endif |
844 | 245 mFullscreen=fullscreen&1; |
1 | 246 |
247 switch ( vo_depthonscreen ) | |
248 { | |
249 case 32: | |
250 case 24: fgColor=0x00ff00ffL; break; | |
251 case 16: fgColor=0xf81fL; break; | |
252 case 15: fgColor=0x7c1fL; break; | |
614 | 253 default: printf( "Sorry, this (%d) color depth not supported.\n",vo_depthonscreen ); return -1; |
1 | 254 } |
255 | |
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
|
256 aspect(&d_width,&d_height,A_NOZOOM); |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
257 #ifdef HAVE_NEW_GUI |
723 | 258 if ( vo_window == None ) |
259 { | |
260 #endif | |
844 | 261 if ( mFullscreen ) |
723 | 262 { |
263 wndWidth=vo_screenwidth; | |
264 wndHeight=vo_screenheight; | |
2039 | 265 #ifdef X11_FULLSCREEN |
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
|
266 aspect(&d_width,&d_height,A_ZOOM); |
2039 | 267 #endif |
723 | 268 } |
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
|
269 dwidth=d_width; dheight=d_height; |
723 | 270 |
271 XGetWindowAttributes( mDisplay,DefaultRootWindow( mDisplay ),&attribs ); | |
272 mDepth=attribs.depth; | |
273 if ( mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32 ) mDepth=24; | |
274 XMatchVisualInfo( mDisplay,mScreen,mDepth,TrueColor,&vinfo ); | |
275 xWAttribs.colormap=XCreateColormap( mDisplay,RootWindow( mDisplay,mScreen ),vinfo.visual,AllocNone ); | |
276 xWAttribs.background_pixel=0; | |
277 xWAttribs.border_pixel=0; | |
278 xWAttribs.event_mask=StructureNotifyMask | ExposureMask | KeyPressMask; | |
279 xswamask=CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; | |
1 | 280 |
723 | 281 mWindow=XCreateWindow( mDisplay,RootWindow( mDisplay,mScreen ), |
282 wndX,wndY, | |
283 wndWidth,wndHeight, | |
284 xWAttribs.border_pixel, | |
285 mDepth, | |
286 InputOutput, | |
287 vinfo.visual,xswamask,&xWAttribs ); | |
1137
4c7b219e126c
patch: some X11 compliance fixed: set ClassHint and better fullscreen mode
arpi_esp
parents:
927
diff
changeset
|
288 vo_x11_classhint( mDisplay,mWindow,"xmga" ); |
723 | 289 vo_hidecursor(mDisplay,mWindow); |
290 | |
844 | 291 if ( mFullscreen ) vo_x11_decoration( mDisplay,mWindow,0 ); |
1 | 292 |
723 | 293 XGetNormalHints( mDisplay,mWindow,&hint ); |
294 hint.x=wndX; hint.y=wndY; | |
295 hint.width=wndWidth; hint.height=wndHeight; | |
296 hint.base_width=wndWidth; hint.base_height=wndHeight; | |
297 hint.flags=USPosition | USSize; | |
298 XSetNormalHints( mDisplay,mWindow,&hint ); | |
299 XStoreName( mDisplay,mWindow,mTitle ); | |
300 XMapWindow( mDisplay,mWindow ); | |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
301 mGC=XCreateGC( mDisplay,mWindow,GCForeground,&wGCV ); |
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
302 #ifdef HAVE_NEW_GUI |
723 | 303 } |
304 else | |
305 { | |
306 mWindow=vo_window; | |
1852 | 307 // fprintf( stderr,"[xmga] width: %d height: %d d_width: %d d_height: %d\n",width,height,d_width,d_height ); |
308 // if ( vo_screenwidth != d_width ) | |
309 // { | |
310 // XMoveWindow( mDisplay,mWindow,( vo_screenwidth - d_width ) / 2,( vo_screenheight - d_height ) / 2 ); | |
311 // XResizeWindow( mDisplay,mWindow,d_width,d_height ); | |
312 // } | |
313 // else mFullscreen=1; | |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
314 mGC=vo_gc; //XCreateGC( mDisplay,mWindow,GCForeground,&wGCV ); |
723 | 315 } |
316 #endif | |
1 | 317 |
120 | 318 set_window(); |
1 | 319 |
320 mga_vid_config.src_width=width; | |
321 mga_vid_config.src_height=height; | |
322 | |
323 mga_vid_config.colkey_on=1; | |
324 mga_vid_config.colkey_red=255; | |
325 mga_vid_config.colkey_green=0; | |
326 mga_vid_config.colkey_blue=255; | |
327 | |
56 | 328 if(mga_init()) return -1; |
1852 | 329 |
330 set_window(); | |
1 | 331 |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
332 #ifdef HAVE_NEW_GUI |
723 | 333 if ( vo_window == None ) |
334 #endif | |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
335 { |
723 | 336 XFlush( mDisplay ); |
337 XSync( mDisplay,False ); | |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
338 } |
1852 | 339 |
340 #ifdef HAVE_NEW_GUI | |
341 if ( vo_window == None ) | |
342 #endif | |
343 saver_off(mDisplay); | |
324 | 344 |
1 | 345 return 0; |
346 } | |
347 | |
348 static const vo_info_t* get_info( void ) | |
349 { return &vo_info; } | |
350 | |
351 | |
352 static void | |
353 uninit(void) | |
354 { | |
1852 | 355 #ifdef HAVE_NEW_GUI |
356 if ( vo_window == None ) | |
357 #endif | |
1924 | 358 { |
1852 | 359 saver_on(mDisplay); |
1924 | 360 XDestroyWindow( mDisplay,mWindow ); |
361 } | |
1637 | 362 mga_uninit(); |
363 printf("vo: uninit!\n"); | |
1 | 364 } |