History

lavfi: add error handling to start_frame().

Anton Khirnov committed 14 years ago

Commit ebc8d971 parent 1470ce226 files · +209 −99Browse files

Unified · Split

26 files
  1. libavfilter/avfilter.h +4 −1
  2. libavfilter/buffersink.c +3 −7
  3. libavfilter/fifo.c +2 −7
  4. libavfilter/internal.h +3 −0
  5. libavfilter/split.c +9 −5
  6. libavfilter/vf_aspect.c +2 −2
  7. libavfilter/vf_crop.c +5 −2
  8. libavfilter/vf_delogo.c +17 −4
  9. libavfilter/vf_drawtext.c +9 −7
  10. libavfilter/vf_fieldorder.c +17 −3
  11. libavfilter/vf_fps.c +2 −1
  12. libavfilter/vf_gradfun.c +17 −4
  13. libavfilter/vf_overlay.c +4 −3
  14. libavfilter/vf_pad.c +23 −5
  15. libavfilter/vf_pixdesctest.c +15 −6
  16. libavfilter/vf_scale.c +14 −5
  17. libavfilter/vf_select.c +5 −3
  18. libavfilter/vf_setpts.c +5 −2
  19. libavfilter/vf_settb.c +2 −2
  20. libavfilter/vf_slicify.c +2 −2
  21. libavfilter/vf_transpose.c +5 −2
  22. libavfilter/vf_vflip.c +2 −2
  23. libavfilter/vf_yadif.c +4 −5
  24. libavfilter/video.c +31 −16
  25. libavfilter/video.h +5 −2
  26. libavfilter/vsink_nullsink.c +2 −1
