summaryrefslogtreecommitdiff
path: root/libavfilter/af_resample.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2012-07-02 20:13:40 +0200
committerAnton Khirnov <anton@khirnov.net>2012-07-09 08:25:19 +0200
commitcd99146253cf9de5dad5694b97027d5612fdc61d (patch)
tree0b53395aa59459574c2e5fa1c277b4267e01c4a0 /libavfilter/af_resample.c
parent8d18bc550e7dfc62bc872507a02ae2d7827882d6 (diff)
lavfi: add error handling to filter_samples().
Diffstat (limited to 'libavfilter/af_resample.c')
-rw-r--r--libavfilter/af_resample.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/libavfilter/af_resample.c b/libavfilter/af_resample.c
index 8fbe60b2cf..1360c1ca49 100644
--- a/libavfilter/af_resample.c
+++ b/libavfilter/af_resample.c
@@ -157,21 +157,21 @@ static int request_frame(AVFilterLink *outlink)
}
buf->pts = s->next_pts;
- ff_filter_samples(outlink, buf);
- return 0;
+ return ff_filter_samples(outlink, buf);
}
return ret;
}
-static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *buf)
+static int filter_samples(AVFilterLink *inlink, AVFilterBufferRef *buf)
{
AVFilterContext *ctx = inlink->dst;
ResampleContext *s = ctx->priv;
AVFilterLink *outlink = ctx->outputs[0];
+ int ret;
if (s->avr) {
AVFilterBufferRef *buf_out;
- int delay, nb_samples, ret;
+ int delay, nb_samples;
/* maximum possible samples lavr can output */
delay = avresample_get_delay(s->avr);
@@ -180,10 +180,19 @@ static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *buf)
AV_ROUND_UP);
buf_out = ff_get_audio_buffer(outlink, AV_PERM_WRITE, nb_samples);
+ if (!buf_out) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+
ret = avresample_convert(s->avr, (void**)buf_out->extended_data,
buf_out->linesize[0], nb_samples,
(void**)buf->extended_data, buf->linesize[0],
buf->audio->nb_samples);
+ if (ret < 0) {
+ avfilter_unref_buffer(buf_out);
+ goto fail;
+ }
av_assert0(!avresample_available(s->avr));
@@ -209,14 +218,18 @@ static void filter_samples(AVFilterLink *inlink, AVFilterBufferRef *buf)
s->next_pts = buf_out->pts + buf_out->audio->nb_samples;
- ff_filter_samples(outlink, buf_out);
+ ret = ff_filter_samples(outlink, buf_out);
s->got_output = 1;
}
+
+fail:
avfilter_unref_buffer(buf);
} else {
- ff_filter_samples(outlink, buf);
+ ret = ff_filter_samples(outlink, buf);
s->got_output = 1;
}
+
+ return ret;
}
AVFilter avfilter_af_resample = {