Commit 2e7ccd49 authored by Paul B Mahol's avatar Paul B Mahol

avfilter/f_loop: fix pts handling when timebase and 1/samplerate differ

parent f7ad9a6c
...@@ -107,7 +107,7 @@ static int push_samples(AVFilterContext *ctx, int nb_samples) ...@@ -107,7 +107,7 @@ static int push_samples(AVFilterContext *ctx, int nb_samples)
} }
out->pts = s->pts; out->pts = s->pts;
out->nb_samples = ret; out->nb_samples = ret;
s->pts += out->nb_samples; s->pts += av_rescale_q(out->nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
i += out->nb_samples; i += out->nb_samples;
s->current_sample += out->nb_samples; s->current_sample += out->nb_samples;
...@@ -145,7 +145,7 @@ static int afilter_frame(AVFilterLink *inlink, AVFrame *frame) ...@@ -145,7 +145,7 @@ static int afilter_frame(AVFilterLink *inlink, AVFrame *frame)
drain = FFMAX(0, s->start - s->ignored_samples); drain = FFMAX(0, s->start - s->ignored_samples);
s->pts = frame->pts; s->pts = frame->pts;
av_audio_fifo_drain(s->fifo, drain); av_audio_fifo_drain(s->fifo, drain);
s->pts += s->start - s->ignored_samples; s->pts += av_rescale_q(s->start - s->ignored_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
} }
s->nb_samples += ret - drain; s->nb_samples += ret - drain;
drain = frame->nb_samples - written; drain = frame->nb_samples - written;
...@@ -158,7 +158,7 @@ static int afilter_frame(AVFilterLink *inlink, AVFrame *frame) ...@@ -158,7 +158,7 @@ static int afilter_frame(AVFilterLink *inlink, AVFrame *frame)
av_audio_fifo_drain(s->left, drain); av_audio_fifo_drain(s->left, drain);
} }
frame->nb_samples = ret; frame->nb_samples = ret;
s->pts += ret; s->pts += av_rescale_q(ret, (AVRational){1, outlink->sample_rate}, outlink->time_base);
ret = ff_filter_frame(outlink, frame); ret = ff_filter_frame(outlink, frame);
} else { } else {
int nb_samples = frame->nb_samples; int nb_samples = frame->nb_samples;
...@@ -169,7 +169,7 @@ static int afilter_frame(AVFilterLink *inlink, AVFrame *frame) ...@@ -169,7 +169,7 @@ static int afilter_frame(AVFilterLink *inlink, AVFrame *frame)
} else { } else {
s->ignored_samples += frame->nb_samples; s->ignored_samples += frame->nb_samples;
frame->pts = s->pts; frame->pts = s->pts;
s->pts += frame->nb_samples; s->pts += av_rescale_q(frame->nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
ret = ff_filter_frame(outlink, frame); ret = ff_filter_frame(outlink, frame);
} }
...@@ -195,7 +195,7 @@ static int arequest_frame(AVFilterLink *outlink) ...@@ -195,7 +195,7 @@ static int arequest_frame(AVFilterLink *outlink)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
av_audio_fifo_read(s->left, (void **)out->extended_data, nb_samples); av_audio_fifo_read(s->left, (void **)out->extended_data, nb_samples);
out->pts = s->pts; out->pts = s->pts;
s->pts += nb_samples; s->pts += av_rescale_q(nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
ret = ff_filter_frame(outlink, out); ret = ff_filter_frame(outlink, out);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment