summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog1
-rw-r--r--ffmpeg.c4
-rw-r--r--ffmpeg_filter.c57
3 files changed, 62 insertions, 0 deletions
diff --git a/Changelog b/Changelog
index 024be15a95..4bd02e1eda 100644
--- a/Changelog
+++ b/Changelog
@@ -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:
diff --git a/ffmpeg.c b/ffmpeg.c
index 30b69d3aed..962628b629 100644
--- a/ffmpeg.c
+++ b/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 &&
diff --git a/ffmpeg_filter.c b/ffmpeg_filter.c
index e7e7242788..b9e3e4eed1 100644
--- a/ffmpeg_filter.c
+++ b/ffmpeg_filter.c
@@ -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;