History

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

Michael Niedermayer committed 14 years ago

Commit 88beb2d2 parents 9023de3 df53a4a64 files · +764 −376Browse files

Unified · Split

64 files
  1. common.mak +1 −1
  2. libavfilter/af_join.c +2 −2
  3. libavfilter/avfilter.h +11 −4
  4. libavfilter/buffersink.c +3 −7
  5. libavfilter/buffersrc.c +6 −6
  6. libavfilter/f_settb.c +2 −2
  7. libavfilter/fifo.c +20 −14
  8. libavfilter/internal.h +9 −2
  9. libavfilter/sink_buffer.c +3 −2
  10. libavfilter/split.c +36 −15
  11. libavfilter/src_movie.c +17 −6
  12. libavfilter/vf_alphaextract.c +2 −2
  13. libavfilter/vf_alphamerge.c +4 −3
  14. libavfilter/vf_aspect.c +2 −2
  15. libavfilter/vf_ass.c +3 −3
  16. libavfilter/vf_bbox.c +2 −2
  17. libavfilter/vf_blackdetect.c +4 −4
  18. libavfilter/vf_blackframe.c +4 −4
  19. libavfilter/vf_boxblur.c +3 −3
  20. libavfilter/vf_colormatrix.c +5 −5
  21. libavfilter/vf_crop.c +10 −7
  22. libavfilter/vf_cropdetect.c +2 −2
  23. libavfilter/vf_delogo.c +32 −8
  24. libavfilter/vf_deshake.c +4 −3
  25. libavfilter/vf_drawbox.c +2 −2
  26. libavfilter/vf_drawtext.c +10 −4
  27. libavfilter/vf_fade.c +7 −4
  28. libavfilter/vf_fieldorder.c +22 −7
  29. libavfilter/vf_fps.c +45 −19
  30. libavfilter/vf_frei0r.c +34 −8
  31. libavfilter/vf_gradfun.c +32 −9
  32. libavfilter/vf_hflip.c +4 −4
  33. libavfilter/vf_hqdn3d.c +10 −4
  34. libavfilter/vf_idet.c +7 −7
  35. libavfilter/vf_libopencv.c +10 −4
  36. libavfilter/vf_lut.c +2 −2
  37. libavfilter/vf_mp.c +6 −3
  38. libavfilter/vf_overlay.c +16 −12
  39. libavfilter/vf_pad.c +37 −12
  40. libavfilter/vf_pixdesctest.c +23 −9
  41. libavfilter/vf_removelogo.c +5 −5
  42. libavfilter/vf_scale.c +28 −11
  43. libavfilter/vf_select.c +23 −13
  44. libavfilter/vf_setfield.c +2 −2
  45. libavfilter/vf_setpts.c +5 −2
  46. libavfilter/vf_showinfo.c +2 −2
  47. libavfilter/vf_slicify.c +17 −10
  48. libavfilter/vf_super2xsai.c +3 −3
  49. libavfilter/vf_swapuv.c +2 −2
  50. libavfilter/vf_thumbnail.c +6 −5
  51. libavfilter/vf_tile.c +8 −6
  52. libavfilter/vf_tinterlace.c +7 −4
  53. libavfilter/vf_transpose.c +16 −7
  54. libavfilter/vf_unsharp.c +8 −4
  55. libavfilter/vf_vflip.c +10 −4
  56. libavfilter/vf_yadif.c +42 −23
  57. libavfilter/video.c +63 −37
  58. libavfilter/video.h +14 −7
  59. libavfilter/vsink_nullsink.c +4 −2
  60. libavfilter/vsrc_color.c +24 −4
  61. libavfilter/vsrc_testsrc.c +8 −3
  62. libavformat/matroskadec.c +2 −1
  63. tests/Makefile +1 −0
  64. tests/fate/filter.mak +10 −0