libavfilter/avfilter.h+4−1
@@ -258,8 +258,11 @@ struct AVFilterPad { · 257 unmodified lines
258258 * picture inside the link structure.
259259 *
260260 * Input video pads only.
261+ *
262+ * @return >= 0 on success, a negative AVERROR on error. picref will be
263+ * unreferenced by the caller in case of error.
261264 */
262− void (*start_frame)(AVFilterLink *link, AVFilterBufferRef *picref);
265+ int (*start_frame)(AVFilterLink *link, AVFilterBufferRef *picref);
263266
264267 /**
265268 * Callback function to get a video buffer. If NULL, the filter system will
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/fifo.c+2−7
@@ -76,6 +76,7 @@ static int add_to_queue(AVFilterLink *inlink, AVFilterBufferRef *buf) · 75 unmodified lines
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;
@@ -272,7 +267,7 @@ AVFilter avfilter_vf_fifo = { · 172 unmodified lines
272267 .inputs = (const AVFilterPad[]) {{ .name = "default",
273268 .type = AVMEDIA_TYPE_VIDEO,
274269 .get_video_buffer= ff_null_get_video_buffer,
275− .start_frame = start_frame,
270+ .start_frame = add_to_queue,
276271 .draw_slice = draw_slice,
277272 .end_frame = end_frame,
278273 .rej_perms = AV_PERM_REUSE2, },
libavfilter/internal.h+3−0
@@ -69,6 +69,9 @@ struct AVFilterPad { · 68 unmodified lines
6969 * picture inside the link structure.
7070 *
7171 * Input video pads only.
72+ *
73+ * @return >= 0 on success, a negative AVERROR on error. picref will be
74+ * unreferenced by the caller in case of error.
7275 */
7376 void (*start_frame)(AVFilterLink *link, AVFilterBufferRef *picref);
7477
libavfilter/split.c+9−5
@@ -63,14 +63,18 @@ 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+ ret = ff_start_frame(ctx->outputs[i],
73+ avfilter_ref_buffer(picref, ~AV_PERM_WRITE));
74+ if (ret < 0)
75+ break;
76+ }
77+ return ret;
7478 }
7579
7680 static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
libavfilter/vf_aspect.c+2−2
@@ -64,13 +64,13 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 63 unmodified lines
6464 return 0;
6565 }
6666
67−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
67+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
6868 {
6969 AspectContext *aspect = link->dst->priv;
7070
7171 picref->video->pixel_aspect = aspect->aspect;
7272 link->cur_buf = NULL;
73− ff_start_frame(link->dst->outputs[0], picref);
73+ return ff_start_frame(link->dst->outputs[0], picref);
7474 }
7575
7676 #if CONFIG_SETDAR_FILTER
libavfilter/vf_crop.c+5−2
@@ -240,7 +240,7 @@ static int config_output(AVFilterLink *link) · 239 unmodified lines
240240 return 0;
241241 }
242242
243−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
243+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
244244 {
245245 AVFilterContext *ctx = link->dst;
246246 CropContext *crop = ctx->priv;
@@ -248,6 +248,9 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 1 unmodified line
248248 int i;
249249
250250 ref2 = avfilter_ref_buffer(picref, ~0);
251+ if (!ref2)
252+ return AVERROR(ENOMEM);
253+
251254 ref2->video->w = crop->w;
252255 ref2->video->h = crop->h;
253256
@@ -291,7 +294,7 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 37 unmodified lines
291294 ref2->data[3] += crop->x * crop->max_step[3];
292295 }
293296
294− ff_start_frame(link->dst->outputs[0], ref2);
297+ return ff_start_frame(link->dst->outputs[0], ref2);
295298 }
296299
297300 static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
libavfilter/vf_delogo.c+17−4
@@ -214,22 +214,35 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 213 unmodified lines
214214 return 0;
215215 }
216216
217−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
217+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
218218 {
219219 AVFilterLink *outlink = inlink->dst->outputs[0];
220− AVFilterBufferRef *outpicref;
220+ AVFilterBufferRef *outpicref = NULL;
221+ int ret = 0;
221222
222223 if (inpicref->perms & AV_PERM_PRESERVE) {
223224 outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE,
224225 outlink->w, outlink->h);
226+ if (!outpicref)
227+ return AVERROR(ENOMEM);
228+
225229 avfilter_copy_buffer_ref_props(outpicref, inpicref);
226230 outpicref->video->w = outlink->w;
227231 outpicref->video->h = outlink->h;
228− } else
232+ } else {
229233 outpicref = avfilter_ref_buffer(inpicref, ~0);
234+ if (!outpicref)
235+ return AVERROR(ENOMEM);
236+ }
237+
238+ ret = ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
239+ if (ret < 0) {
240+ avfilter_unref_bufferp(&outpicref);
241+ return ret;
242+ }
230243
231244 outlink->out_buf = outpicref;
232− ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
245+ return 0;
233246 }
234247
235248 static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
libavfilter/vf_drawtext.c+9−7
@@ -808,16 +808,16 @@ static inline int normalize_double(int *n, double d) · 807 unmodified lines
808808 return ret;
809809 }
810810
811−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
811+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
812812 {
813813 AVFilterContext *ctx = inlink->dst;
814814 DrawTextContext *dtext = ctx->priv;
815815 AVFilterBufferRef *buf_out;
816− int fail = 0;
816+ int ret = 0;
817817
818− if (dtext_prepare_text(ctx) < 0) {
818+ if ((ret = dtext_prepare_text(ctx)) < 0) {
819819 av_log(ctx, AV_LOG_ERROR, "Can't draw text\n");
820− fail = 1;
820+ return ret;
821821 }
822822
823823 dtext->var_values[VAR_T] = inpicref->pts == AV_NOPTS_VALUE ?
@@ -829,8 +829,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) · 5 unmodified lines
829829 dtext->var_values[VAR_X] =
830830 av_expr_eval(dtext->x_pexpr, dtext->var_values, &dtext->prng);
831831
832− dtext->draw = fail ? 0 :
833− av_expr_eval(dtext->d_pexpr, dtext->var_values, &dtext->prng);
832+ dtext->draw = av_expr_eval(dtext->d_pexpr, dtext->var_values, &dtext->prng);
834833
835834 normalize_double(&dtext->x, dtext->var_values[VAR_X]);
836835 normalize_double(&dtext->y, dtext->var_values[VAR_Y]);
@@ -852,7 +851,10 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) · 15 unmodified lines
852851 dtext->x, dtext->y, dtext->x+dtext->w, dtext->y+dtext->h);
853852
854853 buf_out = avfilter_ref_buffer(inpicref, ~0);
855− ff_start_frame(inlink->dst->outputs[0], buf_out);
854+ if (!buf_out)
855+ return AVERROR(ENOMEM);
856+
857+ return ff_start_frame(inlink->dst->outputs[0], buf_out);
856858 }
857859
858860 static void end_frame(AVFilterLink *inlink)
libavfilter/vf_fieldorder.c+17−3
@@ -116,18 +116,32 @@ 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
133147 static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
libavfilter/vf_fps.c+2−1
@@ -243,8 +243,9 @@ static void end_frame(AVFilterLink *inlink) · 242 unmodified lines
243243 s->pts = s->first_pts + av_rescale_q(s->frames_out, outlink->time_base, inlink->time_base);
244244 }
245245
246−static void null_start_frame(AVFilterLink *link, AVFilterBufferRef *buf)
246+static int null_start_frame(AVFilterLink *link, AVFilterBufferRef *buf)
247247 {
248+ return 0;
248249 }
249250
250251 static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
libavfilter/vf_gradfun.c+17−4
@@ -180,21 +180,34 @@ 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;
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+ ret = ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
204+ if (ret < 0) {
205+ avfilter_unref_bufferp(&outpicref);
206+ return ret;
207+ }
195208
196209 outlink->out_buf = outpicref;
197− ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
210+ return 0;
198211 }
199212
200213 static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
libavfilter/vf_overlay.c+4−3
@@ -208,7 +208,7 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *link, int perms, int w, · 207 unmodified lines
208208 return ff_get_video_buffer(link->dst->outputs[0], perms, w, h);
209209 }
210210
211−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
211+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
212212 {
213213 AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
214214 AVFilterContext *ctx = inlink->dst;
@@ -228,10 +228,10 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) · 13 unmodified lines
228228 over->overpicref = old;
229229 }
230230
231− ff_start_frame(inlink->dst->outputs[0], outpicref);
231+ return ff_start_frame(inlink->dst->outputs[0], outpicref);
232232 }
233233
234−static void start_frame_overlay(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
234+static int start_frame_overlay(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
235235 {
236236 AVFilterContext *ctx = inlink->dst;
237237 OverlayContext *over = ctx->priv;
@@ -239,6 +239,7 @@ static void start_frame_overlay(AVFilterLink *inlink, AVFilterBufferRef *inpicre · 1 unmodified line
239239 over->overpicref = inpicref;
240240 over->overpicref->pts = av_rescale_q(inpicref->pts, ctx->inputs[OVERLAY]->time_base,
241241 ctx->outputs[0]->time_base);
242+ return 0;
242243 }
243244
244245 static void blend_slice(AVFilterContext *ctx,
libavfilter/vf_pad.c+23−5
@@ -299,12 +299,15 @@ static int does_clip(PadContext *pad, AVFilterBufferRef *outpicref, int plane, i · 298 unmodified lines
299299 return 0;
300300 }
301301
302−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
302+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
303303 {
304304 PadContext *pad = inlink->dst->priv;
305305 AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
306306 AVFilterBufferRef *for_next_filter;
307− int plane;
307+ int plane, ret = 0;
308+
309+ if (!outpicref)
310+ return AVERROR(ENOMEM);
308311
309312 for (plane = 0; plane < 4 && outpicref->data[plane]; plane++) {
310313 int hsub = (plane == 1 || plane == 2) ? pad->hsub : 0;
@@ -332,16 +335,31 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) · 21 unmodified lines
332335 outpicref = ff_get_video_buffer(inlink->dst->outputs[0], AV_PERM_WRITE | AV_PERM_NEG_LINESIZES,
333336 FFMAX(inlink->w, pad->w),
334337 FFMAX(inlink->h, pad->h));
338+ if (!outpicref)
339+ return AVERROR(ENOMEM);
340+
335341 avfilter_copy_buffer_ref_props(outpicref, inpicref);
336342 }
337343
338− inlink->dst->outputs[0]->out_buf = outpicref;
339−
340344 outpicref->video->w = pad->w;
341345 outpicref->video->h = pad->h;
342346
343347 for_next_filter = avfilter_ref_buffer(outpicref, ~0);
344− ff_start_frame(inlink->dst->outputs[0], for_next_filter);
348+ if (!for_next_filter) {
349+ ret = AVERROR(ENOMEM);
350+ goto fail;
351+ }
352+
353+ ret = ff_start_frame(inlink->dst->outputs[0], for_next_filter);
354+ if (ret < 0)
355+ goto fail;
356+
357+ inlink->dst->outputs[0]->out_buf = outpicref;
358+ return 0;
359+
360+fail:
361+ avfilter_unref_bufferp(&outpicref);
362+ return ret;
345363 }
346364
347365 static void end_frame(AVFilterLink *link)
libavfilter/vf_pixdesctest.c+15−6
@@ -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];
5858 AVFilterBufferRef *outpicref;
59− int i;
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,7 +80,14 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 11 unmodified lines
7880 priv->pix_desc->flags & PIX_FMT_PSEUDOPAL)
7981 memcpy(outpicref->data[1], outpicref->data[1], 256*4);
8082
81− ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
83+ ret = ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
84+ if (ret < 0) {
85+ avfilter_unref_bufferp(&outpicref);
86+ return ret;
87+ }
88+
89+ outlink->out_buf = outpicref;
90+ return 0;
8291 }
8392
8493 static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
libavfilter/vf_scale.c+14−5
@@ -252,26 +252,28 @@ fail: · 251 unmodified lines
252252 return ret;
253253 }
254254
255−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
255+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
256256 {
257257 ScaleContext *scale = link->dst->priv;
258258 AVFilterLink *outlink = link->dst->outputs[0];
259259 AVFilterBufferRef *outpicref;
260+ int ret = 0;
260261
261262 if (!scale->sws) {
262− ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0));
263− return;
263+ return ff_start_frame(outlink, avfilter_ref_buffer(picref, ~0));
264264 }
265265
266266 scale->hsub = av_pix_fmt_descriptors[link->format].log2_chroma_w;
267267 scale->vsub = av_pix_fmt_descriptors[link->format].log2_chroma_h;
268268
269269 outpicref = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h);
270+ if (!outpicref)
271+ return AVERROR(ENOMEM);
272+
270273 avfilter_copy_buffer_ref_props(outpicref, picref);
271274 outpicref->video->w = outlink->w;
272275 outpicref->video->h = outlink->h;
273276
274− outlink->out_buf = outpicref;
275277
276278 av_reduce(&outpicref->video->pixel_aspect.num, &outpicref->video->pixel_aspect.den,
277279 (int64_t)picref->video->pixel_aspect.num * outlink->h * link->w,
@@ -279,7 +281,14 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 1 unmodified line
279281 INT_MAX);
280282
281283 scale->slice_y = 0;
282− ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
284+ ret = ff_start_frame(outlink, avfilter_ref_buffer(outpicref, ~0));
285+ if (ret < 0) {
286+ avfilter_unref_bufferp(&outpicref);
287+ return ret;
288+ }
289+
290+ outlink->out_buf = outpicref;
291+ return 0;
283292 }
284293
285294 static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
libavfilter/vf_select.c+5−3
@@ -227,7 +227,7 @@ static int select_frame(AVFilterContext *ctx, AVFilterBufferRef *picref) · 226 unmodified lines
227227 return res;
228228 }
229229
230−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
230+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
231231 {
232232 SelectContext *select = inlink->dst->priv;
233233
@@ -241,10 +241,12 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 7 unmodified lines
241241 else
242242 av_fifo_generic_write(select->pending_frames, &picref,
243243 sizeof(picref), NULL);
244− return;
244+ return 0;
245245 }
246− ff_start_frame(inlink->dst->outputs[0], avfilter_ref_buffer(picref, ~0));
246+ return ff_start_frame(inlink->dst->outputs[0], avfilter_ref_buffer(picref, ~0));
247247 }
248+
249+ return 0;
248250 }
249251
250252 static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
libavfilter/vf_setpts.c+5−2
@@ -101,12 +101,15 @@ static int config_input(AVFilterLink *inlink) · 100 unmodified lines
101101 #define D2TS(d) (isnan(d) ? AV_NOPTS_VALUE : (int64_t)(d))
102102 #define TS2D(ts) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts))
103103
104−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
104+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
105105 {
106106 SetPTSContext *setpts = inlink->dst->priv;
107107 double d;
108108 AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
109109
110+ if (!outpicref)
111+ return AVERROR(ENOMEM);
112+
110113 if (isnan(setpts->var_values[VAR_STARTPTS]))
111114 setpts->var_values[VAR_STARTPTS] = TS2D(inpicref->pts);
112115
@@ -130,7 +133,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref) · 17 unmodified lines
130133 setpts->var_values[VAR_N] += 1.0;
131134 setpts->var_values[VAR_PREV_INPTS ] = TS2D(inpicref ->pts);
132135 setpts->var_values[VAR_PREV_OUTPTS] = TS2D(outpicref->pts);
133− ff_start_frame(inlink->dst->outputs[0], outpicref);
136+ return ff_start_frame(inlink->dst->outputs[0], outpicref);
134137 }
135138
136139 static av_cold void uninit(AVFilterContext *ctx)
libavfilter/vf_settb.c+2−2
@@ -104,7 +104,7 @@ static int config_output_props(AVFilterLink *outlink) · 103 unmodified lines
104104 return 0;
105105 }
106106
107−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
107+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
108108 {
109109 AVFilterContext *ctx = inlink->dst;
110110 AVFilterLink *outlink = ctx->outputs[0];
@@ -118,7 +118,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 7 unmodified lines
118118 }
119119 inlink->cur_buf = NULL;
120120
121− ff_start_frame(outlink, picref);
121+ return ff_start_frame(outlink, picref);
122122 }
123123
124124 AVFilter avfilter_vf_settb = {
libavfilter/vf_slicify.c+2−2
@@ -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,7 +75,7 @@ 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
8181 static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
libavfilter/vf_transpose.c+5−2
@@ -117,12 +117,15 @@ static int config_props_output(AVFilterLink *outlink) · 116 unmodified lines
117117 return 0;
118118 }
119119
120−static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
120+static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
121121 {
122122 AVFilterLink *outlink = inlink->dst->outputs[0];
123123
124124 outlink->out_buf = ff_get_video_buffer(outlink, AV_PERM_WRITE,
125125 outlink->w, outlink->h);
126+ if (!outlink->out_buf)
127+ return AVERROR(ENOMEM);
128+
126129 outlink->out_buf->pts = picref->pts;
127130
128131 if (picref->video->pixel_aspect.num == 0) {
@@ -132,7 +135,7 @@ static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 3 unmodified lines
132135 outlink->out_buf->video->pixel_aspect.den = picref->video->pixel_aspect.num;
133136 }
134137
135− ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0));
138+ return ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0));
136139 }
137140
138141 static void end_frame(AVFilterLink *inlink)
libavfilter/vf_vflip.c+2−2
@@ -64,7 +64,7 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *link, int perms, · 63 unmodified lines
6464 return picref;
6565 }
6666
67−static void start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref)
67+static int start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref)
6868 {
6969 FlipContext *flip = link->dst->priv;
7070 AVFilterBufferRef *outpicref = avfilter_ref_buffer(inpicref, ~0);
@@ -79,7 +79,7 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *inpicref) · 8 unmodified lines
7979 }
8080 }
8181
82− ff_start_frame(link->dst->outputs[0], outpicref);
82+ return ff_start_frame(link->dst->outputs[0], outpicref);
8383 }
8484
8585 static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
libavfilter/vf_yadif.c+4−5
@@ -201,7 +201,7 @@ static void return_frame(AVFilterContext *ctx, int is_second) · 200 unmodified lines
201201 yadif->frame_pending = (yadif->mode&1) && !is_second;
202202 }
203203
204−static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
204+static int start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
205205 {
206206 AVFilterContext *ctx = link->dst;
207207 YADIFContext *yadif = ctx->priv;
@@ -216,7 +216,7 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 8 unmodified lines
216216 yadif->next = picref;
217217
218218 if (!yadif->cur)
219− return;
219+ return 0;
220220
221221 if (yadif->auto_enable && !yadif->cur->video->interlaced) {
222222 yadif->out = avfilter_ref_buffer(yadif->cur, AV_PERM_READ);
@@ -224,8 +224,7 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 1 unmodified line
224224 yadif->prev = NULL;
225225 if (yadif->out->pts != AV_NOPTS_VALUE)
226226 yadif->out->pts *= 2;
227− ff_start_frame(ctx->outputs[0], yadif->out);
228− return;
227+ return ff_start_frame(ctx->outputs[0], yadif->out);
229228 }
230229
231230 if (!yadif->prev)
@@ -238,7 +237,7 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 6 unmodified lines
238237 yadif->out->video->interlaced = 0;
239238 if (yadif->out->pts != AV_NOPTS_VALUE)
240239 yadif->out->pts *= 2;
241− ff_start_frame(ctx->outputs[0], yadif->out);
240+ return ff_start_frame(ctx->outputs[0], yadif->out);
242241 }
243242
244243 static void end_frame(AVFilterLink *link)
libavfilter/video.c+31−16
@@ -160,13 +160,15 @@ AVFilterBufferRef *ff_get_video_buffer(AVFilterLink *link, int perms, int w, int · 159 unmodified lines
160160 return ret;
161161 }
162162
163−void ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
163+int ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
164164 {
165165 AVFilterBufferRef *buf_out = avfilter_ref_buffer(picref, ~0);
166− ff_start_frame(link->dst->outputs[0], buf_out);
166+ if (!buf_out)
167+ return AVERROR(ENOMEM);
168+ return ff_start_frame(link->dst->outputs[0], buf_out);
167169 }
168170
169−static void default_start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
171+static int default_start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
170172 {
171173 AVFilterLink *outlink = NULL;
172174
@@ -175,18 +177,29 @@ static void default_start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref) · 2 unmodified lines
175177
176178 if (outlink) {
177179 outlink->out_buf = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h);
180+ if (!outlink->out_buf)
181+ return AVERROR(ENOMEM);
182+
178183 avfilter_copy_buffer_ref_props(outlink->out_buf, picref);
179− ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0));
184+ return ff_start_frame(outlink, avfilter_ref_buffer(outlink->out_buf, ~0));
180185 }
186+ return 0;
187+}
188+
189+static void clear_link(AVFilterLink *link)
190+{
191+ avfilter_unref_bufferp(&link->cur_buf);
192+ avfilter_unref_bufferp(&link->src_buf);
193+ avfilter_unref_bufferp(&link->out_buf);
181194 }
182195
183196 /* XXX: should we do the duplicating of the picture ref here, instead of
184197 * forcing the source filter to do it? */
185−void ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
198+int ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
186199 {
187− void (*start_frame)(AVFilterLink *, AVFilterBufferRef *);
200+ int (*start_frame)(AVFilterLink *, AVFilterBufferRef *);
188201 AVFilterPad *dst = link->dstpad;
189− int perms = picref->perms;
202+ int ret, perms = picref->perms;
190203
191204 FF_DPRINTF_START(NULL, start_frame); ff_dlog_link(NULL, link, 0); av_dlog(NULL, " "); ff_dlog_ref(NULL, picref, 1);
192205
@@ -203,13 +216,22 @@ void ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref) · 10 unmodified lines
203216 link->dstpad->min_perms, link->dstpad->rej_perms);
204217
205218 link->cur_buf = ff_get_video_buffer(link, dst->min_perms, link->w, link->h);
219+ if (!link->cur_buf) {
220+ avfilter_unref_bufferp(&picref);
221+ return AVERROR(ENOMEM);
222+ }
223+
206224 link->src_buf = picref;
207225 avfilter_copy_buffer_ref_props(link->cur_buf, link->src_buf);
208226 }
209227 else
210228 link->cur_buf = picref;
211229
212− start_frame(link, link->cur_buf);
230+ ret = start_frame(link, link->cur_buf);
231+ if (ret < 0)
232+ clear_link(link);
233+
234+ return ret;
213235 }
214236
215237 void ff_null_end_frame(AVFilterLink *link)
@@ -238,14 +260,7 @@ void ff_end_frame(AVFilterLink *link) · 22 unmodified lines
238260
239261 end_frame(link);
240262
241− /* unreference the source picture if we're feeding the destination filter
242− * a copied version dues to permission issues */
243− if (link->src_buf) {
244− avfilter_unref_buffer(link->src_buf);
245− link->src_buf = NULL;
246− }
247− avfilter_unref_bufferp(&link->cur_buf);
248− avfilter_unref_bufferp(&link->out_buf);
263+ clear_link(link);
249264 }
250265
251266 void ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
libavfilter/video.h+5−2
@@ -39,7 +39,7 @@ AVFilterBufferRef *ff_null_get_video_buffer(AVFilterLink *link, int perms, int w · 38 unmodified lines
3939 AVFilterBufferRef *ff_get_video_buffer(AVFilterLink *link, int perms,
4040 int w, int h);
4141
42−void ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
42+int ff_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
4343 void ff_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
4444 void ff_null_end_frame(AVFilterLink *link);
4545
@@ -51,8 +51,11 @@ void ff_null_end_frame(AVFilterLink *link); · 5 unmodified lines
5151 * frame need only be valid once draw_slice() is called for that
5252 * portion. The receiving filter will free this reference when
5353 * it no longer needs it.
54+ *
55+ * @return >= 0 on success, a negative AVERROR on error. This function will
56+ * unreference picref in case of error.
5457 */
55−void ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
58+int ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref);
5659
5760 /**
5861 * Notify the next filter that the current frame has finished.
libavfilter/vsink_nullsink.c+2−1
@@ -19,8 +19,9 @@ · 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
2627 static void end_frame(AVFilterLink *link)

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