aboutsummaryrefslogtreecommitdiffstats
path: root/libavfilter/af_resample.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2015-07-19 15:45:15 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2015-07-19 16:05:33 +0200
commit7093e215d02ed0dc9632f82ac8ccec432d29cd35 (patch)
treeb41d3772ec361212b717c827155b4544b1ef04cb /libavfilter/af_resample.c
parent2dbaec690d9f8e25e12b80e1162097e96b30ddc8 (diff)
parent6b15874fc2c3f565732201f7907ae1112727d6ae (diff)
downloadffmpeg-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.c50
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;