* commit '488a0fa68973d48e264d54f1722f7afb18afbea7': avconv: support -t as an input option. Conflicts: Changelog ffmpeg.h Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.1
| @@ -11,6 +11,8 @@ version <next> | |||||
| - when transcoding with ffmpeg (i.e. not streamcopying), -ss is now accurate | - 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 | even when used as an input option. Previous behavior can be restored with | ||||
| the -noaccurate_seek option. | 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: | version 2.0: | ||||
| @@ -1389,6 +1389,7 @@ static int check_output_constraints(InputStream *ist, OutputStream *ost) | |||||
| static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt) | static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt) | ||||
| { | { | ||||
| OutputFile *of = output_files[ost->file_index]; | 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 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 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); | 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; | 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 */ | /* force the input stream PTS */ | ||||
| if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) | if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) | ||||
| audio_size += pkt->size; | audio_size += pkt->size; | ||||
| @@ -284,6 +284,7 @@ typedef struct InputFile { | |||||
| int64_t ts_offset; | int64_t ts_offset; | ||||
| int64_t last_ts; | int64_t last_ts; | ||||
| int64_t start_time; /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */ | 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 | 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() */ | 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 */ | int nb_streams_warn; /* number of streams that the user was warned of */ | ||||
| @@ -698,7 +698,7 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter, | |||||
| snprintf(name, sizeof(name), "trim for input stream %d:%d", | snprintf(name, sizeof(name), "trim for input stream %d:%d", | ||||
| ist->file_index, ist->st->index); | ist->file_index, ist->st->index); | ||||
| ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ? | 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) | if (ret < 0) | ||||
| return ret; | 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", | snprintf(name, sizeof(name), "trim for input stream %d:%d", | ||||
| ist->file_index, ist->st->index); | ist->file_index, ist->st->index); | ||||
| ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ? | 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) | if (ret < 0) | ||||
| return ret; | return ret; | ||||
| @@ -842,6 +842,7 @@ static int open_input_file(OptionsContext *o, const char *filename) | |||||
| f->ctx = ic; | f->ctx = ic; | ||||
| f->ist_index = nb_input_streams - ic->nb_streams; | f->ist_index = nb_input_streams - ic->nb_streams; | ||||
| f->start_time = o->start_time; | f->start_time = o->start_time; | ||||
| f->recording_time = o->recording_time; | |||||
| f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp); | f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp); | ||||
| f->nb_streams = ic->nb_streams; | f->nb_streams = ic->nb_streams; | ||||
| f->rate_emu = o->rate_emu; | f->rate_emu = o->rate_emu; | ||||
| @@ -2599,7 +2600,8 @@ const OptionDef options[] = { | |||||
| { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET | | { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET | | ||||
| OPT_OUTPUT, { .off = OFFSET(chapters_input_file) }, | OPT_OUTPUT, { .off = OFFSET(chapters_input_file) }, | ||||
| "set chapters mapping", "input_file_index" }, | "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", | "record or transcode \"duration\" seconds of audio/video", | ||||
| "duration" }, | "duration" }, | ||||
| { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) }, | { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) }, | ||||