changeset 13158:b872a27aea9e

Added output to multiple directories for vo_jpeg. Updated the manual page to describe the new options.
author ivo
date Thu, 26 Aug 2004 22:18:25 +0000
parents 0d44af5bec83
children edeba26483a1
files DOCS/man/en/mplayer.1 cfg-mplayer.h help/help_mp-en.h libvo/vo_jpeg.c
diffstat 4 files changed, 140 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1	Thu Aug 26 22:15:26 2004 +0000
+++ b/DOCS/man/en/mplayer.1	Thu Aug 26 22:18:25 2004 +0000
@@ -1924,17 +1924,27 @@
 .PD 0
 .RSs
 .IPs [no]progressive
-Specify standard or progressive JPEG.
+Specify standard or progressive JPEG (default: noprogressive).
 .IPs [no]baseline
-Specify use of baseline or not.
+Specify use of baseline or not (default: baseline).
 .IPs optimize=<0\-100>
-optimization factor
+optimization factor (default: 100)
 .IPs smooth=<0\-100>
-smooth factor
+smooth factor (default: 0)
 .IPs quality=<0\-100>
-quality factor
+quality factor (default: 75)
 .IPs outdir=<value>
-directory to save the JPEG files
+Specify the directory to save the JPEG files to.
+If not specified, all JPEG files are written to the current directory.
+.IPs subdirs=<value>
+If specified, MPlayer will create numbered subdirectories with the
+specified prefix.
+If it's not specified, no subdirectories are created
+and all JPEG files are written to the same directory.
+.IPs maxfiles=<value>
+Maximum number of JPEG files to be saved per subdirectory in case subdirs
+is specified.
+Must be equal to or larger than 1 (default: 1000).
 .RE
 .PD 1
 .
--- a/cfg-mplayer.h	Thu Aug 26 22:15:26 2004 +0000
+++ b/cfg-mplayer.h	Thu Aug 26 22:18:25 2004 +0000
@@ -36,6 +36,8 @@
 extern int jpeg_smooth;
 extern int jpeg_quality;
 extern char * jpeg_outdir;
+extern char * jpeg_subdirs;
+extern int jpeg_maxfiles;
 #endif
 #ifdef HAVE_SDL
 //extern char *sdl_driver;
@@ -152,6 +154,8 @@
 	{"smooth", &jpeg_smooth, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL},
 	{"quality", &jpeg_quality, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL},
 	{"outdir", &jpeg_outdir, CONF_TYPE_STRING, 0, 0, 0, NULL},
+	{"subdirs", &jpeg_subdirs, CONF_TYPE_STRING, 0, 0, 0, NULL},
+	{"maxfiles", &jpeg_maxfiles, CONF_TYPE_INT, CONF_MIN, 1, 0, NULL},
 	{NULL, NULL, 0, 0, 0, 0, NULL}
 };
 #endif
--- a/help/help_mp-en.h	Thu Aug 26 22:15:26 2004 +0000
+++ b/help/help_mp-en.h	Thu Aug 26 22:18:25 2004 +0000
@@ -86,7 +86,6 @@
 #define MSGTR_CouldntInitAudioCodec "Could not initialize audio codec -> no sound.\n"
 #define MSGTR_TryForceVideoFmtStr "Trying to force video codec driver family %s...\n"
 #define MSGTR_CantFindVideoCodec "Cannot find codec matching selected -vo and video format 0x%X.\n"
-#define MSGTR_VOincompCodec "The selected video_out device is incompatible with this codec.\n"
 #define MSGTR_CannotInitVO "FATAL: Cannot initialize video driver.\n"
 #define MSGTR_CannotInitAO "Could not open/initialize audio device -> no sound.\n"
 #define MSGTR_StartPlaying "Starting playback...\n"
@@ -746,3 +745,17 @@
 #define MSGTR_MSGBOX_LABEL_Warning "Warning!"
 
 #endif
+
+// ======================= VO Video Output drivers ========================
+
+#define MSGTR_VOincompCodec "The selected video_out device is incompatible with this codec.\n"
+
+// vo_jpeg.c
+#define MSGTR_VO_JPEG_GenericError "This error has occurred"
+#define MSGTR_VO_JPEG_UnableToAccess "Unable to access"
+#define MSGTR_VO_JPEG_ExistsButNoDirectory "already exists, but is not a directory."
+#define MSGTR_VO_JPEG_DirExistsButNotWritable "Output directory already exists, but is not writable."
+#define MSGTR_VO_JPEG_DirExistsAndIsWritable "Output directory already exists and is writable."
+#define MSGTR_VO_JPEG_CantCreateDirectory "Unable to create ouput directory."
+#define MSGTR_VO_JPEG_DirectoryCreateSuccess "Output directory successfully created."
+
--- a/libvo/vo_jpeg.c	Thu Aug 26 22:15:26 2004 +0000
+++ b/libvo/vo_jpeg.c	Thu Aug 26 22:18:25 2004 +0000
@@ -3,6 +3,7 @@
  *
  * Copyright 2002 by Pontscho (pontscho@makacs.poliod.hu)
  * 25/04/2003: Spring cleanup -- alex
+ * 04/08/2004: Added multiple subdirectory support -- ivop@euronet.nl
  *
  */
 
@@ -14,8 +15,18 @@
 #include <jpeglib.h>
 
 #include "config.h"
+#include "mp_msg.h"
 #include "video_out.h"
 #include "video_out_internal.h"
