Fixes accumulation of data in case of significant silence injections
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
... | ... |
@@ -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 |
|