changeset 22312:cca9ff25bed2

Move parsing of the -ss option to the option code. Also fixes a memory leak of the parameter string.
author uau
date Sat, 24 Feb 2007 07:11:57 +0000
parents d15affa943e1
children 5a5c7529e8a3
files cfg-common.h m_option.c m_option.h mencoder.c mplayer.c
diffstat 5 files changed, 56 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/cfg-common.h	Fri Feb 23 22:14:15 2007 +0000
+++ b/cfg-common.h	Sat Feb 24 07:11:57 2007 +0000
@@ -93,7 +93,7 @@
 
 	// seek to byte/seconds position
 	{"sb", &seek_to_byte, CONF_TYPE_POSITION, CONF_MIN, 0, 0, NULL},
-	{"ss", &seek_to_sec, CONF_TYPE_STRING, CONF_MIN, 0, 0, NULL},
+	{"ss", &seek_to_sec, CONF_TYPE_TIME, 0, 0, 0, NULL},
 
 	// stop at given position
 	{"endpos", &end_at, CONF_TYPE_TIME_SIZE, 0, 0, 0, NULL},
--- a/m_option.c	Fri Feb 23 22:14:15 2007 +0000
+++ b/m_option.c	Sat Feb 24 07:11:57 2007 +0000
@@ -1188,13 +1188,56 @@
 };
 
 
+static double parse_timestring(char *str)
+{
+  int a, b;
+  double d;
+  if (sscanf(str, "%d:%d:%lf", &a, &b, &d) == 3)
+    return 3600*a + 60*b + d;
+  else if (sscanf(str, "%d:%lf", &a, &d) == 2)
+    return 60*a + d;
+  else if (sscanf(str, "%lf", &d) == 1)
+    return d;
+  return -1e100;
+}
+    
+
+static int parse_time(m_option_t* opt,char *name, char *param, void* dst, int src)
+{
+  if (param == NULL || strlen(param) == 0)
+    return M_OPT_MISSING_PARAM;
+  
+  double time = parse_timestring(param);
+  if (time == -1e100) {
+    mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid time: '%s'\n",
+           name,param);
+    return M_OPT_INVALID;
+  }
+  
+  if (dst)
+    *(double *)dst = time;
+  return 1;
+}
+
+m_option_type_t m_option_type_time = {
+  "Time",
+  "",
+  sizeof(double),
+  0,
+  parse_time,
+  NULL,
+  copy_opt,
+  copy_opt,
+  NULL,
+  NULL
+};
+
+
 // Time or size (-endpos)
 
 static int parse_time_size(m_option_t* opt,char *name, char *param, void* dst, int src) {
   m_time_size_t ts;
   char unit[4];
-  int a,b;
-  float d;
   double end_at;
 
   if (param == NULL || strlen(param) == 0)
@@ -1221,15 +1264,9 @@
     }
   }
 
-  /* End at time parsing. This has to be last because of
-   * sscanf("%f", ...) below */
-  if (sscanf(param, "%d:%d:%f", &a, &b, &d) == 3)
-    end_at = 3600*a + 60*b + d;
-  else if (sscanf(param, "%d:%f", &a, &d) == 2)
-    end_at = 60*a + d;
-  else if (sscanf(param, "%f", &d) == 1)
-    end_at = d;
-  else {
+  /* End at time parsing. This has to be last because the parsing accepts
+   * even a number followed by garbage */
+  if ((end_at = parse_timestring(param)) == -1e100) {
     mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid time or size: '%s'\n",
            name,param);
     return M_OPT_INVALID;
--- a/m_option.h	Fri Feb 23 22:14:15 2007 +0000
+++ b/m_option.h	Sat Feb 24 07:11:57 2007 +0000
@@ -28,6 +28,7 @@
 extern m_option_type_t m_option_type_string;
 extern m_option_type_t m_option_type_string_list;
 extern m_option_type_t m_option_type_position;
+extern m_option_type_t m_option_type_time;
 extern m_option_type_t m_option_type_time_size;
 
 extern m_option_type_t m_option_type_print;
@@ -168,6 +169,7 @@
 #define CONF_TYPE_OBJ_PRESETS	(&m_option_type_obj_presets)
 #define CONF_TYPE_CUSTOM_URL	(&m_option_type_custom_url)
 #define CONF_TYPE_OBJ_PARAMS	(&m_option_type_obj_params)
+#define CONF_TYPE_TIME		(&m_option_type_time)
 #define CONF_TYPE_TIME_SIZE	(&m_option_type_time_size)
 
 /////////////////////////////////////////////////////////////////////////////////////////////
--- a/mencoder.c	Fri Feb 23 22:14:15 2007 +0000
+++ b/mencoder.c	Sat Feb 24 07:11:57 2007 +0000
@@ -250,7 +250,7 @@
 	return m_config_parse_config_file(mconfig, filename);
 }
 
-static char *seek_to_sec=NULL;
+static double seek_to_sec;
 static off_t seek_to_byte=0;
 
 static m_time_size_t end_at = { .type = END_AT_NONE, .pos = 0 };
@@ -1035,16 +1035,7 @@
 }
 
 if (seek_to_sec) {
-    int a,b; float d;
-
-    if (sscanf(seek_to_sec, "%d:%d:%f", &a,&b,&d)==3)
-        d += 3600*a + 60*b;
-    else if (sscanf(seek_to_sec, "%d:%f", &a, &d)==2)
-        d += 60*a;
-    else 
-        sscanf(seek_to_sec, "%f", &d);
-
-    demux_seek(demuxer, d, audio_delay, 1);
+    demux_seek(demuxer, seek_to_sec, audio_delay, 1);
 //  there is 2 way to handle the -ss option in 3-pass mode:
 // > 1. do the first pass for the whole file, and use -ss for 2nd/3rd pases only
 // > 2. do all the 3 passes with the same -ss value
--- a/mplayer.c	Fri Feb 23 22:14:15 2007 +0000
+++ b/mplayer.c	Sat Feb 24 07:11:57 2007 +0000
@@ -239,7 +239,7 @@
 static char* term_osd_esc = "\x1b[A\r\x1b[K";
 static char* playing_msg = NULL;
 // seek:
-static char *seek_to_sec=NULL;
+static double seek_to_sec;
 static off_t seek_to_byte=0;
 static off_t step_sec=0;
 static int loop_times=-1;
@@ -3537,16 +3537,8 @@
   mpctx->was_paused = 0;
 
   if (seek_to_sec) {
-    int a,b; float d;
-    
-    if (sscanf(seek_to_sec, "%d:%d:%f", &a,&b,&d)==3)
-	rel_seek_secs += 3600*a +60*b +d ;
-    else if (sscanf(seek_to_sec, "%d:%f", &a, &d)==2)
-	rel_seek_secs += 60*a +d;
-    else if (sscanf(seek_to_sec, "%f", &d)==1)
-	rel_seek_secs += d;
-
-     seek_to_sec = NULL;
+      rel_seek_secs += seek_to_sec;
+      seek_to_sec = 0;
   }
   
   if (end_at.type != END_AT_NONE) {