changeset 4739:a2df307ed979

Screenshot on the fly
author nick
date Sun, 17 Feb 2002 10:21:00 +0000
parents 77519b9ac057
children 54226110dbe5
files libvo/vo_vesa.c libvo/vosub_vidix.c
diffstat 2 files changed, 78 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_vesa.c	Sun Feb 17 09:25:09 2002 +0000
+++ b/libvo/vo_vesa.c	Sun Feb 17 10:21:00 2002 +0000
@@ -25,6 +25,11 @@
 #include <string.h>
 #include <stddef.h>
 #include <limits.h>
+#include <unistd.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
 
 #include "video_out.h"
 #include "video_out_internal.h"
@@ -42,6 +47,11 @@
 #include "../postproc/swscale.h"
 
 LIBVO_EXTERN(vesa)
+
+#ifdef HAVE_PNG
+extern vo_functions_t video_out_png;
+#endif
+
 extern int verbose;
 
 #define MAX_BUFFERS 3
@@ -936,11 +946,74 @@
   return pre_init_err;
 }
 
+#ifdef HAVE_PNG
+static int vesa_screenshot(const char *fname)
+{
+    uint32_t i,n;
+    uint8_t *ptrs[video_mode_info.YResolution];
+    if(!video_out_png.control(VOCTRL_QUERY_FORMAT, &dstFourcc))
+    {
+	printf("\nvo_vesa: vo_png doesn't support: %s fourcc\n",vo_format_name(dstFourcc));
+	return 1;
+    }
+    if(video_out_png.preinit(NULL)) 
+    {
+	printf("\nvo_vesa: can't preinit vo_png\n");
+	return 1;
+    }
+    if(video_out_png.config(HAS_DGA()?video_mode_info.XResolution:dstW,
+			    HAS_DGA()?video_mode_info.YResolution:dstH,
+			    HAS_DGA()?video_mode_info.XResolution:dstW,
+			    HAS_DGA()?video_mode_info.YResolution:dstH,
+			    0,NULL,dstFourcc,NULL))
+    {
+	printf("\nvo_vesa: can't configure vo_png\n");
+	return 1;
+    }
+    n = HAS_DGA()?video_mode_info.YResolution:dstH;
+    for(i=0;i<n;i++)
+		ptrs[i] = &dga_buffer[(HAS_DGA()?video_mode_info.XResolution:dstW)*i*PIXEL_SIZE()];
+    if(video_out_png.draw_frame(ptrs))
+    {
+	printf("\nvo_vesa: vo_png: error during dumping\n");
+	return 1;
+    }
+    
+    video_out_png.uninit();
+    if(verbose) printf("\nvo_vesa: png output has been created\n");
+    return 0;
+}
+
+
+static char _home_name[FILENAME_MAX + 1];
+static char * __get_home_filename(const char *progname)
+{
+    char *p = getenv("HOME");
+
+    if (p == NULL || strlen(p) < 2) {
+	struct passwd *psw = getpwuid(getuid());
+	if (psw != NULL) p = psw->pw_dir;
+    }	
+
+    if (p == NULL || strlen(p) > FILENAME_MAX - (strlen(progname) + 4))
+	p = "/tmp";
+
+    strcpy(_home_name, p);
+    strcat(_home_name, "/.");
+    return strcat(_home_name, progname);
+}
+#endif
+
 static uint32_t control(uint32_t request, void *data, ...)
 {
   switch (request) {
   case VOCTRL_QUERY_FORMAT:
     return query_format(*((uint32_t*)data));
+#ifdef HAVE_PNG
+  case VOCTRL_SCREENSHOT:
+    return vesa_screenshot(__get_home_filename("mplayer_vesa_dump.png"));
+    break;
+#endif
   }
   return VO_NOTIMPL;
 }
--- a/libvo/vosub_vidix.c	Sun Feb 17 09:25:09 2002 +0000
+++ b/libvo/vosub_vidix.c	Sun Feb 17 10:21:00 2002 +0000
@@ -43,6 +43,8 @@
 static vidix_playback_t   vidix_play;
 static vidix_fourcc_t	  vidix_fourcc;
 static vo_functions_t *   vo_server;
+static uint32_t (*server_control)(uint32_t request, void *data, ...);
+
 
 static int  vidix_get_bes_da(bes_da_t *);
 static int  vidix_get_video_eq(vidix_video_eq_t *info);
@@ -635,6 +637,8 @@
     return VO_TRUE;
   case VOCTRL_QUERY_FORMAT:
     return vidix_query_fourcc(*((uint32_t*)data));
+  case VOCTRL_SCREENSHOT:
+    return (*server_control)(request,data);
   }
   return VO_NOTIMPL;
 }
@@ -668,6 +672,7 @@
 	((vo_functions_t *)server)->draw_frame=vidix_draw_frame;
 	((vo_functions_t *)server)->flip_page=vidix_flip_page;
 	((vo_functions_t *)server)->draw_osd=vidix_draw_osd;
+	server_control = ((vo_functions_t *)server)->control;
 	((vo_functions_t *)server)->control=vidix_control;
 	vo_server = server;
 	return 0;