[Mplayer-cvslog] CVS: main/libvo vo_sdl.c,1.25,1.26
Felix Buenemann
atmosfear at users.sourceforge.net
Wed Apr 25 22:43:47 CEST 2001
Update of /cvsroot/mplayer/main/libvo
In directory usw-pr-cvs1:/tmp/cvs-serv24045
Modified Files:
vo_sdl.c
Log Message:
15,16,24,32Bit rgb/bgr support added, aalib fixed, performance optimizations, code cleanup and so much more...
Index: vo_sdl.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_sdl.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -r1.25 -r1.26
*** vo_sdl.c 2001/04/24 11:42:04 1.25
--- vo_sdl.c 2001/04/25 20:43:45 1.26
***************
*** 6,9 ****
--- 6,13 ----
* Copyright (C) Ryan C. Gordon <icculus at lokigames.com> - April 22, 2000.
*
+ * Copyright (C) Felix Buenemann <atmosfear at users.sourceforge.net> - 2001
+ *
+ * (for extensive code enhancements)
+ *
* Current maintainer for MPlayer project (report bugs to that address):
* Felix Buenemann <atmosfear at users.sourceforge.net>
***************
*** 87,99 ****
*
* KNOWN BUGS:
! * - Crashes with aalib (not resolved yet)
*/
- /* 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>
--- 91,99 ----
*
* KNOWN BUGS:
! * - Crashes with aalib (fixed, but have to find cause!)
*/
/* define to force software-surface (video surface stored in system memory)*/
#undef SDL_NOHWSURFACE
#include <stdio.h>
***************
*** 111,124 ****
LIBVO_EXTERN(sdl)
- //#include "log.h"
- //#define LOG if(0)printf
-
extern int verbose;
static vo_info_t vo_info =
{
! "SDL YUV overlay (SDL v1.1.7+ only!)",
"sdl",
! "Ryan C. Gordon <icculus at lokigames.com>",
""
};
--- 111,124 ----
LIBVO_EXTERN(sdl)
extern int verbose;
+ char *sdl_driver;
+ int sdl_noxv;
+ int sdl_forcexv;
static vo_info_t vo_info =
{
! "SDL YUV/RGB/BGR renderer (SDL v1.1.7+ only!)",
"sdl",
! "Ryan C. Gordon <icculus at lokigames.com>, Felix Buenemann <atmosfear at users.sourceforge.net>",
""
};
***************
*** 130,138 ****
static struct sdl_priv_s {
! /* SDL YUV surface & overlay */
SDL_Surface *surface;
SDL_Overlay *overlay;
- // SDL_Overlay *current_frame;
/* available fullscreen modes */
SDL_Rect **fullmodes;
--- 130,148 ----
static struct sdl_priv_s {
! /* 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;
+ /* x,y video position for centering */
+ SDL_Rect vidpos;
+
/* available fullscreen modes */
SDL_Rect **fullmodes;
***************
*** 147,150 ****
--- 157,166 ----
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;
***************
*** 153,156 ****
--- 169,176 ----
int framePlaneY, framePlaneUV;
int stridePlaneY, stridePlaneUV;
+
+ /* RGB ints */
+ int framePlaneRGB;
+
int width,height;
int format;
***************
*** 167,171 ****
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) {
--- 187,190 ----
***************
*** 181,185 ****
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;
}
}
--- 200,220 ----
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;
! 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;
}
}
***************
*** 221,259 ****
opened = 1;
! // LOG (LOG_DEBUG, "SDL video out: Opened Plugin");
/* 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
/* default to no fullscreen mode, we'll set this as soon we have the avail. modes */
priv->fullmode = -2;
! /* 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
! #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);
/* get information about the graphics adapter */
--- 256,307 ----
opened = 1;
! 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 */
! 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((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
!
! /* Setup Keyrepeats */
! SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
/* get information about the graphics adapter */
***************
*** 277,285 ****
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)");
return -1;
}
}
!
/* YUV overlays need at least 16-bit color depth, but the
--- 325,333 ----
priv->sdlflags &= ~SDL_HWSURFACE;
if ((!SDL_ListModes (vidInfo->vfmt, priv->sdlflags)) && (!priv->fullmodes)) {
! 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
***************
*** 287,303 ****
* 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.
! */
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\
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);
! */
priv->bpp = 16;
}
! /* We dont want those in out event queue */
! SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
SDL_EventState(SDL_KEYDOWN, SDL_IGNORE);
SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
--- 335,356 ----
* 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;
! //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.\n", priv->bpp);
!
priv->bpp = 16;
}
! /* 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);
***************
*** 306,311 ****
SDL_EventState(SDL_QUIT, SDL_IGNORE);
SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
! SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
/* Success! */
return 0;
--- 359,365 ----
SDL_EventState(SDL_QUIT, SDL_IGNORE);
SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
! SDL_EventState(SDL_USEREVENT, SDL_IGNORE);*/
+
/* Success! */
return 0;
***************
*** 328,331 ****
--- 382,389 ----
SDL_FreeYUVOverlay(priv->overlay);
+ /* Free RGB Surface */
+ if (priv->rgbsurface)
+ SDL_FreeSurface(priv->rgbsurface);
+
/* Free our blitting surface */
if (priv->surface)
***************
*** 335,342 ****
/* Cleanup SDL */
! SDL_Quit(); /* might have to be changed to quitsubsystem only, if plugins become
! changeable on the fly */
! // LOG (LOG_DEBUG, "SDL video out: Closed Plugin");
return 0;
--- 393,402 ----
/* Cleanup SDL */
! SDL_Quit();
! //SDL_QuitSubSystem(SDL_INIT_VIDEO);
! /* might have to be changed to quitsubsystem only, if plugins become
! * changeable on the fly */
! if(verbose > 2) printf("SDL: Closed Plugin\n");
return 0;
***************
*** 379,382 ****
--- 439,445 ----
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;
}
***************
*** 415,419 ****
printf("SDL: Mapping I420 to IYUV\n");
sdl_format = SDL_IYUV_OVERLAY;
! break;
default:
printf("SDL: Unsupported image format (0x%X)\n",format);
--- 478,514 ----
printf("SDL: Mapping I420 to IYUV\n");
sdl_format = SDL_IYUV_OVERLAY;
! 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);
***************
*** 425,434 ****
/* Set output window title */
SDL_WM_SetCaption (".: MPlayer : F = Fullscreen/Windowed : C = Cycle Fullscreen Resolutions :.", "SDL Video Out");
/* Save the original Image size */
! priv->width = width;
! priv->height = height;
priv->format = format;
/* bit 0 (0x01) means fullscreen (-fs)
--- 520,532 ----
/* 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 = 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)
***************
*** 441,469 ****
case 0x01:
case 0x05:
if(verbose) printf("SDL: setting zoomed fullscreen without modeswitching\n");
! priv->windowsize.w = d_width;
! priv->windowsize.h = d_height;
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))
SDL_ShowCursor(0);
! #else
! if(verbose) printf("SDL: setting zoomed fullscreen with modeswitching\n");
! priv->surface=NULL;
! set_fullmode(priv->fullmode);
! #endif
! break;
case 0x06:
- case 0x07:
if(verbose) printf("SDL: setting zoomed fullscreen with modeswitching\n");
! priv->windowsize.w = width;
! priv->windowsize.h = height;
priv->surface=NULL;
set_fullmode(priv->fullmode);
--- 539,559 ----
case 0x01:
case 0x05:
+ priv->width = width;
+ priv->height = height;
if(verbose) printf("SDL: setting zoomed fullscreen without modeswitching\n");
! 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:
if(verbose) printf("SDL: setting nonzoomed fullscreen with modeswitching\n");
! 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);
! break;
! case 0x04:
case 0x06:
if(verbose) printf("SDL: setting zoomed fullscreen with modeswitching\n");
! printf("SDL: Info - please use -vm switch instead if you don't want scaled video\n");
priv->surface=NULL;
set_fullmode(priv->fullmode);
***************
*** 471,490 ****
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) 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");
return -1;
! }
! priv->framePlaneY = width * height;
! priv->framePlaneUV = (width * height) >> 2;
! priv->stridePlaneY = width;
! priv->stridePlaneUV = width/2;
return 0;
}
--- 561,644 ----
default:
if(verbose) printf("SDL: setting windowed mode\n");
! 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) { // cannot SetVideoMode
! printf("SDL: failed to set video mode: %s\n", SDL_GetError());
return -1;
! }
+ 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;
}
***************
*** 503,519 ****
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:
dst = (uint8_t *) *(priv->overlay->pixels);
memcpy (dst, src[0], priv->framePlaneY);
--- 657,669 ----
struct sdl_priv_s *priv = &sdl_priv;
uint8_t *dst;
!
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);
***************
*** 522,525 ****
--- 672,676 ----
dst += priv->framePlaneUV;
memcpy (dst, src[1], priv->framePlaneUV);
+ /*SDL_UnlockYUVOverlay (priv->overlay);*/
break;
***************
*** 527,536 ****
case IMGFMT_UYVY:
case IMGFMT_YVYU:
dst = (uint8_t *) *(priv->overlay->pixels);
memcpy (dst, src[0], priv->width*priv->height*2);
break;
}
- SDL_UnlockYUVOverlay (priv->overlay);
return 0;
}
--- 678,712 ----
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;
+
}
return 0;
}
***************
*** 552,561 ****
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");
return -1;
! }
dst = (uint8_t *) *(priv->overlay->pixels)
--- 728,735 ----
int i;
! /*if (SDL_LockYUVOverlay (priv->overlay)) {
! if(verbose) printf("SDL: Couldn't lock YUV overlay");
return -1;
! }*/
dst = (uint8_t *) *(priv->overlay->pixels)
***************
*** 588,601 ****
}
! #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);
return 0;
--- 762,766 ----
}
! /*SDL_UnlockYUVOverlay (priv->overlay);*/
return 0;
***************
*** 634,643 ****
priv->windowsize.h = priv->surface->h;
//}
! // LOG (LOG_DEBUG, "SDL video out: Window resize");
break;
/* graphics mode selection shortcuts */
! case SDL_KEYUP:
keypressed = event.key.keysym.sym;
--- 799,816 ----
priv->windowsize.h = priv->surface->h;
//}
! if(verbose > 2) printf("SDL: Window resize\n");
break;
/* graphics mode selection shortcuts */
! 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;
***************
*** 649,653 ****
set_fullmode(priv->fullmode);
! // LOG (LOG_DEBUG, "SDL video out: Set next available fullscreen mode.");
}
--- 822,826 ----
set_fullmode(priv->fullmode);
! if(verbose > 1) printf("SDL: Set next available fullscreen mode.\n");
}
***************
*** 657,671 ****
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");
}
else if (priv->fullmodes){
set_fullmode(priv->fullmode);
! // LOG (LOG_DEBUG, "SDL video out: Set fullscreen mode.");
}
}
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; }
--- 830,843 ----
priv->surface = SDL_SetVideoMode(priv->windowsize.w, priv->windowsize.h, priv->bpp, priv->sdlflags);
SDL_ShowCursor(1);
! if(verbose > 1) printf("SDL: Windowed mode\n");
}
else if (priv->fullmodes){
set_fullmode(priv->fullmode);
! if(verbose > 1) printf("SDL: Set fullscreen mode\n");
}
}
else switch(keypressed){
case SDLK_RETURN:
if (!firstcheck) { firstcheck = 1; break; }
***************
*** 678,685 ****
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;
--- 850,853 ----
***************
*** 712,762 ****
{
struct sdl_priv_s *priv = &sdl_priv;
! //vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride)
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);
-
- /* 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 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
--- 880,933 ----
{
struct sdl_priv_s *priv = &sdl_priv;
+ SDL_Surface *blitconv; // temporary conversion surface
! /* update osd/subtitles */
vo_draw_text(priv->width,priv->height,draw_alpha);
/* check and react on keypresses and window resizes */
check_events();
! 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);
!
! /*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!?
! }
}
static uint32_t
***************
*** 770,776 ****
case IMGFMT_UYVY:
case IMGFMT_YVYU:
! // case IMGFMT_RGB|24:
! // case IMGFMT_BGR|24:
! return 1;
}
return 0;
--- 941,954 ----
case IMGFMT_UYVY:
case IMGFMT_YVYU:
! 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;
_______________________________________________
Mplayer-cvslog mailing list
Mplayer-cvslog at lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/mplayer-cvslog
More information about the MPlayer-cvslog
mailing list