Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Sukhanov <alx.sukhanov@gmail.com>2013-11-15 05:56:36 +0400
committerMichael Niedermayer <michaelni@gmx.at>2013-11-15 14:54:02 +0400
commit86b3435fc01049cfa9dc0257ddbf1f531f7cb67a (patch)
treedc8492fd5fc0d0b7b8e39b112da78c864c66c893 /libavfilter
parent995f450b44be02cc159ac825f038309e7a3de51e (diff)
af_aresample: Fix timestamp of first padded PCM audio packet
Problem: ffmpeg generated video file which had two audio packets with the same timestamp: last original audio packet and first padded audio packet. Timestamp of first added audio packet by 'apad' fitler had the same value as last original audio packet. The problem was in 'aresample' fitler, which used next pts instead of current one. As long as 'apad' and 'aresample' filters have separate mechanisms of timestamp calculation, they got the same values. Command line: ffmpeg -i <input_filename> -shortest -apad 512 -af asetnsamples=n=512 -b:a 1058400 -ac 1 -ar 44100 -async 0 -acodec pcm_s16le -sn -f matroska -y <output_file> Fix: Call swr_next_pts() function before swr_convert() Tested: FATE tests passed. Fix has been tested in our Transcoder regression framework on ~10k test videos. It's about ~500k transcodes. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/af_aresample.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/libavfilter/af_aresample.c b/libavfilter/af_aresample.c
index e21b3e4a04..e05c0a179d 100644
--- a/libavfilter/af_aresample.c
+++ b/libavfilter/af_aresample.c
@@ -230,10 +230,15 @@ static int request_frame(AVFilterLink *outlink)
if (ret == AVERROR_EOF) {
AVFrame *outsamplesref;
int n_out = 4096;
+ int64_t pts;
outsamplesref = ff_get_audio_buffer(outlink, n_out);
if (!outsamplesref)
return AVERROR(ENOMEM);
+
+ pts = swr_next_pts(aresample->swr, INT64_MIN);
+ pts = ROUNDED_DIV(pts, inlink->sample_rate);
+
n_out = swr_convert(aresample->swr, outsamplesref->extended_data, n_out, 0, 0);
if (n_out <= 0) {
av_frame_free(&outsamplesref);
@@ -242,14 +247,8 @@ static int request_frame(AVFilterLink *outlink)
outsamplesref->sample_rate = outlink->sample_rate;
outsamplesref->nb_samples = n_out;
-#if 0
- outsamplesref->pts = aresample->next_pts;
- if(aresample->next_pts != AV_NOPTS_VALUE)
- aresample->next_pts += av_rescale_q(n_out, (AVRational){1 ,outlink->sample_rate}, outlink->time_base);
-#else
- outsamplesref->pts = swr_next_pts(aresample->swr, INT64_MIN);
- outsamplesref->pts = ROUNDED_DIV(outsamplesref->pts, inlink->sample_rate);
-#endif
+
+ outsamplesref->pts = pts;
return ff_filter_frame(outlink, outsamplesref);
}