summaryrefslogtreecommitdiff
path: root/libavfilter/vf_fps.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-07-22 22:57:02 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-07-22 23:56:21 +0200
commit88beb2df982aa4de257f742ff41f777927cc5173 (patch)
tree15427851afeaa2fee531f53808237948b81b2e44 /libavfilter/vf_fps.c
parent9023de342f88e961a3741753aff68925eebf884e (diff)
parentdf53a4a7c1c496363e3fc165b431940ccd0cb8a0 (diff)
Merge remote-tracking branch 'qatar/master'
* qatar/master: FATE: fix the asyncts test build: Drop gcc-specific warning flag from header compilation rule FATE: add a test for the asyncts audio filter. matroskadec: return more correct error code on read error. buffersrc: check ff_get_audio_buffer() for errors. lavfi: check all ff_get_video_buffer() calls for errors. lavfi: check all avfilter_ref_buffer() calls for errors. vf_select: avoid an unnecessary avfilter_ref_buffer(). buffersrc: avoid creating unnecessary buffer reference lavfi: use avfilter_unref_bufferp() where appropriate. vf_fps: add more error checks. vf_fps: fix a memleak on malloc failure. lavfi: check all ff_start_frame/draw_slice/end_frame calls for errors lavfi: add error handling to end_frame(). lavfi: add error handling to draw_slice(). lavfi: add error handling to start_frame(). Conflicts: Makefile ffplay.c libavfilter/buffersrc.c libavfilter/vf_boxblur.c libavfilter/vf_drawtext.c libavfilter/vf_fade.c libavfilter/vf_frei0r.c libavfilter/vf_hflip.c libavfilter/vf_overlay.c libavfilter/vf_pad.c libavfilter/vf_scale.c libavfilter/video.c libavfilter/vsrc_color.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavfilter/vf_fps.c')
-rw-r--r--libavfilter/vf_fps.c64
1 files changed, 45 insertions, 19 deletions
diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c
index 71c30ccdff..3fdac4f267 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;
@@ -159,28 +161,33 @@ 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;
}
-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++;
/* 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 "
@@ -188,13 +195,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 +217,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 */
@@ -224,31 +230,51 @@ static void 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++;
}
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);
- 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 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)
+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
{
+ return 0;
}
AVFilter avfilter_vf_fps = {