aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-08-06 12:35:48 +0200
committerMichael Niedermayer <michaelni@gmx.at>2013-08-06 12:41:04 +0200
commitb7fc2693c70fe72936e4ce124c802ac23857c476 (patch)
tree6633a69bc7ab53e1478bb2210e25b834da038aa5
parent6d77279ed81c5db8a9f7b895d5090c0328c12174 (diff)
parent488a0fa68973d48e264d54f1722f7afb18afbea7 (diff)
downloadffmpeg-b7fc2693c70fe72936e4ce124c802ac23857c476.tar.gz
Merge commit '488a0fa68973d48e264d54f1722f7afb18afbea7'
* commit '488a0fa68973d48e264d54f1722f7afb18afbea7': avconv: support -t as an input option. Conflicts: Changelog ffmpeg.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--Changelog2
-rw-r--r--ffmpeg.c11
-rw-r--r--ffmpeg.h1
-rw-r--r--ffmpeg_filter.c4
-rw-r--r--ffmpeg_opt.c4
5 files changed, 19 insertions, 3 deletions
diff --git a/Changelog b/Changelog
index c507b954d3..fd17e993ca 100644
--- a/Changelog
+++ b/Changelog
@@ -11,6 +11,8 @@ version <next>
- when transcoding with ffmpeg (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.
+- ffmpeg -t option can now be used for inputs, to limit the duration of
+ data read from an input file
version 2.0:
diff --git a/ffmpeg.c b/ffmpeg.c
index dffe724751..3c7617a338 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -1389,6 +1389,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);
int64_t ist_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ist->st->time_base);
@@ -1417,6 +1418,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->pts >= f->recording_time + start_time) {
+ close_output_stream(ost);
+ return;
+ }
+ }
+
/* force the input stream PTS */
if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
audio_size += pkt->size;
diff --git a/ffmpeg.h b/ffmpeg.h
index 9b70eb2308..09b29a9673 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -284,6 +284,7 @@ typedef struct InputFile {
int64_t ts_offset;
int64_t last_ts;
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 ffmpeg is aware of; may be different
from ctx.nb_streams if new streams appear during av_read_frame() */
int nb_streams_warn; /* number of streams that the user was warned of */
diff --git a/ffmpeg_filter.c b/ffmpeg_filter.c
index 21b33432c4..c8164ed62d 100644
--- a/ffmpeg_filter.c
+++ b/ffmpeg_filter.c
@@ -698,7 +698,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;
@@ -795,7 +795,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/ffmpeg_opt.c b/ffmpeg_opt.c
index 35b12e5ff0..8ff5bdfbda 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -842,6 +842,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;
@@ -2599,7 +2600,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" },
{ "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) },