Mercurial > mplayer.hg
annotate libvo/mga_common.c @ 9278:caea8ed36b48
The reason why mplayer crashes (in some cases) when using x11
output and -wid (>0) parameter is this:
Mplayer by default creates a colormap using DirectColor visual. If the
window given to mplayer uses TrueColor visual there will be an error
when mplayer sets the colormap for the window. This patch
modifies mplayer to use TrueColor visual if the window given to mplayer
uses TrueColor. Another solution is to make sure that the window given to
mplayer is created using DirectColor visual if it is supported by the
display.
Jouni Tulkki <jitulkki@cc.hut.fi>
author | arpi |
---|---|
date | Tue, 04 Feb 2003 18:31:44 +0000 |
parents | 8c3d54868366 |
children | 148281a4e77b |
rev | line source |
---|---|
413 | 1 |
566 | 2 #include "fastmemcpy.h" |
2625 | 3 #include "../mmx_defs.h" |
5405 | 4 #include "../postproc/rgb2rgb.h" |
8017
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
5 #include "mp_msg.h" |
1 | 6 |
7 // mga_vid drawing functions | |
8017
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
8 static void set_window( void ); /* forward declaration to kill warnings */ |
6335
e9bd97d5c5cc
warning & newline fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
6311
diff
changeset
|
9 #ifdef VO_XMGA |
8017
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
10 static void mDrawColorKey( void ); /* forward declaration to kill warnings */ |
8988 | 11 #ifdef HAVE_XINERAMA |
12 extern int xinerama_screen; | |
13 #endif | |
6335
e9bd97d5c5cc
warning & newline fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
6311
diff
changeset
|
14 #endif |
1 | 15 |
56 | 16 static int mga_next_frame=0; |
17 | |
18 static mga_vid_config_t mga_vid_config; | |
19 static uint8_t *vid_data, *frames[4]; | |
5389
7296c4262457
quick hack to make vo_mga accept multiple calls to config
rfelker
parents:
5335
diff
changeset
|
20 static int f = -1; |
56 | 21 |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8017
diff
changeset
|
22 static uint32_t drwX,drwY,drwWidth,drwHeight; |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8017
diff
changeset
|
23 #ifdef VO_XMGA |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8017
diff
changeset
|
24 static uint32_t drwBorderWidth,drwDepth; |
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8017
diff
changeset
|
25 #endif |
8017
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
26 static uint32_t drwcX,drwcY,dwidth,dheight; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
27 |
202 | 28 static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ |
29 uint32_t bespitch = (mga_vid_config.src_width + 31) & ~31; | |
466 | 30 switch(mga_vid_config.format){ |
31 case MGA_VID_FORMAT_YV12: | |
470 | 32 case MGA_VID_FORMAT_IYUV: |
33 case MGA_VID_FORMAT_I420: | |
326 | 34 vo_draw_alpha_yv12(w,h,src,srca,stride,vid_data+bespitch*y0+x0,bespitch); |
466 | 35 break; |
36 case MGA_VID_FORMAT_YUY2: | |
326 | 37 vo_draw_alpha_yuy2(w,h,src,srca,stride,vid_data+2*(bespitch*y0+x0),2*bespitch); |
466 | 38 break; |
39 case MGA_VID_FORMAT_UYVY: | |
40 vo_draw_alpha_yuy2(w,h,src,srca,stride,vid_data+2*(bespitch*y0+x0)+1,2*bespitch); | |
41 break; | |
42 } | |
1 | 43 } |
44 | |
7680 | 45 static void draw_osd(void) |
46 { | |
47 vo_draw_text(mga_vid_config.src_width,mga_vid_config.src_height,draw_alpha); | |
48 } | |
49 | |
50 | |
1 | 51 //static void |
52 //write_slice_g200(uint8_t *y,uint8_t *cr, uint8_t *cb,uint32_t slice_num) | |
53 | |
54 static void | |
55 draw_slice_g200(uint8_t *image[], int stride[], int width,int height,int x,int y) | |
56 { | |
57 uint8_t *dest; | |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
6799
diff
changeset
|
58 uint32_t bespitch = (mga_vid_config.src_width + 31) & ~31; |
1 | 59 |
284 | 60 dest = vid_data + bespitch*y + x; |
4949 | 61 mem2agpcpy_pic(dest, image[0], width, height, bespitch, stride[0]); |
1 | 62 |
63 width/=2;height/=2;x/=2;y/=2; | |
64 | |
284 | 65 dest = vid_data + bespitch*mga_vid_config.src_height + bespitch*y + 2*x; |
5405 | 66 |
67 interleaveBytes(image[1],image[2],dest, | |
5406 | 68 width, height, |
5405 | 69 stride[1], stride[2], bespitch); |
1 | 70 } |
71 | |
72 static void | |
73 draw_slice_g400(uint8_t *image[], int stride[], int w,int h,int x,int y) | |
74 { | |
75 uint8_t *dest; | |
5317 | 76 uint8_t *dest2; |
1 | 77 uint32_t bespitch,bespitch2; |
78 | |
79 bespitch = (mga_vid_config.src_width + 31) & ~31; | |
80 bespitch2 = bespitch/2; | |
81 | |
82 dest = vid_data + bespitch * y + x; | |
4949 | 83 mem2agpcpy_pic(dest, image[0], w, h, bespitch, stride[0]); |
1 | 84 |
85 w/=2;h/=2;x/=2;y/=2; | |
5317 | 86 |
1 | 87 dest = vid_data + bespitch*mga_vid_config.src_height + bespitch2 * y + x; |
5317 | 88 dest2= dest + bespitch2*mga_vid_config.src_height / 2; |
1 | 89 |
5317 | 90 if(mga_vid_config.format==MGA_VID_FORMAT_YV12){ |
91 // mga_vid's YV12 assumes Y,U,V order (insteda of Y,V,U) :( | |
92 mem2agpcpy_pic(dest, image[1], w, h, bespitch2, stride[1]); | |
93 mem2agpcpy_pic(dest2,image[2], w, h, bespitch2, stride[2]); | |
94 } else { | |
4949 | 95 mem2agpcpy_pic(dest, image[2], w, h, bespitch2, stride[2]); |
5317 | 96 mem2agpcpy_pic(dest2,image[1], w, h, bespitch2, stride[1]); |
97 } | |
1 | 98 |
99 } | |
100 | |
101 static uint32_t | |
102 draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) | |
103 { | |
4949 | 104 |
105 #if 0 | |
106 printf("vo: %p/%d %p/%d %p/%d %dx%d/%d;%d \n", | |
107 src[0],stride[0], | |
108 src[1],stride[1], | |
109 src[2],stride[2], | |
110 w,h,x,y); | |
111 #endif | |
112 | |
1 | 113 if (mga_vid_config.card_type == MGA_G200) |
114 draw_slice_g200(src,stride,w,h,x,y); | |
115 else | |
116 draw_slice_g400(src,stride,w,h,x,y); | |
117 return 0; | |
118 } | |
119 | |
120 static void | |
31 | 121 vo_mga_flip_page(void) |
1 | 122 { |
47 | 123 |
124 // printf("-- flip to %d --\n",mga_next_frame); | |
1 | 125 |
47 | 126 #if 1 |
127 ioctl(f,MGA_VID_FSEL,&mga_next_frame); | |
56 | 128 mga_next_frame=(mga_next_frame+1)%mga_vid_config.num_frames; |
47 | 129 vid_data=frames[mga_next_frame]; |
130 #endif | |
1 | 131 |
132 } | |
133 | |
134 static uint32_t | |
135 draw_frame(uint8_t *src[]) | |
136 { | |
7681 | 137 printf("!!! mga::draw_frame() called !!!\n"); |
448
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
413
diff
changeset
|
138 return 0; |
1 | 139 } |
140 | |
7681 | 141 static uint32_t get_image(mp_image_t *mpi){ |
4971 | 142 uint32_t bespitch = (mga_vid_config.src_width + 31) & ~31; |
143 uint32_t bespitch2 = bespitch/2; | |
144 // printf("mga: get_image() called\n"); | |
4975 | 145 if(mpi->type==MP_IMGTYPE_STATIC && mga_vid_config.num_frames>1) return VO_FALSE; // it is not static |
4971 | 146 if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; // slow video ram |
5335 | 147 if(mga_vid_config.card_type == MGA_G200 && mpi->flags&MP_IMGFLAG_PLANAR) return VO_FALSE; |
4971 | 148 // printf("width=%d vs. bespitch=%d, flags=0x%X \n",mpi->width,bespitch,mpi->flags); |
149 if((mpi->width==bespitch) || | |
150 (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH))){ | |
151 // we're lucky or codec accepts stride => ok, let's go! | |
152 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
153 mpi->planes[0]=vid_data; | |
5317 | 154 if(mpi->flags&MP_IMGFLAG_SWAPPED){ |
155 mpi->planes[1]=vid_data + bespitch*mga_vid_config.src_height; | |
156 mpi->planes[2]=mpi->planes[1] + bespitch2*mga_vid_config.src_height/2; | |
157 } else { | |
158 mpi->planes[2]=vid_data + bespitch*mga_vid_config.src_height; | |
159 mpi->planes[1]=mpi->planes[2] + bespitch2*mga_vid_config.src_height/2; | |
160 } | |
4971 | 161 mpi->width=mpi->stride[0]=bespitch; |
162 mpi->stride[1]=mpi->stride[2]=bespitch2; | |
163 } else { | |
164 mpi->planes[0]=vid_data; | |
165 mpi->width=bespitch; | |
166 mpi->stride[0]=mpi->width*(mpi->bpp/8); | |
167 } | |
168 mpi->flags|=MP_IMGFLAG_DIRECT; | |
169 // printf("mga: get_image() SUCCESS -> Direct Rendering ENABLED\n"); | |
170 return VO_TRUE; | |
171 } | |
172 return VO_FALSE; | |
173 } | |
174 | |
175 static uint32_t | |
7681 | 176 draw_image(mp_image_t *mpi){ |
177 uint32_t bespitch = (mga_vid_config.src_width + 31) & ~31; | |
178 | |
179 // if -dr or -slices then do nothing: | |
180 if(mpi->flags&(MP_IMGFLAG_DIRECT|MP_IMGFLAG_DRAW_CALLBACK)) return VO_TRUE; | |
181 | |
182 if(mpi->flags&MP_IMGFLAG_PLANAR){ | |
183 // copy planar: | |
184 draw_slice(mpi->planes,mpi->stride,mpi->w,mpi->h,mpi->x,mpi->y); | |
185 } else { | |
186 // copy packed: | |
187 mem2agpcpy_pic(vid_data, mpi->planes[0], // dst,src | |
188 mpi->w*(mpi->bpp/8), mpi->h, // w,h | |
189 bespitch*2, mpi->stride[0]); // dstride,sstride | |
190 } | |
191 return VO_TRUE; | |
192 } | |
193 | |
194 static uint32_t | |
1 | 195 query_format(uint32_t format) |
196 { | |
197 switch(format){ | |
198 case IMGFMT_YV12: | |
470 | 199 case IMGFMT_I420: |
200 case IMGFMT_IYUV: | |
1 | 201 case IMGFMT_YUY2: |
448
198b46b739d8
qrva eletbe nem kene cvs-t elbaszni inkabb ne nyuljatok hozza baz+
arpi_esp
parents:
413
diff
changeset
|
202 case IMGFMT_UYVY: |
7694
b64f14fdadfb
also set VFCAP_ACCEPT_STRIDE when draw_image() is implemented
arpi
parents:
7681
diff
changeset
|
203 return 3 | VFCAP_OSD|VFCAP_HWSCALE_UP|VFCAP_HWSCALE_DOWN|VFCAP_ACCEPT_STRIDE; |
1 | 204 } |
205 return 0; | |
206 } | |
207 | |
5987 | 208 static void mga_fullscreen() |
209 { | |
210 uint32_t w,h; | |
211 if ( !vo_fs ) { | |
212 vo_fs=VO_TRUE; | |
213 w=vo_screenwidth; h=vo_screenheight; | |
214 aspect(&w,&h,A_ZOOM); | |
215 } else { | |
216 vo_fs=VO_FALSE; | |
217 w=vo_dwidth; h=vo_dheight; | |
218 aspect(&w,&h,A_NOZOOM); | |
219 } | |
220 mga_vid_config.dest_width = w; | |
221 mga_vid_config.dest_height= h; | |
7680 | 222 mga_vid_config.x_org=(vo_screenwidth-w)/2; |
223 mga_vid_config.y_org=(vo_screenheight-h)/2; | |
5987 | 224 if ( ioctl( f,MGA_VID_CONFIG,&mga_vid_config ) ) |
225 printf( "Error in mga_vid_config ioctl (wrong mga_vid.o version?)" ); | |
226 } | |
227 | |
4970 | 228 static uint32_t control(uint32_t request, void *data, ...) |
229 { | |
230 switch (request) { | |
231 case VOCTRL_QUERY_FORMAT: | |
232 return query_format(*((uint32_t*)data)); | |
4971 | 233 case VOCTRL_GET_IMAGE: |
234 return get_image(data); | |
7681 | 235 case VOCTRL_DRAW_IMAGE: |
236 return draw_image(data); | |
6799 | 237 case VOCTRL_SET_EQUALIZER: |
238 { | |
239 va_list ap; | |
240 short value; | |
241 uint32_t luma,prev; | |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
242 |
6799 | 243 if ( strcmp( data,"brightness" ) && strcmp( data,"contrast" ) ) return VO_FALSE; |
244 | |
245 if (ioctl(f,MGA_VID_GET_LUMA,&prev)) { | |
246 perror("Error in mga_vid_config ioctl()"); | |
247 printf("Could not get luma values from the kernel module!\n"); | |
248 return VO_FALSE; | |
249 } | |
250 | |
251 // printf("GET: 0x%4X 0x%4X \n",(prev>>16),(prev&0xffff)); | |
252 | |
253 va_start(ap, data); | |
254 value = va_arg(ap, int); | |
255 va_end(ap); | |
256 | |
257 // printf("value: %d -> ",value); | |
258 value=((value+100)*255)/200-128; // maps -100=>-128 and +100=>127 | |
259 // printf("%d \n",value); | |
260 | |
261 if(!strcmp(data,"contrast")) | |
262 luma = (prev&0xFFFF0000)|(value&0xFFFF); | |
263 else | |
264 luma = (prev&0xFFFF)|(value<<16); | |
265 | |
266 if (ioctl(f,MGA_VID_SET_LUMA,luma)) { | |
267 perror("Error in mga_vid_config ioctl()"); | |
268 printf("Could not set luma values in the kernel module!\n"); | |
269 return VO_FALSE; | |
270 } | |
271 | |
272 return VO_TRUE; | |
273 } | |
274 | |
275 case VOCTRL_GET_EQUALIZER: | |
276 { | |
277 va_list ap; | |
278 int * value; | |
279 short val; | |
280 uint32_t luma; | |
281 | |
282 if ( strcmp( data,"brightness" ) && strcmp( data,"contrast" ) ) return VO_FALSE; | |
283 | |
284 if (ioctl(f,MGA_VID_GET_LUMA,&luma)) { | |
285 perror("Error in mga_vid_config ioctl()"); | |
286 printf("Could not get luma values from the kernel module!\n"); | |
287 return VO_FALSE; | |
288 } | |
289 | |
290 if ( !strcmp( data,"contrast" ) ) | |
291 val=(luma & 0xFFFF); | |
292 else | |
293 val=(luma >> 16); | |
294 | |
295 va_start(ap, data); | |
296 value = va_arg(ap, int*); | |
297 va_end(ap); | |
298 | |
299 *value = (val*200)/255; | |
300 | |
301 return VO_TRUE; | |
302 } | |
303 | |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
304 #ifndef VO_XMGA |
5987 | 305 case VOCTRL_FULLSCREEN: |
7680 | 306 if (vo_screenwidth && vo_screenheight) |
307 mga_fullscreen(); | |
308 else | |
309 printf("Screen width/height unknown!\n"); | |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
310 return VO_TRUE; |
8017
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
311 case VOCTRL_GET_PANSCAN: |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
312 if ( !vo_fs ) return VO_FALSE; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
313 return VO_TRUE; |
5987 | 314 #endif |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
315 |
6009 | 316 #if defined( VO_XMGA ) && defined( HAVE_NEW_GUI ) |
317 case VOCTRL_GUISUPPORT: | |
318 return VO_TRUE; | |
319 #endif | |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
320 |
6307 | 321 #ifdef VO_XMGA |
322 case VOCTRL_GET_PANSCAN: | |
6311
da2dda48b7ec
add mute support ( step 1 ) and fixed panscan bugs (1000l for me)
pontscho
parents:
6307
diff
changeset
|
323 if ( !inited || !vo_fs ) return VO_FALSE; |
6307 | 324 return VO_TRUE; |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
325 case VOCTRL_FULLSCREEN: |
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
326 vo_x11_fullscreen(); |
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
327 vo_panscan_amount=0; |
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
328 /* indended, fallthrough to update panscan on fullscreen/windowed switch */ |
8017
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
329 #endif |
6307 | 330 case VOCTRL_SET_PANSCAN: |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
331 if ( vo_fs && ( vo_panscan != vo_panscan_amount ) ) // || ( !vo_fs && vo_panscan_amount ) ) |
6307 | 332 { |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
8017
diff
changeset
|
333 // int old_y = vo_panscan_y; |
6307 | 334 panscan_calc(); |
6382
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
335 // if ( old_y != vo_panscan_y ) |
86d5fc5b54e2
fix panscan support and add Jesper Svennevid's <mplayer@svennevid.net> patch
pontscho
parents:
6335
diff
changeset
|
336 set_window(); |
6307 | 337 } |
338 return VO_TRUE; | |
4970 | 339 } |
340 return VO_NOTIMPL; | |
341 } | |
342 | |
343 | |
7679 | 344 static int mga_init(int width,int height,unsigned int format){ |
345 | |
346 switch(format){ | |
347 case IMGFMT_YV12: | |
348 width+=width&1;height+=height&1; | |
349 mga_vid_config.frame_size = ((width + 31) & ~31) * height + (((width + 31) & ~31) * height) / 2; | |
350 mga_vid_config.format=MGA_VID_FORMAT_I420; break; | |
351 case IMGFMT_I420: | |
352 case IMGFMT_IYUV: | |
353 width+=width&1;height+=height&1; | |
354 mga_vid_config.frame_size = ((width + 31) & ~31) * height + (((width + 31) & ~31) * height) / 2; | |
355 mga_vid_config.format=MGA_VID_FORMAT_YV12; break; | |
356 case IMGFMT_YUY2: | |
357 mga_vid_config.frame_size = ((width + 31) & ~31) * height * 2; | |
358 mga_vid_config.format=MGA_VID_FORMAT_YUY2; break; | |
359 case IMGFMT_UYVY: | |
360 mga_vid_config.frame_size = ((width + 31) & ~31) * height * 2; | |
361 mga_vid_config.format=MGA_VID_FORMAT_UYVY; break; | |
362 default: | |
363 printf("mga: invalid output format %0X\n",format); | |
364 return (-1); | |
365 } | |
366 | |
367 mga_vid_config.src_width = width; | |
368 mga_vid_config.src_height= height; | |
7680 | 369 if(!mga_vid_config.dest_width) |
370 mga_vid_config.dest_width = width; | |
371 if(!mga_vid_config.dest_height) | |
372 mga_vid_config.dest_height= height; | |
56 | 373 |
7680 | 374 mga_vid_config.colkey_on=0; |
375 | |
5432 | 376 mga_vid_config.num_frames=(vo_directrendering && !vo_doublebuffering)?1:3; |
56 | 377 mga_vid_config.version=MGA_VID_VERSION; |
378 if (ioctl(f,MGA_VID_CONFIG,&mga_vid_config)) | |
379 { | |
275 | 380 perror("Error in mga_vid_config ioctl()"); |
381 printf("Your mga_vid driver version is incompatible with this MPlayer version!\n"); | |
56 | 382 return -1; |
383 } | |
5432 | 384 |
385 printf("[mga] Using %d buffers.\n",mga_vid_config.num_frames); | |
56 | 386 |
387 frames[0] = (char*)mmap(0,mga_vid_config.frame_size*mga_vid_config.num_frames,PROT_WRITE,MAP_SHARED,f,0); | |
388 frames[1] = frames[0] + 1*mga_vid_config.frame_size; | |
389 frames[2] = frames[0] + 2*mga_vid_config.frame_size; | |
390 frames[3] = frames[0] + 3*mga_vid_config.frame_size; | |
391 mga_next_frame = 0; | |
392 vid_data = frames[mga_next_frame]; | |
393 | |
394 //clear the buffer | |
395 memset(frames[0],0x80,mga_vid_config.frame_size*mga_vid_config.num_frames); | |
396 | |
7777 | 397 #ifndef VO_XMGA |
7679 | 398 ioctl(f,MGA_VID_ON,0); |
7777 | 399 #endif |
7679 | 400 |
56 | 401 return 0; |
402 } | |
403 | |
1637 | 404 static int mga_uninit(){ |
7679 | 405 if(f>=0){ |
1637 | 406 ioctl( f,MGA_VID_OFF,0 ); |
407 munmap(frames[0],mga_vid_config.frame_size*mga_vid_config.num_frames); | |
408 close(f); | |
5389
7296c4262457
quick hack to make vo_mga accept multiple calls to config
rfelker
parents:
5335
diff
changeset
|
409 f = -1; |
7679 | 410 } |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
6799
diff
changeset
|
411 return 0; |
1637 | 412 } |
4970 | 413 |
7676 | 414 static uint32_t preinit(const char *vo_subdevice) |
4970 | 415 { |
7695 | 416 const char *devname=vo_subdevice?vo_subdevice:"/dev/mga_vid"; |
5433 | 417 |
418 f = open(devname,O_RDWR); | |
419 if(f == -1) | |
420 { | |
421 perror("open"); | |
7676 | 422 printf("vo_mga: Couldn't open %s\n",devname); |
5433 | 423 return(-1); |
424 } | |
7679 | 425 |
426 #ifdef VO_XMGA | |
8778
ff92d9b5ade5
don't keep mga_vid device open if x11 init fails (fixes "-vo xmga,mga")
rfelker
parents:
8123
diff
changeset
|
427 if (!vo_init()) { |
ff92d9b5ade5
don't keep mga_vid device open if x11 init fails (fixes "-vo xmga,mga")
rfelker
parents:
8123
diff
changeset
|
428 close(f); |
ff92d9b5ade5
don't keep mga_vid device open if x11 init fails (fixes "-vo xmga,mga")
rfelker
parents:
8123
diff
changeset
|
429 return -1; |
ff92d9b5ade5
don't keep mga_vid device open if x11 init fails (fixes "-vo xmga,mga")
rfelker
parents:
8123
diff
changeset
|
430 } |
7679 | 431 #endif |
432 | |
4970 | 433 return 0; |
434 } | |
435 | |
8017
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
436 static void set_window( void ){ |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
437 |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
438 #ifdef VO_XMGA |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
439 if ( WinID ) |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
440 { |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
441 XGetGeometry( mDisplay,vo_window,&mRoot,&drwX,&drwY,&drwWidth,&drwHeight,&drwBorderWidth,&drwDepth ); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
442 mp_msg(MSGT_VO,MSGL_V,"[xmga] x: %d y: %d w: %d h: %d\n",drwX,drwY,drwWidth,drwHeight ); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
443 drwX=0; drwY=0; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
444 XTranslateCoordinates( mDisplay,vo_window,mRoot,0,0,&drwcX,&drwcY,&mRoot ); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
445 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 ); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
446 |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
447 } |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
448 else |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
449 #endif |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
450 { drwX=drwcX=vo_dx; drwY=drwcY=vo_dy; drwWidth=vo_dwidth; drwHeight=vo_dheight; } |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
451 |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
452 aspect(&dwidth,&dheight,A_NOZOOM); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
453 if ( vo_fs ) |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
454 { |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
455 aspect(&dwidth,&dheight,A_ZOOM); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
456 drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
457 drwcX+=drwX; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
458 drwY=( vo_screenheight - (dheight > vo_screenheight?vo_screenheight:dheight) ) / 2; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
459 drwcY+=drwY; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
460 drwWidth=(dwidth > vo_screenwidth?vo_screenwidth:dwidth); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
461 drwHeight=(dheight > vo_screenheight?vo_screenheight:dheight); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
462 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 ); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
463 } |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
464 vo_dwidth=drwWidth; vo_dheight=drwHeight; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
465 |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
466 #ifdef VO_XMGA |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
467 #ifdef HAVE_XINERAMA |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
468 if(XineramaIsActive(mDisplay)) |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
469 { |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
470 XineramaScreenInfo *screens; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
471 int num_screens; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
472 int i; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
473 |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
474 screens = XineramaQueryScreens(mDisplay,&num_screens); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
475 |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
476 /* find the screen we are on */ |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
477 i = 0; |
8988 | 478 while(i<num_screens && |
479 ((screens[i].x_org < drwcX) || | |
480 (screens[i].y_org < drwcY) || | |
481 (screens[i].x_org + screens[i].width >= drwcX) || | |
482 (screens[i].y_org + screens[i].height >= drwcY))) | |
8017
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
483 { |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
484 i++; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
485 } |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
486 |
8988 | 487 if(i<num_screens) |
488 { | |
489 /* save the screen we are on */ | |
490 xinerama_screen = i; | |
491 } else { | |
492 /* oops.. couldnt find the screen we are on | |
493 * because the upper left corner left the | |
494 * visual range. assume we are still on the | |
495 * same screen | |
496 */ | |
497 i = xinerama_screen; | |
498 } | |
499 | |
8017
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
500 /* set drwcX and drwcY to the right values */ |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
501 drwcX = drwcX - screens[i].x_org; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
502 drwcY = drwcY - screens[i].y_org; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
503 XFree(screens); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
504 } |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
505 |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
506 #endif |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
507 |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
508 mDrawColorKey(); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
509 #endif |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
510 |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
511 mga_vid_config.x_org=drwcX; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
512 mga_vid_config.y_org=drwcY; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
513 mga_vid_config.dest_width=drwWidth; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
514 mga_vid_config.dest_height=drwHeight; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
515 if ( vo_panscan > 0.0f && vo_fs ) |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
516 { |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
517 drwX-=vo_panscan_x>>1; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
518 drwY-=vo_panscan_y>>1; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
519 drwWidth+=vo_panscan_x; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
520 drwHeight+=vo_panscan_y; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
521 |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
522 mga_vid_config.x_org-=vo_panscan_x>>1; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
523 mga_vid_config.y_org-=vo_panscan_y>>1; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
524 mga_vid_config.dest_width=drwWidth; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
525 mga_vid_config.dest_height=drwHeight; |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
526 #ifdef VO_XMGA |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
527 mDrawColorKey(); |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
528 #endif |
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
529 } |
9047 | 530 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?)" ); |
8017
a57aac3a927a
panscan support in -vo mga (actually moved common code to mga_common.c)
arpi
parents:
7777
diff
changeset
|
531 } |