History

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

Fixes #6181.

Paul B Mahol committed 9 years ago

Commit dbc7f021 parent 353f5093 files · +1544 −1156Browse files

Showing the changes to libavfilter (1 of 3 files). Show all

Unified · Split

libavfilter/aeval.c+11−3
@@ -277,16 +277,24 @@ static int request_frame(AVFilterLink *outlink) · 276 unmodified lines
277277 AVFrame *samplesref;
278278 int i, j;
279279 int64_t t = av_rescale(eval->n, AV_TIME_BASE, eval->sample_rate);
280+ int nb_samples;
280281
281282 if (eval->duration >= 0 && t >= eval->duration)
282283 return AVERROR_EOF;
283284
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);
285293 if (!samplesref)
286294 return AVERROR(ENOMEM);
287295
288296 /* 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++) {
290298 eval->var_values[VAR_N] = eval->n;
291299 eval->var_values[VAR_T] = eval->var_values[VAR_N] * (double)1/eval->sample_rate;
292300
@@ -298,7 +306,7 @@ static int request_frame(AVFilterLink *outlink) · 5 unmodified lines
298306
299307 samplesref->pts = eval->pts;
300308 samplesref->sample_rate = eval->sample_rate;
301− eval->pts += eval->nb_samples;
309+ eval->pts += nb_samples;
302310
303311 return ff_filter_frame(outlink, samplesref);
304312 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t