]> git.sesse.net Git - ffmpeg/commitdiff
lavfi: add error handling to end_frame().
authorAnton Khirnov <anton@khirnov.net>
Sat, 14 Jul 2012 07:25:33 +0000 (09:25 +0200)
committerAnton Khirnov <anton@khirnov.net>
Sun, 22 Jul 2012 07:14:05 +0000 (09:14 +0200)
26 files changed:
libavfilter/avfilter.h
libavfilter/fifo.c
libavfilter/internal.h
libavfilter/split.c
libavfilter/vf_blackframe.c
libavfilter/vf_crop.c
libavfilter/vf_cropdetect.c
libavfilter/vf_delogo.c
libavfilter/vf_drawtext.c
libavfilter/vf_fade.c
libavfilter/vf_fieldorder.c
libavfilter/vf_fps.c
libavfilter/vf_frei0r.c
libavfilter/vf_gradfun.c
libavfilter/vf_hqdn3d.c
libavfilter/vf_libopencv.c
libavfilter/vf_overlay.c
libavfilter/vf_pad.c
libavfilter/vf_select.c
libavfilter/vf_showinfo.c
libavfilter/vf_transpose.c
libavfilter/vf_unsharp.c
libavfilter/vf_yadif.c
libavfilter/video.c
libavfilter/video.h
libavfilter/vsink_nullsink.c

