2001-02-24 20:28:24 +00:00
|
|
|
/*
|
2009-02-08 03:27:30 +00:00
|
|
|
* copyright (C) 2001 Zoltan Ponekker
|
|
|
|
*
|
|
|
|
* This file is part of MPlayer.
|
2001-02-24 20:28:24 +00:00
|
|
|
*
|
2009-02-08 03:27:30 +00:00
|
|
|
* MPlayer is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
2001-02-24 20:28:24 +00:00
|
|
|
*
|
2009-02-08 03:27:30 +00:00
|
|
|
* MPlayer is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2001-02-24 20:28:24 +00:00
|
|
|
*/
|
|
|
|
|
2009-02-08 03:27:30 +00:00
|
|
|
//#define SHOW_TIME
|
|
|
|
|
2001-02-24 20:28:24 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "config.h"
|
2002-06-03 23:23:03 +00:00
|
|
|
|
2001-02-24 20:28:24 +00:00
|
|
|
#include "video_out.h"
|
|
|
|
#include "video_out_internal.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <sys/mman.h>
|
|
|
|
|
|
|
|
#include "drivers/mga_vid.h"
|
|
|
|
|
|
|
|
#include <X11/Xlib.h>
|
|
|
|
#include <X11/Xutil.h>
|
|
|
|
#include <errno.h>
|
|
|
|
|
2008-08-04 06:16:23 +00:00
|
|
|
#ifdef CONFIG_XINERAMA
|
2002-01-06 21:07:20 +00:00
|
|
|
#include <X11/extensions/Xinerama.h>
|
|
|
|
#endif
|
|
|
|
|
2001-03-03 21:46:39 +00:00
|
|
|
#include "x11_common.h"
|
2001-04-24 11:42:04 +00:00
|
|
|
#include "sub.h"
|
2001-10-03 17:27:13 +00:00
|
|
|
#include "aspect.h"
|
2001-03-03 21:46:39 +00:00
|
|
|
|
2001-03-21 19:10:55 +00:00
|
|
|
#ifdef SHOW_TIME
|
2004-10-28 01:15:53 +00:00
|
|
|
#include "osdep/timer.h"
|
2004-06-14 04:53:03 +00:00
|
|
|
static unsigned int timer = 0;
|
|
|
|
static unsigned int timerd = 0;
|
2001-03-13 00:14:47 +00:00
|
|
|
#endif
|
|
|
|
|
2008-07-30 13:44:59 +00:00
|
|
|
#ifdef CONFIG_GUI
|
2007-04-23 07:42:42 +00:00
|
|
|
#include "gui/interface.h"
|
2002-05-03 20:57:13 +00:00
|
|
|
#endif
|
|
|
|
|
2007-12-02 14:06:03 +00:00
|
|
|
static const vo_info_t info = {
|
2004-06-14 04:53:03 +00:00
|
|
|
"Matrox G200/G4x0/G550 overlay in X11 window (using /dev/mga_vid)",
|
|
|
|
"xmga",
|
|
|
|
"Zoltan Ponekker <pontscho@makacs.poliod.hu>",
|
|
|
|
""
|
2001-02-24 20:28:24 +00:00
|
|
|
};
|
|
|
|
|
2007-12-02 14:39:15 +00:00
|
|
|
const LIBVO_EXTERN(xmga)
|
2002-11-11 15:22:10 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
static uint32_t mDepth;
|
|
|
|
static XWindowAttributes attribs;
|
2003-10-03 18:13:45 +00:00
|
|
|
static int colorkey;
|
2001-02-24 20:28:24 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
static uint32_t mvHeight;
|
|
|
|
static uint32_t mvWidth;
|
2001-02-24 20:28:24 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
static Window mRoot;
|
2001-02-24 20:28:24 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
static XSetWindowAttributes xWAttribs;
|
2001-02-24 20:28:24 +00:00
|
|
|
|
2008-02-14 14:23:55 +00:00
|
|
|
static int initialized = 0;
|
2002-06-06 07:13:57 +00:00
|
|
|
|
2002-03-07 17:50:25 +00:00
|
|
|
#define VO_XMGA
|
2001-02-24 20:28:24 +00:00
|
|
|
#include "mga_common.c"
|
2002-03-07 17:50:25 +00:00
|
|
|
#undef VO_XMGA
|
2001-02-24 20:28:24 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
static void mDrawColorKey(void)
|
2001-02-24 20:28:24 +00:00
|
|
|
{
|
2004-06-14 04:53:03 +00:00
|
|
|
XSetBackground(mDisplay, vo_gc, 0);
|
|
|
|
XClearWindow(mDisplay, vo_window);
|
|
|
|
XSetForeground(mDisplay, vo_gc, colorkey);
|
|
|
|
XFillRectangle(mDisplay, vo_window, vo_gc, drwX, drwY, drwWidth,
|
|
|
|
(vo_fs ? drwHeight - 1 : drwHeight));
|
|
|
|
XFlush(mDisplay);
|
2001-02-24 20:28:24 +00:00
|
|
|
}
|
|
|
|
|
2001-03-17 19:19:18 +00:00
|
|
|
static void check_events(void)
|
|
|
|
{
|
2004-06-14 04:53:03 +00:00
|
|
|
int e = vo_x11_check_events(mDisplay);
|
|
|
|
|
|
|
|
if (!(e & VO_EVENT_RESIZE) && !(e & VO_EVENT_EXPOSE))
|
|
|
|
return;
|
|
|
|
set_window();
|
|
|
|
mDrawColorKey();
|
|
|
|
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?)");
|
2001-02-24 20:28:24 +00:00
|
|
|
}
|
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
static void flip_page(void)
|
|
|
|
{
|
2001-03-21 19:10:55 +00:00
|
|
|
#ifdef SHOW_TIME
|
2001-03-13 00:14:47 +00:00
|
|
|
unsigned int t;
|
2004-06-14 04:53:03 +00:00
|
|
|
|
|
|
|
t = GetTimer();
|
|
|
|
mp_msg(MSGT_VO, MSGL_STATUS,
|
|
|
|
" [timer: %08X diff: %6d dd: %6d ] \n", t, t - timer,
|
|
|
|
(t - timer) - timerd);
|
|
|
|
timerd = t - timer;
|
|
|
|
timer = t;
|
2001-03-21 19:10:55 +00:00
|
|
|
#endif
|
2001-03-13 00:14:47 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
vo_mga_flip_page();
|
2001-03-03 21:46:39 +00:00
|
|
|
}
|
2001-02-24 20:28:24 +00:00
|
|
|
|
2005-08-05 01:24:37 +00:00
|
|
|
static int config(uint32_t width, uint32_t height, uint32_t d_width,
|
2004-06-14 04:53:03 +00:00
|
|
|
uint32_t d_height, uint32_t flags, char *title,
|
|
|
|
uint32_t format)
|
2001-02-24 20:28:24 +00:00
|
|
|
{
|
2004-06-14 04:53:03 +00:00
|
|
|
XVisualInfo vinfo;
|
|
|
|
unsigned long xswamask;
|
|
|
|
int r, g, b;
|
|
|
|
|
|
|
|
if (mga_init(width, height, format))
|
|
|
|
return -1; // ioctl errors?
|
|
|
|
|
|
|
|
aspect_save_orig(width, height);
|
|
|
|
aspect_save_prescale(d_width, d_height);
|
2006-04-16 13:38:28 +00:00
|
|
|
update_xinerama_info();
|
2004-06-14 04:53:03 +00:00
|
|
|
|
|
|
|
mvWidth = width;
|
|
|
|
mvHeight = height;
|
|
|
|
|
|
|
|
vo_panscan_x = vo_panscan_y = vo_panscan_amount = 0;
|
|
|
|
|
2006-05-14 19:36:21 +00:00
|
|
|
aspect(&d_width, &d_height, A_NOZOOM);
|
2004-06-14 04:53:03 +00:00
|
|
|
vo_dx = (vo_screenwidth - d_width) / 2;
|
|
|
|
vo_dy = (vo_screenheight - d_height) / 2;
|
|
|
|
geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth,
|
|
|
|
vo_screenheight);
|
2006-04-16 13:38:28 +00:00
|
|
|
vo_dx += xinerama_x;
|
|
|
|
vo_dy += xinerama_y;
|
2004-06-14 04:53:03 +00:00
|
|
|
vo_dwidth = d_width;
|
|
|
|
vo_dheight = d_height;
|
|
|
|
|
|
|
|
r = (vo_colorkey & 0x00ff0000) >> 16;
|
|
|
|
g = (vo_colorkey & 0x0000ff00) >> 8;
|
|
|
|
b = vo_colorkey & 0x000000ff;
|
|
|
|
switch (vo_depthonscreen)
|
|
|
|
{
|
|
|
|
case 32:
|
|
|
|
colorkey = vo_colorkey;
|
|
|
|
break;
|
|
|
|
case 24:
|
|
|
|
colorkey = vo_colorkey & 0x00ffffff;
|
|
|
|
break;
|
|
|
|
case 16:
|
|
|
|
colorkey = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
|
|
|
|
break;
|
|
|
|
case 15:
|
|
|
|
colorkey = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
mp_msg(MSGT_VO, MSGL_ERR,
|
|
|
|
"Sorry, this (%d) color depth not supported.\n",
|
|
|
|
vo_depthonscreen);
|
|
|
|
return -1;
|
|
|
|
}
|
2004-11-15 09:09:29 +00:00
|
|
|
mp_msg(MSGT_VO, MSGL_V, "Using colorkey: %x\n", colorkey);
|
2004-06-14 04:53:03 +00:00
|
|
|
|
2008-02-14 14:23:55 +00:00
|
|
|
initialized = 1;
|
2004-06-14 04:53:03 +00:00
|
|
|
|
2008-07-30 13:44:59 +00:00
|
|
|
#ifdef CONFIG_GUI
|
2004-06-14 04:53:03 +00:00
|
|
|
if (use_gui)
|
|
|
|
guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window
|
|
|
|
else
|
2001-05-08 12:17:03 +00:00
|
|
|
#endif
|
2004-06-14 04:53:03 +00:00
|
|
|
{
|
2005-04-18 15:52:38 +00:00
|
|
|
if (flags & VOFLAG_FULLSCREEN)
|
2004-06-14 04:53:03 +00:00
|
|
|
aspect(&dwidth, &dheight, A_ZOOM);
|
|
|
|
|
|
|
|
XGetWindowAttributes(mDisplay, mRootWin, &attribs);
|
|
|
|
mDepth = attribs.depth;
|
|
|
|
if (mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32)
|
|
|
|
mDepth = 24;
|
|
|
|
XMatchVisualInfo(mDisplay, mScreen, mDepth, TrueColor, &vinfo);
|
|
|
|
xWAttribs.colormap =
|
|
|
|
XCreateColormap(mDisplay, mRootWin, vinfo.visual, AllocNone);
|
|
|
|
xWAttribs.background_pixel = 0;
|
|
|
|
xWAttribs.border_pixel = 0;
|
2008-11-19 20:19:25 +00:00
|
|
|
xswamask = CWBackPixel | CWBorderPixel | CWColormap;
|
|
|
|
|
2007-06-27 10:26:13 +00:00
|
|
|
vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height,
|
2007-07-22 18:27:26 +00:00
|
|
|
flags, xWAttribs.colormap, "xmga", title);
|
2007-09-08 13:36:13 +00:00
|
|
|
XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xWAttribs);
|
2002-10-09 13:25:13 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
} // !GUI
|
2001-02-24 20:28:24 +00:00
|
|
|
|
2005-04-18 15:52:38 +00:00
|
|
|
if ((flags & VOFLAG_FULLSCREEN) && (!WinID))
|
2004-06-14 04:53:03 +00:00
|
|
|
{
|
|
|
|
vo_dx = 0;
|
|
|
|
vo_dy = 0;
|
|
|
|
vo_dwidth = vo_screenwidth;
|
|
|
|
vo_dheight = vo_screenheight;
|
|
|
|
vo_fs = 1;
|
|
|
|
}
|
2002-06-10 18:40:19 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
panscan_calc();
|
2001-02-24 20:28:24 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
mga_vid_config.colkey_on = 1;
|
|
|
|
mga_vid_config.colkey_red = r;
|
|
|
|
mga_vid_config.colkey_green = g;
|
|
|
|
mga_vid_config.colkey_blue = b;
|
2002-01-23 15:16:20 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
set_window(); // set up mga_vid_config.dest_width etc
|
2001-02-24 20:28:24 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
XSync(mDisplay, False);
|
2001-02-24 20:28:24 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
ioctl(f, MGA_VID_ON, 0);
|
2002-10-09 13:25:13 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
return 0;
|
2001-02-24 20:28:24 +00:00
|
|
|
}
|
2002-01-26 16:01:26 +00:00
|
|
|
|
2004-06-14 04:53:03 +00:00
|
|
|
static void uninit(void)
|
|
|
|
{
|
|
|
|
mp_msg(MSGT_VO, MSGL_V, "vo: uninit!\n");
|
|
|
|
mga_uninit();
|
2008-02-14 14:23:55 +00:00
|
|
|
if (!initialized)
|
2004-06-14 04:53:03 +00:00
|
|
|
return; // no window?
|
2008-02-14 14:23:55 +00:00
|
|
|
initialized = 0;
|
2004-06-14 04:53:03 +00:00
|
|
|
vo_x11_uninit(); // destroy the window
|
|
|
|
}
|