1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

lavfi/atempo: raise filter_frame() error.

This commit is contained in:
Clément Bœsch 2013-03-13 09:55:43 +01:00
parent dda59d9adc
commit 1b0d0e6b72

View File

@ -1020,10 +1020,12 @@ static int config_props(AVFilterLink *inlink)
return yae_reset(atempo, format, sample_rate, channels); return yae_reset(atempo, format, sample_rate, channels);
} }
static void push_samples(ATempoContext *atempo, static int push_samples(ATempoContext *atempo,
AVFilterLink *outlink, AVFilterLink *outlink,
int n_out) int n_out)
{ {
int ret;
atempo->dst_buffer->sample_rate = outlink->sample_rate; atempo->dst_buffer->sample_rate = outlink->sample_rate;
atempo->dst_buffer->nb_samples = n_out; atempo->dst_buffer->nb_samples = n_out;
@ -1033,12 +1035,15 @@ static void push_samples(ATempoContext *atempo,
(AVRational){ 1, outlink->sample_rate }, (AVRational){ 1, outlink->sample_rate },
outlink->time_base); outlink->time_base);
ff_filter_frame(outlink, atempo->dst_buffer); ret = ff_filter_frame(outlink, atempo->dst_buffer);
if (ret < 0)
return ret;
atempo->dst_buffer = NULL; atempo->dst_buffer = NULL;
atempo->dst = NULL; atempo->dst = NULL;
atempo->dst_end = NULL; atempo->dst_end = NULL;
atempo->nsamples_out += n_out; atempo->nsamples_out += n_out;
return 0;
} }
static int filter_frame(AVFilterLink *inlink, AVFrame *src_buffer) static int filter_frame(AVFilterLink *inlink, AVFrame *src_buffer)
@ -1047,6 +1052,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *src_buffer)
ATempoContext *atempo = ctx->priv; ATempoContext *atempo = ctx->priv;
AVFilterLink *outlink = ctx->outputs[0]; AVFilterLink *outlink = ctx->outputs[0];
int ret = 0;
int n_in = src_buffer->nb_samples; int n_in = src_buffer->nb_samples;
int n_out = (int)(0.5 + ((double)n_in) / atempo->tempo); int n_out = (int)(0.5 + ((double)n_in) / atempo->tempo);
@ -1065,14 +1071,17 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *src_buffer)
yae_apply(atempo, &src, src_end, &atempo->dst, atempo->dst_end); yae_apply(atempo, &src, src_end, &atempo->dst, atempo->dst_end);
if (atempo->dst == atempo->dst_end) { if (atempo->dst == atempo->dst_end) {
push_samples(atempo, outlink, n_out); ret = push_samples(atempo, outlink, n_out);
if (ret < 0)
goto end;
atempo->request_fulfilled = 1; atempo->request_fulfilled = 1;
} }
} }
atempo->nsamples_in += n_in; atempo->nsamples_in += n_in;
end:
av_frame_free(&src_buffer); av_frame_free(&src_buffer);
return 0; return ret;
} }
static int request_frame(AVFilterLink *outlink) static int request_frame(AVFilterLink *outlink)
@ -1107,7 +1116,7 @@ static int request_frame(AVFilterLink *outlink)
atempo->stride); atempo->stride);
if (n_out) { if (n_out) {
push_samples(atempo, outlink, n_out); ret = push_samples(atempo, outlink, n_out);
} }
} }