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 | AVFrame *samplesref; | 277 | AVFrame *samplesref; |
| 278 | int i, j; | 278 | int i, j; |
| 279 | int64_t t = av_rescale(eval->n, AV_TIME_BASE, eval->sample_rate); | 279 | int64_t t = av_rescale(eval->n, AV_TIME_BASE, eval->sample_rate); |
| 280 | int nb_samples; | ||
| 280 | 281 | ||
| 281 | if (eval->duration >= 0 && t >= eval->duration) | 282 | if (eval->duration >= 0 && t >= eval->duration) |
| 282 | return AVERROR_EOF; | 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 | if (!samplesref) | 293 | if (!samplesref) |
| 286 | return AVERROR(ENOMEM); | 294 | return AVERROR(ENOMEM); |
| 287 | 295 | ||
| 288 | /* evaluate expression for each single sample and for each channel */ | 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 | eval->var_values[VAR_N] = eval->n; | 298 | eval->var_values[VAR_N] = eval->n; |
| 291 | eval->var_values[VAR_T] = eval->var_values[VAR_N] * (double)1/eval->sample_rate; | 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 | samplesref->pts = eval->pts; | 307 | samplesref->pts = eval->pts; |
| 300 | samplesref->sample_rate = eval->sample_rate; | 308 | samplesref->sample_rate = eval->sample_rate; |
| 301 | eval->pts += eval->nb_samples; | 309 | eval->pts += nb_samples; |
| 302 | 310 | ||
| 303 | return ff_filter_frame(outlink, samplesref); | 311 | return ff_filter_frame(outlink, samplesref); |
| 304 | } | 312 | } |