[FFmpeg-devel] ffmpeg: Allow "-to" on input files in addition to "-t"

Submitted by vi0oss@gmail.com on Nov. 18, 2017, 7:36 a.m.

Details

Message ID 20171118073651.7644-1-vi0oss@gmail.com
State New
Headers show

Commit Message

vi0oss@gmail.com Nov. 18, 2017, 7:36 a.m.
From: Vitaly _Vi Shukela <vi0oss@gmail.com>

For some strange reason "-t" option was only implemented
for input files while both "-t" and "-to" were available
for use for output files. This made extracting a range from
input file inconvenient.

This patch enables -to option for input so one can do

    ffmpeg -ss 1:23:20 -to 1:27:22.3 -i myinput.mkv ...

Signed-off-by: Vitaly _Vi Shukela <vi0oss@gmail.com>
---
 doc/ffmpeg.texi      |  4 ++--
 fftools/ffmpeg_opt.c | 17 ++++++++++++++++-
 2 files changed, 18 insertions(+), 3 deletions(-)

Comments

Michael Niedermayer Nov. 19, 2017, 3:13 a.m.
On Sat, Nov 18, 2017 at 10:36:51AM +0300, vi0oss@gmail.com wrote:
> From: Vitaly _Vi Shukela <vi0oss@gmail.com>
> 
> For some strange reason "-t" option was only implemented
> for input files while both "-t" and "-to" were available
> for use for output files. This made extracting a range from
> input file inconvenient.
> 
> This patch enables -to option for input so one can do
> 
>     ffmpeg -ss 1:23:20 -to 1:27:22.3 -i myinput.mkv ...
> 
> Signed-off-by: Vitaly _Vi Shukela <vi0oss@gmail.com>
> ---
>  doc/ffmpeg.texi      |  4 ++--
>  fftools/ffmpeg_opt.c | 17 ++++++++++++++++-
>  2 files changed, 18 insertions(+), 3 deletions(-)

will apply

thanks

[...]

Patch hide | download patch | download mbox

diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
index 7db80ebf6a..9a90d7327a 100644
--- a/doc/ffmpeg.texi
+++ b/doc/ffmpeg.texi
@@ -289,8 +289,8 @@  see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1)
 
 -to and -t are mutually exclusive and -t has priority.
 
-@item -to @var{position} (@emph{output})
-Stop writing the output at @var{position}.
+@item -to @var{position} (@emph{input/output})
+Stop writing the output or reading the input at @var{position}.
 @var{position} must be a time duration specification,
 see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
 
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 47d384166c..f66f672c3c 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -976,6 +976,21 @@  static int open_input_file(OptionsContext *o, const char *filename)
     char *    data_codec_name = NULL;
     int scan_all_pmts_set = 0;
 
+    if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
+        o->stop_time = INT64_MAX;
+        av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
+    }
+
+    if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
+        int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
+        if (o->stop_time <= start_time) {
+            av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
+            exit_program(1);
+        } else {
+            o->recording_time = o->stop_time - start_time;
+        }
+    }
+
     if (o->format) {
         if (!(file_iformat = av_find_input_format(o->format))) {
             av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
@@ -3407,7 +3422,7 @@  const OptionDef options[] = {
                         OPT_INPUT | OPT_OUTPUT,                      { .off = OFFSET(recording_time) },
         "record or transcode \"duration\" seconds of audio/video",
         "duration" },
-    { "to",             HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT,  { .off = OFFSET(stop_time) },
+    { "to",             HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,  { .off = OFFSET(stop_time) },
         "record or transcode stop time", "time_stop" },
     { "fs",             HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
         "set the limit file size in bytes", "limit_size" },