From 488a0fa68973d48e264d54f1722f7afb18afbea7 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 18 Jun 2013 11:12:09 +0200 Subject: avconv: support -t as an input option. It limits the duration of the data read from a given input. --- 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 3b1d01e0b1..230b2f9b99 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 adea0ade79..7351b7757f 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 2143c0fc79..56876ec066 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 704a1b09b7..348196f5fa 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 f14d7f1c62..bd8e7e5a79 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) }, -- cgit v1.2.3