OSDN Git Service

avfilter/af_aresample: Calculate output buffer size more precisely.
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 6 Nov 2013 21:59:16 +0000 (22:59 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 6 Nov 2013 22:54:02 +0000 (23:54 +0100)
Fixes accumulation of data in case of significant silence injections

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavfilter/af_aresample.c

index 86e7b74..e21b3e4 100644 (file)
@@ -170,11 +170,18 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamplesref)
 {
     AResampleContext *aresample = inlink->dst->priv;
     const int n_in  = insamplesref->nb_samples;
-    int n_out       = n_in * aresample->ratio * 2 + 256;
+    int64_t delay;
+    int n_out       = n_in * aresample->ratio + 32;
     AVFilterLink *const outlink = inlink->dst->outputs[0];
-    AVFrame *outsamplesref = ff_get_audio_buffer(outlink, n_out);
+    AVFrame *outsamplesref;
     int ret;
 
+    delay = swr_get_delay(aresample->swr, outlink->sample_rate);
+    if (delay > 0)
+        n_out += delay;
+
+    outsamplesref = ff_get_audio_buffer(outlink, n_out);
+
     if(!outsamplesref)
         return AVERROR(ENOMEM);