Browse code

avfilter/af_aresample: Calculate output buffer size more precisely.

Fixes accumulation of data in case of significant silence injections

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>

Michael Niedermayer authored on 2013/11/07 06:59:16
Showing 1 changed files
... ...
@@ -170,11 +170,18 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamplesref)
170 170
 {
171 171
     AResampleContext *aresample = inlink->dst->priv;
172 172
     const int n_in  = insamplesref->nb_samples;
173
-    int n_out       = n_in * aresample->ratio * 2 + 256;
173
+    int64_t delay;
174
+    int n_out       = n_in * aresample->ratio + 32;
174 175
     AVFilterLink *const outlink = inlink->dst->outputs[0];
175
-    AVFrame *outsamplesref = ff_get_audio_buffer(outlink, n_out);
176
+    AVFrame *outsamplesref;
176 177
     int ret;
177 178
 
179
+    delay = swr_get_delay(aresample->swr, outlink->sample_rate);
180
+    if (delay > 0)
181
+        n_out += delay;
182
+
183
+    outsamplesref = ff_get_audio_buffer(outlink, n_out);
184
+
178 185
     if(!outsamplesref)
179 186
         return AVERROR(ENOMEM);
180 187