2 * libvo common functions, variables used by many/all drivers.
4 * This file is part of MPlayer.
6 * MPlayer is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * MPlayer is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 //#include <sys/mman.h>
29 #include "video_out.h"
35 #include "input/input.h"
36 #include "osdep/shmem.h"
40 int xinerama_screen
= -1;
44 // currect resolution/bpp on screen: (should be autodetected by vo_init())
45 int vo_depthonscreen
=0;
47 int vo_screenheight
=0;
49 int vo_config_count
=0;
51 // requested resolution/bpp: (-x -y -bpp options)
58 int vo_nomouse_input
= 0;
59 int vo_grabpointer
= 1;
60 int vo_doublebuffering
= 1;
64 float vo_panscan
= 0.0f
;
67 int vo_refresh_rate
=0;
73 int vo_pts
=0; // for hw decoding
76 char *vo_subdevice
= NULL
;
77 int vo_directrendering
=0;
79 int vo_colorkey
= 0x0000ff00; // default colorkey is green
80 // (0xff000000 means that colorkey has been disabled)
82 // name to be used instead of the vo's default
84 // title to be applied to movie window
88 // Externally visible list of all vo drivers
90 extern const vo_functions_t video_out_mga
;
91 extern const vo_functions_t video_out_xmga
;
92 extern const vo_functions_t video_out_x11
;
93 extern vo_functions_t video_out_xover
;
94 extern const vo_functions_t video_out_xvmc
;
95 extern const vo_functions_t video_out_vdpau
;
96 extern const vo_functions_t video_out_xv
;
97 extern const vo_functions_t video_out_gl_nosw
;
98 extern const vo_functions_t video_out_gl
;
99 extern const vo_functions_t video_out_gl2
;
100 extern const vo_functions_t video_out_matrixview
;
101 extern const vo_functions_t video_out_dga
;
102 extern const vo_functions_t video_out_sdl
;
103 extern const vo_functions_t video_out_3dfx
;
104 extern const vo_functions_t video_out_tdfxfb
;
105 extern const vo_functions_t video_out_s3fb
;
106 extern const vo_functions_t video_out_wii
;
107 extern const vo_functions_t video_out_null
;
108 extern const vo_functions_t video_out_zr
;
109 extern const vo_functions_t video_out_zr2
;
110 extern const vo_functions_t video_out_bl
;
111 extern vo_functions_t video_out_fbdev
;
112 extern const vo_functions_t video_out_fbdev2
;
113 extern vo_functions_t video_out_svga
;
114 extern const vo_functions_t video_out_png
;
115 extern const vo_functions_t video_out_ggi
;
116 extern const vo_functions_t video_out_aa
;
117 extern const vo_functions_t video_out_caca
;
118 extern const vo_functions_t video_out_mpegpes
;
119 extern const vo_functions_t video_out_yuv4mpeg
;
120 extern const vo_functions_t video_out_direct3d
;
121 extern const vo_functions_t video_out_directx
;
122 extern const vo_functions_t video_out_kva
;
123 extern const vo_functions_t video_out_dxr2
;
124 extern const vo_functions_t video_out_dxr3
;
125 extern const vo_functions_t video_out_ivtv
;
126 extern const vo_functions_t video_out_v4l2
;
127 extern const vo_functions_t video_out_jpeg
;
128 extern const vo_functions_t video_out_gif89a
;
129 extern vo_functions_t video_out_vesa
;
130 extern const vo_functions_t video_out_directfb
;
131 extern const vo_functions_t video_out_dfbmga
;
132 extern vo_functions_t video_out_xvidix
;
133 extern vo_functions_t video_out_winvidix
;
134 extern vo_functions_t video_out_cvidix
;
135 extern const vo_functions_t video_out_tdfx_vid
;
136 extern const vo_functions_t video_out_xvr100
;
137 extern const vo_functions_t video_out_tga
;
138 extern const vo_functions_t video_out_corevideo
;
139 extern const vo_functions_t video_out_quartz
;
140 extern const vo_functions_t video_out_pnm
;
141 extern const vo_functions_t video_out_md5sum
;
143 const vo_functions_t
* const video_out_drivers
[] =
148 #ifdef CONFIG_TDFX_VID
151 #ifdef CONFIG_DIRECTX
154 #ifdef CONFIG_DIRECT3D
160 #ifdef CONFIG_COREVIDEO
161 &video_out_corevideo
,
214 #ifdef CONFIG_SVGALIB
217 #ifdef CONFIG_MATRIXVIEW
218 &video_out_matrixview
,
235 #ifdef CONFIG_V4L2_DECODER
248 #ifdef CONFIG_DIRECTFB
258 #if defined(__MINGW32__) || defined(__CYGWIN__)
264 // should not be auto-selected
269 #ifdef CONFIG_YUV4MPEG
272 #ifdef CONFIG_LIBAVCODEC
293 void list_video_out(void){
295 mp_msg(MSGT_CPLAYER
, MSGL_INFO
, MSGTR_AvailableVideoOutputDrivers
);
296 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_VIDEO_OUTPUTS\n");
297 while (video_out_drivers
[i
]) {
298 const vo_info_t
*info
= video_out_drivers
[i
++]->info
;
299 mp_msg(MSGT_GLOBAL
, MSGL_INFO
,"\t%s\t%s\n", info
->short_name
, info
->name
);
301 mp_msg(MSGT_GLOBAL
, MSGL_INFO
,"\n");
304 const vo_functions_t
* init_best_video_out(char** vo_list
){
306 // first try the preferred drivers, with their optional subdevice param:
307 if(vo_list
&& vo_list
[0])
308 while(vo_list
[0][0]){
309 char* vo
=strdup(vo_list
[0]);
310 vo_subdevice
=strchr(vo
,':');
311 if (!strcmp(vo
, "pgm"))
312 mp_msg(MSGT_CPLAYER
, MSGL_ERR
, MSGTR_VO_PGM_HasBeenReplaced
);
313 if (!strcmp(vo
, "md5"))
314 mp_msg(MSGT_CPLAYER
, MSGL_ERR
, MSGTR_VO_MD5_HasBeenReplaced
);
319 for(i
=0;video_out_drivers
[i
];i
++){
320 const vo_functions_t
* video_driver
=video_out_drivers
[i
];
321 const vo_info_t
*info
= video_driver
->info
;
322 if(!strcmp(info
->short_name
,vo
)){
323 // name matches, try it
324 if(!video_driver
->preinit(vo_subdevice
))
327 return video_driver
; // success!
334 if(!(vo_list
[0])) return NULL
; // do NOT fallback to others
336 // now try the rest...
338 for(i
=0;video_out_drivers
[i
];i
++){
339 const vo_functions_t
* video_driver
=video_out_drivers
[i
];
340 if(!video_driver
->preinit(vo_subdevice
))
341 return video_driver
; // success!
346 int config_video_out(const vo_functions_t
*vo
, uint32_t width
, uint32_t height
,
347 uint32_t d_width
, uint32_t d_height
, uint32_t flags
,
348 char *title
, uint32_t format
) {
350 aspect_save_orig(width
,height
);
351 aspect_save_prescale(d_width
,d_height
);
353 if (vo
->control(VOCTRL_UPDATE_SCREENINFO
, NULL
) == VO_TRUE
) {
354 aspect(&d_width
,&d_height
,A_NOZOOM
);
355 vo_dx
= (int)(vo_screenwidth
- d_width
) / 2;
356 vo_dy
= (int)(vo_screenheight
- d_height
) / 2;
357 geometry(&vo_dx
, &vo_dy
, &d_width
, &d_height
,
358 vo_screenwidth
, vo_screenheight
);
362 vo_dheight
= d_height
;
365 return vo
->config(width
, height
, d_width
, d_height
, flags
, title
, format
);
369 * \brief lookup an integer in a table, table must have 0 as the last key
370 * \param key key to search for
371 * \result translation corresponding to key or "to" value of last mapping
374 int lookup_keymap_table(const struct mp_keymap
*map
, int key
) {
375 while (map
->from
&& map
->from
!= key
) map
++;
380 * \brief helper function for the kind of panscan-scaling that needs a source
381 * and destination rectangle like Direct3D and VDPAU
383 static void src_dst_split_scaling(int src_size
, int dst_size
, int scaled_src_size
,
384 int *src_start
, int *src_end
, int *dst_start
, int *dst_end
) {
385 if (scaled_src_size
> dst_size
) {
386 int border
= src_size
* (scaled_src_size
- dst_size
) / scaled_src_size
;
387 // round to a multiple of 2, this is at least needed for vo_direct3d and ATI cards
388 border
= (border
/ 2 + 1) & ~1;
390 *src_end
= src_size
- border
;
396 *dst_start
= (dst_size
- scaled_src_size
) / 2;
397 *dst_end
= *dst_start
+ scaled_src_size
;
402 * Calculate the appropriate source and destination rectangle to
403 * get a correctly scaled picture, including pan-scan.
404 * Can be extended to take future cropping support into account.
406 * \param crop specifies the cropping border size in the left, right, top and bottom members, may be NULL
407 * \param borders the border values as e.g. EOSD (ASS) and properly placed DVD highlight support requires,
408 * may be NULL and only left and top are currently valid.
410 void calc_src_dst_rects(int src_width
, int src_height
, struct vo_rect
*src
, struct vo_rect
*dst
,
411 struct vo_rect
*borders
, const struct vo_rect
*crop
) {
412 static const struct vo_rect no_crop
= {0, 0, 0, 0, 0, 0};
413 int scaled_width
= 0;
414 int scaled_height
= 0;
415 if (!crop
) crop
= &no_crop
;
416 src_width
-= crop
->left
+ crop
->right
;
417 src_height
-= crop
->top
+ crop
->bottom
;
418 if (src_width
< 2) src_width
= 2;
419 if (src_height
< 2) src_height
= 2;
420 dst
->left
= 0; dst
->right
= vo_dwidth
;
421 dst
->top
= 0; dst
->bottom
= vo_dheight
;
422 src
->left
= 0; src
->right
= src_width
;
423 src
->top
= 0; src
->bottom
= src_height
;
425 borders
->left
= 0; borders
->top
= 0;
427 if (aspect_scaling()) {
428 aspect(&scaled_width
, &scaled_height
, A_WINZOOM
);
429 panscan_calc_windowed();
430 scaled_width
+= vo_panscan_x
;
431 scaled_height
+= vo_panscan_y
;
433 borders
->left
= (vo_dwidth
- scaled_width
) / 2;
434 borders
->top
= (vo_dheight
- scaled_height
) / 2;
436 src_dst_split_scaling(src_width
, vo_dwidth
, scaled_width
,
437 &src
->left
, &src
->right
, &dst
->left
, &dst
->right
);
438 src_dst_split_scaling(src_height
, vo_dheight
, scaled_height
,
439 &src
->top
, &src
->bottom
, &dst
->top
, &dst
->bottom
);
441 src
->left
+= crop
->left
; src
->right
+= crop
->left
;
442 src
->top
+= crop
->top
; src
->bottom
+= crop
->top
;
443 src
->width
= src
->right
- src
->left
;
444 src
->height
= src
->bottom
- src
->top
;
445 dst
->width
= dst
->right
- dst
->left
;
446 dst
->height
= dst
->bottom
- dst
->top
;
450 * Generates a mouse movement message if those are enable and sends it
451 * to the "main" MPlayer.
453 * \param posx new x position of mouse
454 * \param posy new y position of mouse
456 void vo_mouse_movement(int posx
, int posy
) {
458 if (!enable_mouse_movements
)
460 snprintf(cmd_str
, sizeof(cmd_str
), "set_mouse_pos %i %i", posx
, posy
);
461 mp_input_queue_cmd(mp_input_parse_cmd(cmd_str
));
464 #if defined(CONFIG_FBDEV) || defined(CONFIG_VESA)
465 /* Borrowed from vo_fbdev.c
466 Monitor ranges related functions*/
468 char *monitor_hfreq_str
= NULL
;
469 char *monitor_vfreq_str
= NULL
;
470 char *monitor_dotclock_str
= NULL
;
472 float range_max(range_t
*r
)
476 for (/* NOTHING */; (r
->min
!= -1 && r
->max
!= -1); r
++)
477 if (max
< r
->max
) max
= r
->max
;
482 int in_range(range_t
*r
, float f
)
484 for (/* NOTHING */; (r
->min
!= -1 && r
->max
!= -1); r
++)
485 if (f
>= r
->min
&& f
<= r
->max
)
490 range_t
*str2range(char *s
)
492 float tmp_min
, tmp_max
;
493 char *endptr
= s
; // to start the loop
499 for (i
= 0; *endptr
; i
++) {
502 if (!(r
= realloc(r
, sizeof(*r
) * (i
+ 2)))) {
503 mp_msg(MSGT_GLOBAL
, MSGL_WARN
,"can't realloc 'r'\n");
506 tmp_min
= strtod(s
, &endptr
);
507 if (*endptr
== 'k' || *endptr
== 'K') {
510 } else if (*endptr
== 'm' || *endptr
== 'M') {
511 tmp_min
*= 1000000.0;
514 if (*endptr
== '-') {
515 tmp_max
= strtod(endptr
+ 1, &endptr
);
516 if (*endptr
== 'k' || *endptr
== 'K') {
519 } else if (*endptr
== 'm' || *endptr
== 'M') {
520 tmp_max
*= 1000000.0;
523 if (*endptr
!= ',' && *endptr
)
525 } else if (*endptr
== ',' || !*endptr
) {
531 if (r
[i
].min
< 0 || r
[i
].max
< 0)
535 r
[i
].min
= r
[i
].max
= -1;
543 /* Borrowed from vo_fbdev.c END */