[Mplayer-cvslog] CVS: main/libvo vo_sdl.c,1.33,1.34
Felix Buenemann
atmosfear at users.sourceforge.net
Sun May 13 18:38:35 CEST 2001
Update of /cvsroot/mplayer/main/libvo
In directory usw-pr-cvs1:/tmp/cvs-serv25300
Modified Files:
vo_sdl.c
Log Message:
Added full aspect awareness, rewrote fullscreen handling.
Index: vo_sdl.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_sdl.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -C2 -r1.33 -r1.34
*** vo_sdl.c 2001/05/11 21:36:30 1.33
--- vo_sdl.c 2001/05/13 16:38:33 1.34
***************
*** 97,100 ****
--- 97,103 ----
//#define BUGGY_SDL //defined by configure
+ /* MONITOR_ASPECT MUST BE FLOAT */
+ #define MONITOR_ASPECT 4.0/3.0
+
#include <stdio.h>
#include <stdlib.h>
***************
*** 131,134 ****
--- 134,142 ----
#include <SDL/SDL.h>
+ #define FS 0x01
+ #define VM 0x02
+ #define ZOOM 0x04
+ #define FLIP 0x08
+
/** Private SDL Data structure **/
***************
*** 147,153 ****
SDL_Overlay *overlay;
- /* x,y video position for centering */
- SDL_Rect vidpos;
-
/* available fullscreen modes */
SDL_Rect **fullmodes;
--- 155,158 ----
***************
*** 172,177 ****
/* YUV ints */
! int framePlaneY, framePlaneUV;
! int stridePlaneY, stridePlaneUV;
/* RGB ints */
--- 177,182 ----
/* YUV ints */
! int framePlaneY, framePlaneUV, framePlaneYUY;
! int stridePlaneY, stridePlaneUV, stridePlaneYUY;
/* RGB ints */
***************
*** 181,186 ****
/* Flip image */
int flip;
! int width,height;
int format;
} sdl_priv;
--- 186,205 ----
/* Flip image */
int flip;
+
+ /* fullscreen behaviour; see init */
+ int fulltype;
+
+ #ifdef HAVE_X11
+ /* X11 Resolution */
+ int XWidth, XHeight;
+ #endif
! /* original image dimensions */
! int width, height;
!
! /* destination dimensions */
! int dstwidth, dstheight;
!
! /* source image format (YUV/RGB/...) */
int format;
} sdl_priv;
***************
*** 410,414 ****
--- 429,464 ----
}
+ /**
+ * Do aspect ratio calculations
+ *
+ * params : srcw == sourcewidth
+ * srch == sourceheight
+ * dstw == destinationwidth
+ * dsth == destinationheight
+ *
+ * returns : SDL_Rect structure with new x and y, w and h
+ **/
+ static SDL_Rect aspect(int srcw, int srch, int dstw, int dsth) {
+ SDL_Rect newres;
+ if(verbose > 1) printf("SDL Aspect: src: %ix%i dst: %ix%i\n", srcw, srch, dstw, dsth);
+ newres.h = ((float)dstw / (float)srcw * (float)srch) * ((float)dsth/((float)dstw/(MONITOR_ASPECT)));
+ if(newres.h > dsth) {
+ newres.w = ((float)dsth / (float)newres.h) * dstw;
+ newres.h = dsth;
+ newres.x = (dstw - newres.w) / 2;
+ newres.y = 0;
+ }
+ else {
+ newres.w = dstw;
+ newres.x = 0;
+ newres.y = (dsth - newres.h) / 2;
+ }
+
+ if(verbose) printf("SDL Aspect-Destinationres: %ix%i (x: %i, y: %i)\n", newres.w, newres.h, newres.x, newres.y);
+
+ return newres;
+ }
+
/**
* Sets the specified fullscreen mode.
***************
*** 417,421 ****
* returns : doesn't return
**/
!
static void set_fullmode (int mode)
{
--- 467,472 ----
* returns : doesn't return
**/
!
! #if 0
static void set_fullmode (int mode)
{
***************
*** 447,455 ****
}
//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;
}
/**
* Initialize an SDL surface and an SDL YUV overlay.
--- 498,535 ----
}
//TODO: check if this produces memhole! (no surface freeing)
}
+ #endif
+ static void set_fullmode (int mode) {
+ struct sdl_priv_s *priv = &sdl_priv;
+ SDL_Surface *newsurface = NULL;
+ SDL_Rect newsize;
+
+ /* if we haven't set a fullmode yet, default to the lowest res fullmode first */
+ if(mode < 0)
+ mode = priv->fullmode = findArrayEnd(priv->fullmodes) - 1;
+
+ /* calculate new video size/aspect */
+ if(priv->fulltype&FS) {
+ newsize = aspect(priv->width, priv->height, priv->XWidth ? priv->XWidth : priv->dstwidth, priv->XHeight ? priv->XHeight : priv->dstheight);
+ } else
+ if(priv->fulltype&VM) {
+ newsize = aspect(priv->dstwidth, priv->dstheight, priv->dstwidth, priv->dstwidth*((float)priv->XHeight / (float)priv->XWidth));
+ }
+ else {
+ newsize = aspect(priv->dstwidth, priv->dstheight, priv->fullmodes[mode]->w, priv->fullmodes[mode]->h);
+ }
+ /* try to change to given fullscreenmode */
+ newsurface = SDL_SetVideoMode(newsize.w, newsize.h, priv->bpp, priv->sdlfullflags);
+
+ /* if creation of new surface was successfull, save it and hide mouse cursor */
+ if(newsurface) {
+ priv->surface = newsurface;
+ SDL_ShowCursor(0);
+ }
+ }
+
+
/**
* Initialize an SDL surface and an SDL YUV overlay.
***************
*** 468,477 ****
struct sdl_priv_s *priv = &sdl_priv;
unsigned int sdl_format;
#ifdef HAVE_X11
static Display *XDisplay;
#endif
- //priv->flip = 1; // debugging only
-
sdl_format = format;
switch(format){
--- 548,557 ----
struct sdl_priv_s *priv = &sdl_priv;
unsigned int sdl_format;
+ SDL_Rect res;
#ifdef HAVE_X11
static Display *XDisplay;
+ static int XScreen;
#endif
sdl_format = format;
switch(format){
***************
*** 528,540 ****
}
- sdl_open (NULL, NULL);
#ifdef HAVE_X11
if(getenv("DISPLAY")) {
if(verbose) printf("SDL: deactivating XScreensaver/DPMS\n");
XDisplay = XOpenDisplay(getenv("DISPLAY"));
saver_off(XDisplay);
XCloseDisplay(XDisplay);
}
#endif
/* Set output window title */
--- 608,624 ----
}
#ifdef HAVE_X11
if(getenv("DISPLAY")) {
if(verbose) printf("SDL: deactivating XScreensaver/DPMS\n");
XDisplay = XOpenDisplay(getenv("DISPLAY"));
+ XScreen = DefaultScreen(XDisplay);
+ priv->XWidth = DisplayWidth(XDisplay, XScreen);
+ priv->XHeight = DisplayHeight(XDisplay, XScreen);
+ if(verbose) printf("SDL: X11 Resolution %ix%i\n", priv->XWidth, priv->XHeight);
saver_off(XDisplay);
XCloseDisplay(XDisplay);
}
#endif
+ sdl_open (NULL, NULL);
/* Set output window title */
***************
*** 544,554 ****
/* Save the original Image size */
- //priv->width = d_width ? d_width : width;
- //priv->height = d_height ? d_height : height;
priv->width = width;
priv->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)
--- 628,647 ----
/* Save the original Image size */
priv->width = width;
priv->height = height;
+ priv->dstwidth = d_width ? d_width : width;
+ priv->dstheight = d_height ? d_height : height;
+
+ /*priv->width = res.w;
+ priv->height = res.h;*/
priv->format = format;
! #ifdef HAVE_X11
! res = aspect(priv->dstwidth, priv->dstheight, priv->dstwidth, priv->dstwidth*((float)priv->XHeight / (float)priv->XWidth));
! priv->windowsize.w = res.w;
! priv->windowsize.h = res.h;
! #else
! priv->windowsize.w = priv->dstwidth;
! priv->windowsize.h = priv->dstheight;
! #endif
/* bit 0 (0x01) means fullscreen (-fs)
***************
*** 557,594 ****
* bit 3 (0x08) enables flipping (-flip)
*/
- #define FS 0x01
- #define VM 0x02
- #define ZOOM 0x04
- #define FLIP 0x08
// printf("SDL: flags are set to: %i\n", flags);
// printf("SDL: Width: %i Height: %i D_Width %i D_Height: %i\n", width, height, d_width, d_height);
! if(flags&FLIP) { // flipping flag set, use it
! if(verbose) printf("SDL: using flipped video (only with RGB/BGR)\n");
priv->flip = 1;
}
if(flags&FS) {
- 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);
} else
if(flags&VM) {
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);
} else
if(flags&ZOOM) {
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);
}
else {
! 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?
}
--- 650,703 ----
* bit 3 (0x08) enables flipping (-flip)
*/
// printf("SDL: flags are set to: %i\n", flags);
// printf("SDL: Width: %i Height: %i D_Width %i D_Height: %i\n", width, height, d_width, d_height);
! if(flags&FLIP) {
! if(verbose) printf("SDL: using flipped video (only with RGB/BGR/packed YUV)\n");
priv->flip = 1;
}
if(flags&FS) {
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");
! priv->surface = NULL;
! priv->fulltype = FS;
! set_fullmode(priv->fullmode);
! /*if((priv->surface = SDL_SetVideoMode (d_width, d_height, priv->bpp, priv->sdlfullflags)))
! SDL_ShowCursor(0);*/
} else
if(flags&VM) {
if(verbose) printf("SDL: setting nonzoomed fullscreen with modeswitching\n");
printf("SDL: Info - please use -zoom switch to scale video\n");
!
! priv->surface = NULL;
! priv->fulltype = VM;
! set_fullmode(priv->fullmode);
! /*if((priv->surface = SDL_SetVideoMode (d_width ? d_width : width, d_height ? d_height : height, priv->bpp, priv->sdlfullflags)))
! SDL_ShowCursor(0);*/
} else
if(flags&ZOOM) {
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;
! priv->fulltype = ZOOM;
! set_fullmode(priv->fullmode);
}
else {
! if(strcmp(priv->driver, "x11") == 0) {
! if(verbose) printf("SDL: setting windowed mode\n");
! #ifdef HAVE_X11
! priv->surface = SDL_SetVideoMode (res.w, res.h, priv->bpp, priv->sdlflags);
! #else
! priv->surface = SDL_SetVideoMode (priv->dstwidth, priv->dstheight, priv->bpp, priv->sdlflags);
! #endif
! }
! else {
! if(verbose) printf("SDL: setting nonzoomed fullscreen with modeswitching\n");
! printf("SDL: Info - please use -zoom switch to scale video\n");
!
! priv->surface = NULL;
! priv->fulltype = VM;
! set_fullmode(priv->fullmode);
! }
}
***************
*** 663,668 ****
--- 772,779 ----
priv->framePlaneY = width * height;
priv->framePlaneUV = (width * height) >> 2;
+ priv->framePlaneYUY = width * height * 2;
priv->stridePlaneY = width;
priv->stridePlaneUV = width/2;
+ priv->stridePlaneYUY = width * 2;
}
***************
*** 715,719 ****
}*/
dst = (uint8_t *) *(priv->overlay->pixels);
! memcpy (dst, src[0], priv->width*priv->height*2);
/*SDL_UnlockYUVOverlay (priv->overlay);*/
break;
--- 826,838 ----
}*/
dst = (uint8_t *) *(priv->overlay->pixels);
! if(priv->flip) {
! mysrc+=priv->framePlaneYUY;
! for(i = 0; i < priv->height; i++) {
! mysrc-=priv->stridePlaneYUY;
! memcpy (dst, mysrc, priv->stridePlaneYUY);
! dst+=priv->stridePlaneYUY;
! }
! }
! else memcpy (dst, src[0], priv->framePlaneYUY);
/*SDL_UnlockYUVOverlay (priv->overlay);*/
break;
***************
*** 970,988 ****
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. */
--- 1089,1100 ----
case IMGFMT_BGR32:
/* blit to the RGB surface */
! blitconv = SDL_DisplayFormat(priv->rgbsurface);
! if(SDL_BlitSurface (blitconv, NULL, priv->surface, NULL))
printf("SDL: Blit failed: %s\n", SDL_GetError());
SDL_FreeSurface(blitconv);
/* update screen */
! //SDL_UpdateRect(priv->surface, 0, 0, priv->surface->clip_rect.w, priv->surface->clip_rect.h);
! SDL_UpdateRects(priv->surface, 1, &priv->surface->clip_rect);
/* check if we have a double buffered surface and flip() if we do. */
_______________________________________________
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