1
mirror of https://github.com/mpv-player/mpv synced 2024-10-22 08:51:57 +02:00

15,16,24,32Bit rgb/bgr support added, aalib fixed, performance optimizations, code cleanup and so much more...

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@636 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
atmosfear 2001-04-25 20:43:45 +00:00
parent 0650831eeb
commit fc7355bf9d

View File

@ -5,6 +5,10 @@
*
* Copyright (C) Ryan C. Gordon <icculus@lokigames.com> - April 22, 2000.
*
* Copyright (C) Felix Buenemann <atmosfear@users.sourceforge.net> - 2001
*
* (for extensive code enhancements)
*
* Current maintainer for MPlayer project (report bugs to that address):
* Felix Buenemann <atmosfear@users.sourceforge.net>
*
@ -86,15 +90,11 @@
* to update this all the time (CVS info on http://mplayer.sourceforge.net)
*
* KNOWN BUGS:
* - Crashes with aalib (not resolved yet)
* - Crashes with aalib (fixed, but have to find cause!)
*/
/* define if you want to force Xv SDL output? */
#undef SDL_FORCEXV
/* define to force software-surface (video surface stored in system memory)*/
#undef SDL_NOHWSURFACE
/* define to disable usage of the xvideo extension */
#undef SDL_NOXV
#include <stdio.h>
#include <stdlib.h>
@ -110,16 +110,16 @@
LIBVO_EXTERN(sdl)
//#include "log.h"
//#define LOG if(0)printf
extern int verbose;
char *sdl_driver;
int sdl_noxv;
int sdl_forcexv;
static vo_info_t vo_info =
{
"SDL YUV overlay (SDL v1.1.7+ only!)",
"SDL YUV/RGB/BGR renderer (SDL v1.1.7+ only!)",
"sdl",
"Ryan C. Gordon <icculus@lokigames.com>",
"Ryan C. Gordon <icculus@lokigames.com>, Felix Buenemann <atmosfear@users.sourceforge.net>",
""
};
@ -129,10 +129,20 @@ static vo_info_t vo_info =
static struct sdl_priv_s {
/* SDL YUV surface & overlay */
/* output driver used by sdl */
char driver[8];
/* SDL display surface */
SDL_Surface *surface;
/* SDL RGB surface */
SDL_Surface *rgbsurface;
/* SDL YUV overlay */
SDL_Overlay *overlay;
// SDL_Overlay *current_frame;
/* x,y video position for centering */
SDL_Rect vidpos;
/* available fullscreen modes */
SDL_Rect **fullmodes;
@ -146,12 +156,22 @@ static struct sdl_priv_s {
/* Bits per Pixel */
Uint8 bpp;
/* RGB or YUV? */
Uint8 mode;
#define YUV 0
#define RGB 1
#define BGR 2
/* current fullscreen mode, 0 = highest available fullscreen mode */
int fullmode;
/* YUV ints */
int framePlaneY, framePlaneUV;
int stridePlaneY, stridePlaneUV;
/* RGB ints */
int framePlaneRGB;
int width,height;
int format;
} sdl_priv;
@ -166,7 +186,6 @@ static struct sdl_priv_s {
static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
struct sdl_priv_s *priv = &sdl_priv;
int x,y;
switch(priv->format) {
case IMGFMT_YV12:
@ -180,7 +199,23 @@ static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned
break;
case IMGFMT_UYVY:
vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) *(priv->overlay->pixels))+2*(priv->width*y0+x0)+1,2*priv->width);
break;
break;
case IMGFMT_RGB15:
case IMGFMT_BGR15:
vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *) priv->rgbsurface->pixels)+2*(y0*priv->width+x0),2*priv->width);
break;
case IMGFMT_RGB16:
case IMGFMT_BGR16:
vo_draw_alpha_rgb16(w,h,src,srca,stride,((uint8_t *) priv->rgbsurface->pixels)+2*(y0*priv->width+x0),2*priv->width);
break;
case IMGFMT_RGB24:
case IMGFMT_BGR24:
vo_draw_alpha_rgb24(w,h,src,srca,stride,((uint8_t *) priv->rgbsurface->pixels)+3*(y0*priv->width+x0),3*priv->width);
break;
case IMGFMT_RGB32:
case IMGFMT_BGR32:
vo_draw_alpha_rgb32(w,h,src,srca,stride,((uint8_t *) priv->rgbsurface->pixels)+4*(y0*priv->width+x0),4*priv->width);
break;
}
}
@ -220,41 +255,54 @@ static int sdl_open (void *plugin, void *name)
return 0;
opened = 1;
// LOG (LOG_DEBUG, "SDL video out: Opened Plugin");
if(verbose > 2) printf("SDL: Opening Plugin\n");
if(sdl_driver) setenv("SDL_VIDEODRIVER", sdl_driver, 1);
/* does the user want SDL to try and force Xv */
#ifdef SDL_FORCEXV
setenv("SDL_VIDEO_X11_NODIRECTCOLOR", "1", 1);
#endif
#ifdef SDL_NOXV
setenv("SDL_VIDEO_YUV_HWACCEL", "0", 1);
#endif
if(sdl_forcexv) setenv("SDL_VIDEO_X11_NODIRECTCOLOR", "1", 1);
/* does the user want to disable Xv and use software scaling instead */
if(sdl_noxv) setenv("SDL_VIDEO_YUV_HWACCEL", "0", 1);
/* default to no fullscreen mode, we'll set this as soon we have the avail. modes */
priv->fullmode = -2;
priv->surface = NULL;
priv->rgbsurface = NULL;
priv->overlay = NULL;
priv->fullmodes = NULL;
priv->bpp = 0;
/* initialize the SDL Video system */
if (SDL_Init (SDL_INIT_VIDEO/*|SDL_INIT_NOPARACHUTE*/)) {
if(verbose > 2) printf("SDL: Initializing of SDL failed: %s.\n", SDL_GetError());
return -1;
}
SDL_VideoDriverName(priv->driver, 8);
if(verbose) printf("SDL: Using driver: %s\n", priv->driver);
/* other default values */
#ifdef SDL_NOHWSURFACE
if(verbose) printf("SDL: using software-surface\n");
priv->sdlflags = SDL_SWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT;
priv->sdlfullflags = SDL_SWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF|SDL_ASYNCBLIT;
#else
if(verbose) printf("SDL: using hardware-surface\n");
priv->sdlflags = SDL_HWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT; //SDL_HWACCEL
priv->sdlfullflags = SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF|SDL_ASYNCBLIT; //SDL_HWACCEL
if((strcmp(priv->driver, "dga") == 0) && (priv->mode)) {
if(verbose) printf("SDL: using software-surface\n");
priv->sdlflags = SDL_SWSURFACE|SDL_FULLSCREEN|SDL_ASYNCBLIT|SDL_HWACCEL;
priv->sdlfullflags = SDL_SWSURFACE|SDL_FULLSCREEN|SDL_ASYNCBLIT|SDL_HWACCEL;
}
else {
if(verbose) printf("SDL: using hardware-surface\n");
priv->sdlflags = SDL_HWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT|SDL_HWACCEL;
priv->sdlfullflags = SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF|SDL_ASYNCBLIT|SDL_HWACCEL;
}
#endif
priv->surface = NULL;
priv->overlay = NULL;
priv->fullmodes = NULL;
priv->bpp = 0; //added atmos
/* initialize the SDL Video system */
if (SDL_Init (SDL_INIT_VIDEO)) {
// LOG (LOG_ERROR, "SDL video out: Initializing of SDL failed (SDL_Init). Please use the latest version of SDL.");
return -1;
}
/* No Keyrepeats! */
SDL_EnableKeyRepeat(0,0);
/* Setup Keyrepeats */
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
/* get information about the graphics adapter */
vidInfo = SDL_GetVideoInfo ();
@ -276,36 +324,42 @@ static int sdl_open (void *plugin, void *name)
*/
priv->sdlflags &= ~SDL_HWSURFACE;
if ((!SDL_ListModes (vidInfo->vfmt, priv->sdlflags)) && (!priv->fullmodes)) {
// LOG (LOG_ERROR, "SDL video out: Couldn't get any acceptable SDL Mode for output. (SDL_ListModes failed)");
printf("SDL: Couldn't get any acceptable SDL Mode for output.\n");
return -1;
}
}
/* YUV overlays need at least 16-bit color depth, but the
* display might less. The SDL AAlib target says it can only do
* 8-bits, for example. So, if the display is less than 16-bits,
* we'll force the BPP to 16, and pray that SDL can emulate for us.
*/
*/
//commented out for RGB test reasons
priv->bpp = vidInfo->vfmt->BitsPerPixel;
if (priv->bpp < 16) {
/*
LOG (LOG_WARNING, "SDL video out: Your SDL display target wants to be at a color depth of (%d), but we need it to be at\
//FIXME: DO NOT ADD ANY CODE BELOW THIS OR SDL WILL CRASH WITH AALIB!
if (!priv->mode && priv->bpp < 16) {
if(verbose) printf("SDL: Your SDL display target wants to be at a color depth of (%d), but we need it to be at\
least 16 bits, so we need to emulate 16-bit color. This is going to slow things down; you might want to\
increase your display's color depth, if possible", priv->bpp);
*/
increase your display's color depth, if possible.\n", priv->bpp);
priv->bpp = 16;
}
/* We dont want those in out event queue */
SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
/* We don't want those in our event queue.
* We use SDL_KEYUP cause SDL_KEYDOWN seems to cause problems
* with keys need to be pressed twice, to be recognized.
*/
/*SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
SDL_EventState(SDL_KEYDOWN, SDL_IGNORE);
SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
SDL_EventState(SDL_MOUSEBUTTONDOWN, SDL_IGNORE);
SDL_EventState(SDL_MOUSEBUTTONUP, SDL_IGNORE);
SDL_EventState(SDL_QUIT, SDL_IGNORE);
SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
SDL_EventState(SDL_USEREVENT, SDL_IGNORE);*/
/* Success! */
return 0;
@ -327,6 +381,10 @@ static int sdl_close (void)
if (priv->overlay)
SDL_FreeYUVOverlay(priv->overlay);
/* Free RGB Surface */
if (priv->rgbsurface)
SDL_FreeSurface(priv->rgbsurface);
/* Free our blitting surface */
if (priv->surface)
SDL_FreeSurface(priv->surface);
@ -334,10 +392,12 @@ static int sdl_close (void)
/* DONT attempt to free the fullscreen modes array. SDL_Quit* does this for us */
/* Cleanup SDL */
SDL_Quit(); /* might have to be changed to quitsubsystem only, if plugins become
changeable on the fly */
SDL_Quit();
//SDL_QuitSubSystem(SDL_INIT_VIDEO);
/* might have to be changed to quitsubsystem only, if plugins become
* changeable on the fly */
// LOG (LOG_DEBUG, "SDL video out: Closed Plugin");
if(verbose > 2) printf("SDL: Closed Plugin\n");
return 0;
}
@ -378,6 +438,9 @@ static void set_fullmode (int mode)
priv->surface = newsurface;
SDL_ShowCursor(0);
}
//TODO: check if this produces memhole! (no surface freeing)
priv->vidpos.x = (priv->surface->w - priv->width) / 2;
priv->vidpos.y = (priv->surface->h - priv->height) / 2;
}
@ -414,7 +477,39 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
if(verbose) printf("SDL: Using 0x%X (I420) image format\n", format);
printf("SDL: Mapping I420 to IYUV\n");
sdl_format = SDL_IYUV_OVERLAY;
break;
break;
case IMGFMT_BGR15:
if(verbose) printf("SDL: Using 0x%X (BGR15) image format\n", format);
priv->mode = BGR;
break;
case IMGFMT_RGB15:
if(verbose) printf("SDL: Using 0x%X (RGB15) image format\n", format);
priv->mode = RGB;
break;
case IMGFMT_BGR16:
if(verbose) printf("SDL: Using 0x%X (BGR16) image format\n", format);
priv->mode = BGR;
break;
case IMGFMT_RGB16:
if(verbose) printf("SDL: Using 0x%X (RGB16) image format\n", format);
priv->mode = RGB;
break;
case IMGFMT_BGR24:
if(verbose) printf("SDL: Using 0x%X (BGR24) image format\n", format);
priv->mode = BGR;
break;
case IMGFMT_RGB24:
if(verbose) printf("SDL: Using 0x%X (RGB24) image format\n", format);
priv->mode = RGB;
break;
case IMGFMT_BGR32:
if(verbose) printf("SDL: Using 0x%X (BGR32) image format\n", format);
priv->mode = BGR;
break;
case IMGFMT_RGB32:
if(verbose) printf("SDL: Using 0x%X (RGB32) image format\n", format);
priv->mode = RGB;
break;
default:
printf("SDL: Unsupported image format (0x%X)\n",format);
return -1;
@ -424,12 +519,15 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
/* Set output window title */
SDL_WM_SetCaption (".: MPlayer : F = Fullscreen/Windowed : C = Cycle Fullscreen Resolutions :.", "SDL Video Out");
//SDL_WM_SetCaption (title, title);
/* Save the original Image size */
priv->width = width;
priv->height = height;
priv->width = d_width ? d_width : width;
priv->height = d_height ? d_height : height;
priv->format = format;
priv->windowsize.w = d_width ? d_width : width;
priv->windowsize.h = d_height ? d_height : height;
/* bit 0 (0x01) means fullscreen (-fs)
* bit 1 (0x02) means mode switching (-vm)
@ -440,52 +538,108 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
switch(fullscreen){
case 0x01:
case 0x05:
priv->width = width;
priv->height = height;
if(verbose) printf("SDL: setting zoomed fullscreen without modeswitching\n");
priv->windowsize.w = d_width;
priv->windowsize.h = d_height;
printf("SDL: Info - please use -vm (unscaled) or -zoom (scaled) for best fullscreen experience\n");
if((priv->surface = SDL_SetVideoMode (d_width, d_height, priv->bpp, priv->sdlfullflags)))
SDL_ShowCursor(0);
break;
case 0x02:
case 0x03:
priv->windowsize.w = width;
priv->windowsize.h = height;
#ifdef SDL_NOXV
if(verbose) printf("SDL: setting nonzoomed fullscreen with modeswitching\n");
if(priv->surface = SDL_SetVideoMode (width, height, priv->bpp, priv->sdlfullflags))
printf("SDL: Info - please use -zoom switch to scale video\n");
if((priv->surface = SDL_SetVideoMode (d_width ? d_width : width, d_height ? d_height : height, priv->bpp, priv->sdlfullflags)))
SDL_ShowCursor(0);
#else
if(verbose) printf("SDL: setting zoomed fullscreen with modeswitching\n");
priv->surface=NULL;
set_fullmode(priv->fullmode);
#endif
break;
break;
case 0x04:
case 0x06:
case 0x07:
if(verbose) printf("SDL: setting zoomed fullscreen with modeswitching\n");
priv->windowsize.w = width;
priv->windowsize.h = height;
printf("SDL: Info - please use -vm switch instead if you don't want scaled video\n");
priv->surface=NULL;
set_fullmode(priv->fullmode);
break;
default:
if(verbose) printf("SDL: setting windowed mode\n");
priv->windowsize.w = d_width;
priv->windowsize.h = d_height;
priv->surface = SDL_SetVideoMode (d_width, d_height, priv->bpp, priv->sdlflags);
if((priv->surface = SDL_SetVideoMode (d_width, d_height, priv->bpp, priv->sdlflags))
&& (strcmp(priv->driver, "dga") == 0)) SDL_ShowCursor(0); //TODO: other sdl drivers that are fullscreen only?
}
if(!priv->surface) return -1; // cannot SetVideoMode
/* Initialize and create the YUV Overlay used for video out */
if (!(priv->overlay = SDL_CreateYUVOverlay (width, height, sdl_format, priv->surface))) {
printf ("SDL video out: Couldn't create an SDL-based YUV overlay\n");
if(!priv->surface) { // cannot SetVideoMode
printf("SDL: failed to set video mode: %s\n", SDL_GetError());
return -1;
}
priv->framePlaneY = width * height;
priv->framePlaneUV = (width * height) >> 2;
priv->stridePlaneY = width;
priv->stridePlaneUV = width/2;
}
switch(format) {
/* Initialize and create the RGB Surface used for video out in BGR/RGB mode */
//SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
// SDL_SWSURFACE,SDL_HWSURFACE,SDL_SRCCOLORKEY, priv->flags? guess: exchange Rmask and Bmask for BGR<->RGB
// 32 bit: a:ff000000 r:ff000 g:ff00 b:ff
// 24 bit: r:ff0000 g:ff00 b:ff
// 16 bit: r:1111100000000000b g:0000011111100000b b:0000000000011111b
// 15 bit: r:111110000000000b g:000001111100000b b:000000000011111b
// FIXME: colorkey detect based on bpp, FIXME static bpp value, FIXME alpha value correct?
case IMGFMT_RGB15:
if (!(priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY, width, height, 15, 31, 992, 31744, 0))) {
printf ("SDL: Couldn't create a RGB surface: %s\n", SDL_GetError());
return -1;
}
break;
case IMGFMT_BGR15:
if (!(priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY, width, height, 15, 31744, 992, 31, 0))) {
printf ("SDL: Couldn't create a RGB surface: %s\n", SDL_GetError());
return -1;
}
break;
case IMGFMT_RGB16:
if (!(priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY, width, height, 16, 31, 2016, 63488, 0))) {
printf ("SDL: Couldn't create a RGB surface: %s\n", SDL_GetError());
return -1;
}
break;
case IMGFMT_BGR16:
if (!(priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY, width, height, 16, 63488, 2016, 31, 0))) {
printf ("SDL: Couldn't create a RGB surface: %s\n", SDL_GetError());
return -1;
}
break;
case IMGFMT_RGB24:
if (!(priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY, width, height, 24, 0x0000FF, 0x00FF00, 0xFF0000, 0))) {
printf ("SDL: Couldn't create a RGB surface: %s\n", SDL_GetError());
return -1;
}
break;
case IMGFMT_BGR24:
if (!(priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY, width, height, 24, 0xFF0000, 0x00FF00, 0x0000FF, 0))) {
printf ("SDL: Couldn't create a RGB surface: %s\n", SDL_GetError());
return -1;
}
break;
case IMGFMT_RGB32:
if (!(priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY, width, height, 32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000))) {
printf ("SDL: Couldn't create a RGB surface: %s\n", SDL_GetError());
return -1;
}
break;
case IMGFMT_BGR32:
if (!(priv->rgbsurface = SDL_CreateRGBSurface (SDL_SRCCOLORKEY, width, height, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000))) {
printf ("SDL: Couldn't create a RGB surface: %s\n", SDL_GetError());
return -1;
}
break;
default:
/* Initialize and create the YUV Overlay used for video out */
if (!(priv->overlay = SDL_CreateYUVOverlay (width, height, sdl_format, priv->surface))) {
printf ("SDL: Couldn't create a YUV overlay: %s\n", SDL_GetError());
return -1;
}
priv->framePlaneY = width * height;
priv->framePlaneUV = (width * height) >> 2;
priv->stridePlaneY = width;
priv->stridePlaneUV = width/2;
}
if(priv->mode) {
priv->framePlaneRGB = width * height * priv->rgbsurface->format->BytesPerPixel;
}
return 0;
}
@ -502,36 +656,58 @@ static uint32_t draw_frame(uint8_t *src[])
{
struct sdl_priv_s *priv = &sdl_priv;
uint8_t *dst;
// priv->current_frame = (SDL_Overlay*) frame->private;
// SDL_UnlockYUVOverlay (priv->current_frame);
if (SDL_LockYUVOverlay (priv->overlay)) {
// LOG (LOG_ERROR, "SDL video out: Couldn't lock SDL-based YUV overlay");
return -1;
}
switch(priv->format){
case IMGFMT_YV12:
case IMGFMT_I420:
case IMGFMT_IYUV:
/*if (SDL_LockYUVOverlay (priv->overlay)) {
if(verbose) printf("SDL: Couldn't lock YUV overlay\n");
return -1;
}*/
dst = (uint8_t *) *(priv->overlay->pixels);
memcpy (dst, src[0], priv->framePlaneY);
dst += priv->framePlaneY;
memcpy (dst, src[2], priv->framePlaneUV);
dst += priv->framePlaneUV;
memcpy (dst, src[1], priv->framePlaneUV);
/*SDL_UnlockYUVOverlay (priv->overlay);*/
break;
case IMGFMT_YUY2:
case IMGFMT_UYVY:
case IMGFMT_YVYU:
/*if (SDL_LockYUVOverlay (priv->overlay)) {
if(verbose) printf("SDL: Couldn't lock YUV overlay\n");
return -1;
}*/
dst = (uint8_t *) *(priv->overlay->pixels);
memcpy (dst, src[0], priv->width*priv->height*2);
/*SDL_UnlockYUVOverlay (priv->overlay);*/
break;
case IMGFMT_RGB15:
case IMGFMT_BGR15:
case IMGFMT_RGB16:
case IMGFMT_BGR16:
case IMGFMT_RGB24:
case IMGFMT_BGR24:
case IMGFMT_RGB32:
case IMGFMT_BGR32:
/*if(SDL_MUSTLOCK(priv->rgbsurface)) {
if (SDL_LockSurface (priv->rgbsurface)) {
if(verbose) printf("SDL: Couldn't lock RGB surface\n");
return -1;
}
}*/
dst = (uint8_t *) priv->rgbsurface->pixels;
memcpy (dst, src[0], priv->framePlaneRGB);
/*if(SDL_MUSTLOCK(priv->rgbsurface))
SDL_UnlockSurface (priv->rgbsurface);*/
break;
}
SDL_UnlockYUVOverlay (priv->overlay);
return 0;
}
@ -551,12 +727,10 @@ static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int
uint8_t *src;
int i;
//priv->current_frame = priv->overlay;
if (SDL_LockYUVOverlay (priv->overlay)) {
// LOG (LOG_ERROR, "SDL video out: Couldn't lock SDL-based YUV overlay");
/*if (SDL_LockYUVOverlay (priv->overlay)) {
if(verbose) printf("SDL: Couldn't lock YUV overlay");
return -1;
}
}*/
dst = (uint8_t *) *(priv->overlay->pixels)
+ (priv->stridePlaneY * y + x);
@ -587,16 +761,7 @@ static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int
dst+=priv->stridePlaneUV;
}
#if 0
dst = (uint8_t *) *(priv->overlay->pixels) + (priv->slicePlaneY * slice_num);
memcpy (dst, src[0], priv->slicePlaneY);
dst = (uint8_t *) *(priv->overlay->pixels) + priv->framePlaneY + (priv->slicePlaneUV * slice_num);
memcpy (dst, src[2], priv->slicePlaneUV);
dst += priv->framePlaneUV;
memcpy (dst, src[1], priv->slicePlaneUV);
#endif
SDL_UnlockYUVOverlay (priv->overlay);
/*SDL_UnlockYUVOverlay (priv->overlay);*/
return 0;
}
@ -633,12 +798,20 @@ static void check_events (void)
priv->windowsize.w = priv->surface->w;
priv->windowsize.h = priv->surface->h;
//}
// LOG (LOG_DEBUG, "SDL video out: Window resize");
if(verbose > 2) printf("SDL: Window resize\n");
break;
/* graphics mode selection shortcuts */
case SDL_KEYUP:
case SDL_KEYDOWN:
switch(event.key.keysym.sym) {
case SDLK_UP: mplayer_put_key(KEY_UP);break;
case SDLK_DOWN: mplayer_put_key(KEY_DOWN);break;
case SDLK_LEFT: mplayer_put_key(KEY_LEFT);break;
case SDLK_RIGHT: mplayer_put_key(KEY_RIGHT);break;
}
break;
case SDL_KEYUP:
keypressed = event.key.keysym.sym;
/* c key pressed. c cycles through available fullscreenmodes, if we have some */
@ -648,7 +821,7 @@ static void check_events (void)
if (priv->fullmode > (findArrayEnd(priv->fullmodes) - 1)) priv->fullmode = 0;
set_fullmode(priv->fullmode);
// LOG (LOG_DEBUG, "SDL video out: Set next available fullscreen mode.");
if(verbose > 1) printf("SDL: Set next available fullscreen mode.\n");
}
/* f key pressed toggles/exits fullscreenmode */
@ -656,17 +829,16 @@ static void check_events (void)
if (priv->surface->flags & SDL_FULLSCREEN) {
priv->surface = SDL_SetVideoMode(priv->windowsize.w, priv->windowsize.h, priv->bpp, priv->sdlflags);
SDL_ShowCursor(1);
// LOG (LOG_DEBUG, "SDL video out: Windowed mode");
if(verbose > 1) printf("SDL: Windowed mode\n");
}
else if (priv->fullmodes){
set_fullmode(priv->fullmode);
// LOG (LOG_DEBUG, "SDL video out: Set fullscreen mode.");
if(verbose > 1) printf("SDL: Set fullscreen mode\n");
}
}
else switch(keypressed){
// case SDLK_q: if(!(priv->surface->flags & SDL_FULLSCREEN))mplayer_put_key('q');break;
case SDLK_RETURN:
if (!firstcheck) { firstcheck = 1; break; }
case SDLK_ESCAPE:
@ -677,10 +849,6 @@ static void check_events (void)
/*case SDLK_o: mplayer_put_key('o');break;
case SDLK_SPACE: mplayer_put_key(' ');break;
case SDLK_p: mplayer_put_key('p');break;*/
case SDLK_UP: mplayer_put_key(KEY_UP);break;
case SDLK_DOWN: mplayer_put_key(KEY_DOWN);break;
case SDLK_LEFT: mplayer_put_key(KEY_LEFT);break;
case SDLK_RIGHT: mplayer_put_key(KEY_RIGHT);break;
case SDLK_PLUS:
case SDLK_KP_PLUS: mplayer_put_key('+');break;
case SDLK_MINUS:
@ -711,54 +879,57 @@ static void check_events (void)
static void flip_page (void)
{
struct sdl_priv_s *priv = &sdl_priv;
SDL_Surface *blitconv; // temporary conversion surface
//vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride)
/* update osd/subtitles */
vo_draw_text(priv->width,priv->height,draw_alpha);
/* check and react on keypresses and window resizes */
check_events();
/* blit to the YUV overlay */
SDL_DisplayYUVOverlay (priv->overlay, &priv->surface->clip_rect);
switch(priv->format) {
case IMGFMT_RGB15:
case IMGFMT_BGR15:
case IMGFMT_RGB16:
case IMGFMT_BGR16:
case IMGFMT_RGB24:
case IMGFMT_BGR24:
case IMGFMT_RGB32:
case IMGFMT_BGR32:
/* blit to the RGB surface */
blitconv = SDL_DisplayFormat(priv->rgbsurface);
if(SDL_BlitSurface (blitconv, NULL, priv->surface, &priv->vidpos))
printf("SDL: Blit failed: %s\n", SDL_GetError());
SDL_FreeSurface(blitconv);
/* check if we have a double buffered surface and flip() if we do. */
if ( priv->surface->flags & SDL_DOUBLEBUF )
SDL_Flip(priv->surface);
SDL_LockYUVOverlay (priv->overlay);
/*if(SDL_MUSTLOCK(priv->surface)) {
if (SDL_LockSurface (priv->surface)) {
if(verbose) printf("SDL: Couldn't lock RGB surface\n");
return;
}
}*/
/* update screen */
SDL_UpdateRect(priv->surface, priv->vidpos.x, priv->vidpos.y, priv->width, priv->height);
/*if(SDL_MUSTLOCK(priv->surface))
SDL_UnlockSurface (priv->surface);*/
/* check if we have a double buffered surface and flip() if we do. */
if ( priv->surface->flags & SDL_DOUBLEBUF )
SDL_Flip(priv->surface);
break;
default:
/* blit to the YUV overlay */
SDL_DisplayYUVOverlay (priv->overlay, &priv->surface->clip_rect);
/* check if we have a double buffered surface and flip() if we do. */
if ( priv->surface->flags & SDL_DOUBLEBUF )
SDL_Flip(priv->surface);
//SDL_LockYUVOverlay (priv->overlay); // removed because unused!?
}
}
#if 0
static frame_t* sdl_allocate_image_buffer(int width, int height)
{
struct sdl_priv_s *priv = &sdl_priv;
frame_t *frame;
if (!(frame = malloc (sizeof (frame_t))))
return NULL;
if (!(frame->private = (void*) SDL_CreateYUVOverlay (width, height,
SDL_IYUV_OVERLAY, priv->surface)))
{
// LOG (LOG_ERROR, "SDL video out: Couldn't create an SDL-based YUV overlay");
return NULL;
}
frame->base[0] = (uint8_t*) ((SDL_Overlay*) (frame->private))->pixels[0];
frame->base[1] = (uint8_t*) ((SDL_Overlay*) (frame->private))->pixels[1];
frame->base[2] = (uint8_t*) ((SDL_Overlay*) (frame->private))->pixels[2];
SDL_LockYUVOverlay ((SDL_Overlay*) frame->private);
return frame;
}
static void sdl_free_image_buffer(frame_t* frame)
{
SDL_FreeYUVOverlay((SDL_Overlay*) frame->private);
free(frame);
}
#endif
static uint32_t
query_format(uint32_t format)
{
@ -769,9 +940,16 @@ query_format(uint32_t format)
case IMGFMT_YUY2:
case IMGFMT_UYVY:
case IMGFMT_YVYU:
// case IMGFMT_RGB|24:
// case IMGFMT_BGR|24:
return 1;
return 0x6; // hw supported & osd
case IMGFMT_RGB15:
case IMGFMT_BGR15:
case IMGFMT_RGB16:
case IMGFMT_BGR16:
case IMGFMT_RGB24:
case IMGFMT_BGR24:
case IMGFMT_RGB32:
case IMGFMT_BGR32:
return 0x5; // hw supported w/conversion & osd
}
return 0;
}