[FFmpeg-cvslog] avconv: support -t as an input option.

Anton Khirnov git at videolan.org
Tue Aug 6 12:48:40 CEST 2013


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Tue Jun 18 11:12:09 2013 +0200| [488a0fa68973d48e264d54f1722f7afb18afbea7] | committer: Anton Khirnov

avconv: support -t as an input option.

It limits the duration of the data read from a given input.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=488a0fa68973d48e264d54f1722f7afb18afbea7
---

 Changelog       |    2 ++
 avconv.c        |   11 +++++++++++
 avconv.h        |    1 +
 avconv_filter.c |    4 ++--
 avconv_opt.c    |    4 +++-
 5 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/Changelog b/Changelog
index 3b1d01e..230b2f9 100644
--- a/Changelog
+++ b/Changelog
@@ -30,6 +30,8 @@ version 10:
 - when transcoding with avconv (i.e. not streamcopying), -ss is now accurate
   even when used as an input option. Previous behavior can be restored with
   the -noaccurate_seek option.
+- avconv -t option can now be used for inputs, to limit the duration of
+  data read from an input file
 
 
 version 9:
diff --git a/avconv.c b/avconv.c
index adea0ad..7351b77 100644
--- a/avconv.c
+++ b/avconv.c
@@ -958,6 +958,7 @@ static int check_output_constraints(InputStream *ist, OutputStream *ost)
 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
 {
     OutputFile *of = output_files[ost->file_index];
+    InputFile   *f = input_files [ist->file_index];
     int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
     int64_t ost_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
     AVPacket opkt;
@@ -974,6 +975,16 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
         return;
     }
 
+    if (f->recording_time != INT64_MAX) {
+        start_time = f->ctx->start_time;
+        if (f->start_time != AV_NOPTS_VALUE)
+            start_time += f->start_time;
+        if (ist->last_dts >= f->recording_time + start_time) {
+            ost->finished = 1;
+            return;
+        }
+    }
+
     /* force the input stream PTS */
     if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
         audio_size += pkt->size;
diff --git a/avconv.h b/avconv.h
index 2143c0f..56876ec 100644
--- a/avconv.h
+++ b/avconv.h
@@ -239,6 +239,7 @@ typedef struct InputFile {
     int ist_index;        /* index of first stream in ist_table */
     int64_t ts_offset;
     int64_t start_time;   /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */
+    int64_t recording_time;
     int nb_streams;       /* number of stream that avconv is aware of; may be different
                              from ctx.nb_streams if new streams appear during av_read_frame() */
     int rate_emu;
diff --git a/avconv_filter.c b/avconv_filter.c
index 704a1b0..348196f 100644
--- a/avconv_filter.c
+++ b/avconv_filter.c
@@ -463,7 +463,7 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
     snprintf(name, sizeof(name), "trim for input stream %d:%d",
              ist->file_index, ist->st->index);
     ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
-                      AV_NOPTS_VALUE : 0, INT64_MAX, &last_filter, &pad_idx, name);
+                      AV_NOPTS_VALUE : 0, f->recording_time, &last_filter, &pad_idx, name);
     if (ret < 0)
         return ret;
 
@@ -550,7 +550,7 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
     snprintf(name, sizeof(name), "trim for input stream %d:%d",
              ist->file_index, ist->st->index);
     ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
-                      AV_NOPTS_VALUE : 0, INT64_MAX, &last_filter, &pad_idx, name);
+                      AV_NOPTS_VALUE : 0, f->recording_time, &last_filter, &pad_idx, name);
     if (ret < 0)
         return ret;
 
diff --git a/avconv_opt.c b/avconv_opt.c
index f14d7f1..bd8e7e5 100644
--- a/avconv_opt.c
+++ b/avconv_opt.c
@@ -689,6 +689,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
     f->ctx        = ic;
     f->ist_index  = nb_input_streams - ic->nb_streams;
     f->start_time = o->start_time;
+    f->recording_time = o->recording_time;
     f->ts_offset  = o->input_ts_offset - (copy_ts ? 0 : timestamp);
     f->nb_streams = ic->nb_streams;
     f->rate_emu   = o->rate_emu;
@@ -2146,7 +2147,8 @@ const OptionDef options[] = {
     { "map_chapters",   HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
                         OPT_OUTPUT,                                  { .off = OFFSET(chapters_input_file) },
         "set chapters mapping", "input_file_index" },
-    { "t",              HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(recording_time) },
+    { "t",              HAS_ARG | OPT_TIME | OPT_OFFSET |
+                        OPT_INPUT | OPT_OUTPUT,                      { .off = OFFSET(recording_time) },
         "record or transcode \"duration\" seconds of audio/video",
         "duration" },
     { "fs",             HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },



More information about the ffmpeg-cvslog mailing list