index 3cd65da1e7433db4b03cd0b568e8aad3da67d517..7ca9eb42b399f199eedac8d7ece589199fa2420a 100644 (file)
@@ -287,8 +287,10 @@ struct AVFilterPad {
      * in the link structure during start_frame().
      *
      * Input video pads only.
+     *
+     * @return >= 0 on success, a negative AVERROR on error.
      */
-    void (*end_frame)(AVFilterLink *link);
+    int (*end_frame)(AVFilterLink *link);
 
     /**
      * Slice drawing callback. This is where a filter receives video data
index f7788b26a6d108671eb660bd1ad464bcc73ab02c..16a86b3565e67ff4ec7f60d7350cb3d02bfd936c 100644 (file)
@@ -98,7 +98,10 @@ static void queue_pop(FifoContext *s)
     s->root.next = tmp;
 }
 
-static void end_frame(AVFilterLink *inlink) { }
+static int end_frame(AVFilterLink *inlink)
+{
+    return 0;
+}
 
 static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
 {
index 3a2d50d65c94a365b679f5f86ef3c772aa229983..6f868ae89fe66756a6210ced0d03d7e202716243 100644 (file)
@@ -98,8 +98,10 @@ struct AVFilterPad {
      * in the link structure during start_frame().
      *
      * Input video pads only.
+     *
+     * @return >= 0 on success, a negative AVERROR on error.
      */
-    void (*end_frame)(AVFilterLink *link);
+    int (*end_frame)(AVFilterLink *link);
 
     /**
      * Slice drawing callback. This is where a filter receives video data
index 0ae0a60056896c3f1c2f18299ca95ed698747d27..469f69d76ac01163b27436a6203d391263b0ad53 100644 (file)
@@ -90,13 +90,17 @@ static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
     return ret;
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
-    int i;
+    int i, ret = 0;
 
-    for (i = 0; i < ctx->nb_outputs; i++)
-        ff_end_frame(ctx->outputs[i]);
+    for (i = 0; i < ctx->nb_outputs; i++) {
+        ret = ff_end_frame(ctx->outputs[i]);
+        if (ret < 0)
+            break;
+    }
+    return ret;
 }
 
 AVFilter avfilter_vf_split = {
index 9fd544921be476376007d7a6fb31ac81003ef0d7..bf0b18bea3680d7da648a51302435de03edb200f 100644 (file)
@@ -91,7 +91,7 @@ static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
     return ff_draw_slice(ctx->outputs[0], y, h, slice_dir);
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     BlackFrameContext *blackframe = ctx->priv;
@@ -106,7 +106,7 @@ static void end_frame(AVFilterLink *inlink)
 
     blackframe->frame++;
     blackframe->nblack = 0;
-    ff_end_frame(inlink->dst->outputs[0]);
+    return ff_end_frame(inlink->dst->outputs[0]);
 }
 
 AVFilter avfilter_vf_blackframe = {
index f7d311a9a8b7fe0d158e0147c9a9c562cc884987..4361ba5a8c770d86e5b807bbffbcc2c7d42dfb57 100644 (file)
@@ -315,12 +315,12 @@ static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
     return ff_draw_slice(ctx->outputs[0], y - crop->y, h, slice_dir);
 }
 
-static void end_frame(AVFilterLink *link)
+static int end_frame(AVFilterLink *link)
 {
     CropContext *crop = link->dst->priv;
 
     crop->var_values[VAR_N] += 1.0;
-    ff_end_frame(link->dst->outputs[0]);
+    return ff_end_frame(link->dst->outputs[0]);
 }
 
 AVFilter avfilter_vf_crop = {
index 1790f4b4e556bdd50df44130bb3b958e77543fab..8b6063c99600ec05c7bb24083151a0dde12de3d8 100644 (file)
@@ -114,7 +114,7 @@ static int config_input(AVFilterLink *inlink)
     return 0;
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     CropDetectContext *cd = ctx->priv;
@@ -191,7 +191,7 @@ static void end_frame(AVFilterLink *inlink)
                w, h, x, y);
     }
 
-    ff_end_frame(inlink->dst->outputs[0]);
+    return ff_end_frame(inlink->dst->outputs[0]);
 }
 
 AVFilter avfilter_vf_cropdetect = {
index 6e77cf19a879bc1520e381aa337f93375ae0b1d7..81f33b727ef15ccf6dcbf8958bccd2eb1bc1a8ad 100644 (file)
@@ -250,7 +250,7 @@ static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
     return 0;
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     DelogoContext *delogo = inlink->dst->priv;
     AVFilterLink *outlink = inlink->dst->outputs[0];
@@ -260,6 +260,7 @@ static void end_frame(AVFilterLink *inlink)
     int hsub0 = av_pix_fmt_descriptors[inlink->format].log2_chroma_w;
     int vsub0 = av_pix_fmt_descriptors[inlink->format].log2_chroma_h;
     int plane;
+    int ret;
 
     for (plane = 0; plane < 4 && inpicref->data[plane]; plane++) {
         int hsub = plane == 1 || plane == 2 ? hsub0 : 0;
@@ -274,8 +275,10 @@ static void end_frame(AVFilterLink *inlink)
                      delogo->show, direct);
     }
 
-    ff_draw_slice(outlink, 0, inlink->h, 1);
-    ff_end_frame(outlink);
+    if ((ret = ff_draw_slice(outlink, 0, inlink->h, 1)) < 0 ||
+        (ret = ff_end_frame(outlink)) < 0)
+        return ret;
+    return 0;
 }
 
 AVFilter avfilter_vf_delogo = {
index 732ab32aaa8d12030c2cc1d39dd75be99b82038e..30bdcea16d167ef32c383b88c83f6665010b718a 100644 (file)
@@ -860,19 +860,22 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
     return ff_start_frame(inlink->dst->outputs[0], buf_out);
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     AVFilterLink *outlink = inlink->dst->outputs[0];
     AVFilterBufferRef *picref = inlink->cur_buf;
     DrawTextContext *dtext = inlink->dst->priv;
+    int ret;
 
     if (dtext->draw)
         draw_text(inlink->dst, picref, picref->video->w, picref->video->h);
 
     dtext->var_values[VAR_N] += 1.0;
 
-    ff_draw_slice(outlink, 0, picref->video->h, 1);
-    ff_end_frame(outlink);
+    if ((ret = ff_draw_slice(outlink, 0, picref->video->h, 1)) < 0 ||
+        (ret = ff_end_frame(outlink)) < 0)
+        return ret;
+    return 0;
 }
 
 AVFilter avfilter_vf_drawtext = {
index 0a2a655cce785b7c4f8482e99da77e947ec36922..c30a862ad616029e85a0e2646bebdd03d2264a8c 100644 (file)
@@ -137,17 +137,20 @@ static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
     return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     FadeContext *fade = inlink->dst->priv;
+    int ret;
 
-    ff_end_frame(inlink->dst->outputs[0]);
+    ret = ff_end_frame(inlink->dst->outputs[0]);
 
     if (fade->frame_index >= fade->start_frame &&
         fade->frame_index <= fade->stop_frame)
         fade->factor += fade->fade_per_frame;
     fade->factor = av_clip_uint16(fade->factor);
     fade->frame_index++;
+
+    return ret;
 }
 
 AVFilter avfilter_vf_fade = {
index 312ff4fc26db2772682de676270b6b67a884aef3..4ea7fe1127adb599b161c61a44bdf9727a57501b 100644 (file)
@@ -163,7 +163,7 @@ static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
     return 0;
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     AVFilterContext   *ctx        = inlink->dst;
     FieldOrderContext *fieldorder = ctx->priv;
@@ -227,7 +227,7 @@ static void end_frame(AVFilterLink *inlink)
                 "not interlaced or field order already correct\n");
     }
 
-    ff_end_frame(outlink);
+    return ff_end_frame(outlink);
 }
 
 AVFilter avfilter_vf_fieldorder = {
index 619a86cc11478d1c9dad257735e3a49b0c990691..9ca0668c766b7c34c6570bba89a22bb4c2404c85 100644 (file)
@@ -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)
index 21221e1ed8cd267d56aa8b04c1e1885d0d6ce1b9..472177934817c9a81a5e9acfac83f010b86cc4eb 100644 (file)
@@ -345,18 +345,21 @@ static int null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
     return 0;
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     Frei0rContext *frei0r = inlink->dst->priv;
     AVFilterLink *outlink = inlink->dst->outputs[0];
     AVFilterBufferRef  *inpicref =  inlink->cur_buf;
     AVFilterBufferRef *outpicref = outlink->out_buf;
+    int ret;
 
     frei0r->update(frei0r->instance, inpicref->pts * av_q2d(inlink->time_base) * 1000,
                    (const uint32_t *)inpicref->data[0],
                    (uint32_t *)outpicref->data[0]);
-    ff_draw_slice(outlink, 0, outlink->h, 1);
-    ff_end_frame(outlink);
+    if ((ret = ff_draw_slice(outlink, 0, outlink->h, 1)) ||
+        (ret = ff_end_frame(outlink)) < 0)
+        return ret;
+    return 0;
 }
 
 AVFilter avfilter_vf_frei0r = {
index 61be40c913bf7b5c417e298f0079b7a126087091..d73e83386523b858b789e9b2b8f0514c6efefd71 100644 (file)
@@ -215,13 +215,13 @@ static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
     return 0;
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     GradFunContext *gf = inlink->dst->priv;
     AVFilterBufferRef *inpic = inlink->cur_buf;
     AVFilterLink *outlink = inlink->dst->outputs[0];
     AVFilterBufferRef *outpic = outlink->out_buf;
-    int p;
+    int p, ret;
 
     for (p = 0; p < 4 && inpic->data[p]; p++) {
         int w = inlink->w;
@@ -239,8 +239,10 @@ static void end_frame(AVFilterLink *inlink)
             av_image_copy_plane(outpic->data[p], outpic->linesize[p], inpic->data[p], inpic->linesize[p], w, h);
     }
 
-    ff_draw_slice(outlink, 0, inlink->h, 1);
-    ff_end_frame(outlink);
+    if ((ret = ff_draw_slice(outlink, 0, inlink->h, 1)) < 0 ||
+        (ret = ff_end_frame(outlink)) < 0)
+        return ret;
+    return 0;
 }
 
 AVFilter avfilter_vf_gradfun = {
index 3985ce45013af7568307535310af1cc32a1b4b31..9e01606041413a11a9e60621411fd0f8ee4dd139 100644 (file)
@@ -295,7 +295,7 @@ static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
     return 0;
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     HQDN3DContext *hqdn3d = inlink->dst->priv;
     AVFilterLink *outlink = inlink->dst->outputs[0];
@@ -303,6 +303,7 @@ static void end_frame(AVFilterLink *inlink)
     AVFilterBufferRef *outpic = outlink->out_buf;
     int cw = inpic->video->w >> hqdn3d->hsub;
     int ch = inpic->video->h >> hqdn3d->vsub;
+    int ret;
 
     deNoise(inpic->data[0], outpic->data[0],
             hqdn3d->Line, &hqdn3d->Frame[0], inpic->video->w, inpic->video->h,
@@ -323,8 +324,10 @@ static void end_frame(AVFilterLink *inlink)
             hqdn3d->Coefs[2],
             hqdn3d->Coefs[3]);
 
-    ff_draw_slice(outlink, 0, inpic->video->h, 1);
-    ff_end_frame(outlink);
+    if ((ret = ff_draw_slice(outlink, 0, inpic->video->h, 1)) < 0 ||
+        (ret = ff_end_frame(outlink)) < 0)
+        return ret;
+    return 0;
 }
 
 AVFilter avfilter_vf_hqdn3d = {
index aa30d3688069d03334378a8d0e59ffc5c2890eac..e60caf2bc3ac0adcca49aa28f7d654d94a168c92 100644 (file)
@@ -354,7 +354,7 @@ static av_cold void uninit(AVFilterContext *ctx)
     memset(ocv, 0, sizeof(*ocv));
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     OCVContext *ocv = ctx->priv;
@@ -362,14 +362,17 @@ static void end_frame(AVFilterLink *inlink)
     AVFilterBufferRef *inpicref  = inlink ->cur_buf;
     AVFilterBufferRef *outpicref = outlink->out_buf;
     IplImage inimg, outimg;
+    int ret;
 
     fill_iplimage_from_picref(&inimg , inpicref , inlink->format);
     fill_iplimage_from_picref(&outimg, outpicref, inlink->format);
     ocv->end_frame_filter(ctx, &inimg, &outimg);
     fill_picref_from_iplimage(outpicref, &outimg, inlink->format);
 
-    ff_draw_slice(outlink, 0, outlink->h, 1);
-    ff_end_frame(outlink);
+    if ((ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 ||
+        (ret = ff_end_frame(outlink)) < 0)
+        return ret;
+    return 0;
 }
 
 AVFilter avfilter_vf_ocv = {
index 2b9439c911ae85305270b8cc0a4274fbee2dc4d8..a0c423de26b411563b20b44f6df0e9d86222b5d2 100644 (file)
@@ -337,9 +337,9 @@ static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
     return ff_draw_slice(outlink, y, h, slice_dir);
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
-    ff_end_frame(inlink->dst->outputs[0]);
+    return ff_end_frame(inlink->dst->outputs[0]);
 }
 
 static int null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
@@ -347,7 +347,10 @@ static int null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
     return 0;
 }
 
-static void null_end_frame(AVFilterLink *inlink) { }
+static int null_end_frame(AVFilterLink *inlink)
+{
+    return 0;
+}
 
 static int poll_frame(AVFilterLink *link)
 {
index 2f641f2eb6f2d030a4b876edd98d28a6ce049679..262a41648830c2f59113abc64a076c80570f8665 100644 (file)
@@ -362,9 +362,9 @@ fail:
     return ret;
 }
 
-static void end_frame(AVFilterLink *link)
+static int end_frame(AVFilterLink *link)
 {
-    ff_end_frame(link->dst->outputs[0]);
+    return ff_end_frame(link->dst->outputs[0]);
 }
 
 static int draw_send_bar_slice(AVFilterLink *link, int y, int h, int slice_dir, int before_slice)
index a4bb2dfe2b905b1b931ab751fee0414f13205665..b9e053fc036daa51ca425d5b4c28c07a867419a7 100644 (file)
@@ -258,15 +258,16 @@ static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
     return 0;
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     SelectContext *select = inlink->dst->priv;
 
     if (select->select) {
         if (select->cache_frames)
-            return;
-        ff_end_frame(inlink->dst->outputs[0]);
+            return 0;
+        return ff_end_frame(inlink->dst->outputs[0]);
     }
+    return 0;
 }
 
 static int request_frame(AVFilterLink *outlink)
index cc1360e76c417cecf256d693abf93e06a97ec856..254141d6778bb660d9901124ac79877c605b0f1d 100644 (file)
@@ -40,7 +40,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
     return 0;
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     ShowInfoContext *showinfo = ctx->priv;
@@ -76,7 +76,7 @@ static void end_frame(AVFilterLink *inlink)
            checksum, plane_checksum[0], plane_checksum[1], plane_checksum[2], plane_checksum[3]);
 
     showinfo->frame++;
-    ff_end_frame(inlink->dst->outputs[0]);
+    return ff_end_frame(inlink->dst->outputs[0]);
 }
 
 AVFilter avfilter_vf_showinfo = {
index cafd17d42aba1304e3bcd6577ceab559ed37de8e..49b54d760b5d55ddc791f2069141e86f57ec495f 100644 (file)
@@ -138,13 +138,13 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
     return ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0));
 }
 
-static void end_frame(AVFilterLink *inlink)
+static int end_frame(AVFilterLink *inlink)
 {
     TransContext *trans = inlink->dst->priv;
     AVFilterBufferRef *inpic  = inlink->cur_buf;
     AVFilterBufferRef *outpic = inlink->dst->outputs[0]->out_buf;
     AVFilterLink *outlink = inlink->dst->outputs[0];
-    int plane;
+    int plane, ret;
 
     for (plane = 0; outpic->data[plane]; plane++) {
         int hsub = plane == 1 || plane == 2 ? trans->hsub : 0;
@@ -195,8 +195,10 @@ static void end_frame(AVFilterLink *inlink)
         }
     }
 
-    ff_draw_slice(outlink, 0, outpic->video->h, 1);
-    ff_end_frame(outlink);
+    if ((ret = ff_draw_slice(outlink, 0, outpic->video->h, 1)) < 0 ||
+        (ret = ff_end_frame(outlink)) < 0)
+        return ret;
+    return 0;
 }
 
 AVFilter avfilter_vf_transpose = {
index 41bcae2dd119e5e569e22705e19888232d087f04..6140c75a871d0ce0832396c79e14613dd97eb90b 100644 (file)
@@ -213,20 +213,23 @@ static av_cold void uninit(AVFilterContext *ctx)
     free_filter_param(&unsharp->chroma);
 }
 
-static void end_frame(AVFilterLink *link)
+static int end_frame(AVFilterLink *link)
 {
     UnsharpContext *unsharp = link->dst->priv;
     AVFilterBufferRef *in  = link->cur_buf;
     AVFilterBufferRef *out = link->dst->outputs[0]->out_buf;
     int cw = SHIFTUP(link->w, unsharp->hsub);
     int ch = SHIFTUP(link->h, unsharp->vsub);
+    int ret;
 
     apply_unsharp(out->data[0], out->linesize[0], in->data[0], in->linesize[0], link->w, link->h, &unsharp->luma);
     apply_unsharp(out->data[1], out->linesize[1], in->data[1], in->linesize[1], cw,      ch,      &unsharp->chroma);
     apply_unsharp(out->data[2], out->linesize[2], in->data[2], in->linesize[2], cw,      ch,      &unsharp->chroma);
 
-    ff_draw_slice(link->dst->outputs[0], 0, link->h, 1);
-    ff_end_frame(link->dst->outputs[0]);
+    if ((ret = ff_draw_slice(link->dst->outputs[0], 0, link->h, 1)) < 0 ||
+        (ret = ff_end_frame(link->dst->outputs[0])) < 0)
+        return ret;
+    return 0;
 }
 
 static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
index 19652aa4652189b6e178eaad6ffab396e1807cf8..69efc8a08a629db00e108307f18ad24bb4693307 100644 (file)
@@ -240,21 +240,23 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
     return ff_start_frame(ctx->outputs[0], yadif->out);
 }
 
-static void end_frame(AVFilterLink *link)
+static int end_frame(AVFilterLink *link)
 {
     AVFilterContext *ctx = link->dst;
     YADIFContext *yadif = ctx->priv;
 
     if (!yadif->out)
-        return;
+        return 0;
 
     if (yadif->auto_enable && !yadif->cur->video->interlaced) {
-        ff_draw_slice(ctx->outputs[0], 0, link->h, 1);
-        ff_end_frame(ctx->outputs[0]);
-        return;
+        int ret = ff_draw_slice(ctx->outputs[0], 0, link->h, 1);
+        if (ret >= 0)
+            ret = ff_end_frame(ctx->outputs[0]);
+        return ret;
     }
 
     return_frame(ctx, 0);
+    return 0;
 }
 
 static int request_frame(AVFilterLink *link)
index ffcc2347fcee825afdbb2094821f369f8bee96c3..8dd5bf4272b5bfa08326a93e8a6bdbe7e74b4f68 100644 (file)
@@ -234,12 +234,12 @@ int ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
     return ret;
 }
 
-void ff_null_end_frame(AVFilterLink *link)
+int ff_null_end_frame(AVFilterLink *link)
 {
-    ff_end_frame(link->dst->outputs[0]);
+    return ff_end_frame(link->dst->outputs[0]);
 }
 
-static void default_end_frame(AVFilterLink *inlink)
+static int default_end_frame(AVFilterLink *inlink)
 {
     AVFilterLink *outlink = NULL;
 
@@ -247,20 +247,24 @@ static void default_end_frame(AVFilterLink *inlink)
         outlink = inlink->dst->outputs[0];
 
     if (outlink) {
-        ff_end_frame(outlink);
+        return ff_end_frame(outlink);
     }
+    return 0;
 }
 
-void ff_end_frame(AVFilterLink *link)
+int ff_end_frame(AVFilterLink *link)
 {
-    void (*end_frame)(AVFilterLink *);
+    int (*end_frame)(AVFilterLink *);
+    int ret;
 
     if (!(end_frame = link->dstpad->end_frame))
         end_frame = default_end_frame;
 
-    end_frame(link);
+    ret = end_frame(link);
 
     clear_link(link);
+
+    return ret;
 }
 
 int ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
index 893960e7c1d1e123993ab048ffa63b6ba874bd20..ef4a1a9c326bedd1b25a2fb0aad6246990acfc09 100644 (file)
@@ -41,7 +41,7 @@ AVFilterBufferRef *ff_get_video_buffer(AVFilterLink *link, int perms,
 
 int ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
 int ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
-void ff_null_end_frame(AVFilterLink *link);
+int ff_null_end_frame(AVFilterLink *link);
 
 /**
  * Notify the next filter of the start of a frame.
@@ -61,8 +61,10 @@ int ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
  * Notify the next filter that the current frame has finished.
  *
  * @param link the output link the frame was sent over
+ *
+ * @return >= 0 on success, a negative AVERROR on error
  */
-void ff_end_frame(AVFilterLink *link);
+int ff_end_frame(AVFilterLink *link);
 
 /**
  * Send a slice to the next filter.
index 8d656e111f7a6df1bfec061de6a5657a6a4d0fe7..e03dcf0085e4a2d0785fb1961414b8cfb4d01a6a 100644 (file)
@@ -24,8 +24,9 @@ static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
     return 0;
 }
 
-static void end_frame(AVFilterLink *link)
+static int end_frame(AVFilterLink *link)
 {
+    return 0;
 }
 
 AVFilter avfilter_vsink_nullsink = {