mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
Merge commit 'a83c0da539fb07260310bc3b34056239d2b138b2'
* commit 'a83c0da539fb07260310bc3b34056239d2b138b2': avconv: make -t insert trim/atrim filters. The filter insertion code is merged but disabled as it is buggy. For example it fails in various ways when used with -s with some files. Also the trimming is arguably less accurate than the default without filters in some cases. These issues should be fixed before auto inserting the filters, until then the user can explicitly add a trim/atrim filter when one is wanted. Conflicts: Changelog ffmpeg.c ffmpeg_filter.c tests/ref/fate/bethsoft-vid tests/ref/lavf/aiff tests/ref/lavf/asf tests/ref/lavf/au tests/ref/lavf/avi tests/ref/lavf/dpx tests/ref/lavf/ffm tests/ref/lavf/gxf tests/ref/lavf/jpg tests/ref/lavf/mkv tests/ref/lavf/mmf tests/ref/lavf/mov tests/ref/lavf/mpg tests/ref/lavf/nut tests/ref/lavf/ogg tests/ref/lavf/pcx tests/ref/lavf/png tests/ref/lavf/rm tests/ref/lavf/ts tests/ref/lavf/voc tests/ref/lavf/voc_s16 tests/ref/lavf/wav Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
76c1f9200f
@ -35,6 +35,7 @@ version <next>:
|
||||
the vid.stab library
|
||||
- astats filter
|
||||
- trim and atrim filters
|
||||
- ffmpeg -t option is now sample-accurate when transcoding audio
|
||||
|
||||
|
||||
version 1.2:
|
||||
|
4
ffmpeg.c
4
ffmpeg.c
@ -846,7 +846,11 @@ static void do_video_out(AVFormatContext *s,
|
||||
|
||||
in_picture->pts = ost->sync_opts;
|
||||
|
||||
#if 1
|
||||
if (!check_recording_time(ost))
|
||||
#else
|
||||
if (ost->frame_number >= ost->max_frames)
|
||||
#endif
|
||||
return;
|
||||
|
||||
if (s->oformat->flags & AVFMT_RAWPICTURE &&
|
||||
|
@ -276,6 +276,54 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
|
||||
ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
|
||||
}
|
||||
|
||||
static int insert_trim(OutputStream *ost, AVFilterContext **last_filter, int *pad_idx)
|
||||
{
|
||||
OutputFile *of = output_files[ost->file_index];
|
||||
AVFilterGraph *graph = (*last_filter)->graph;
|
||||
AVFilterContext *ctx;
|
||||
const AVFilter *trim;
|
||||
const char *name = ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO ? "trim" : "atrim";
|
||||
char filter_name[128];
|
||||
int ret = 0;
|
||||
|
||||
if (of->recording_time == INT64_MAX)
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
|
||||
trim = avfilter_get_by_name(name);
|
||||
if (!trim) {
|
||||
av_log(NULL, AV_LOG_ERROR, "%s filter not present, cannot limit "
|
||||
"recording time.\n", name);
|
||||
return AVERROR_FILTER_NOT_FOUND;
|
||||
}
|
||||
|
||||
snprintf(filter_name, sizeof(filter_name), "%s for output stream %d:%d",
|
||||
name, ost->file_index, ost->index);
|
||||
ctx = avfilter_graph_alloc_filter(graph, trim, filter_name);
|
||||
if (!ctx)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
ret = av_opt_set_double(ctx, "duration", (double)of->recording_time / 1e6,
|
||||
AV_OPT_SEARCH_CHILDREN);
|
||||
if (ret < 0) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Error configuring the %s filter", name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = avfilter_init_str(ctx, NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = avfilter_link(*last_filter, *pad_idx, ctx, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*last_filter = ctx;
|
||||
*pad_idx = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
|
||||
{
|
||||
char *pix_fmts;
|
||||
@ -352,6 +400,11 @@ static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter,
|
||||
pad_idx = 0;
|
||||
}
|
||||
|
||||
ret = insert_trim(ost, &last_filter, &pad_idx);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
||||
if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
|
||||
return ret;
|
||||
|
||||
@ -458,6 +511,10 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter,
|
||||
AUTO_INSERT_FILTER("-vol", "volume", args);
|
||||
}
|
||||
|
||||
ret = insert_trim(ost, &last_filter, &pad_idx);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
|
||||
return ret;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user