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