+#include "mplayer.h"			/* for exit_player() */
+#include "help_mp.h"
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+/* Used for temporary buffers to store file- and pathnames */
+#define BUFLENGTH 512
 
 static vo_info_t info=
 {
@@ -36,13 +47,51 @@
 int jpeg_smooth = 0;
 int jpeg_quality = 75;
 char * jpeg_outdir = ".";
+char * jpeg_subdirs = NULL;
+int jpeg_maxfiles=1000;
 
 static int framenum=0;
 
 static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format)
 {
-     image_height=height;
-     image_width=width;
+ char buf[BUFLENGTH];
+ struct stat stat_p;
+
+/* Create outdir. If it already exists, test if it's a writable directory */
+
+ snprintf (buf, BUFLENGTH, "%s", jpeg_outdir);
+ 
+ if (mkdir (buf, 0755)<0) {
+  switch (errno) { /* use switch in case other errors need to be caught and handled in the future */
+   case EEXIST:
+    if ( stat(buf, &stat_p) < 0 ) {
+     mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, MSGTR_VO_JPEG_GenericError, strerror(errno) );
+     mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name, MSGTR_VO_JPEG_UnableToAccess,buf);
+     exit_player(MSGTR_Exit_error);
+    }
+    if ( !S_ISDIR(stat_p.st_mode) ) {
+     mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name, buf, MSGTR_VO_JPEG_ExistsButNoDirectory);
+     exit_player(MSGTR_Exit_error);
+    }
+    if ( !(stat_p.st_mode & S_IWUSR) ) {
+     mp_msg(MSGT_VO, MSGL_ERR, "%s: %s\n", info.short_name, MSGTR_VO_JPEG_DirExistsButNotWritable);
+     exit_player(MSGTR_Exit_error);
+    }
+
+    mp_msg(MSGT_VO, MSGL_INFO, "%s: %s\n", info.short_name, MSGTR_VO_JPEG_DirExistsAndIsWritable);
+    break;
+
+   default:
+    mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, MSGTR_VO_JPEG_GenericError, strerror(errno) );
+    mp_msg(MSGT_VO, MSGL_ERR, "%s: %s\n", info.short_name, MSGTR_VO_JPEG_CantCreateDirectory);
+    exit_player(MSGTR_Exit_error);
+  } /* end switch */
+ } else {  
+  mp_msg(MSGT_VO, MSGL_INFO, "%s: %s\n", info.short_name, MSGTR_VO_JPEG_DirectoryCreateSuccess);
+ } /* end if */
+
+ image_height=height;
+ image_width=width;
     
  return 0;
 }
@@ -91,10 +140,59 @@
 
 static uint32_t draw_frame(uint8_t * src[])
 {
- char buf[256];
+ static uint32_t framecounter=0, subdircounter=0;
+ char buf[BUFLENGTH];
  uint8_t *dst= src[0];
-    
- snprintf (buf, 256, "%s/%08d.jpg", jpeg_outdir, ++framenum);
+ static char subdirname[BUFLENGTH] = "";
+ struct stat stat_p;
+
+/* Start writing to new subdirectory after a certain amount of frames */
+ if ( framecounter == jpeg_maxfiles ) {
+  framecounter = 0;
+ }
+
+/* If framecounter is zero (or reset to zero), increment subdirectory number
+ * and create the subdirectory.
+ * If jpeg_subdirs is not set, do nothing and resort to old behaviour. */
+ if ( !framecounter && jpeg_subdirs ) {
+  snprintf (subdirname, BUFLENGTH, "%s%08d", jpeg_subdirs, ++subdircounter);
+  snprintf (buf, BUFLENGTH, "%s/%s", jpeg_outdir, subdirname);
+  if (mkdir (buf, 0755)<0) {
+   switch (errno) { /* use switch in case other errors need to be caught and handled in the future */
+    case EEXIST:
+     if ( stat(buf, &stat_p) < 0 ) {
+      mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, MSGTR_VO_JPEG_GenericError, strerror(errno) );
+      mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name, MSGTR_VO_JPEG_UnableToAccess, buf);
+      exit_player(MSGTR_Exit_error);
+     }
+     if ( !S_ISDIR(stat_p.st_mode) ) {
+      mp_msg(MSGT_VO, MSGL_ERR, "\n%s: %s %s\n", info.short_name, buf, MSGTR_VO_JPEG_ExistsButNoDirectory);
+      exit_player(MSGTR_Exit_error);
+     }
+     if ( !(stat_p.st_mode & S_IWUSR) ) {
+      mp_msg(MSGT_VO, MSGL_ERR, "\n%s: %s - %s\n", info.short_name, buf, MSGTR_VO_JPEG_DirExistsButNotWritable);
+      exit_player(MSGTR_Exit_error);
+     }
+
+     mp_msg(MSGT_VO, MSGL_INFO, "\n%s: %s - %s\n", info.short_name, buf, MSGTR_VO_JPEG_DirExistsAndIsWritable);
+     break;
+
+    default:
+     mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name, MSGTR_VO_JPEG_GenericError, strerror(errno) );
+     mp_msg(MSGT_VO, MSGL_ERR, "\n%s: %s - %s.\n", info.short_name, buf, MSGTR_VO_JPEG_CantCreateDirectory);
+     exit_player(MSGTR_Exit_error);
+     break;
+   }
+  } /* switch */
+ } /* if !framecounter && jpeg_subdirs */
+
+
+ framenum++;
+
+/* snprintf the full pathname of the outputfile */
+ snprintf (buf, BUFLENGTH, "%s/%s/%08d.jpg", jpeg_outdir, subdirname, framenum);
+
+ framecounter++;
 
  return jpeg_write( buf,src[0] );
 }
@@ -142,3 +240,6 @@
   }
  return VO_NOTIMPL;
 }
+
+#undef BUFLENGTH
+