Fixes #6181.
Showing the changes to libavfilter (1 of 3 files). Show all
Unified · Split
| @@ -277,16 +277,24 @@ static int request_frame(AVFilterLink *outlink) · 276 unmodified lines | ||
| 277 | 277 | AVFrame *samplesref; |
| 278 | 278 | int i, j; |
| 279 | 279 | int64_t t = av_rescale(eval->n, AV_TIME_BASE, eval->sample_rate); |
| 280 | + int nb_samples; | |
| 280 | 281 | |
| 281 | 282 | if (eval->duration >= 0 && t >= eval->duration) |
| 282 | 283 | return AVERROR_EOF; |
| 283 | 284 | |
| 284 | − samplesref = ff_get_audio_buffer(outlink, eval->nb_samples); | |
| 285 | + if (eval->duration >= 0) { | |
| 286 | + nb_samples = FFMIN(eval->nb_samples, av_rescale(eval->duration, eval->sample_rate, AV_TIME_BASE) - eval->pts); | |
| 287 | + if (!nb_samples) | |
| 288 | + return AVERROR_EOF; | |
| 289 | + } else { | |
| 290 | + nb_samples = eval->nb_samples; | |
| 291 | + } | |
| 292 | + samplesref = ff_get_audio_buffer(outlink, nb_samples); | |
| 285 | 293 | if (!samplesref) |
| 286 | 294 | return AVERROR(ENOMEM); |
| 287 | 295 | |
| 288 | 296 | /* evaluate expression for each single sample and for each channel */ |
| 289 | − for (i = 0; i < eval->nb_samples; i++, eval->n++) { | |
| 297 | + for (i = 0; i < nb_samples; i++, eval->n++) { | |
| 290 | 298 | eval->var_values[VAR_N] = eval->n; |
| 291 | 299 | eval->var_values[VAR_T] = eval->var_values[VAR_N] * (double)1/eval->sample_rate; |
| 292 | 300 | |
| @@ -298,7 +306,7 @@ static int request_frame(AVFilterLink *outlink) · 5 unmodified lines | ||
| 298 | 306 | |
| 299 | 307 | samplesref->pts = eval->pts; |
| 300 | 308 | samplesref->sample_rate = eval->sample_rate; |
| 301 | − eval->pts += eval->nb_samples; | |
| 309 | + eval->pts += nb_samples; | |
| 302 | 310 | |
| 303 | 311 | return ff_filter_frame(outlink, samplesref); |
| 304 | 312 | } |