changeset 4159:42fec596fe7c

-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
author arpi
date Tue, 15 Jan 2002 00:20:50 +0000
parents 479c7828edbb
children ac62f8534409
files cfg-mencoder.h mencoder.c
diffstat 2 files changed, 62 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/cfg-mencoder.h	Mon Jan 14 23:55:51 2002 +0000
+++ b/cfg-mencoder.h	Tue Jan 15 00:20:50 2002 +0000
@@ -89,6 +89,8 @@
 	/* name, pointer, type, flags, min, max */
 	{"include", cfg_include, CONF_TYPE_FUNC_PARAM, CONF_NOSAVE, 0, 0, NULL}, /* this must be the first!!! */
 
+	{"endpos", parse_end_at, CONF_TYPE_FUNC_PARAM, 0, 0, 0, NULL},
+	
 	{"ofps", &force_ofps, CONF_TYPE_FLOAT, CONF_MIN, 0, 0, NULL},
 	{"o", &out_filename, CONF_TYPE_STRING, 0, 0, 0, NULL},
 
--- a/mencoder.c	Mon Jan 14 23:55:51 2002 +0000
+++ b/mencoder.c	Tue Jan 15 00:20:50 2002 +0000
@@ -180,6 +180,8 @@
 	return m_config_parse_config_file(mconfig, filename);
 }
 
+static int parse_end_at(struct config *conf, const char* param);
+
 #include "get_path.c"
 
 #include "cfg-mplayer-def.h"
@@ -305,6 +307,10 @@
 static int eof=0;
 static int interrupted=0;
 
+enum end_at_type_t {END_AT_NONE, END_AT_TIME, END_AT_SIZE};
+static enum end_at_type_t end_at_type = END_AT_NONE;
+static int end_at;
+
 static void exit_sighandler(int x){
     eof=1;
     interrupted=1;
@@ -1057,6 +1063,10 @@
     int in_size;
     int skip_flag=0; // 1=skip  -1=duplicate
 
+    if((end_at_type == END_AT_SIZE && end_at <= ftell(muxer_f))  ||
+       (end_at_type == END_AT_TIME && end_at < sh_video->timer))
+        break;
+
     if(play_n_frames>=0){
       --play_n_frames;
       if(play_n_frames<0) break;
@@ -1357,3 +1367,53 @@
 
 return interrupted;
 }
+
+static int parse_end_at(struct config *conf, const char* param)
+{
+    int i;
+
+    end_at_type = END_AT_NONE;
+    
+    /* End at size parsing */
+    {
+        char unit[4];
+        
+        end_at_type = END_AT_SIZE;
+
+        if(sscanf(param, "%d%3s", &end_at, unit) == 2) {
+            if(!strcasecmp(unit, "b"))
+                ;
+            else if(!strcasecmp(unit, "kb"))
+                end_at *= 1024;
+            else if(!strcasecmp(unit, "mb"))
+                end_at *= 1024*1024;
+            else
+                end_at_type = END_AT_NONE;
+        }
+        else
+            end_at_type = END_AT_NONE;
+    }
+
+    /* End at time parsing. This has to be last because of
+     * sscanf("%f", ...) below */
+    if(end_at_type == END_AT_NONE)
+    {
+        int a,b; float d;
+
+        end_at_type = END_AT_TIME;
+        
+        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_type = END_AT_NONE;
+    }
+
+    if(end_at_type == END_AT_NONE)
+        return ERR_FUNC_ERR;
+
+    return 1;
+}