common.mak+1−1
@@ -54,7 +54,7 @@ COMPILE_S = $(call COMPILE,AS) · 53 unmodified lines
5454 $(COMPILE_S)
5555
5656 %.ho: %.h
57− $(CC) $(CPPFLAGS) $(CFLAGS) -Wno-unused -c -o $@ -x c $<
57+ $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ -x c $<
5858
5959 %.ver: %.v
6060 $(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@
libavfilter/af_join.c+2−2
@@ -248,7 +248,7 @@ static void join_uninit(AVFilterContext *ctx) · 247 unmodified lines
248248
249249 for (i = 0; i < ctx->nb_inputs; i++) {
250250 av_freep(&ctx->input_pads[i].name);
251− avfilter_unref_buffer(s->input_frames[i]);
251+ avfilter_unref_bufferp(&s->input_frames[i]);
252252 }
253253
254254 av_freep(&s->channels);
@@ -402,7 +402,7 @@ static void join_free_buffer(AVFilterBuffer *buf) · 147 unmodified lines
402402 int i;
403403
404404 for (i = 0; i < priv->nb_in_buffers; i++)
405− avfilter_unref_buffer(priv->in_buffers[i]);
405+ avfilter_unref_bufferp(&priv->in_buffers[i]);
406406
407407 av_freep(&priv->in_buffers);
408408 av_freep(&buf->priv);
libavfilter/avfilter.h+11−4
@@ -261,8 +261,11 @@ struct AVFilterPad { · 260 unmodified lines
261261 * picture inside the link structure.
262262 *
263263 * Input video pads only.
264+ *
265+ * @return >= 0 on success, a negative AVERROR on error. picref will be
266+ * unreferenced by the caller in case of error.
264267 */
265− void (*start_frame)(AVFilterLink *link, AVFilterBufferRef *picref);
268+ int (*start_frame)(AVFilterLink *link, AVFilterBufferRef *picref);
266269
267270 /**
268271 * Callback function to get a video buffer. If NULL, the filter system will
@@ -287,16 +290,20 @@ struct AVFilterPad { · 18 unmodified lines
287290 * in the link structure during start_frame().
288291 *
289292 * Input video pads only.
293+ *
294+ * @return >= 0 on success, a negative AVERROR on error.
290295 */
291− void (*end_frame)(AVFilterLink *link);
296+ int (*end_frame)(AVFilterLink *link);
292297
293298 /**
294299 * Slice drawing callback. This is where a filter receives video data
295300 * and should do its processing.
296301 *
297302 * Input video pads only.
303+ *
304+ * @return >= 0 on success, a negative AVERROR on error.
298305 */
299− void (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir);
306+ int (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir);
300307
301308 /**
302309 * Samples filtering callback. This is where a filter receives audio data
@@ -385,7 +392,7 @@ enum AVMediaType avfilter_pad_get_type(AVFilterPad *pads, int pad_idx); · 82 unmodified lines
385392
386393 /** default handler for end_frame() for video inputs */
387394 attribute_deprecated
388−void avfilter_default_end_frame(AVFilterLink *link);
395+int avfilter_default_end_frame(AVFilterLink *link);
389396
390397 /**
391398 * Filter definition. This defines the pads a filter contains, and all the
libavfilter/buffersink.c+3−7
@@ -47,20 +47,16 @@ static av_cold void uninit(AVFilterContext *ctx) · 46 unmodified lines
4747 av_audio_fifo_free(sink->audio_fifo);
4848 }
4949
50−static void start_frame(AVFilterLink *link, AVFilterBufferRef *buf)
50+static int start_frame(AVFilterLink *link, AVFilterBufferRef *buf)
5151 {
5252 BufferSinkContext *s = link->dst->priv;
5353
5454 // av_assert0(!s->cur_buf);
5555 s->cur_buf = buf;
5656 link->cur_buf = NULL;
57−};
5857
59−static int filter_samples(AVFilterLink *link, AVFilterBufferRef *buf)
60−{
61− start_frame(link, buf);
6258 return 0;
63−}
59+};
6460
6561 int av_buffersink_read(AVFilterContext *ctx, AVFilterBufferRef **buf)
6662 {
@@ -166,7 +162,7 @@ AVFilter avfilter_asink_abuffer = { · 99 unmodified lines
166162
167163 .inputs = (const AVFilterPad[]) {{ .name = "default",
168164 .type = AVMEDIA_TYPE_AUDIO,
169− .filter_samples = filter_samples,
165+ .filter_samples = start_frame,
170166 .min_perms = AV_PERM_READ,
171167 .needs_fifo = 1 },
172168 { .name = NULL }},
libavfilter/buffersrc.c+6−6
@@ -382,19 +382,19 @@ static int request_frame(AVFilterLink *link) · 381 unmodified lines
382382
383383 switch (link->type) {
384384 case AVMEDIA_TYPE_VIDEO:
385− ff_start_frame(link, avfilter_ref_buffer(buf, ~0));
386− ff_draw_slice(link, 0, link->h, 1);
387− ff_end_frame(link);
385+ if ((ret = ff_start_frame(link, buf)) < 0 ||
386+ (ret = ff_draw_slice(link, 0, link->h, 1)) < 0 ||
387+ (ret = ff_end_frame(link)) < 0)
388+ return ret;
388389 break;
389390 case AVMEDIA_TYPE_AUDIO:
390− ret = ff_filter_samples(link, avfilter_ref_buffer(buf, ~0));
391+ ret = ff_filter_samples(link, buf);
391392 break;
392393 default:
394+ avfilter_unref_bufferp(&buf);
393395 return AVERROR(EINVAL);
394396 }
395397
396− avfilter_unref_buffer(buf);
397−
398398 return ret;
399399 }
400400
libavfilter/f_settb.c+2−2
@@ -99,7 +99,7 @@ static int config_output_props(AVFilterLink *outlink) · 98 unmodified lines
9999 return 0;
100100 }
101101
102−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
102+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
103103 {
104104 AVFilterContext *ctx = inlink->dst;
105105 AVFilterLink *outlink = ctx->outputs[0];
@@ -113,7 +113,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 7 unmodified lines
113113 }
114114 inlink->cur_buf = NULL;
115115
116− ff_start_frame(outlink, picref);
116+ return ff_start_frame(outlink, picref);
117117 }
118118
119119 static int filter_samples(AVFilterLink *inlink, AVFilterBufferRef *insamples)
libavfilter/fifo.c+20−14
@@ -65,17 +65,18 @@ static av_cold void uninit(AVFilterContext *ctx) · 64 unmodified lines
6565
6666 for (buf = fifo->root.next; buf; buf = tmp) {
6767 tmp = buf->next;
68− avfilter_unref_buffer(buf->buf);
68+ avfilter_unref_bufferp(&buf->buf);
6969 av_free(buf);
7070 }
7171
72− avfilter_unref_buffer(fifo->buf_out);
72+ avfilter_unref_bufferp(&fifo->buf_out);
7373 }
7474
7575 static int add_to_queue(AVFilterLink *inlink, AVFilterBufferRef *buf)
7676 {
7777 FifoContext *fifo = inlink->dst->priv;
7878
79+ inlink->cur_buf = NULL;
7980 fifo->last->next = av_mallocz(sizeof(Buf));
8081 if (!fifo->last->next) {
8182 avfilter_unref_buffer(buf);
@@ -88,12 +89,6 @@ static int add_to_queue(AVFilterLink *inlink, AVFilterBufferRef *buf) · 6 unmodified lines
8889 return 0;
8990 }
9091
91−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *buf)
92−{
93− add_to_queue(inlink, buf);
94− inlink->cur_buf = NULL;
95−}
96−
9792 static void queue_pop(FifoContext *s)
9893 {
9994 Buf *tmp = s->root.next->next;
@@ -103,9 +98,15 @@ static void queue_pop(FifoContext *s) · 3 unmodified lines
10398 s->root.next = tmp;
10499 }
105100
106−static void end_frame(AVFilterLink *inlink) { }
101+static int end_frame(AVFilterLink *inlink)
102+{
103+ return 0;
104+}
107105
108−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { }
106+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
107+{
108+ return 0;
109+}
109110
110111 /**
111112 * Move data pointers and pts offset samples forward.
@@ -168,6 +169,9 @@ static int return_audio_frame(AVFilterContext *ctx) · 56 unmodified lines
168169 queue_pop(s);
169170 } else {
170171 buf_out = avfilter_ref_buffer(head, AV_PERM_READ);
172+ if (!buf_out)
173+ return AVERROR(ENOMEM);
174+
171175 buf_out->audio->nb_samples = link->request_samples;
172176 buffer_offset(link, head, link->request_samples);
173177 }
@@ -240,9 +244,11 @@ static int request_frame(AVFilterLink *outlink) · 66 unmodified lines
240244 * so we don't have to worry about dereferencing it ourselves. */
241245 switch (outlink->type) {
242246 case AVMEDIA_TYPE_VIDEO:
243− ff_start_frame(outlink, fifo->root.next->buf);
244− ff_draw_slice (outlink, 0, outlink->h, 1);
245− ff_end_frame (outlink);
247+ if ((ret = ff_start_frame(outlink, fifo->root.next->buf)) < 0 ||
248+ (ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 ||
249+ (ret = ff_end_frame(outlink)) < 0)
250+ return ret;
251+
246252 queue_pop(fifo);
247253 break;
248254 case AVMEDIA_TYPE_AUDIO:
@@ -272,7 +278,7 @@ AVFilter avfilter_vf_fifo = { · 23 unmodified lines
272278 .inputs = (const AVFilterPad[]) {{ .name = "default",
273279 .type = AVMEDIA_TYPE_VIDEO,
274280 .get_video_buffer= ff_null_get_video_buffer,
275− .start_frame = start_frame,
281+ .start_frame = add_to_queue,
276282 .draw_slice = draw_slice,
277283 .end_frame = end_frame,
278284 .rej_perms = AV_PERM_REUSE2, },
libavfilter/internal.h+9−2
@@ -93,6 +93,9 @@ struct AVFilterPad { · 92 unmodified lines
9393 * picture inside the link structure.
9494 *
9595 * Input video pads only.
96+ *
97+ * @return >= 0 on success, a negative AVERROR on error. picref will be
98+ * unreferenced by the caller in case of error.
9699 */
97100 void (*start_frame)(AVFilterLink *link, AVFilterBufferRef *picref);
98101
@@ -119,16 +122,20 @@ struct AVFilterPad { · 20 unmodified lines
119122 * in the link structure during start_frame().
120123 *
121124 * Input video pads only.
125+ *
126+ * @return >= 0 on success, a negative AVERROR on error.
122127 */
123− void (*end_frame)(AVFilterLink *link);
128+ int (*end_frame)(AVFilterLink *link);
124129
125130 /**
126131 * Slice drawing callback. This is where a filter receives video data
127132 * and should do its processing.
128133 *
129134 * Input video pads only.
135+ *
136+ * @return >= 0 on success, a negative AVERROR on error.
130137 */
131− void (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir);
138+ int (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir);
132139
133140 /**
134141 * Samples filtering callback. This is where a filter receives audio data
libavfilter/sink_buffer.c+3−2
@@ -96,7 +96,7 @@ static av_cold void common_uninit(AVFilterContext *ctx) · 95 unmodified lines
9696 }
9797 }
9898
99−static void end_frame(AVFilterLink *inlink)
99+static int end_frame(AVFilterLink *inlink)
100100 {
101101 AVFilterContext *ctx = inlink->dst;
102102 BufferSinkContext *buf = inlink->dst->priv;
@@ -108,7 +108,7 @@ static void end_frame(AVFilterLink *inlink) · 5 unmodified lines
108108 av_log(ctx, AV_LOG_ERROR,
109109 "Cannot buffer more frames. Consume some available frames "
110110 "before adding new ones.\n");
111− return;
111+ return AVERROR(ENOMEM);
112112 }
113113 }
114114
@@ -124,6 +124,7 @@ static void end_frame(AVFilterLink *inlink) · 9 unmodified lines
124124 (char *)av_x_if_null(ctx->name, ctx->filter->name));
125125 buf->warning_limit *= 10;
126126 }
127+ return 0;
127128 }
128129
129130 void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size)
libavfilter/split.c+36−15
@@ -63,32 +63,47 @@ static void split_uninit(AVFilterContext *ctx) · 62 unmodified lines
6363 av_freep(&ctx->output_pads[i].name);
6464 }
6565
66−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
66+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
6767 {
6868 AVFilterContext *ctx = inlink->dst;
69− int i;
69+ int i, ret = 0;
7070
71− for (i = 0; i < ctx->nb_outputs; i++)
72− ff_start_frame(ctx->outputs[i],
73− avfilter_ref_buffer(picref, ~AV_PERM_WRITE));
71+ for (i = 0; i < ctx->nb_outputs; i++) {
72+ AVFilterBufferRef *buf_out = avfilter_ref_buffer(picref, ~AV_PERM_WRITE);
73+ if (!buf_out)
74+ return AVERROR(ENOMEM);
75+
76+ ret = ff_start_frame(ctx->outputs[i], buf_out);
77+ if (ret < 0)
78+ break;
79+ }
80+ return ret;
7481 }
7582
76−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
83+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
7784 {
7885 AVFilterContext *ctx = inlink->dst;
79− int i;
86+ int i, ret = 0;
8087
81− for (i = 0; i < ctx->nb_outputs; i++)
82− ff_draw_slice(ctx->outputs[i], y, h, slice_dir);
88+ for (i = 0; i < ctx->nb_outputs; i++) {
89+ ret = ff_draw_slice(ctx->outputs[i], y, h, slice_dir);
90+ if (ret < 0)
91+ break;
92+ }
93+ return ret;
8394 }
8495
85−static void end_frame(AVFilterLink *inlink)
96+static int end_frame(AVFilterLink *inlink)
8697 {
8798 AVFilterContext *ctx = inlink->dst;
88− int i;
99+ int i, ret = 0;
89100
90− for (i = 0; i < ctx->nb_outputs; i++)
91− ff_end_frame(ctx->outputs[i]);
101+ for (i = 0; i < ctx->nb_outputs; i++) {
102+ ret = ff_end_frame(ctx->outputs[i]);
103+ if (ret < 0)
104+ break;
105+ }
106+ return ret;
92107 }
93108
94109 AVFilter avfilter_vf_split = {
@@ -114,8 +129,14 @@ static int filter_samples(AVFilterLink *inlink, AVFilterBufferRef *samplesref) · 19 unmodified lines
114129 int i, ret = 0;
115130
116131 for (i = 0; i < ctx->nb_outputs; i++) {
117− ret = ff_filter_samples(inlink->dst->outputs[i],
118− avfilter_ref_buffer(samplesref, ~AV_PERM_WRITE));
132+ AVFilterBufferRef *buf_out = avfilter_ref_buffer(samplesref,
133+ ~AV_PERM_WRITE);
134+ if (!buf_out) {
135+ ret = AVERROR(ENOMEM);
136+ break;
137+ }
138+
139+ ret = ff_filter_samples(inlink->dst->outputs[i], buf_out);
119140 if (ret < 0)
120141 break;
121142 }
libavfilter/src_movie.c+17−6
@@ -326,13 +326,24 @@ static int movie_request_frame(AVFilterLink *outlink) · 325 unmodified lines
326326 return ret;
327327
328328 outpicref = avfilter_ref_buffer(movie->picref, ~0);
329− ff_start_frame(outlink, outpicref);
330− ff_draw_slice(outlink, 0, outlink->h, 1);
331− ff_end_frame(outlink);
332− avfilter_unref_buffer(movie->picref);
333− movie->picref = NULL;
329+ if (!outpicref) {
330+ ret = AVERROR(ENOMEM);
331+ goto fail;
332+ }
334333
335− return 0;
334+ ret = ff_start_frame(outlink, outpicref);
335+ if (ret < 0)
336+ goto fail;
337+
338+ ret = ff_draw_slice(outlink, 0, outlink->h, 1);
339+ if (ret < 0)
340+ goto fail;
341+
342+ ret = ff_end_frame(outlink);
343+fail:
344+ avfilter_unref_bufferp(&movie->picref);
345+
346+ return ret;
336347 }
337348
338349 AVFilter avfilter_vsrc_movie = {
libavfilter/vf_alphaextract.c+2−2
@@ -59,7 +59,7 @@ static int config_input(AVFilterLink *inlink) · 58 unmodified lines
5959 return 0;
6060 }
6161
62−static void draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir)
62+static int draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir)
6363 {
6464 AlphaExtractContext *extract = inlink->dst->priv;
6565 AVFilterBufferRef *cur_buf = inlink->cur_buf;
@@ -91,7 +91,7 @@ static void draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir) · 25 unmodified lines
9191 linesize);
9292 }
9393 }
94− ff_draw_slice(inlink->dst->outputs[0], y0, h, slice_dir);
94+ return ff_draw_slice(inlink->dst->outputs[0], y0, h, slice_dir);
9595 }
9696
9797 AVFilter avfilter_vf_alphaextract = {
libavfilter/vf_alphamerge.c+4−3
@@ -95,8 +95,8 @@ static int config_output(AVFilterLink *outlink) · 94 unmodified lines
9595 return 0;
9696 }
9797
98−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) {}
99−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) {}
98+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) {return 0;}
99+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) {return 0;}
100100
101101 static void draw_frame(AVFilterContext *ctx,
102102 AVFilterBufferRef *main_buf,
@@ -130,7 +130,7 @@ static void draw_frame(AVFilterContext *ctx, · 27 unmodified lines
130130 ff_draw_slice(ctx->outputs[0], 0, h, 1);
131131 }
132132
133−static void end_frame(AVFilterLink *inlink)
133+static int end_frame(AVFilterLink *inlink)
134134 {
135135 AVFilterContext *ctx = inlink->dst;
136136 AlphaMergeContext *merge = ctx->priv;
@@ -157,6 +157,7 @@ static void end_frame(AVFilterLink *inlink) · 20 unmodified lines
157157 ff_end_frame(ctx->outputs[0]);
158158 avfilter_unref_buffer(alpha_buf);
159159 }
160+ return 0;
160161 }
161162
162163 static int request_frame(AVFilterLink *outlink)
libavfilter/vf_aspect.c+2−2
@@ -51,13 +51,13 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 50 unmodified lines
5151 return 0;
5252 }
5353
54−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
54+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
5555 {
5656 AspectContext *aspect = link->dst->priv;
5757
5858 picref->video->sample_aspect_ratio = aspect->ratio;
5959 link->cur_buf = NULL;
60− ff_start_frame(link->dst->outputs[0], picref);
60+ return ff_start_frame(link->dst->outputs[0], picref);
6161 }
6262
6363 #if CONFIG_SETDAR_FILTER
libavfilter/vf_ass.c+3−3
@@ -157,7 +157,7 @@ static int config_input(AVFilterLink *inlink) · 156 unmodified lines
157157 return 0;
158158 }
159159
160−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
160+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { return 0; }
161161
162162 /* libass stores an RGBA color in the format RRGGBBTT, where TT is the transparency level */
163163 #define AR(c) ( (c)>>24)
@@ -180,7 +180,7 @@ static void overlay_ass_image(AssContext *ass, AVFilterBufferRef *picref, · 16 unmodified lines
180180 }
181181 }
182182
183−static void end_frame(AVFilterLink *inlink)
183+static int end_frame(AVFilterLink *inlink)
184184 {
185185 AVFilterContext *ctx = inlink->dst;
186186 AVFilterLink *outlink = ctx->outputs[0];
@@ -197,7 +197,7 @@ static void end_frame(AVFilterLink *inlink) · 10 unmodified lines
197197 overlay_ass_image(ass, picref, image);
198198
199199 ff_draw_slice(outlink, 0, picref->video->h, 1);
200− ff_end_frame(outlink);
200+ return ff_end_frame(outlink);
201201 }
202202
203203 AVFilter avfilter_vf_ass = {
libavfilter/vf_bbox.c+2−2
@@ -56,7 +56,7 @@ static int query_formats(AVFilterContext *ctx) · 55 unmodified lines
5656 return 0;
5757 }
5858
59−static void end_frame(AVFilterLink *inlink)
59+static int end_frame(AVFilterLink *inlink)
6060 {
6161 AVFilterContext *ctx = inlink->dst;
6262 BBoxContext *bbox = ctx->priv;
@@ -86,7 +86,7 @@ static void end_frame(AVFilterLink *inlink) · 23 unmodified lines
8686 av_log(ctx, AV_LOG_INFO, "\n");
8787
8888 bbox->frame++;
89− ff_end_frame(inlink->dst->outputs[0]);
89+ return ff_end_frame(inlink->dst->outputs[0]);
9090 }
9191
9292 AVFilter avfilter_vf_bbox = {
libavfilter/vf_blackdetect.c+4−4
@@ -146,7 +146,7 @@ static int request_frame(AVFilterLink *outlink) · 145 unmodified lines
146146 return ret;
147147 }
148148
149−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
149+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
150150 {
151151 AVFilterContext *ctx = inlink->dst;
152152 BlackDetectContext *blackdetect = ctx->priv;
@@ -160,10 +160,10 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) · 7 unmodified lines
160160 p += picref->linesize[0];
161161 }
162162
163− ff_draw_slice(ctx->outputs[0], y, h, slice_dir);
163+ return ff_draw_slice(ctx->outputs[0], y, h, slice_dir);
164164 }
165165
166−static void end_frame(AVFilterLink *inlink)
166+static int end_frame(AVFilterLink *inlink)
167167 {
168168 AVFilterContext *ctx = inlink->dst;
169169 BlackDetectContext *blackdetect = ctx->priv;
@@ -194,7 +194,7 @@ static void end_frame(AVFilterLink *inlink) · 24 unmodified lines
194194 blackdetect->last_picref_pts = picref->pts;
195195 blackdetect->frame_count++;
196196 blackdetect->nb_black_pixels = 0;
197− ff_end_frame(inlink->dst->outputs[0]);
197+ return ff_end_frame(inlink->dst->outputs[0]);
198198 }
199199
200200 AVFilter avfilter_vf_blackdetect = {
libavfilter/vf_blackframe.c+4−4
@@ -77,7 +77,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 76 unmodified lines
7777 return 0;
7878 }
7979
80−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
80+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
8181 {
8282 AVFilterContext *ctx = inlink->dst;
8383 BlackFrameContext *blackframe = ctx->priv;
@@ -91,10 +91,10 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) · 7 unmodified lines
9191 p += picref->linesize[0];
9292 }
9393
94− ff_draw_slice(ctx->outputs[0], y, h, slice_dir);
94+ return ff_draw_slice(ctx->outputs[0], y, h, slice_dir);
9595 }
9696
97−static void end_frame(AVFilterLink *inlink)
97+static int end_frame(AVFilterLink *inlink)
9898 {
9999 AVFilterContext *ctx = inlink->dst;
100100 BlackFrameContext *blackframe = ctx->priv;
@@ -114,7 +114,7 @@ static void end_frame(AVFilterLink *inlink) · 13 unmodified lines
114114
115115 blackframe->frame++;
116116 blackframe->nblack = 0;
117− ff_end_frame(inlink->dst->outputs[0]);
117+ return ff_end_frame(inlink->dst->outputs[0]);
118118 }
119119
120120 AVFilter avfilter_vf_blackframe = {
libavfilter/vf_boxblur.c+3−3
@@ -301,9 +301,9 @@ static void vblur(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_li · 300 unmodified lines
301301 h, radius, power, temp);
302302 }
303303
304−static void null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { }
304+static int null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { return 0; }
305305
306−static void end_frame(AVFilterLink *inlink)
306+static int end_frame(AVFilterLink *inlink)
307307 {
308308 AVFilterContext *ctx = inlink->dst;
309309 BoxBlurContext *boxblur = ctx->priv;
@@ -328,7 +328,7 @@ static void end_frame(AVFilterLink *inlink) · 18 unmodified lines
328328 boxblur->temp);
329329
330330 ff_draw_slice(outlink, 0, inlink->h, 1);
331− avfilter_default_end_frame(inlink);
331+ return avfilter_default_end_frame(inlink);
332332 }
333333
334334 AVFilter avfilter_vf_boxblur = {
libavfilter/vf_colormatrix.c+5−5
@@ -340,7 +340,7 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *inlink, int perms, int · 339 unmodified lines
340340 return picref;
341341 }
342342
343−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
343+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
344344 {
345345 AVFilterContext *ctx = link->dst;
346346 ColorMatrixContext *color = ctx->priv;
@@ -348,10 +348,10 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 1 unmodified line
348348
349349 color->outpicref = outpicref;
350350
351− ff_start_frame(link->dst->outputs[0], outpicref);
351+ return ff_start_frame(link->dst->outputs[0], outpicref);
352352 }
353353
354−static void end_frame(AVFilterLink *link)
354+static int end_frame(AVFilterLink *link)
355355 {
356356 AVFilterContext *ctx = link->dst;
357357 ColorMatrixContext *color = ctx->priv;
@@ -365,10 +365,10 @@ static void end_frame(AVFilterLink *link) · 7 unmodified lines
365365 process_frame_uyvy422(color, out, link->cur_buf);
366366
367367 ff_draw_slice(ctx->outputs[0], 0, link->dst->outputs[0]->h, 1);
368− ff_end_frame(ctx->outputs[0]);
368+ return ff_end_frame(ctx->outputs[0]);
369369 }
370370
371−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
371+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { return 0; }
372372
373373 AVFilter avfilter_vf_colormatrix = {
374374 .name = "colormatrix",
libavfilter/vf_crop.c+10−7
@@ -259,7 +259,7 @@ static int config_output(AVFilterLink *link) · 258 unmodified lines
259259 return 0;
260260 }
261261
262−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
262+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
263263 {
264264 AVFilterContext *ctx = link->dst;
265265 CropContext *crop = ctx->priv;
@@ -267,6 +267,9 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 1 unmodified line
267267 int i;
268268
269269 ref2 = avfilter_ref_buffer(picref, ~0);
270+ if (!ref2)
271+ return AVERROR(ENOMEM);
272+
270273 ref2->video->w = crop->w;
271274 ref2->video->h = crop->h;
272275
@@ -310,16 +313,16 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 37 unmodified lines
310313 ref2->data[3] += crop->x * crop->max_step[3];
311314 }
312315
313− ff_start_frame(link->dst->outputs[0], ref2);
316+ return ff_start_frame(link->dst->outputs[0], ref2);
314317 }
315318
316−static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
319+static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
317320 {
318321 AVFilterContext *ctx = link->dst;
319322 CropContext *crop = ctx->priv;
320323
321324 if (y >= crop->y + crop->h || y + h <= crop->y)
322− return;
325+ return 0;
323326
324327 if (y < crop->y) {
325328 h -= crop->y - y;
@@ -328,15 +331,15 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir) · 2 unmodified lines
328331 if (y + h > crop->y + crop->h)
329332 h = crop->y + crop->h - y;
330333
331− ff_draw_slice(ctx->outputs[0], y - crop->y, h, slice_dir);
334+ return ff_draw_slice(ctx->outputs[0], y - crop->y, h, slice_dir);
332335 }
333336
334−static void end_frame(AVFilterLink *link)
337+static int end_frame(AVFilterLink *link)
335338 {
336339 CropContext *crop = link->dst->priv;
337340
338341 crop->var_values[VAR_N] += 1.0;
339− ff_end_frame(link->dst->outputs[0]);
342+ return ff_end_frame(link->dst->outputs[0]);
340343 }
341344
342345 AVFilter avfilter_vf_crop = {
libavfilter/vf_cropdetect.c+2−2
@@ -114,7 +114,7 @@ static int config_input(AVFilterLink *inlink) · 113 unmodified lines
114114 return 0;
115115 }
116116
117−static void end_frame(AVFilterLink *inlink)
117+static int end_frame(AVFilterLink *inlink)
118118 {
119119 AVFilterContext *ctx = inlink->dst;
120120 CropDetectContext *cd = ctx->priv;
@@ -191,7 +191,7 @@ static void end_frame(AVFilterLink *inlink) · 70 unmodified lines
191191 w, h, x, y);
192192 }
193193
194− ff_end_frame(inlink->dst->outputs[0]);
194+ return ff_end_frame(inlink->dst->outputs[0]);
195195 }
196196
197197 AVFilter avfilter_vf_cropdetect = {
libavfilter/vf_delogo.c+32−8
@@ -209,27 +209,48 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 208 unmodified lines
209209 return 0;
210210 }
211211
212−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
212+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
213213 {
214214 AVFilterLink *outlink = inlink->dst->outputs[0];
215− AVFilterBufferRef *outpicref;
215+ AVFilterBufferRef *outpicref = NULL, *for_next_filter;
216+ int ret = 0;
216217
217218 if (inpicref->perms & AV_PERM_PRESERVE) {
218219 outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE,
219220 outlink->w, outlink->h);
221+ if (!outpicref)
222+ return AVERROR(ENOMEM);
223+
220224 avfilter_copy_buffer_ref_props(outpicref, inpicref);
221225 outpicref->video->w = outlink->w;
222226 outpicref->video->h = outlink->h;
223− } else
227+ } else {
224228 outpicref = avfilter_ref_buffer(inpicref, ~0);
229+ if (!outpicref)
230+ return AVERROR(ENOMEM);
231+ }
232+
233+ for_next_filter = avfilter_ref_buffer(outpicref, ~0);
234+ if (for_next_filter)
235+ ret = ff_start_frame(outlink, for_next_filter);
236+ else
237+ ret = AVERROR(ENOMEM);
238+
239+ if (ret < 0) {
240+ avfilter_unref_bufferp(&outpicref);
241+ return ret;
242+ }
225243
226244 outlink->out_buf = outpicref;
227− ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
245+ return 0;
228246 }
229247
230−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
248+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
249+{
250+ return 0;
251+}
231252
232−static void end_frame(AVFilterLink *inlink)
253+static int end_frame(AVFilterLink *inlink)
233254 {
234255 DelogoContext *delogo = inlink->dst->priv;
235256 AVFilterLink *outlink = inlink->dst->outputs[0];
@@ -239,6 +260,7 @@ static void end_frame(AVFilterLink *inlink) · 3 unmodified lines
239260 int hsub0 = av_pix_fmt_descriptors[inlink->format].log2_chroma_w;
240261 int vsub0 = av_pix_fmt_descriptors[inlink->format].log2_chroma_h;
241262 int plane;
263+ int ret;
242264
243265 for (plane = 0; plane < 4 && inpicref->data[plane]; plane++) {
244266 int hsub = plane == 1 || plane == 2 ? hsub0 : 0;
@@ -253,8 +275,10 @@ static void end_frame(AVFilterLink *inlink) · 8 unmodified lines
253275 delogo->show, direct);
254276 }
255277
256− ff_draw_slice(outlink, 0, inlink->h, 1);
257− ff_end_frame(outlink);
278+ if ((ret = ff_draw_slice(outlink, 0, inlink->h, 1)) < 0 ||
279+ (ret = ff_end_frame(outlink)) < 0)
280+ return ret;
281+ return 0;
258282 }
259283
260284 AVFilter avfilter_vf_delogo = {
libavfilter/vf_deshake.c+4−3
@@ -425,7 +425,7 @@ static av_cold void uninit(AVFilterContext *ctx) · 424 unmodified lines
425425 av_freep(&deshake->avctx);
426426 }
427427
428−static void end_frame(AVFilterLink *link)
428+static int end_frame(AVFilterLink *link)
429429 {
430430 DeshakeContext *deshake = link->dst->priv;
431431 AVFilterBufferRef *in = link->cur_buf;
@@ -529,11 +529,12 @@ static void end_frame(AVFilterLink *link) · 97 unmodified lines
529529
530530 // Draw the transformed frame information
531531 ff_draw_slice(link->dst->outputs[0], 0, link->h, 1);
532− ff_end_frame(link->dst->outputs[0]);
532+ return ff_end_frame(link->dst->outputs[0]);
533533 }
534534
535−static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
535+static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
536536 {
537+ return 0;
537538 }
538539
539540 AVFilter avfilter_vf_deshake = {
libavfilter/vf_drawbox.c+2−2
@@ -94,7 +94,7 @@ static int config_input(AVFilterLink *inlink) · 93 unmodified lines
9494 return 0;
9595 }
9696
97−static void draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir)
97+static int draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir)
9898 {
9999 DrawBoxContext *drawbox = inlink->dst->priv;
100100 int plane, x, y, xb = drawbox->x, yb = drawbox->y;
@@ -120,7 +120,7 @@ static void draw_slice(AVFilterLink *inlink, int y0, int h, int slice_dir) · 19 unmodified lines
120120 }
121121 }
122122
123− ff_draw_slice(inlink->dst->outputs[0], y0, h, 1);
123+ return ff_draw_slice(inlink->dst->outputs[0], y0, h, 1);
124124 }
125125
126126 AVFilter avfilter_vf_drawbox = {
libavfilter/vf_drawtext.c+10−4
@@ -780,14 +780,18 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref, · 779 unmodified lines
780780 return 0;
781781 }
782782
783−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
783+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
784+{
785+ return 0;
786+}
784787
785−static void end_frame(AVFilterLink *inlink)
788+static int end_frame(AVFilterLink *inlink)
786789 {
787790 AVFilterContext *ctx = inlink->dst;
788791 AVFilterLink *outlink = ctx->outputs[0];
789792 DrawTextContext *dtext = ctx->priv;
790793 AVFilterBufferRef *picref = inlink->cur_buf;
794+ int ret;
791795
792796 dtext->var_values[VAR_T] = picref->pts == AV_NOPTS_VALUE ?
793797 NAN : picref->pts * av_q2d(inlink->time_base);
@@ -801,8 +805,10 @@ static void end_frame(AVFilterLink *inlink) · 7 unmodified lines
801805
802806 dtext->var_values[VAR_N] += 1.0;
803807
804− ff_draw_slice(outlink, 0, picref->video->h, 1);
805− ff_end_frame(outlink);
808+ if ((ret = ff_draw_slice(outlink, 0, picref->video->h, 1)) < 0 ||
809+ (ret = ff_end_frame(outlink)) < 0)
810+ return ret;
811+ return 0;
806812 }
807813
808814 AVFilter avfilter_vf_drawtext = {
libavfilter/vf_fade.c+7−4
@@ -214,7 +214,7 @@ static void fade_plane(int y, int h, int w, · 213 unmodified lines
214214 }
215215 }
216216
217−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
217+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
218218 {
219219 FadeContext *fade = inlink->dst->priv;
220220 AVFilterBufferRef *outpic = inlink->cur_buf;
@@ -255,20 +255,23 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) · 34 unmodified lines
255255 }
256256 }
257257
258− ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
258+ return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
259259 }
260260
261−static void end_frame(AVFilterLink *inlink)
261+static int end_frame(AVFilterLink *inlink)
262262 {
263263 FadeContext *fade = inlink->dst->priv;
264+ int ret;
264265
265− ff_end_frame(inlink->dst->outputs[0]);
266+ ret = ff_end_frame(inlink->dst->outputs[0]);
266267
267268 if (fade->frame_index >= fade->start_frame &&
268269 fade->frame_index <= fade->stop_frame)
269270 fade->factor += fade->fade_per_frame;
270271 fade->factor = av_clip_uint16(fade->factor);
271272 fade->frame_index++;
273+
274+ return ret;
272275 }
273276
274277 AVFilter avfilter_vf_fade = {
libavfilter/vf_fieldorder.c+22−7
@@ -116,21 +116,35 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *inlink, int perms, int · 115 unmodified lines
116116 return ff_get_video_buffer(outlink, perms, w, h);
117117 }
118118
119−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
119+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
120120 {
121121 AVFilterContext *ctx = inlink->dst;
122122 AVFilterLink *outlink = ctx->outputs[0];
123123
124124 AVFilterBufferRef *outpicref, *for_next_filter;
125+ int ret = 0;
125126
126127 outpicref = avfilter_ref_buffer(inpicref, ~0);
127− outlink->out_buf = outpicref;
128+ if (!outpicref)
129+ return AVERROR(ENOMEM);
128130
129131 for_next_filter = avfilter_ref_buffer(outpicref, ~0);
130− ff_start_frame(outlink, for_next_filter);
132+ if (!for_next_filter) {
133+ avfilter_unref_bufferp(&outpicref);
134+ return AVERROR(ENOMEM);
135+ }
136+
137+ ret = ff_start_frame(outlink, for_next_filter);
138+ if (ret < 0) {
139+ avfilter_unref_bufferp(&outpicref);
140+ return ret;
141+ }
142+
143+ outlink->out_buf = outpicref;
144+ return 0;
131145 }
132146
133−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
147+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
134148 {
135149 AVFilterContext *ctx = inlink->dst;
136150 FieldOrderContext *fieldorder = ctx->priv;
@@ -144,11 +158,12 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) · 7 unmodified lines
144158 * and that complexity will be added later */
145159 if ( !inpicref->video->interlaced
146160 || inpicref->video->top_field_first == fieldorder->dst_tff) {
147− ff_draw_slice(outlink, y, h, slice_dir);
161+ return ff_draw_slice(outlink, y, h, slice_dir);
148162 }
163+ return 0;
149164 }
150165
151−static void end_frame(AVFilterLink *inlink)
166+static int end_frame(AVFilterLink *inlink)
152167 {
153168 AVFilterContext *ctx = inlink->dst;
154169 FieldOrderContext *fieldorder = ctx->priv;
@@ -212,7 +227,7 @@ static void end_frame(AVFilterLink *inlink) · 57 unmodified lines
212227 "not interlaced or field order already correct\n");
213228 }
214229
215− ff_end_frame(outlink);
230+ return ff_end_frame(outlink);
216231 }
217232
218233 AVFilter avfilter_vf_fieldorder = {
libavfilter/vf_fps.c+45−19
@@ -143,9 +143,11 @@ static int request_frame(AVFilterLink *outlink) · 142 unmodified lines
143143 buf->pts = av_rescale_q(s->first_pts, ctx->inputs[0]->time_base,
144144 outlink->time_base) + s->frames_out;
145145
146− ff_start_frame(outlink, buf);
147− ff_draw_slice(outlink, 0, outlink->h, 1);
148− ff_end_frame(outlink);
146+ if ((ret = ff_start_frame(outlink, buf)) < 0 ||
147+ (ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 ||
148+ (ret = ff_end_frame(outlink)) < 0)
149+ return ret;
150+
149151 s->frames_out++;
150152 }
151153 return 0;
@@ -159,28 +161,33 @@ static int write_to_fifo(AVFifoBuffer *fifo, AVFilterBufferRef *buf) · 7 unmodified lines
159161 int ret;
160162
161163 if (!av_fifo_space(fifo) &&
162− (ret = av_fifo_realloc2(fifo, 2*av_fifo_size(fifo))))
164+ (ret = av_fifo_realloc2(fifo, 2*av_fifo_size(fifo)))) {
165+ avfilter_unref_bufferp(&buf);
163166 return ret;
167+ }
164168
165169 av_fifo_generic_write(fifo, &buf, sizeof(buf), NULL);
166170 return 0;
167171 }
168172
169−static void end_frame(AVFilterLink *inlink)
173+static int end_frame(AVFilterLink *inlink)
170174 {
171175 AVFilterContext *ctx = inlink->dst;
172176 FPSContext *s = ctx->priv;
173177 AVFilterLink *outlink = ctx->outputs[0];
174178 AVFilterBufferRef *buf = inlink->cur_buf;
175179 int64_t delta;
176− int i;
180+ int i, ret;
177181
178182 inlink->cur_buf = NULL;
179183 s->frames_in++;
180184 /* discard frames until we get the first timestamp */
181185 if (s->pts == AV_NOPTS_VALUE) {
182186 if (buf->pts != AV_NOPTS_VALUE) {
183− write_to_fifo(s->fifo, buf);
187+ ret = write_to_fifo(s->fifo, buf);
188+ if (ret < 0)
189+ return ret;
190+
184191 s->first_pts = s->pts = buf->pts;
185192 } else {
186193 av_log(ctx, AV_LOG_WARNING, "Discarding initial frame(s) with no "
@@ -188,13 +195,12 @@ static void end_frame(AVFilterLink *inlink) · 1 unmodified line
188195 avfilter_unref_buffer(buf);
189196 s->drop++;
190197 }
191− return;
198+ return 0;
192199 }
193200
194201 /* now wait for the next timestamp */
195202 if (buf->pts == AV_NOPTS_VALUE) {
196− write_to_fifo(s->fifo, buf);
197− return;
203+ return write_to_fifo(s->fifo, buf);
198204 }
199205
200206 /* number of output frames */
@@ -211,10 +217,10 @@ static void end_frame(AVFilterLink *inlink) · 10 unmodified lines
211217
212218 av_fifo_generic_read(s->fifo, &tmp, sizeof(tmp), NULL);
213219 flush_fifo(s->fifo);
214− write_to_fifo(s->fifo, tmp);
220+ ret = write_to_fifo(s->fifo, tmp);
215221
216222 avfilter_unref_buffer(buf);
217− return;
223+ return ret;
218224 }
219225
220226 /* can output >= 1 frames */
@@ -224,31 +230,51 @@ static void end_frame(AVFilterLink *inlink) · 3 unmodified lines
224230
225231 /* duplicate the frame if needed */
226232 if (!av_fifo_size(s->fifo) && i < delta - 1) {
233+ AVFilterBufferRef *dup = avfilter_ref_buffer(buf_out, AV_PERM_READ);
234+
227235 av_log(ctx, AV_LOG_DEBUG, "Duplicating frame.\n");
228− write_to_fifo(s->fifo, avfilter_ref_buffer(buf_out, AV_PERM_READ));
236+ if (dup)
237+ ret = write_to_fifo(s->fifo, dup);
238+ else
239+ ret = AVERROR(ENOMEM);
240+
241+ if (ret < 0) {
242+ avfilter_unref_bufferp(&buf_out);
243+ avfilter_unref_bufferp(&buf);
244+ return ret;
245+ }
246+
229247 s->dup++;
230248 }
231249
232250 buf_out->pts = av_rescale_q(s->first_pts, inlink->time_base,
233251 outlink->time_base) + s->frames_out;
234252
235− ff_start_frame(outlink, buf_out);
236− ff_draw_slice(outlink, 0, outlink->h, 1);
237− ff_end_frame(outlink);
253+ if ((ret = ff_start_frame(outlink, buf_out)) < 0 ||
254+ (ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 ||
255+ (ret = ff_end_frame(outlink)) < 0) {
256+ avfilter_unref_bufferp(&buf);
257+ return ret;
258+ }
259+
238260 s->frames_out++;
239261 }
240262 flush_fifo(s->fifo);
241263
242− write_to_fifo(s->fifo, buf);
264+ ret = write_to_fifo(s->fifo, buf);
243265 s->pts = s->first_pts + av_rescale_q(s->frames_out, outlink->time_base, inlink->time_base);
266+
267+ return ret;
244268 }
245269
246−static void null_start_frame(AVFilterLink *link, AVFilterBufferRef *buf)
270+static int null_start_frame(AVFilterLink *link, AVFilterBufferRef *buf)
247271 {
272+ return 0;
248273 }
249274
250−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
275+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
251276 {
277+ return 0;
252278 }
253279
254280 AVFilter avfilter_vf_fps = {
libavfilter/vf_frei0r.c+34−8
@@ -340,20 +340,26 @@ static int query_formats(AVFilterContext *ctx) · 339 unmodified lines
340340 return 0;
341341 }
342342
343−static void null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { }
343+static int null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
344+{
345+ return 0;
346+}
344347
345−static void end_frame(AVFilterLink *inlink)
348+static int end_frame(AVFilterLink *inlink)
346349 {
347350 Frei0rContext *frei0r = inlink->dst->priv;
348351 AVFilterLink *outlink = inlink->dst->outputs[0];
349352 AVFilterBufferRef *inpicref = inlink->cur_buf;
350353 AVFilterBufferRef *outpicref = outlink->out_buf;
354+ int ret;
351355
352356 frei0r->update(frei0r->instance, inpicref->pts * av_q2d(inlink->time_base) * 1000,
353357 (const uint32_t *)inpicref->data[0],
354358 (uint32_t *)outpicref->data[0]);
355− ff_draw_slice(outlink, 0, outlink->h, 1);
356− ff_end_frame(outlink);
359+ if ((ret = ff_draw_slice(outlink, 0, outlink->h, 1)) ||
360+ (ret = ff_end_frame(outlink)) < 0)
361+ return ret;
362+ return 0;
357363 }
358364
359365 AVFilter avfilter_vf_frei0r = {
@@ -432,18 +438,38 @@ static int source_request_frame(AVFilterLink *outlink) · 72 unmodified lines
432438 {
433439 Frei0rContext *frei0r = outlink->src->priv;
434440 AVFilterBufferRef *picref = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h);
441+ AVFilterBufferRef *buf_out;
442+ int ret;
443+
444+ if (!picref)
445+ return AVERROR(ENOMEM);
446+
435447 picref->video->sample_aspect_ratio = (AVRational) {1, 1};
436448 picref->pts = frei0r->pts++;
437449 picref->pos = -1;
438450
439− ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0));
451+ buf_out = avfilter_ref_buffer(picref, ~0);
452+ if (!buf_out) {
453+ ret = AVERROR(ENOMEM);
454+ goto fail;
455+ }
456+
457+ ret = ff_start_frame(outlink, buf_out);
458+ if (ret < 0)
459+ goto fail;
460+
440461 frei0r->update(frei0r->instance, av_rescale_q(picref->pts, frei0r->time_base, (AVRational){1,1000}),
441462 NULL, (uint32_t *)picref->data[0]);
442− ff_draw_slice(outlink, 0, outlink->h, 1);
443− ff_end_frame(outlink);
463+ ret = ff_draw_slice(outlink, 0, outlink->h, 1);
464+ if (ret < 0)
465+ goto fail;
466+
467+ ret = ff_end_frame(outlink);
468+
469+fail:
444470 avfilter_unref_buffer(picref);
445471
446− return 0;
472+ return ret;
447473 }
448474
449475 AVFilter avfilter_vsrc_frei0r_src = {
libavfilter/vf_gradfun.c+32−9
@@ -180,32 +180,53 @@ static int config_input(AVFilterLink *inlink) · 179 unmodified lines
180180 return 0;
181181 }
182182
183−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
183+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
184184 {
185185 AVFilterLink *outlink = inlink->dst->outputs[0];
186− AVFilterBufferRef *outpicref;
186+ AVFilterBufferRef *outpicref = NULL, *for_next_filter;
187+ int ret = 0;
187188
188189 if (inpicref->perms & AV_PERM_PRESERVE) {
189190 outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h);
191+ if (!outpicref)
192+ return AVERROR(ENOMEM);
193+
190194 avfilter_copy_buffer_ref_props(outpicref, inpicref);
191195 outpicref->video->w = outlink->w;
192196 outpicref->video->h = outlink->h;
193− } else
197+ } else {
194198 outpicref = avfilter_ref_buffer(inpicref, ~0);
199+ if (!outpicref)
200+ return AVERROR(ENOMEM);
201+ }
202+
203+ for_next_filter = avfilter_ref_buffer(outpicref, ~0);
204+ if (for_next_filter)
205+ ret = ff_start_frame(outlink, for_next_filter);
206+ else
207+ ret = AVERROR(ENOMEM);
208+
209+ if (ret < 0) {
210+ avfilter_unref_bufferp(&outpicref);
211+ return ret;
212+ }
195213
196214 outlink->out_buf = outpicref;
197− ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
215+ return 0;
198216 }
199217
200−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
218+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
219+{
220+ return 0;
221+}
201222
202−static void end_frame(AVFilterLink *inlink)
223+static int end_frame(AVFilterLink *inlink)
203224 {
204225 GradFunContext *gf = inlink->dst->priv;
205226 AVFilterBufferRef *inpic = inlink->cur_buf;
206227 AVFilterLink *outlink = inlink->dst->outputs[0];
207228 AVFilterBufferRef *outpic = outlink->out_buf;
208− int p;
229+ int p, ret;
209230
210231 for (p = 0; p < 4 && inpic->data[p]; p++) {
211232 int w = inlink->w;
@@ -223,8 +244,10 @@ static void end_frame(AVFilterLink *inlink) · 11 unmodified lines
223244 av_image_copy_plane(outpic->data[p], outpic->linesize[p], inpic->data[p], inpic->linesize[p], w, h);
224245 }
225246
226− ff_draw_slice(outlink, 0, inlink->h, 1);
227− ff_end_frame(outlink);
247+ if ((ret = ff_draw_slice(outlink, 0, inlink->h, 1)) < 0 ||
248+ (ret = ff_end_frame(outlink)) < 0)
249+ return ret;
250+ return 0;
228251 }
229252
230253 AVFilter avfilter_vf_gradfun = {
libavfilter/vf_hflip.c+4−4
@@ -83,7 +83,7 @@ static int config_props(AVFilterLink *inlink) · 82 unmodified lines
8383 return 0;
8484 }
8585
86−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
86+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
8787 {
8888 AVFilterLink *outlink = inlink->dst->outputs[0];
8989
@@ -95,10 +95,10 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 5 unmodified lines
9595 if (av_pix_fmt_descriptors[inlink->format].flags & PIX_FMT_PAL)
9696 memcpy(inlink->dst->outputs[0]->out_buf->data[1], picref->data[1], AVPALETTE_SIZE);
9797
98− ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0));
98+ return ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0));
9999 }
100100
101−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
101+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
102102 {
103103 FlipContext *flip = inlink->dst->priv;
104104 AVFilterBufferRef *inpic = inlink->cur_buf;
@@ -159,7 +159,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) · 54 unmodified lines
159159 }
160160 }
161161
162− ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
162+ return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
163163 }
164164
165165 AVFilter avfilter_vf_hflip = {
libavfilter/vf_hqdn3d.c+10−4
@@ -290,9 +290,12 @@ static int config_input(AVFilterLink *inlink) · 289 unmodified lines
290290 return 0;
291291 }
292292
293−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
293+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
294+{
295+ return 0;
296+}
294297
295−static void end_frame(AVFilterLink *inlink)
298+static int end_frame(AVFilterLink *inlink)
296299 {
297300 HQDN3DContext *hqdn3d = inlink->dst->priv;
298301 AVFilterLink *outlink = inlink->dst->outputs[0];
@@ -300,6 +303,7 @@ static void end_frame(AVFilterLink *inlink) · 1 unmodified line
300303 AVFilterBufferRef *outpic = outlink->out_buf;
301304 int cw = inpic->video->w >> hqdn3d->hsub;
302305 int ch = inpic->video->h >> hqdn3d->vsub;
306+ int ret;
303307
304308 deNoise(inpic->data[0], outpic->data[0],
305309 hqdn3d->Line, &hqdn3d->Frame[0], inpic->video->w, inpic->video->h,
@@ -320,8 +324,10 @@ static void end_frame(AVFilterLink *inlink) · 14 unmodified lines
320324 hqdn3d->Coefs[2],
321325 hqdn3d->Coefs[3]);
322326
323− ff_draw_slice(outlink, 0, inpic->video->h, 1);
324− ff_end_frame(outlink);
327+ if ((ret = ff_draw_slice(outlink, 0, inpic->video->h, 1)) < 0 ||
328+ (ret = ff_end_frame(outlink)) < 0)
329+ return ret;
330+ return 0;
325331 }
326332
327333 AVFilter avfilter_vf_hqdn3d = {
libavfilter/vf_idet.c+7−7
@@ -169,7 +169,7 @@ static void filter(AVFilterContext *ctx) · 168 unmodified lines
169169 av_log(ctx, AV_LOG_DEBUG, "Single frame:%s, Multi frame:%s\n", type2str(type), type2str(idet->last_type));
170170 }
171171
172−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
172+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
173173 {
174174 AVFilterContext *ctx = link->dst;
175175 IDETContext *idet = ctx->priv;
@@ -181,21 +181,21 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 5 unmodified lines
181181 idet->next = picref;
182182
183183 if (!idet->cur)
184− return;
184+ return 0;
185185
186186 if (!idet->prev)
187187 idet->prev = avfilter_ref_buffer(idet->cur, AV_PERM_READ);
188188
189− ff_start_frame(ctx->outputs[0], avfilter_ref_buffer(idet->cur, AV_PERM_READ));
189+ return ff_start_frame(ctx->outputs[0], avfilter_ref_buffer(idet->cur, AV_PERM_READ));
190190 }
191191
192−static void end_frame(AVFilterLink *link)
192+static int end_frame(AVFilterLink *link)
193193 {
194194 AVFilterContext *ctx = link->dst;
195195 IDETContext *idet = ctx->priv;
196196
197197 if (!idet->cur)
198− return;
198+ return 0;
199199
200200 if (!idet->csp)
201201 idet->csp = &av_pix_fmt_descriptors[link->format];
@@ -205,7 +205,7 @@ static void end_frame(AVFilterLink *link) · 3 unmodified lines
205205 filter(ctx);
206206
207207 ff_draw_slice(ctx->outputs[0], 0, link->h, 1);
208− ff_end_frame(ctx->outputs[0]);
208+ return ff_end_frame(ctx->outputs[0]);
209209 }
210210
211211 static int request_frame(AVFilterLink *link)
@@ -311,7 +311,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 99 unmodified lines
311311 return 0;
312312 }
313313
314−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
314+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { return 0; }
315315
316316 AVFilter avfilter_vf_idet = {
317317 .name = "idet",
libavfilter/vf_libopencv.c+10−4
@@ -67,7 +67,10 @@ static int query_formats(AVFilterContext *ctx) · 66 unmodified lines
6767 return 0;
6868 }
6969
70−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
70+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
71+{
72+ return 0;
73+}
7174
7275 typedef struct {
7376 const char *name;
@@ -351,7 +354,7 @@ static av_cold void uninit(AVFilterContext *ctx) · 277 unmodified lines
351354 memset(ocv, 0, sizeof(*ocv));
352355 }
353356
354−static void end_frame(AVFilterLink *inlink)
357+static int end_frame(AVFilterLink *inlink)
355358 {
356359 AVFilterContext *ctx = inlink->dst;
357360 OCVContext *ocv = ctx->priv;
@@ -359,14 +362,17 @@ static void end_frame(AVFilterLink *inlink) · 1 unmodified line
359362 AVFilterBufferRef *inpicref = inlink ->cur_buf;
360363 AVFilterBufferRef *outpicref = outlink->out_buf;
361364 IplImage inimg, outimg;
365+ int ret;
362366
363367 fill_iplimage_from_picref(&inimg , inpicref , inlink->format);
364368 fill_iplimage_from_picref(&outimg, outpicref, inlink->format);
365369 ocv->end_frame_filter(ctx, &inimg, &outimg);
366370 fill_picref_from_iplimage(outpicref, &outimg, inlink->format);
367371
368− ff_draw_slice(outlink, 0, outlink->h, 1);
369− ff_end_frame(outlink);
372+ if ((ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 ||
373+ (ret = ff_end_frame(outlink)) < 0)
374+ return ret;
375+ return 0;
370376 }
371377
372378 AVFilter avfilter_vf_ocv = {
libavfilter/vf_lut.c+2−2
@@ -275,7 +275,7 @@ static int config_props(AVFilterLink *inlink) · 274 unmodified lines
275275 return 0;
276276 }
277277
278−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
278+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
279279 {
280280 AVFilterContext *ctx = inlink->dst;
281281 LutContext *lut = ctx->priv;
@@ -332,7 +332,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) · 50 unmodified lines
332332 }
333333 }
334334
335− ff_draw_slice(outlink, y, h, slice_dir);
335+ return ff_draw_slice(outlink, y, h, slice_dir);
336336 }
337337
338338 static const AVFilterPad inputs[] = {
libavfilter/vf_mp.c+6−3
@@ -848,15 +848,17 @@ static int request_frame(AVFilterLink *outlink) · 847 unmodified lines
848848 return ret;
849849 }
850850
851−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
851+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
852852 {
853+ return 0;
853854 }
854855
855−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
856+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
856857 {
858+ return 0;
857859 }
858860
859−static void end_frame(AVFilterLink *inlink)
861+static int end_frame(AVFilterLink *inlink)
860862 {
861863 MPContext *m = inlink->dst->priv;
862864 AVFilterBufferRef *inpic = inlink->cur_buf;
@@ -883,6 +885,7 @@ static void end_frame(AVFilterLink *inlink) · 20 unmodified lines
883885 av_log(m->avfctx, AV_LOG_DEBUG, "put_image() says skip\n");
884886 }
885887 free_mp_image(mpi);
888+ return 0;
886889 }
887890
888891 AVFilter avfilter_vf_mp = {
libavfilter/vf_overlay.c+16−12
@@ -145,8 +145,7 @@ static av_cold void uninit(AVFilterContext *ctx) · 144 unmodified lines
145145 av_freep(&over->x_expr);
146146 av_freep(&over->y_expr);
147147
148− if (over->overpicref)
149− avfilter_unref_bufferp(&over->overpicref);
148+ avfilter_unref_bufferp(&over->overpicref);
150149 ff_bufqueue_discard_all(&over->queue_main);
151150 ff_bufqueue_discard_all(&over->queue_over);
152151 }
@@ -506,7 +505,7 @@ static void flush_frames(AVFilterContext *ctx) · 353 unmodified lines
506505 while (!try_push_frame(ctx));
507506 }
508507
509−static void start_frame_main(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
508+static int start_frame_main(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
510509 {
511510 AVFilterContext *ctx = inlink->dst;
512511 OverlayContext *over = ctx->priv;
@@ -519,9 +518,10 @@ static void start_frame_main(AVFilterLink *inlink, AVFilterBufferRef *inpicref) · 6 unmodified lines
519518 av_assert1(inpicref == inlink->cur_buf);
520519 inlink->cur_buf = NULL;
521520 }
521+ return 0;
522522 }
523523
524−static void draw_slice_main(AVFilterLink *inlink, int y, int h, int slice_dir)
524+static int draw_slice_main(AVFilterLink *inlink, int y, int h, int slice_dir)
525525 {
526526 AVFilterContext *ctx = inlink->dst;
527527 OverlayContext *over = ctx->priv;
@@ -536,10 +536,10 @@ static void draw_slice_main(AVFilterLink *inlink, int y, int h, int slice_dir) · 8 unmodified lines
536536 over->overpicref->video->w, over->overpicref->video->h,
537537 y, outpicref->video->w, h);
538538 }
539− ff_draw_slice(outlink, y, h, slice_dir);
539+ return ff_draw_slice(outlink, y, h, slice_dir);
540540 }
541541
542−static void end_frame_main(AVFilterLink *inlink)
542+static int end_frame_main(AVFilterLink *inlink)
543543 {
544544 AVFilterContext *ctx = inlink->dst;
545545 AVFilterLink *outlink = ctx->outputs[0];
@@ -547,15 +547,16 @@ static void end_frame_main(AVFilterLink *inlink) · 1 unmodified line
547547 flush_frames(ctx);
548548
549549 if (!outpicref)
550− return;
551− ff_end_frame(ctx->outputs[0]);
550+ return 0;
551+ return ff_end_frame(ctx->outputs[0]);
552552 }
553553
554−static void start_frame_over(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
554+static int start_frame_over(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
555555 {
556+ return 0;
556557 }
557558
558−static void end_frame_over(AVFilterLink *inlink)
559+static int end_frame_over(AVFilterLink *inlink)
559560 {
560561 AVFilterContext *ctx = inlink->dst;
561562 OverlayContext *over = ctx->priv;
@@ -566,7 +567,7 @@ static void end_frame_over(AVFilterLink *inlink) · 4 unmodified lines
566567 inpicref->pts = av_rescale_q(inpicref->pts, ctx->inputs[OVERLAY]->time_base,
567568 ctx->outputs[0]->time_base);
568569 ff_bufqueue_add(ctx, &over->queue_over, inpicref);
569− try_push_frame(ctx);
570+ return try_push_frame(ctx);
570571 }
571572
572573 static int request_frame(AVFilterLink *outlink)
@@ -597,7 +598,10 @@ static int request_frame(AVFilterLink *outlink) · 24 unmodified lines
597598 return 0;
598599 }
599600
600−static void null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { }
601+static int null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
602+{
603+ return 0;
604+}
601605
602606 AVFilter avfilter_vf_overlay = {
603607 .name = "overlay",
libavfilter/vf_pad.c+37−12
@@ -226,6 +226,9 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *inlink, int perms, int · 225 unmodified lines
226226 h + (pad->h - pad->in_h));
227227 int plane;
228228
229+ if (!picref)
230+ return NULL;
231+
229232 picref->video->w = w;
230233 picref->video->h = h;
231234
@@ -259,12 +262,15 @@ static int does_clip(PadContext *pad, AVFilterBufferRef *outpicref, int plane, i · 27 unmodified lines
259262 return 0;
260263 }
261264
262−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
265+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
263266 {
264267 PadContext *pad = inlink->dst->priv;
265268 AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
266269 AVFilterBufferRef *for_next_filter;
267− int plane;
270+ int plane, ret = 0;
271+
272+ if (!outpicref)
273+ return AVERROR(ENOMEM);
268274
269275 for (plane = 0; plane < 4 && outpicref->data[plane] && pad->draw.pixelstep[plane]; plane++) {
270276 int hsub = pad->draw.hsub[plane];
@@ -292,22 +298,37 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) · 21 unmodified lines
292298 outpicref = ff_get_video_buffer(inlink->dst->outputs[0], AV_PERM_WRITE | AV_PERM_NEG_LINESIZES,
293299 FFMAX(inlink->w, pad->w),
294300 FFMAX(inlink->h, pad->h));
301+ if (!outpicref)
302+ return AVERROR(ENOMEM);
303+
295304 avfilter_copy_buffer_ref_props(outpicref, inpicref);
296305 }
297306
298− inlink->dst->outputs[0]->out_buf = outpicref;
299−
300307 outpicref->video->w = pad->w;
301308 outpicref->video->h = pad->h;
302309
303310 for_next_filter = avfilter_ref_buffer(outpicref, ~0);
304− ff_start_frame(inlink->dst->outputs[0], for_next_filter);
311+ if (!for_next_filter) {
312+ ret = AVERROR(ENOMEM);
313+ goto fail;
314+ }
315+
316+ ret = ff_start_frame(inlink->dst->outputs[0], for_next_filter);
317+ if (ret < 0)
318+ goto fail;
319+
320+ inlink->dst->outputs[0]->out_buf = outpicref;
321+ return 0;
322+
323+fail:
324+ avfilter_unref_bufferp(&outpicref);
325+ return ret;
305326 }
306327
307−static void draw_send_bar_slice(AVFilterLink *link, int y, int h, int slice_dir, int before_slice)
328+static int draw_send_bar_slice(AVFilterLink *link, int y, int h, int slice_dir, int before_slice)
308329 {
309330 PadContext *pad = link->dst->priv;
310− int bar_y, bar_h = 0;
331+ int bar_y, bar_h = 0, ret = 0;
311332
312333 if (slice_dir * before_slice == 1 && y == pad->y) {
313334 /* top bar */
@@ -324,15 +345,17 @@ static void draw_send_bar_slice(AVFilterLink *link, int y, int h, int slice_dir, · 10 unmodified lines
324345 link->dst->outputs[0]->out_buf->data,
325346 link->dst->outputs[0]->out_buf->linesize,
326347 0, bar_y, pad->w, bar_h);
327− ff_draw_slice(link->dst->outputs[0], bar_y, bar_h, slice_dir);
348+ ret = ff_draw_slice(link->dst->outputs[0], bar_y, bar_h, slice_dir);
328349 }
350+ return ret;
329351 }
330352
331−static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
353+static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
332354 {
333355 PadContext *pad = link->dst->priv;
334356 AVFilterBufferRef *outpic = link->dst->outputs[0]->out_buf;
335357 AVFilterBufferRef *inpic = link->cur_buf;
358+ int ret;
336359
337360 y += pad->y;
338361
@@ -340,7 +363,7 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir) · 1 unmodified line
340363 h = ff_draw_round_to_sub(&pad->draw, 1, -1, h);
341364
342365 if (!h)
343− return;
366+ return 0;
344367 draw_send_bar_slice(link, y, h, slice_dir, 1);
345368
346369 /* left border */
@@ -357,9 +380,11 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir) · 10 unmodified lines
357380 /* right border */
358381 ff_fill_rectangle(&pad->draw, &pad->color, outpic->data, outpic->linesize,
359382 pad->x + pad->in_w, y, pad->w - pad->x - pad->in_w, h);
360− ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
383+ ret = ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
384+ if (ret < 0)
385+ return ret;
361386
362− draw_send_bar_slice(link, y, h, slice_dir, -1);
387+ return draw_send_bar_slice(link, y, h, slice_dir, -1);
363388 }
364389
365390 AVFilter avfilter_vf_pad = {
libavfilter/vf_pixdesctest.c+23−9
@@ -51,16 +51,18 @@ static int config_props(AVFilterLink *inlink) · 50 unmodified lines
5151 return 0;
5252 }
5353
54−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
54+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
5555 {
5656 PixdescTestContext *priv = inlink->dst->priv;
5757 AVFilterLink *outlink = inlink->dst->outputs[0];
58− AVFilterBufferRef *outpicref;
59− int i;
58+ AVFilterBufferRef *outpicref, *for_next_filter;
59+ int i, ret = 0;
60+
61+ outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE,
62+ outlink->w, outlink->h);
63+ if (!outpicref)
64+ return AVERROR(ENOMEM);
6065
61− outlink->out_buf = ff_get_video_buffer(outlink, AV_PERM_WRITE,
62− outlink->w, outlink->h);
63− outpicref = outlink->out_buf;
6466 avfilter_copy_buffer_ref_props(outpicref, picref);
6567
6668 for (i = 0; i < 4; i++) {
@@ -78,10 +80,22 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 11 unmodified lines
7880 priv->pix_desc->flags & PIX_FMT_PSEUDOPAL)
7981 memcpy(outpicref->data[1], picref->data[1], AVPALETTE_SIZE);
8082
81− ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
83+ for_next_filter = avfilter_ref_buffer(outpicref, ~0);
84+ if (for_next_filter)
85+ ret = ff_start_frame(outlink, for_next_filter);
86+ else
87+ ret = AVERROR(ENOMEM);
88+
89+ if (ret < 0) {
90+ avfilter_unref_bufferp(&outpicref);
91+ return ret;
92+ }
93+
94+ outlink->out_buf = outpicref;
95+ return 0;
8296 }
8397
84−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
98+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
8599 {
86100 PixdescTestContext *priv = inlink->dst->priv;
87101 AVFilterBufferRef *inpic = inlink->cur_buf;
@@ -108,7 +122,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) · 20 unmodified lines
108122 }
109123 }
110124
111− ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
125+ return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
112126 }
113127
114128 AVFilter avfilter_vf_pixdesctest = {
libavfilter/vf_removelogo.c+5−5
@@ -472,7 +472,7 @@ static void blur_image(int ***mask, · 471 unmodified lines
472472 }
473473 }
474474
475−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
475+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
476476 {
477477 AVFilterLink *outlink = inlink->dst->outputs[0];
478478 AVFilterBufferRef *outpicref;
@@ -487,10 +487,10 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) · 8 unmodified lines
487487 outpicref = inpicref;
488488
489489 outlink->out_buf = outpicref;
490− ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
490+ return ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
491491 }
492492
493−static void end_frame(AVFilterLink *inlink)
493+static int end_frame(AVFilterLink *inlink)
494494 {
495495 RemovelogoContext *removelogo = inlink->dst->priv;
496496 AVFilterLink *outlink = inlink->dst->outputs[0];
@@ -515,7 +515,7 @@ static void end_frame(AVFilterLink *inlink) · 18 unmodified lines
515515 inlink->w/2, inlink->h/2, direct, &removelogo->half_mask_bbox);
516516
517517 ff_draw_slice(outlink, 0, inlink->h, 1);
518− ff_end_frame(outlink);
518+ return ff_end_frame(outlink);
519519 }
520520
521521 static void uninit(AVFilterContext *ctx)
@@ -540,7 +540,7 @@ static void uninit(AVFilterContext *ctx) · 18 unmodified lines
540540 }
541541 }
542542
543−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
543+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { return 0; }
544544
545545 AVFilter avfilter_vf_removelogo = {
546546 .name = "removelogo",
libavfilter/vf_scale.c+28−11
@@ -272,11 +272,12 @@ fail: · 271 unmodified lines
272272 return ret;
273273 }
274274
275−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
275+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
276276 {
277277 ScaleContext *scale = link->dst->priv;
278278 AVFilterLink *outlink = link->dst->outputs[0];
279− AVFilterBufferRef *outpicref;
279+ AVFilterBufferRef *outpicref, *for_next_filter;
280+ int ret = 0;
280281
281282 if( picref->video->w != link->w
282283 || picref->video->h != link->h
@@ -295,19 +296,23 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 12 unmodified lines
295296
296297
297298 if (!scale->sws) {
298− ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0));
299− return;
299+ outpicref = avfilter_ref_buffer(picref, ~0);
300+ if (!outpicref)
301+ return AVERROR(ENOMEM);
302+ return ff_start_frame(outlink, outpicref);
300303 }
301304
302305 scale->hsub = av_pix_fmt_descriptors[link->format].log2_chroma_w;
303306 scale->vsub = av_pix_fmt_descriptors[link->format].log2_chroma_h;
304307
305308 outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE|AV_PERM_ALIGN, outlink->w, outlink->h);
309+ if (!outpicref)
310+ return AVERROR(ENOMEM);
311+
306312 avfilter_copy_buffer_ref_props(outpicref, picref);
307313 outpicref->video->w = outlink->w;
308314 outpicref->video->h = outlink->h;
309315
310− outlink->out_buf = outpicref;
311316 if(scale->output_is_pal)
312317 ff_set_systematic_pal2(outpicref->data[1], outlink->format == PIX_FMT_PAL8 ? PIX_FMT_BGR8 : outlink->format);
313318
@@ -317,7 +322,19 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 3 unmodified lines
317322 INT_MAX);
318323
319324 scale->slice_y = 0;
320− ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
325+ for_next_filter = avfilter_ref_buffer(outpicref, ~0);
326+ if (for_next_filter)
327+ ret = ff_start_frame(outlink, for_next_filter);
328+ else
329+ ret = AVERROR(ENOMEM);
330+
331+ if (ret < 0) {
332+ avfilter_unref_bufferp(&outpicref);
333+ return ret;
334+ }
335+
336+ outlink->out_buf = outpicref;
337+ return 0;
321338 }
322339
323340 static int scale_slice(AVFilterLink *link, struct SwsContext *sws, int y, int h, int mul, int field)
@@ -346,14 +363,13 @@ static int scale_slice(AVFilterLink *link, struct SwsContext *sws, int y, int h, · 22 unmodified lines
346363 out,out_stride);
347364 }
348365
349−static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
366+static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
350367 {
351368 ScaleContext *scale = link->dst->priv;
352− int out_h;
369+ int out_h, ret;
353370
354371 if (!scale->sws) {
355− ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
356− return;
372+ return ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
357373 }
358374
359375 if (scale->slice_y == 0 && slice_dir == -1)
@@ -369,9 +385,10 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir) · 9 unmodified lines
369385
370386 if (slice_dir == -1)
371387 scale->slice_y -= out_h;
372− ff_draw_slice(link->dst->outputs[0], scale->slice_y, out_h, slice_dir);
388+ ret = ff_draw_slice(link->dst->outputs[0], scale->slice_y, out_h, slice_dir);
373389 if (slice_dir == 1)
374390 scale->slice_y += out_h;
391+ return ret;
375392 }
376393
377394 AVFilter avfilter_vf_scale = {
libavfilter/vf_select.c+23−13
@@ -269,12 +269,13 @@ static int select_frame(AVFilterContext *ctx, AVFilterBufferRef *picref) · 268 unmodified lines
269269 return res;
270270 }
271271
272−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
272+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
273273 {
274274 SelectContext *select = inlink->dst->priv;
275275
276276 select->select = select_frame(inlink->dst, picref);
277277 if (select->select) {
278+ AVFilterBufferRef *buf_out;
278279 /* frame was requested through poll_frame */
279280 if (select->cache_frames) {
280281 if (!av_fifo_space(select->pending_frames))
@@ -283,29 +284,36 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 2 unmodified lines
283284 else
284285 av_fifo_generic_write(select->pending_frames, &picref,
285286 sizeof(picref), NULL);
286− return;
287+ return 0;
287288 }
288− ff_start_frame(inlink->dst->outputs[0], avfilter_ref_buffer(picref, ~0));
289+ buf_out = avfilter_ref_buffer(picref, ~0);
290+ if (!buf_out)
291+ return AVERROR(ENOMEM);
292+ return ff_start_frame(inlink->dst->outputs[0], buf_out);
289293 }
294+
295+ return 0;
290296 }
291297
292−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
298+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
293299 {
294300 SelectContext *select = inlink->dst->priv;
295301
296302 if (select->select && !select->cache_frames)
297− ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
303+ return ff_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
304+ return 0;
298305 }
299306
300−static void end_frame(AVFilterLink *inlink)
307+static int end_frame(AVFilterLink *inlink)
301308 {
302309 SelectContext *select = inlink->dst->priv;
303310
304311 if (select->select) {
305312 if (select->cache_frames)
306− return;
307− ff_end_frame(inlink->dst->outputs[0]);
313+ return 0;
314+ return ff_end_frame(inlink->dst->outputs[0]);
308315 }
316+ return 0;
309317 }
310318
311319 static int request_frame(AVFilterLink *outlink)
@@ -317,12 +325,14 @@ static int request_frame(AVFilterLink *outlink) · 5 unmodified lines
317325
318326 if (av_fifo_size(select->pending_frames)) {
319327 AVFilterBufferRef *picref;
328+ int ret;
329+
320330 av_fifo_generic_read(select->pending_frames, &picref, sizeof(picref), NULL);
321− ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0));
322− ff_draw_slice(outlink, 0, outlink->h, 1);
323− ff_end_frame(outlink);
324− avfilter_unref_buffer(picref);
325− return 0;
331+ if ((ret = ff_start_frame(outlink, picref)) < 0 ||
332+ (ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 ||
333+ (ret = ff_end_frame(outlink)) < 0);
334+
335+ return ret;
326336 }
327337
328338 while (!select->select) {
libavfilter/vf_setfield.c+2−2
@@ -69,7 +69,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 68 unmodified lines
6969 return 0;
7070 }
7171
72−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
72+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
7373 {
7474 SetFieldContext *setfield = inlink->dst->priv;
7575 AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
@@ -80,7 +80,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) · 4 unmodified lines
8080 outpicref->video->interlaced = 1;
8181 outpicref->video->top_field_first = setfield->mode;
8282 }
83− ff_start_frame(inlink->dst->outputs[0], outpicref);
83+ return ff_start_frame(inlink->dst->outputs[0], outpicref);
8484 }
8585
8686 AVFilter avfilter_vf_setfield = {
libavfilter/vf_setpts.c+5−2
@@ -92,12 +92,15 @@ static int config_input(AVFilterLink *inlink) · 91 unmodified lines
9292 #define D2TS(d) (isnan(d) ? AV_NOPTS_VALUE : (int64_t)(d))
9393 #define TS2D(ts) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts))
9494
95−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
95+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
9696 {
9797 SetPTSContext *setpts = inlink->dst->priv;
9898 double d;
9999 AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
100100
101+ if (!outpicref)
102+ return AVERROR(ENOMEM);
103+
101104 if (isnan(setpts->var_values[VAR_STARTPTS]))
102105 setpts->var_values[VAR_STARTPTS] = TS2D(inpicref->pts);
103106
@@ -121,7 +124,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) · 17 unmodified lines
121124 setpts->var_values[VAR_N] += 1.0;
122125 setpts->var_values[VAR_PREV_INPTS ] = TS2D(inpicref ->pts);
123126 setpts->var_values[VAR_PREV_OUTPTS] = TS2D(outpicref->pts);
124− ff_start_frame(inlink->dst->outputs[0], outpicref);
127+ return ff_start_frame(inlink->dst->outputs[0], outpicref);
125128 }
126129
127130 static av_cold void uninit(AVFilterContext *ctx)
libavfilter/vf_showinfo.c+2−2
@@ -41,7 +41,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 40 unmodified lines
4141 return 0;
4242 }
4343
44−static void end_frame(AVFilterLink *inlink)
44+static int end_frame(AVFilterLink *inlink)
4545 {
4646 AVFilterContext *ctx = inlink->dst;
4747 ShowInfoContext *showinfo = ctx->priv;
@@ -81,7 +81,7 @@ static void end_frame(AVFilterLink *inlink) · 33 unmodified lines
8181 av_log(ctx, AV_LOG_INFO, "]\n");
8282
8383 showinfo->frame++;
84− ff_end_frame(inlink->dst->outputs[0]);
84+ return ff_end_frame(inlink->dst->outputs[0]);
8585 }
8686
8787 AVFilter avfilter_vf_showinfo = {
libavfilter/vf_slicify.c+17−10
@@ -59,7 +59,7 @@ static int config_props(AVFilterLink *link) · 58 unmodified lines
5959 return 0;
6060 }
6161
62−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
62+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
6363 {
6464 SliceContext *slice = link->dst->priv;
6565
@@ -75,27 +75,34 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 9 unmodified lines
7575 av_log(link->dst, AV_LOG_DEBUG, "h:%d\n", slice->h);
7676 link->cur_buf = NULL;
7777
78− ff_start_frame(link->dst->outputs[0], picref);
78+ return ff_start_frame(link->dst->outputs[0], picref);
7979 }
8080
81−static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
81+static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
8282 {
8383 SliceContext *slice = link->dst->priv;
84− int y2;
84+ int y2, ret = 0;
8585
8686 if (slice_dir == 1) {
87− for (y2 = y; y2 + slice->h <= y + h; y2 += slice->h)
88− ff_draw_slice(link->dst->outputs[0], y2, slice->h, slice_dir);
87+ for (y2 = y; y2 + slice->h <= y + h; y2 += slice->h) {
88+ ret = ff_draw_slice(link->dst->outputs[0], y2, slice->h, slice_dir);
89+ if (ret < 0)
90+ return ret;
91+ }
8992
9093 if (y2 < y + h)
91− ff_draw_slice(link->dst->outputs[0], y2, y + h - y2, slice_dir);
94+ return ff_draw_slice(link->dst->outputs[0], y2, y + h - y2, slice_dir);
9295 } else if (slice_dir == -1) {
93− for (y2 = y + h; y2 - slice->h >= y; y2 -= slice->h)
94− ff_draw_slice(link->dst->outputs[0], y2 - slice->h, slice->h, slice_dir);
96+ for (y2 = y + h; y2 - slice->h >= y; y2 -= slice->h) {
97+ ret = ff_draw_slice(link->dst->outputs[0], y2 - slice->h, slice->h, slice_dir);
98+ if (ret < 0)
99+ return ret;
100+ }
95101
96102 if (y2 > y)
97− ff_draw_slice(link->dst->outputs[0], y, y2 - y, slice_dir);
103+ return ff_draw_slice(link->dst->outputs[0], y, y2 - y, slice_dir);
98104 }
105+ return 0;
99106 }
100107
101108 AVFilter avfilter_vf_slicify = {
libavfilter/vf_super2xsai.c+3−3
@@ -302,9 +302,9 @@ static int config_output(AVFilterLink *outlink) · 301 unmodified lines
302302 return 0;
303303 }
304304
305−static void null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { }
305+static int null_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) { return 0; }
306306
307−static void end_frame(AVFilterLink *inlink)
307+static int end_frame(AVFilterLink *inlink)
308308 {
309309 AVFilterLink *outlink = inlink->dst->outputs[0];
310310 AVFilterBufferRef *inpicref = inlink->cur_buf;
@@ -315,7 +315,7 @@ static void end_frame(AVFilterLink *inlink) · 4 unmodified lines
315315 inlink->w, inlink->h);
316316
317317 ff_draw_slice(outlink, 0, outlink->h, 1);
318− ff_end_frame(outlink);
318+ return ff_end_frame(outlink);
319319 }
320320
321321 AVFilter avfilter_vf_super2xsai = {
libavfilter/vf_swapuv.c+2−2
@@ -46,7 +46,7 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *link, int perms, · 45 unmodified lines
4646 return picref;
4747 }
4848
49−static void start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref)
49+static int start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref)
5050 {
5151 AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
5252
@@ -56,7 +56,7 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref) · 3 unmodified lines
5656 outpicref->linesize[1] = inpicref->linesize[2];
5757 outpicref->linesize[2] = inpicref->linesize[1];
5858
59− ff_start_frame(link->dst->outputs[0], outpicref);
59+ return ff_start_frame(link->dst->outputs[0], outpicref);
6060 }
6161
6262 static int query_formats(AVFilterContext *ctx)
libavfilter/vf_thumbnail.c+6−5
@@ -68,7 +68,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 67 unmodified lines
6868 return 0;
6969 }
7070
71−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
71+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
7272 {
7373 int i, j;
7474 AVFilterContext *ctx = inlink->dst;
@@ -86,6 +86,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) · 11 unmodified lines
8686 }
8787 p += picref->linesize[0];
8888 }
89+ return 0;
8990 }
9091
9192 /**
@@ -106,7 +107,7 @@ static double frame_sum_square_err(const int *hist, const double *median) · 14 unmodified lines
106107 return sum_sq_err;
107108 }
108109
109−static void end_frame(AVFilterLink *inlink)
110+static int end_frame(AVFilterLink *inlink)
110111 {
111112 int i, j, best_frame_idx = 0;
112113 double avg_hist[HIST_SIZE] = {0}, sq_err, min_sq_err = -1;
@@ -122,7 +123,7 @@ static void end_frame(AVFilterLink *inlink) · 9 unmodified lines
122123 // no selection until the buffer of N frames is filled up
123124 if (thumb->n < thumb->n_frames - 1) {
124125 thumb->n++;
125− return;
126+ return 0;
126127 }
127128
128129 // average histogram of the N frames
@@ -156,7 +157,7 @@ static void end_frame(AVFilterLink *inlink) · 27 unmodified lines
156157 ff_start_frame(outlink, picref);
157158 thumb->frames[best_frame_idx].buf = NULL;
158159 ff_draw_slice(outlink, 0, inlink->h, 1);
159− ff_end_frame(outlink);
160+ return ff_end_frame(outlink);
160161 }
161162
162163 static av_cold void uninit(AVFilterContext *ctx)
@@ -170,7 +171,7 @@ static av_cold void uninit(AVFilterContext *ctx) · 7 unmodified lines
170171 av_freep(&thumb->frames);
171172 }
172173
173−static void null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref) { }
174+static int null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref) { return 0; }
174175
175176 static int request_frame(AVFilterLink *link)
176177 {
libavfilter/vf_tile.c+8−6
@@ -96,23 +96,23 @@ static int config_props(AVFilterLink *outlink) · 95 unmodified lines
9696 * buffers are fed to start_frame in the order they were obtained from
9797 * get_buffer (think B-frames). */
9898
99−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
99+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
100100 {
101101 AVFilterContext *ctx = inlink->dst;
102102 TileContext *tile = ctx->priv;
103103 AVFilterLink *outlink = ctx->outputs[0];
104104
105105 if (tile->current)
106− return;
106+ return 0;
107107 outlink->out_buf = ff_get_video_buffer(outlink, AV_PERM_WRITE,
108108 outlink->w, outlink->h);
109109 avfilter_copy_buffer_ref_props(outlink->out_buf, picref);
110110 outlink->out_buf->video->w = outlink->w;
111111 outlink->out_buf->video->h = outlink->h;
112− ff_start_frame(outlink, outlink->out_buf);
112+ return ff_start_frame(outlink, outlink->out_buf);
113113 }
114114
115−static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
115+static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
116116 {
117117 AVFilterContext *ctx = inlink->dst;
118118 TileContext *tile = ctx->priv;
@@ -126,6 +126,7 @@ static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir) · 7 unmodified lines
126126 x0, y0 + y, 0, y, inlink->cur_buf->video->w, h);
127127 /* TODO if tile->w == 1 && slice_dir is always 1, we could draw_slice
128128 * immediately. */
129+ return 0;
129130 }
130131
131132 static void draw_blank_frame(AVFilterContext *ctx)
@@ -153,14 +154,15 @@ static void end_last_frame(AVFilterContext *ctx) · 21 unmodified lines
153154 tile->current = 0;
154155 }
155156
156−static void end_frame(AVFilterLink *inlink)
157+static int end_frame(AVFilterLink *inlink)
157158 {
158159 AVFilterContext *ctx = inlink->dst;
159160 TileContext *tile = ctx->priv;
160161
161− avfilter_unref_buffer(inlink->cur_buf);
162+ avfilter_unref_bufferp(&inlink->cur_buf);
162163 if (++tile->current == tile->w * tile->h)
163164 end_last_frame(ctx);
165+ return 0;
164166 }
165167
166168 static int request_frame(AVFilterLink *outlink)
libavfilter/vf_tinterlace.c+7−4
@@ -198,7 +198,7 @@ void copy_picture_field(uint8_t *dst[4], int dst_linesize[4], · 197 unmodified lines
198198 }
199199 }
200200
201−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
201+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
202202 {
203203 AVFilterContext *ctx = inlink->dst;
204204 TInterlaceContext *tinterlace = ctx->priv;
@@ -206,9 +206,10 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 1 unmodified line
206206 avfilter_unref_buffer(tinterlace->cur);
207207 tinterlace->cur = tinterlace->next;
208208 tinterlace->next = picref;
209+ return 0;
209210 }
210211
211−static void end_frame(AVFilterLink *inlink)
212+static int end_frame(AVFilterLink *inlink)
212213 {
213214 AVFilterContext *ctx = inlink->dst;
214215 AVFilterLink *outlink = ctx->outputs[0];
@@ -220,7 +221,7 @@ static void end_frame(AVFilterLink *inlink) · 5 unmodified lines
220221
221222 /* we need at least two frames */
222223 if (!tinterlace->cur)
223− return;
224+ return 0;
224225
225226 switch (tinterlace->mode) {
226227 case MODE_MERGE: /* move the odd frame into the upper field of the new image, even into
@@ -324,6 +325,8 @@ static void end_frame(AVFilterLink *inlink) · 97 unmodified lines
324325 ff_end_frame(outlink);
325326
326327 tinterlace->frame++;
328+
329+ return 0;
327330 }
328331
329332 static int poll_frame(AVFilterLink *outlink)
@@ -359,7 +362,7 @@ static int request_frame(AVFilterLink *outlink) · 29 unmodified lines
359362 return 0;
360363 }
361364
362−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
365+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { return 0; }
363366
364367 AVFilter avfilter_vf_tinterlace = {
365368 .name = "tinterlace",
libavfilter/vf_transpose.c+16−7
@@ -114,12 +114,16 @@ static int config_props_output(AVFilterLink *outlink) · 113 unmodified lines
114114 return 0;
115115 }
116116
117−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
117+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
118118 {
119119 AVFilterLink *outlink = inlink->dst->outputs[0];
120+ AVFilterBufferRef *buf_out;
120121
121122 outlink->out_buf = ff_get_video_buffer(outlink, AV_PERM_WRITE,
122123 outlink->w, outlink->h);
124+ if (!outlink->out_buf)
125+ return AVERROR(ENOMEM);
126+
123127 outlink->out_buf->pts = picref->pts;
124128
125129 if (picref->video->sample_aspect_ratio.num == 0) {
@@ -129,16 +133,19 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 3 unmodified lines
129133 outlink->out_buf->video->sample_aspect_ratio.den = picref->video->sample_aspect_ratio.num;
130134 }
131135
132− ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0));
136+ buf_out = avfilter_ref_buffer(outlink->out_buf, ~0);
137+ if (!buf_out)
138+ return AVERROR(ENOMEM);
139+ return ff_start_frame(outlink, buf_out);
133140 }
134141
135−static void end_frame(AVFilterLink *inlink)
142+static int end_frame(AVFilterLink *inlink)
136143 {
137144 TransContext *trans = inlink->dst->priv;
138145 AVFilterBufferRef *inpic = inlink->cur_buf;
139146 AVFilterBufferRef *outpic = inlink->dst->outputs[0]->out_buf;
140147 AVFilterLink *outlink = inlink->dst->outputs[0];
141− int plane;
148+ int plane, ret;
142149
143150 for (plane = 0; outpic->data[plane]; plane++) {
144151 int hsub = plane == 1 || plane == 2 ? trans->hsub : 0;
@@ -189,11 +196,13 @@ static void end_frame(AVFilterLink *inlink) · 44 unmodified lines
189196 }
190197 }
191198
192− ff_draw_slice(outlink, 0, outpic->video->h, 1);
193− ff_end_frame(outlink);
199+ if ((ret = ff_draw_slice(outlink, 0, outpic->video->h, 1)) < 0 ||
200+ (ret = ff_end_frame(outlink)) < 0)
201+ return ret;
202+ return 0;
194203 }
195204
196−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
205+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { return 0; }
197206
198207 AVFilter avfilter_vf_transpose = {
199208 .name = "transpose",
libavfilter/vf_unsharp.c+8−4
@@ -213,24 +213,28 @@ static av_cold void uninit(AVFilterContext *ctx) · 212 unmodified lines
213213 free_filter_param(&unsharp->chroma);
214214 }
215215
216−static void end_frame(AVFilterLink *link)
216+static int end_frame(AVFilterLink *link)
217217 {
218218 UnsharpContext *unsharp = link->dst->priv;
219219 AVFilterBufferRef *in = link->cur_buf;
220220 AVFilterBufferRef *out = link->dst->outputs[0]->out_buf;
221221 int cw = SHIFTUP(link->w, unsharp->hsub);
222222 int ch = SHIFTUP(link->h, unsharp->vsub);
223+ int ret;
223224
224225 apply_unsharp(out->data[0], out->linesize[0], in->data[0], in->linesize[0], link->w, link->h, &unsharp->luma);
225226 apply_unsharp(out->data[1], out->linesize[1], in->data[1], in->linesize[1], cw, ch, &unsharp->chroma);
226227 apply_unsharp(out->data[2], out->linesize[2], in->data[2], in->linesize[2], cw, ch, &unsharp->chroma);
227228
228− ff_draw_slice(link->dst->outputs[0], 0, link->h, 1);
229− ff_end_frame(link->dst->outputs[0]);
229+ if ((ret = ff_draw_slice(link->dst->outputs[0], 0, link->h, 1)) < 0 ||
230+ (ret = ff_end_frame(link->dst->outputs[0])) < 0)
231+ return ret;
232+ return 0;
230233 }
231234
232−static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
235+static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
233236 {
237+ return 0;
234238 }
235239
236240 AVFilter avfilter_vf_unsharp = {
libavfilter/vf_vflip.c+10−4
@@ -52,6 +52,9 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *link, int perms, · 51 unmodified lines
5252 return ff_default_get_video_buffer(link, perms, w, h);
5353
5454 picref = ff_get_video_buffer(link->dst->outputs[0], perms, w, h);
55+ if (!picref)
56+ return NULL;
57+
5558 for (i = 0; i < 4; i ++) {
5659 int vsub = i == 1 || i == 2 ? flip->vsub : 0;
5760
@@ -64,12 +67,15 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *link, int perms, · 6 unmodified lines
6467 return picref;
6568 }
6669
67−static void start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref)
70+static int start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref)
6871 {
6972 FlipContext *flip = link->dst->priv;
7073 AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
7174 int i;
7275
76+ if (!outpicref)
77+ return AVERROR(ENOMEM);
78+
7379 for (i = 0; i < 4; i ++) {
7480 int vsub = i == 1 || i == 2 ? flip->vsub : 0;
7581
@@ -79,14 +85,14 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref) · 3 unmodified lines
7985 }
8086 }
8187
82− ff_start_frame(link->dst->outputs[0], outpicref);
88+ return ff_start_frame(link->dst->outputs[0], outpicref);
8389 }
8490
85−static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
91+static int draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
8692 {
8793 AVFilterContext *ctx = link->dst;
8894
89− ff_draw_slice(ctx->outputs[0], link->h - (y+h), h, -1 * slice_dir);
95+ return ff_draw_slice(ctx->outputs[0], link->h - (y+h), h, -1 * slice_dir);
9096 }
9197
9298 AVFilter avfilter_vf_vflip = {
libavfilter/vf_yadif.c+42−23
@@ -156,11 +156,11 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *link, int perms, int w, · 155 unmodified lines
156156 return picref;
157157 }
158158
159−static void return_frame(AVFilterContext *ctx, int is_second)
159+static int return_frame(AVFilterContext *ctx, int is_second)
160160 {
161161 YADIFContext *yadif = ctx->priv;
162162 AVFilterLink *link= ctx->outputs[0];
163− int tff;
163+ int tff, ret;
164164
165165 if (yadif->parity == -1) {
166166 tff = yadif->cur->video->interlaced ?
@@ -172,6 +172,9 @@ static void return_frame(AVFilterContext *ctx, int is_second) · 5 unmodified lines
172172 if (is_second) {
173173 yadif->out = ff_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE |
174174 AV_PERM_REUSE, link->w, link->h);
175+ if (!yadif->out)
176+ return AVERROR(ENOMEM);
177+
175178 avfilter_copy_buffer_ref_props(yadif->out, yadif->cur);
176179 yadif->out->video->interlaced = 0;
177180 }
@@ -192,15 +195,19 @@ static void return_frame(AVFilterContext *ctx, int is_second) · 14 unmodified lines
192195 } else {
193196 yadif->out->pts = AV_NOPTS_VALUE;
194197 }
195− ff_start_frame(ctx->outputs[0], yadif->out);
198+ ret = ff_start_frame(ctx->outputs[0], yadif->out);
199+ if (ret < 0)
200+ return ret;
196201 }
197− ff_draw_slice(ctx->outputs[0], 0, link->h, 1);
198− ff_end_frame(ctx->outputs[0]);
202+ if ((ret = ff_draw_slice(ctx->outputs[0], 0, link->h, 1)) < 0 ||
203+ (ret = ff_end_frame(ctx->outputs[0])) < 0)
204+ return ret;
199205
200206 yadif->frame_pending = (yadif->mode&1) && !is_second;
207+ return 0;
201208 }
202209
203−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
210+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
204211 {
205212 AVFilterContext *ctx = link->dst;
206213 YADIFContext *yadif = ctx->priv;
@@ -217,46 +224,52 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 10 unmodified lines
217224 yadif->next = picref;
218225
219226 if (!yadif->cur)
220− return;
227+ return 0;
221228
222229 if (yadif->auto_enable && !yadif->cur->video->interlaced) {
223230 yadif->out = avfilter_ref_buffer(yadif->cur, AV_PERM_READ);
224− avfilter_unref_buffer(yadif->prev);
225− yadif->prev = NULL;
231+ if (!yadif->out)
232+ return AVERROR(ENOMEM);
233+
234+ avfilter_unref_bufferp(&yadif->prev);
226235 if (yadif->out->pts != AV_NOPTS_VALUE)
227236 yadif->out->pts *= 2;
228− ff_start_frame(ctx->outputs[0], yadif->out);
229− return;
237+ return ff_start_frame(ctx->outputs[0], yadif->out);
230238 }
231239
232− if (!yadif->prev)
233− yadif->prev = avfilter_ref_buffer(yadif->cur, AV_PERM_READ);
240+ if (!yadif->prev &&
241+ !(yadif->prev = avfilter_ref_buffer(yadif->cur, AV_PERM_READ)))
242+ return AVERROR(ENOMEM);
234243
235244 yadif->out = ff_get_video_buffer(ctx->outputs[0], AV_PERM_WRITE | AV_PERM_PRESERVE |
236245 AV_PERM_REUSE, link->w, link->h);
246+ if (!yadif->out)
247+ return AVERROR(ENOMEM);
237248
238249 avfilter_copy_buffer_ref_props(yadif->out, yadif->cur);
239250 yadif->out->video->interlaced = 0;
240251 if (yadif->out->pts != AV_NOPTS_VALUE)
241252 yadif->out->pts *= 2;
242− ff_start_frame(ctx->outputs[0], yadif->out);
253+ return ff_start_frame(ctx->outputs[0], yadif->out);
243254 }
244255
245−static void end_frame(AVFilterLink *link)
256+static int end_frame(AVFilterLink *link)
246257 {
247258 AVFilterContext *ctx = link->dst;
248259 YADIFContext *yadif = ctx->priv;
249260
250261 if (!yadif->out)
251− return;
262+ return 0;
252263
253264 if (yadif->auto_enable && !yadif->cur->video->interlaced) {
254− ff_draw_slice(ctx->outputs[0], 0, link->h, 1);
255− ff_end_frame(ctx->outputs[0]);
256− return;
265+ int ret = ff_draw_slice(ctx->outputs[0], 0, link->h, 1);
266+ if (ret >= 0)
267+ ret = ff_end_frame(ctx->outputs[0]);
268+ return ret;
257269 }
258270
259271 return_frame(ctx, 0);
272+ return 0;
260273 }
261274
262275 static int request_frame(AVFilterLink *link)
@@ -279,6 +292,9 @@ static int request_frame(AVFilterLink *link) · 16 unmodified lines
279292
280293 if (ret == AVERROR_EOF && yadif->cur) {
281294 AVFilterBufferRef *next = avfilter_ref_buffer(yadif->next, AV_PERM_READ);
295+ if (!next)
296+ return AVERROR(ENOMEM);
297+
282298 next->pts = yadif->next->pts * 2 - yadif->cur->pts;
283299
284300 start_frame(link->src->inputs[0], next);
@@ -323,9 +339,9 @@ static av_cold void uninit(AVFilterContext *ctx) · 38 unmodified lines
323339 {
324340 YADIFContext *yadif = ctx->priv;
325341
326− if (yadif->prev) avfilter_unref_buffer(yadif->prev);
327− if (yadif->cur ) avfilter_unref_buffer(yadif->cur );
328− if (yadif->next) avfilter_unref_buffer(yadif->next);
342+ if (yadif->prev) avfilter_unref_bufferp(&yadif->prev);
343+ if (yadif->cur ) avfilter_unref_bufferp(&yadif->cur );
344+ if (yadif->next) avfilter_unref_bufferp(&yadif->next);
329345 }
330346
331347 static int query_formats(AVFilterContext *ctx)
@@ -381,7 +397,10 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 49 unmodified lines
381397 return 0;
382398 }
383399
384−static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
400+static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
401+{
402+ return 0;
403+}
385404
386405 static int config_props(AVFilterLink *link)
387406 {
libavfilter/video.c+63−37
@@ -149,13 +149,15 @@ AVFilterBufferRef *ff_get_video_buffer(AVFilterLink *link, int perms, int w, int · 148 unmodified lines
149149 return ret;
150150 }
151151
152−void ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
152+int ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
153153 {
154154 AVFilterBufferRef *buf_out = avfilter_ref_buffer(picref, ~0);
155− ff_start_frame(link->dst->outputs[0], buf_out);
155+ if (!buf_out)
156+ return AVERROR(ENOMEM);
157+ return ff_start_frame(link->dst->outputs[0], buf_out);
156158 }
157159
158−static void default_start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
160+static int default_start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
159161 {
160162 AVFilterLink *outlink = NULL;
161163
@@ -163,21 +165,37 @@ static void default_start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 1 unmodified line
163165 outlink = inlink->dst->outputs[0];
164166
165167 if (outlink) {
168+ AVFilterBufferRef *buf_out;
166169 outlink->out_buf = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h);
170+ if (!outlink->out_buf)
171+ return AVERROR(ENOMEM);
172+
167173 avfilter_copy_buffer_ref_props(outlink->out_buf, picref);
168174 outlink->out_buf->video->w = outlink->w;
169175 outlink->out_buf->video->h = outlink->h;
170− ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0));
176+ buf_out = avfilter_ref_buffer(outlink->out_buf, ~0);
177+ if (!buf_out)
178+ return AVERROR(ENOMEM);
179+
180+ return ff_start_frame(outlink, buf_out);
171181 }
182+ return 0;
183+}
184+
185+static void clear_link(AVFilterLink *link)
186+{
187+ avfilter_unref_bufferp(&link->cur_buf);
188+ avfilter_unref_bufferp(&link->src_buf);
189+ avfilter_unref_bufferp(&link->out_buf);
172190 }
173191
174192 /* XXX: should we do the duplicating of the picture ref here, instead of
175193 * forcing the source filter to do it? */
176−void ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
194+int ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
177195 {
178− void (*start_frame)(AVFilterLink *, AVFilterBufferRef *);
196+ int (*start_frame)(AVFilterLink *, AVFilterBufferRef *);
179197 AVFilterPad *dst = link->dstpad;
180− int perms = picref->perms;
198+ int ret, perms = picref->perms;
181199 AVFilterCommand *cmd= link->dst->command_queue;
182200 int64_t pts;
183201
@@ -196,6 +214,11 @@ void ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 12 unmodified lines
196214 link->dstpad->min_perms, link->dstpad->rej_perms);
197215
198216 link->cur_buf = ff_get_video_buffer(link, dst->min_perms, link->w, link->h);
217+ if (!link->cur_buf) {
218+ avfilter_unref_bufferp(&picref);
219+ return AVERROR(ENOMEM);
220+ }
221+
199222 link->src_buf = picref;
200223 avfilter_copy_buffer_ref_props(link->cur_buf, link->src_buf);
201224
@@ -215,22 +238,26 @@ void ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 13 unmodified lines
215238 cmd= link->dst->command_queue;
216239 }
217240 pts = link->cur_buf->pts;
218− start_frame(link, link->cur_buf);
241+ ret = start_frame(link, link->cur_buf);
219242 ff_update_link_current_pts(link,link->cur_buf ? link->cur_buf->pts : pts);
243+ if (ret < 0)
244+ clear_link(link);
245+
246+ return ret;
220247 }
221248
222−void ff_null_start_frame_keep_ref(AVFilterLink *inlink,
249+int ff_null_start_frame_keep_ref(AVFilterLink *inlink,
223250 AVFilterBufferRef *picref)
224251 {
225− ff_start_frame(inlink->dst->outputs[0], avfilter_ref_buffer(picref, ~0));
252+ return ff_start_frame(inlink->dst->outputs[0], avfilter_ref_buffer(picref, ~0));
226253 }
227254
228−void ff_null_end_frame(AVFilterLink *link)
255+int ff_null_end_frame(AVFilterLink *link)
229256 {
230− ff_end_frame(link->dst->outputs[0]);
257+ return ff_end_frame(link->dst->outputs[0]);
231258 }
232259
233−static void default_end_frame(AVFilterLink *inlink)
260+static int default_end_frame(AVFilterLink *inlink)
234261 {
235262 AVFilterLink *outlink = NULL;
236263
@@ -238,37 +265,32 @@ static void default_end_frame(AVFilterLink *inlink) · 1 unmodified line
238265 outlink = inlink->dst->outputs[0];
239266
240267 if (outlink) {
241− ff_end_frame(outlink);
268+ return ff_end_frame(outlink);
242269 }
270+ return 0;
243271 }
244272
245−void ff_end_frame(AVFilterLink *link)
273+int ff_end_frame(AVFilterLink *link)
246274 {
247− void (*end_frame)(AVFilterLink *);
275+ int (*end_frame)(AVFilterLink *);
276+ int ret;
248277
249278 if (!(end_frame = link->dstpad->end_frame))
250279 end_frame = default_end_frame;
251280
252− end_frame(link);
281+ ret = end_frame(link);
253282
254− /* unreference the source picture if we're feeding the destination filter
255− * a copied version dues to permission issues */
256− if (link->src_buf) {
257− avfilter_unref_buffer(link->src_buf);
258− link->src_buf = NULL;
259− }
260− if(link->cur_buf != link->out_buf)
261− avfilter_unref_bufferp(&link->cur_buf);
262− link->cur_buf = NULL;
263− avfilter_unref_bufferp(&link->out_buf);
283+ clear_link(link);
284+
285+ return ret;
264286 }
265287
266−void ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
288+int ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
267289 {
268− ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
290+ return ff_draw_slice(link->dst->outputs[0], y, h, slice_dir);
269291 }
270292
271−static void default_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
293+static int default_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
272294 {
273295 AVFilterLink *outlink = NULL;
274296
@@ -276,14 +298,15 @@ static void default_draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir · 1 unmodified line
276298 outlink = inlink->dst->outputs[0];
277299
278300 if (outlink)
279− ff_draw_slice(outlink, y, h, slice_dir);
301+ return ff_draw_slice(outlink, y, h, slice_dir);
302+ return 0;
280303 }
281304
282−void ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
305+int ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
283306 {
284307 uint8_t *src[4], *dst[4];
285− int i, j, vsub;
286− void (*draw_slice)(AVFilterLink *, int, int, int);
308+ int i, j, vsub, ret;
309+ int (*draw_slice)(AVFilterLink *, int, int, int);
287310
288311 FF_TPRINTF_START(NULL, draw_slice); ff_tlog_link(NULL, link, 0); ff_tlog(NULL, " y:%d h:%d dir:%d\n", y, h, slice_dir);
289312
@@ -317,11 +340,14 @@ void ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) · 27 unmodified lines
317340
318341 if (!(draw_slice = link->dstpad->draw_slice))
319342 draw_slice = default_draw_slice;
320− draw_slice(link, y, h, slice_dir);
343+ ret = draw_slice(link, y, h, slice_dir);
344+ if (ret < 0)
345+ clear_link(link);
346+ return ret;
321347 }
322348
323−void avfilter_default_end_frame(AVFilterLink *inlink)
349+int avfilter_default_end_frame(AVFilterLink *inlink)
324350 {
325− default_end_frame(inlink);
351+ return default_end_frame(inlink);
326352 }
327353
libavfilter/video.h+14−7
@@ -42,9 +42,9 @@ AVFilterBufferRef *ff_null_get_video_buffer(AVFilterLink *link, int perms, int w · 41 unmodified lines
4242 AVFilterBufferRef *ff_get_video_buffer(AVFilterLink *link, int perms,
4343 int w, int h);
4444
45−void ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
46−void ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
47−void ff_null_end_frame(AVFilterLink *link);
45+int ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
46+int ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
47+int ff_null_end_frame(AVFilterLink *link);
4848
4949 /**
5050 * Notify the next filter of the start of a frame.
@@ -54,20 +54,25 @@ void ff_null_end_frame(AVFilterLink *link); · 3 unmodified lines
5454 * frame need only be valid once draw_slice() is called for that
5555 * portion. The receiving filter will free this reference when
5656 * it no longer needs it.
57+ *
58+ * @return >= 0 on success, a negative AVERROR on error. This function will
59+ * unreference picref in case of error.
5760 */
58−void ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
61+int ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
5962
6063 /**
6164 * Pass video frame along and keep an internal reference for later use.
6265 */
63−void ff_null_start_frame_keep_ref(AVFilterLink *inlink, AVFilterBufferRef *picref);
66+int ff_null_start_frame_keep_ref(AVFilterLink *inlink, AVFilterBufferRef *picref);
6467
6568 /**
6669 * Notify the next filter that the current frame has finished.
6770 *
6871 * @param link the output link the frame was sent over
72+ *
73+ * @return >= 0 on success, a negative AVERROR on error
6974 */
70−void ff_end_frame(AVFilterLink *link);
75+int ff_end_frame(AVFilterLink *link);
7176
7277 /**
7378 * Send a slice to the next filter.
@@ -83,7 +88,9 @@ void ff_end_frame(AVFilterLink *link); · 9 unmodified lines
8388 * from the top slice to the bottom slice if the value is 1,
8489 * from the bottom slice to the top slice if the value is -1,
8590 * for other values the behavior of the function is undefined.
91+ *
92+ * @return >= 0 on success, a negative AVERROR on error.
8693 */
87−void ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
94+int ff_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
8895
8996 #endif /* AVFILTER_VIDEO_H */
libavfilter/vsink_nullsink.c+4−2
@@ -19,12 +19,14 @@ · 18 unmodified lines
1919 #include "avfilter.h"
2020 #include "internal.h"
2121
22−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
22+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
2323 {
24+ return 0;
2425 }
2526
26−static void end_frame(AVFilterLink *link)
27+static int end_frame(AVFilterLink *link)
2728 {
29+ return 0;
2830 }
2931
3032 AVFilter avfilter_vsink_nullsink = {
libavfilter/vsrc_color.c+24−4
@@ -149,18 +149,38 @@ static int color_request_frame(AVFilterLink *link) · 148 unmodified lines
149149 {
150150 ColorContext *color = link->src->priv;
151151 AVFilterBufferRef *picref = ff_get_video_buffer(link, AV_PERM_WRITE, color->w, color->h);
152+ AVFilterBufferRef *buf_out;
153+ int ret;
154+
155+ if (!picref)
156+ return AVERROR(ENOMEM);
157+
152158 picref->video->sample_aspect_ratio = (AVRational) {1, 1};
153159 picref->pts = color->pts++;
154160 picref->pos = -1;
155161
156− ff_start_frame(link, avfilter_ref_buffer(picref, ~0));
162+ buf_out = avfilter_ref_buffer(picref, ~0);
163+ if (!buf_out) {
164+ ret = AVERROR(ENOMEM);
165+ goto fail;
166+ }
167+
168+ ret = ff_start_frame(link, buf_out);
169+ if (ret < 0)
170+ goto fail;
171+
157172 ff_fill_rectangle(&color->draw, &color->color, picref->data, picref->linesize,
158173 0, 0, color->w, color->h);
159− ff_draw_slice(link, 0, color->h, 1);
160− ff_end_frame(link);
174+ ret = ff_draw_slice(link, 0, color->h, 1);
175+ if (ret < 0)
176+ goto fail;
177+
178+ ret = ff_end_frame(link);
179+
180+fail:
161181 avfilter_unref_buffer(picref);
162182
163− return 0;
183+ return ret;
164184 }
165185
166186 AVFilter avfilter_vsrc_color = {
libavfilter/vsrc_testsrc.c+8−3
@@ -134,10 +134,14 @@ static int request_frame(AVFilterLink *outlink) · 133 unmodified lines
134134 {
135135 TestSourceContext *test = outlink->src->priv;
136136 AVFilterBufferRef *picref;
137+ int ret;
137138
138139 if (test->max_pts >= 0 && test->pts >= test->max_pts)
139140 return AVERROR_EOF;
140141 picref = ff_get_video_buffer(outlink, AV_PERM_WRITE, test->w, test->h);
142+ if (!picref)
143+ return AVERROR(ENOMEM);
144+
141145 picref->pts = test->pts++;
142146 picref->pos = -1;
143147 picref->video->key_frame = 1;
@@ -147,9 +151,10 @@ static int request_frame(AVFilterLink *outlink) · 3 unmodified lines
147151 test->fill_picture_fn(outlink->src, picref);
148152 test->nb_frame++;
149153
150− ff_start_frame(outlink, picref);
151− ff_draw_slice(outlink, 0, test->h, 1);
152− ff_end_frame(outlink);
154+ if ((ret = ff_start_frame(outlink, picref)) < 0 ||
155+ (ret = ff_draw_slice(outlink, 0, test->h, 1)) < 0 ||
156+ (ret = ff_end_frame(outlink)) < 0)
157+ return ret;
153158
154159 return 0;
155160 }
libavformat/matroskadec.c+2−1
@@ -656,8 +656,9 @@ static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb, · 655 unmodified lines
656656 av_log(matroska->ctx, AV_LOG_ERROR,
657657 "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
658658 pos, pos);
659+ return pb->error ? pb->error : AVERROR(EIO);
659660 }
660− return AVERROR(EIO); /* EOS or actual I/O error */
661+ return AVERROR_EOF;
661662 }
662663
663664 /* get the length of the EBML number */
tests/Makefile+1−0
@@ -54,6 +54,7 @@ include $(SRC_PATH)/tests/fate/demux.mak · 53 unmodified lines
5454 include $(SRC_PATH)/tests/fate/dfa.mak
5555 include $(SRC_PATH)/tests/fate/dpcm.mak
5656 include $(SRC_PATH)/tests/fate/ea.mak
57+include $(SRC_PATH)/tests/fate/filter.mak
5758 include $(SRC_PATH)/tests/fate/flac.mak
5859 include $(SRC_PATH)/tests/fate/fft.mak
5960 include $(SRC_PATH)/tests/fate/h264.mak
tests/fate/filter.mak+10−0
@@ -0,0 +1,10 @@
1+FATE_ASYNCTS += fate-filter-asyncts
2+fate-filter-asyncts: SRC = $(SAMPLES)/nellymoser/nellymoser-discont.flv
3+fate-filter-asyncts: CMD = pcm -i $(SRC) -af aresample=min_comp=0.001:min_hard_comp=0.1
4+fate-filter-asyncts: CMP = oneoff
5+fate-filter-asyncts: REF = $(SAMPLES)/nellymoser/nellymoser-discont.pcm
6+
7+FATE_FILTER += $(FATE_ASYNCTS)
8+FATE_SAMPLES_AVCONV += $(FATE_ASYNCTS)
9+
10+fate-filter: $(FATE_FILTER)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t