[libav-commits] lavfi: check all ff_start_frame/draw_slice/end_frame calls for errors

Anton Khirnov git at libav.org
Sun Jul 22 09:22:22 CEST 2012


Module: libav
Branch: master
Commit: 3825b5268844694ff50a0e0bfde64df43a862fae

Author:    Anton Khirnov <anton at khirnov.net>
Committer: Anton Khirnov <anton at khirnov.net>
Date:      Sun Jul 15 09:47:01 2012 +0200

lavfi: check all ff_start_frame/draw_slice/end_frame calls for errors

---

 libavfilter/buffersrc.c    |    8 +++++---
 libavfilter/fifo.c         |    8 +++++---
 libavfilter/vf_fps.c       |   18 ++++++++++++------
 libavfilter/vf_frei0r.c    |   18 ++++++++++++++----
 libavfilter/vf_select.c    |   11 +++++++----
 libavfilter/vf_yadif.c     |   14 +++++++++-----
 libavfilter/vsrc_color.c   |   18 ++++++++++++++----
 libavfilter/vsrc_movie.c   |   15 +++++++++++----
 libavfilter/vsrc_testsrc.c |    8 +++++---
 9 files changed, 82 insertions(+), 36 deletions(-)

diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
index 0828b15..2aa7d7d 100644
--- a/libavfilter/buffersrc.c
+++ b/libavfilter/buffersrc.c
@@ -323,9 +323,10 @@ static int request_frame(AVFilterLink *link)
 
     switch (link->type) {
     case AVMEDIA_TYPE_VIDEO:
-        ff_start_frame(link, avfilter_ref_buffer(buf, ~0));
-        ff_draw_slice(link, 0, link->h, 1);
-        ff_end_frame(link);
+        if ((ret = ff_start_frame(link, avfilter_ref_buffer(buf, ~0))) < 0 ||
+            (ret = ff_draw_slice(link, 0, link->h, 1)) < 0 ||
+            (ret = ff_end_frame(link)) < 0)
+            goto fail;
         break;
     case AVMEDIA_TYPE_AUDIO:
         ret = ff_filter_samples(link, avfilter_ref_buffer(buf, ~0));
@@ -334,6 +335,7 @@ static int request_frame(AVFilterLink *link)
         return AVERROR(EINVAL);
     }
 
+fail:
     avfilter_unref_buffer(buf);
 
     return ret;
diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c
index 16a86b3..66de62c 100644
--- a/libavfilter/fifo.c
+++ b/libavfilter/fifo.c
@@ -241,9 +241,11 @@ static int request_frame(AVFilterLink *outlink)
      * so we don't have to worry about dereferencing it ourselves. */
     switch (outlink->type) {
     case AVMEDIA_TYPE_VIDEO:
-        ff_start_frame(outlink, fifo->root.next->buf);
-        ff_draw_slice (outlink, 0, outlink->h, 1);
-        ff_end_frame  (outlink);
+        if ((ret = ff_start_frame(outlink, fifo->root.next->buf)) < 0 ||
+            (ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 ||
+            (ret = ff_end_frame(outlink)) < 0)
+            return ret;
+
         queue_pop(fifo);
         break;
     case AVMEDIA_TYPE_AUDIO:
diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c
index 9ca0668..ab7cba5 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);
diff --git a/libavfilter/vf_frei0r.c b/libavfilter/vf_frei0r.c
index 4721779..f5e9128 100644
--- a/libavfilter/vf_frei0r.c
+++ b/libavfilter/vf_frei0r.c
@@ -438,18 +438,28 @@ static int source_request_frame(AVFilterLink *outlink)
 {
     Frei0rContext *frei0r = outlink->src->priv;
     AVFilterBufferRef *picref = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h);
+    int ret;
+
     picref->video->pixel_aspect = (AVRational) {1, 1};
     picref->pts = frei0r->pts++;
     picref->pos = -1;
 
-    ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0));
+    ret = ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0));
+    if (ret < 0)
+        goto fail;
+
     frei0r->update(frei0r->instance, av_rescale_q(picref->pts, frei0r->time_base, (AVRational){1,1000}),
                    NULL, (uint32_t *)picref->data[0]);
-    ff_draw_slice(outlink, 0, outlink->h, 1);
-    ff_end_frame(outlink);
+    ret = ff_draw_slice(outlink, 0, outlink->h, 1);
+    if (ret < 0)
+        goto fail;
+
+    ret = ff_end_frame(outlink);
+
+fail:
     avfilter_unref_buffer(picref);
 
-    return 0;
+    return ret;
 }
 
 AVFilter avfilter_vsrc_frei0r_src = {
diff --git a/libavfilter/vf_select.c b/libavfilter/vf_select.c
index b9e053f..d4cfbe9 100644
--- a/libavfilter/vf_select.c
+++ b/libavfilter/vf_select.c
@@ -279,12 +279,15 @@ static int request_frame(AVFilterLink *outlink)
 
     if (av_fifo_size(select->pending_frames)) {
         AVFilterBufferRef *picref;
+        int ret;
+
         av_fifo_generic_read(select->pending_frames, &picref, sizeof(picref), NULL);
-        ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0));
-        ff_draw_slice(outlink, 0, outlink->h, 1);
-        ff_end_frame(outlink);
+        if ((ret = ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0))) < 0 ||
+            (ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 ||
+            (ret = ff_end_frame(outlink)) < 0);
+
         avfilter_unref_buffer(picref);
