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