diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2015-07-19 15:45:15 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2015-07-19 16:05:33 +0200 |
commit | 7093e215d02ed0dc9632f82ac8ccec432d29cd35 (patch) | |
tree | b41d3772ec361212b717c827155b4544b1ef04cb /libavfilter/af_resample.c | |
parent | 2dbaec690d9f8e25e12b80e1162097e96b30ddc8 (diff) | |
parent | 6b15874fc2c3f565732201f7907ae1112727d6ae (diff) | |
download | ffmpeg-7093e215d02ed0dc9632f82ac8ccec432d29cd35.tar.gz |
Merge commit '6b15874fc2c3f565732201f7907ae1112727d6ae'
* commit '6b15874fc2c3f565732201f7907ae1112727d6ae':
af_resample: do not touch the timestamps if we are not resampling
Merged-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavfilter/af_resample.c')
-rw-r--r-- | libavfilter/af_resample.c | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/libavfilter/af_resample.c b/libavfilter/af_resample.c index ff1f956e04..375f480bcf 100644 --- a/libavfilter/af_resample.c +++ b/libavfilter/af_resample.c @@ -40,6 +40,7 @@ typedef struct ResampleContext { AVAudioResampleContext *avr; AVDictionary *options; + int resampling; int64_t next_pts; int64_t next_in_pts; @@ -117,6 +118,8 @@ static int config_output(AVFilterLink *outlink) char buf1[64], buf2[64]; int ret; + int64_t resampling_forced; + if (s->avr) { avresample_close(s->avr); avresample_free(&s->avr); @@ -155,9 +158,15 @@ static int config_output(AVFilterLink *outlink) if ((ret = avresample_open(s->avr)) < 0) return ret; - outlink->time_base = (AVRational){ 1, outlink->sample_rate }; - s->next_pts = AV_NOPTS_VALUE; - s->next_in_pts = AV_NOPTS_VALUE; + av_opt_get_int(s->avr, "force_resampling", 0, &resampling_forced); + s->resampling = resampling_forced || (inlink->sample_rate != outlink->sample_rate); + + if (s->resampling) { + outlink->time_base = (AVRational){ 1, outlink->sample_rate }; + s->next_pts = AV_NOPTS_VALUE; + s->next_in_pts = AV_NOPTS_VALUE; + } else + outlink->time_base = inlink->time_base; av_get_channel_layout_string(buf1, sizeof(buf1), -1, inlink ->channel_layout); @@ -240,7 +249,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) av_assert0(!avresample_available(s->avr)); - if (s->next_pts == AV_NOPTS_VALUE) { + if (s->resampling && s->next_pts == AV_NOPTS_VALUE) { if (in->pts == AV_NOPTS_VALUE) { av_log(ctx, AV_LOG_WARNING, "First timestamp is missing, " "assuming 0.\n"); @@ -259,22 +268,25 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) goto fail; } - out->sample_rate = outlink->sample_rate; - /* Only convert in->pts if there is a discontinuous jump. - This ensures that out->pts tracks the number of samples actually - output by the resampler in the absence of such a jump. - Otherwise, the rounding in av_rescale_q() and av_rescale() - causes off-by-1 errors. */ - if (in->pts != AV_NOPTS_VALUE && in->pts != s->next_in_pts) { - out->pts = av_rescale_q(in->pts, inlink->time_base, - outlink->time_base) - - av_rescale(delay, outlink->sample_rate, - inlink->sample_rate); + if (s->resampling) { + out->sample_rate = outlink->sample_rate; + /* Only convert in->pts if there is a discontinuous jump. + This ensures that out->pts tracks the number of samples actually + output by the resampler in the absence of such a jump. + Otherwise, the rounding in av_rescale_q() and av_rescale() + causes off-by-1 errors. */ + if (in->pts != AV_NOPTS_VALUE && in->pts != s->next_in_pts) { + out->pts = av_rescale_q(in->pts, inlink->time_base, + outlink->time_base) - + av_rescale(delay, outlink->sample_rate, + inlink->sample_rate); + } else + out->pts = s->next_pts; + + s->next_pts = out->pts + out->nb_samples; + s->next_in_pts = in->pts + in->nb_samples; } else - out->pts = s->next_pts; - - s->next_pts = out->pts + out->nb_samples; - s->next_in_pts = in->pts + in->nb_samples; + out->pts = in->pts; ret = ff_filter_frame(outlink, out); s->got_output = 1; |