-        return 0;
+        return ret;
     }
 
     while (!select->select) {
diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c
index 69efc8a..9ac11bf 100644
--- a/libavfilter/vf_yadif.c
+++ b/libavfilter/vf_yadif.c
@@ -157,11 +157,11 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *link, int perms, int w,
     return picref;
 }
 
-static void return_frame(AVFilterContext *ctx, int is_second)
+static int return_frame(AVFilterContext *ctx, int is_second)
 {
     YADIFContext *yadif = ctx->priv;
     AVFilterLink *link= ctx->outputs[0];
-    int tff;
+    int tff, ret;
 
     if (yadif->parity == -1) {
         tff = yadif->cur->video->interlaced ?
@@ -193,12 +193,16 @@ static void return_frame(AVFilterContext *ctx, int is_second)
         } else {
             yadif->out->pts = AV_NOPTS_VALUE;
         }
-        ff_start_frame(ctx->outputs[0], yadif->out);
+        ret = ff_start_frame(ctx->outputs[0], yadif->out);
+        if (ret < 0)
+            return ret;
     }
-    ff_draw_slice(ctx->outputs[0], 0, link->h, 1);
-    ff_end_frame(ctx->outputs[0]);
+    if ((ret = ff_draw_slice(ctx->outputs[0], 0, link->h, 1)) < 0 ||
+        (ret = ff_end_frame(ctx->outputs[0])) < 0)
+        return ret;
 
     yadif->frame_pending = (yadif->mode&1) && !is_second;
+    return 0;
 }
 
 static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
diff --git a/libavfilter/vsrc_color.c b/libavfilter/vsrc_color.c
index d5bda2b..c17f54f 100644
--- a/libavfilter/vsrc_color.c
+++ b/libavfilter/vsrc_color.c
@@ -142,19 +142,29 @@ static int color_request_frame(AVFilterLink *link)
 {
     ColorContext *color = link->src->priv;
     AVFilterBufferRef *picref = ff_get_video_buffer(link, AV_PERM_WRITE, color->w, color->h);
+    int ret;
+
     picref->video->pixel_aspect = (AVRational) {1, 1};
     picref->pts                 = color->pts++;
     picref->pos                 = -1;
 
-    ff_start_frame(link, avfilter_ref_buffer(picref, ~0));
+    ret = ff_start_frame(link, avfilter_ref_buffer(picref, ~0));
+    if (ret < 0)
+        goto fail;
+
     ff_draw_rectangle(picref->data, picref->linesize,
                       color->line, color->line_step, color->hsub, color->vsub,
                       0, 0, color->w, color->h);
-    ff_draw_slice(link, 0, color->h, 1);
-    ff_end_frame(link);
+    ret = ff_draw_slice(link, 0, color->h, 1);
+    if (ret < 0)
+        goto fail;
+
+    ret = ff_end_frame(link);
+
+fail:
     avfilter_unref_buffer(picref);
 
-    return 0;
+    return ret;
 }
 
 AVFilter avfilter_vsrc_color = {
diff --git a/libavfilter/vsrc_movie.c b/libavfilter/vsrc_movie.c
index 11769d0..1fb0495 100644
--- a/libavfilter/vsrc_movie.c
+++ b/libavfilter/vsrc_movie.c
@@ -289,13 +289,20 @@ static int request_frame(AVFilterLink *outlink)
         return ret;
 
     outpicref = avfilter_ref_buffer(movie->picref, ~0);
-    ff_start_frame(outlink, outpicref);
-    ff_draw_slice(outlink, 0, outlink->h, 1);
-    ff_end_frame(outlink);
+    ret = ff_start_frame(outlink, outpicref);
+    if (ret < 0)
+        goto fail;
+
+    ret = ff_draw_slice(outlink, 0, outlink->h, 1);
+    if (ret < 0)
+        goto fail;
+
+    ret = ff_end_frame(outlink);
+fail:
     avfilter_unref_buffer(movie->picref);
     movie->picref = NULL;
 
-    return 0;
+    return ret;
 }
 
 AVFilter avfilter_vsrc_movie = {
diff --git a/libavfilter/vsrc_testsrc.c b/libavfilter/vsrc_testsrc.c
index 6de1676..22528b4 100644
--- a/libavfilter/vsrc_testsrc.c
+++ b/libavfilter/vsrc_testsrc.c
@@ -130,6 +130,7 @@ static int request_frame(AVFilterLink *outlink)
 {
     TestSourceContext *test = outlink->src->priv;
     AVFilterBufferRef *picref;
+    int ret;
 
     if (test->max_pts >= 0 && test->pts > test->max_pts)
         return AVERROR_EOF;
@@ -143,9 +144,10 @@ static int request_frame(AVFilterLink *outlink)
     test->nb_frame++;
     test->fill_picture_fn(outlink->src, picref);
 
-    ff_start_frame(outlink, picref);
-    ff_draw_slice(outlink, 0, test->h, 1);
-    ff_end_frame(outlink);
+    if ((ret = ff_start_frame(outlink, picref)) < 0 ||
+        (ret = ff_draw_slice(outlink, 0, test->h, 1)) < 0 ||
+        (ret = ff_end_frame(outlink)) < 0)
+        return ret;
 
     return 0;
 }



More information about the libav-commits mailing list