avfilter/aeval: trim last frame's number of samples to match requested duration

Fixes #6181.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
Paul B Mahol
2017-02-24 18:50:09 +01:00
parent f66b048932
commit 7f7f5a924b
3 changed files with 1544 additions and 1156 deletions
+11 -3
View File
@@ -277,16 +277,24 @@ static int request_frame(AVFilterLink *outlink)
AVFrame *samplesref;
int i, j;
int64_t t = av_rescale(eval->n, AV_TIME_BASE, eval->sample_rate);
int nb_samples;
if (eval->duration >= 0 && t >= eval->duration)
return AVERROR_EOF;
samplesref = ff_get_audio_buffer(outlink, eval->nb_samples);
if (eval->duration >= 0) {
nb_samples = FFMIN(eval->nb_samples, av_rescale(eval->duration, eval->sample_rate, AV_TIME_BASE) - eval->pts);
if (!nb_samples)
return AVERROR_EOF;
} else {
nb_samples = eval->nb_samples;
}
samplesref = ff_get_audio_buffer(outlink, nb_samples);
if (!samplesref)
return AVERROR(ENOMEM);
/* evaluate expression for each single sample and for each channel */
for (i = 0; i < eval->nb_samples; i++, eval->n++) {
for (i = 0; i < nb_samples; i++, eval->n++) {
eval->var_values[VAR_N] = eval->n;
eval->var_values[VAR_T] = eval->var_values[VAR_N] * (double)1/eval->sample_rate;
@@ -298,7 +306,7 @@ static int request_frame(AVFilterLink *outlink)
samplesref->pts = eval->pts;
samplesref->sample_rate = eval->sample_rate;
eval->pts += eval->nb_samples;
eval->pts += nb_samples;
return ff_filter_frame(outlink, samplesref);
}
+1 -2
View File
@@ -769,5 +769,4 @@
0, 877824, 877824, 1152, 2304, 0xb2ae7741
0, 878976, 878976, 1152, 2304, 0x4de169e4
0, 880128, 880128, 1152, 2304, 0x3cb18530
0, 881280, 881280, 1152, 2304, 0x48b95d6c
0, 882432, 882432, 1152, 2304, 0xcff707ef
0, 881280, 881280, 1152, 2304, 0x5a0c5e7b
File diff suppressed because it is too large Load Diff