From ebc8d974817fe456a0afe6867fdeb22c761fb04f Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 8 Jul 2012 17:29:42 +0200 Subject: lavfi: add error handling to start_frame(). --- libavfilter/vf_fps.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libavfilter/vf_fps.c') diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c index fbc4d87966..ca0d36630d 100644 --- a/libavfilter/vf_fps.c +++ b/libavfilter/vf_fps.c @@ -243,8 +243,9 @@ static void end_frame(AVFilterLink *inlink) s->pts = s->first_pts + av_rescale_q(s->frames_out, outlink->time_base, inlink->time_base); } -static void null_start_frame(AVFilterLink *link, AVFilterBufferRef *buf) +static int null_start_frame(AVFilterLink *link, AVFilterBufferRef *buf) { + return 0; } static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) -- cgit v1.2.3 From e9b992d035b58209d66115bd7d964741dd31d592 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 14 Jul 2012 09:25:33 +0200 Subject: lavfi: add error handling to draw_slice(). --- libavfilter/vf_fps.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libavfilter/vf_fps.c') diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c index ca0d36630d..619a86cc11 100644 --- a/libavfilter/vf_fps.c +++ b/libavfilter/vf_fps.c @@ -248,8 +248,9 @@ static int null_start_frame(AVFilterLink *link, AVFilterBufferRef *buf) return 0; } -static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) +static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { + return 0; } AVFilter avfilter_vf_fps = { -- cgit v1.2.3 From d4f89906e3b310609b636cf6071313ec557ec873 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 14 Jul 2012 09:25:33 +0200 Subject: lavfi: add error handling to end_frame(). --- libavfilter/vf_fps.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'libavfilter/vf_fps.c') diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c index 619a86cc11..9ca0668c76 100644 --- a/libavfilter/vf_fps.c +++ b/libavfilter/vf_fps.c @@ -166,14 +166,14 @@ static int write_to_fifo(AVFifoBuffer *fifo, AVFilterBufferRef *buf) return 0; } -static void end_frame(AVFilterLink *inlink) +static int end_frame(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; FPSContext *s = ctx->priv; AVFilterLink *outlink = ctx->outputs[0]; AVFilterBufferRef *buf = inlink->cur_buf; int64_t delta; - int i; + int i, ret; inlink->cur_buf = NULL; s->frames_in++; @@ -188,13 +188,12 @@ static void end_frame(AVFilterLink *inlink) avfilter_unref_buffer(buf); s->drop++; } - return; + return 0; } /* now wait for the next timestamp */ if (buf->pts == AV_NOPTS_VALUE) { - write_to_fifo(s->fifo, buf); - return; + return write_to_fifo(s->fifo, buf); } /* number of output frames */ @@ -211,10 +210,10 @@ static void end_frame(AVFilterLink *inlink) av_fifo_generic_read(s->fifo, &tmp, sizeof(tmp), NULL); flush_fifo(s->fifo); - write_to_fifo(s->fifo, tmp); + ret = write_to_fifo(s->fifo, tmp); avfilter_unref_buffer(buf); - return; + return ret; } /* can output >= 1 frames */ @@ -239,8 +238,10 @@ static void end_frame(AVFilterLink *inlink) } flush_fifo(s->fifo); - write_to_fifo(s->fifo, buf); + ret = write_to_fifo(s->fifo, buf); s->pts = s->first_pts + av_rescale_q(s->frames_out, outlink->time_base, inlink->time_base); + + return ret; } static int null_start_frame(AVFilterLink *link, AVFilterBufferRef *buf) -- cgit v1.2.3 From 3825b5268844694ff50a0e0bfde64df43a862fae Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 15 Jul 2012 09:47:01 +0200 Subject: lavfi: check all ff_start_frame/draw_slice/end_frame calls for errors --- libavfilter/vf_fps.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'libavfilter/vf_fps.c') diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c index 9ca0668c76..ab7cba57d1 100644 --- a/libavfilter/vf_fps.c +++ b/libavfilter/vf_fps.c @@ -143,9 +143,11 @@ static int request_frame(AVFilterLink *outlink) buf->pts = av_rescale_q(s->first_pts, ctx->inputs[0]->time_base, outlink->time_base) + s->frames_out; - ff_start_frame(outlink, buf); - ff_draw_slice(outlink, 0, outlink->h, 1); - ff_end_frame(outlink); + if ((ret = ff_start_frame(outlink, buf)) < 0 || + (ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 || + (ret = ff_end_frame(outlink)) < 0) + return ret; + s->frames_out++; } return 0; @@ -231,9 +233,13 @@ static int end_frame(AVFilterLink *inlink) buf_out->pts = av_rescale_q(s->first_pts, inlink->time_base, outlink->time_base) + s->frames_out; - ff_start_frame(outlink, buf_out); - ff_draw_slice(outlink, 0, outlink->h, 1); - ff_end_frame(outlink); + if ((ret = ff_start_frame(outlink, buf_out)) < 0 || + (ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 || + (ret = ff_end_frame(outlink)) < 0) { + avfilter_unref_bufferp(&buf); + return ret; + } + s->frames_out++; } flush_fifo(s->fifo); -- cgit v1.2.3 From d515e9c2259dd825b167a94266efd5336a711702 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 15 Jul 2012 09:50:49 +0200 Subject: vf_fps: fix a memleak on malloc failure. --- libavfilter/vf_fps.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'libavfilter/vf_fps.c') diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c index ab7cba57d1..bf140f8143 100644 --- a/libavfilter/vf_fps.c +++ b/libavfilter/vf_fps.c @@ -161,8 +161,10 @@ static int write_to_fifo(AVFifoBuffer *fifo, AVFilterBufferRef *buf) int ret; if (!av_fifo_space(fifo) && - (ret = av_fifo_realloc2(fifo, 2*av_fifo_size(fifo)))) + (ret = av_fifo_realloc2(fifo, 2*av_fifo_size(fifo)))) { + avfilter_unref_bufferp(&buf); return ret; + } av_fifo_generic_write(fifo, &buf, sizeof(buf), NULL); return 0; -- cgit v1.2.3 From 043800a96888f1a04732f12316ba477d8f098d3f Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 15 Jul 2012 10:07:59 +0200 Subject: vf_fps: add more error checks. --- libavfilter/vf_fps.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'libavfilter/vf_fps.c') diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c index bf140f8143..d95fef5993 100644 --- a/libavfilter/vf_fps.c +++ b/libavfilter/vf_fps.c @@ -184,7 +184,10 @@ static int end_frame(AVFilterLink *inlink) /* discard frames until we get the first timestamp */ if (s->pts == AV_NOPTS_VALUE) { if (buf->pts != AV_NOPTS_VALUE) { - write_to_fifo(s->fifo, buf); + ret = write_to_fifo(s->fifo, buf); + if (ret < 0) + return ret; + s->first_pts = s->pts = buf->pts; } else { av_log(ctx, AV_LOG_WARNING, "Discarding initial frame(s) with no " @@ -227,8 +230,20 @@ static int end_frame(AVFilterLink *inlink) /* duplicate the frame if needed */ if (!av_fifo_size(s->fifo) && i < delta - 1) { + AVFilterBufferRef *dup = avfilter_ref_buffer(buf_out, AV_PERM_READ); + av_log(ctx, AV_LOG_DEBUG, "Duplicating frame.\n"); - write_to_fifo(s->fifo, avfilter_ref_buffer(buf_out, AV_PERM_READ)); + if (dup) + ret = write_to_fifo(s->fifo, dup); + else + ret = AVERROR(ENOMEM); + + if (ret < 0) { + avfilter_unref_bufferp(&buf_out); + avfilter_unref_bufferp(&buf); + return ret; + } + s->dup++; } -- cgit v1.2.3