changeset 772:e70a52f17f92

Added flipped video support and activate/deactivate screensaver under X.
author atmosfear
date Fri, 11 May 2001 21:36:30 +0000
parents 7cd31754739f
children 50c5a214b0d4
files libvo/vo_sdl.c
diffstat 1 files changed, 67 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_sdl.c	Fri May 11 17:43:39 2001 +0000
+++ b/libvo/vo_sdl.c	Fri May 11 21:36:30 2001 +0000
@@ -108,6 +108,11 @@
 #include "fastmemcpy.h"
 #include "sub.h"
 
+#ifdef HAVE_X11
+#include <X11/Xlib.h>
+#include "x11_common.h"
+#endif
+
 LIBVO_EXTERN(sdl)
 
 extern int verbose;
@@ -171,6 +176,10 @@
 	
 	/* RGB ints */
 	int framePlaneRGB;
+	int stridePlaneRGB;
+
+	/* Flip image */
+	int flip;
 	
         int width,height;
         int format;
@@ -349,7 +358,7 @@
 	 * We use SDL_KEYUP cause SDL_KEYDOWN seems to cause problems
 	 * with keys need to be pressed twice, to be recognized.
 	 */
-#ifndef BUGGY_SDL	
+#ifndef BUGGY_SDL
 	SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
 	SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
 	SDL_EventState(SDL_MOUSEBUTTONDOWN, SDL_IGNORE);
@@ -357,7 +366,7 @@
 	SDL_EventState(SDL_QUIT, SDL_IGNORE);
 	SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
 	SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
-#endif	
+#endif
 	
 	/* Success! */
 	return 0;
@@ -453,11 +462,16 @@
  **/
 
 static uint32_t
-init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format)
+init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format)
 //static int sdl_setup (int width, int height)
 {
 	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){
@@ -514,6 +528,14 @@
 	}
 
 	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 */
 	SDL_WM_SetCaption (".: MPlayer : F = Fullscreen/Windowed : C = Cycle Fullscreen Resolutions :.", "SDL Video Out");
@@ -532,37 +554,44 @@
 	/* bit 0 (0x01) means fullscreen (-fs)
 	 * bit 1 (0x02) means mode switching (-vm)
 	 * bit 2 (0x04) enables software scaling (-zoom)
-	 */  
-//      printf("SDL: fullscreenflag is set to: %i\n", fullscreen);
+	 * 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);
-	switch(fullscreen){
-	  case 0x01:
-	  case 0x05:
+	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);
-	  break;	
-	  case 0x02:
+	} 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);
-	  break;
-	  case 0x04:		
-	  case 0x06:
+	} 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);
-	  break;  
-          default:
-	 	if(verbose) printf("SDL: setting windowed mode\n");
+	} 
+        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?
-        }
+	}
+
         if(!priv->surface) { // cannot SetVideoMode
 		printf("SDL: failed to set video mode: %s\n", SDL_GetError());
 		return -1;
@@ -639,6 +668,7 @@
 	
 	if(priv->mode) {
 		priv->framePlaneRGB = width * height * priv->rgbsurface->format->BytesPerPixel;
+		priv->stridePlaneRGB = width * priv->rgbsurface->format->BytesPerPixel;
 	}	
 	return 0;
 }
@@ -656,6 +686,8 @@
 {
 	struct sdl_priv_s *priv = &sdl_priv;
 	uint8_t *dst;
+	int i;
+	uint8_t *mysrc = src[0];
 	
         switch(priv->format){
         case IMGFMT_YV12:
@@ -701,7 +733,15 @@
 	    		}
 		}*/
 		dst = (uint8_t *) priv->rgbsurface->pixels;
-		memcpy (dst, src[0], priv->framePlaneRGB);
+	    	if(priv->flip) {
+	    		mysrc+=priv->framePlaneRGB;
+			for(i = 0; i < priv->height; i++) {
+				mysrc-=priv->stridePlaneRGB;
+				memcpy (dst, mysrc, priv->stridePlaneRGB);
+				dst+=priv->stridePlaneRGB;
+			}
+		}
+		else memcpy (dst, src[0], priv->framePlaneRGB);
 		/*if(SDL_MUSTLOCK(priv->rgbsurface)) 
 			SDL_UnlockSurface (priv->rgbsurface);*/
 		break;
@@ -996,6 +1036,15 @@
 static void
 uninit(void)
 {
+#ifdef HAVE_X11
+	static Display *XDisplay;
+	if(getenv("DISPLAY")) {
+		if(verbose) printf("SDL: activating XScreensaver/DPMS\n");
+		XDisplay = XOpenDisplay(getenv("DISPLAY"));
+		saver_on(XDisplay);
+		XCloseDisplay(XDisplay);
+	}
+#endif
 sdl_close();
 }