It limits the duration of the data read from a given input.
---
Changelog | 2 ++
avconv.c | 11 +++++++++++
avconv.h | 1 +
avconv_filter.c | 6 ++++--
avconv_opt.c | 4 +++-
5 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/Changelog b/Changelog
index b6744d5..e65e207 100644
--- a/Changelog
+++ b/Changelog
@@ -27,6 +27,8 @@ version 10:
- WavPack encoding through libwavpack
- when transcoding with avconv (i.e. not streamcopying), -ss is now accurate
even when used as an input 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 305405e..af61ab3 100644
--- a/avconv.c
+++ b/avconv.c
@@ -959,6 +959,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;
@@ -975,6 +976,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 ad59bcd..1a1c1b0 100644
--- a/avconv.h
+++ b/avconv.h
@@ -238,6 +238,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 81ec474..41340a9 100644
--- a/avconv_filter.c
+++ b/avconv_filter.c
@@ -462,7 +462,8 @@ 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) ? AV_NOPTS_VALUE : 0,
INT64_MAX,
+ ret = insert_trim((f->start_time == AV_NOPTS_VALUE) ? AV_NOPTS_VALUE : 0,
+ f->recording_time,
&last_filter, &pad_idx, name);
if (ret < 0)
return ret;
@@ -549,7 +550,8 @@ 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) ? AV_NOPTS_VALUE : 0,
INT64_MAX,
+ ret = insert_trim((f->start_time == AV_NOPTS_VALUE) ? 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 d856985..8c2175e 100644
--- a/avconv_opt.c
+++ b/avconv_opt.c
@@ -682,6 +682,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;
@@ -2136,7 +2137,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) },
--
1.7.10.4
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel