[FFmpeg-devel] [PATCH 6/7] lavfi/overlay: fix return values.
Stefano Sabatini
stefasab at gmail.com
Tue Aug 21 01:25:19 CEST 2012
On date Monday 2012-08-20 23:28:14 +0200, Nicolas George encoded:
> They were only roughly adapted when error return was
> added to the push functions.
>
> Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
> ---
> libavfilter/vf_overlay.c | 50 +++++++++++++++++++++++++++++++---------------
> 1 file changed, 34 insertions(+), 16 deletions(-)
>
> diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c
> index 6cb4322..2fb2579 100644
> --- a/libavfilter/vf_overlay.c
> +++ b/libavfilter/vf_overlay.c
> @@ -442,6 +442,7 @@ static int try_start_frame(AVFilterContext *ctx, AVFilterBufferRef *mainpic)
> OverlayContext *over = ctx->priv;
> AVFilterLink *outlink = ctx->outputs[0];
> AVFilterBufferRef *next_overpic, *outpicref;
> + int ret;
>
> /* Discard obsolete overlay frames: if there is a next frame with pts is
> * before the main frame, we can drop the current overlay. */
> @@ -469,19 +470,23 @@ static int try_start_frame(AVFilterContext *ctx, AVFilterBufferRef *mainpic)
> av_ts2str(over->overpicref->pts), av_ts2timestr(over->overpicref->pts, &outlink->time_base));
> av_dlog(ctx, "\n");
>
> - ff_start_frame(ctx->outputs[0], avfilter_ref_buffer(outpicref, ~0));
> + ret = ff_start_frame(ctx->outputs[0], avfilter_ref_buffer(outpicref, ~0));
> over->frame_requested = 0;
> - return 0;
> + return ret;
> }
>
> static int try_start_next_frame(AVFilterContext *ctx)
> {
> OverlayContext *over = ctx->priv;
> AVFilterBufferRef *next_mainpic = ff_bufqueue_peek(&over->queue_main, 0);
> - if (!next_mainpic || try_start_frame(ctx, next_mainpic) < 0)
> + int ret;
> +
> + if (!next_mainpic)
> return AVERROR(EAGAIN);
> + if ((ret = try_start_frame(ctx, next_mainpic)) == AVERROR(EAGAIN))
> + return ret;
> avfilter_unref_buffer(ff_bufqueue_get(&over->queue_main));
> - return 0;
> + return ret;
> }
>
> static int try_push_frame(AVFilterContext *ctx)
> @@ -489,33 +494,42 @@ static int try_push_frame(AVFilterContext *ctx)
> OverlayContext *over = ctx->priv;
> AVFilterLink *outlink = ctx->outputs[0];
> AVFilterBufferRef *outpicref;
> + int ret;
>
> - if (try_start_next_frame(ctx) < 0)
> - return AVERROR(EAGAIN);
> + if ((ret = try_start_next_frame(ctx)) < 0)
> + return ret;
> outpicref = outlink->out_buf;
> if (over->overpicref)
> blend_slice(ctx, outpicref, over->overpicref, over->x, over->y,
> over->overpicref->video->w, over->overpicref->video->h,
> 0, outpicref->video->w, outpicref->video->h);
> - ff_draw_slice(outlink, 0, outpicref->video->h, +1);
> - ff_end_frame(outlink);
> + if ((ret = ff_draw_slice(outlink, 0, outpicref->video->h, +1)) < 0 ||
> + (ret = ff_end_frame(outlink)) < 0)
> + return ret;
> return 0;
> }
>
> -static void flush_frames(AVFilterContext *ctx)
> +static int flush_frames(AVFilterContext *ctx)
> {
> - while (!try_push_frame(ctx));
> + int ret;
> +
> + while (!(ret = try_push_frame(ctx)));
> + return ret == AVERROR(EAGAIN) ? 0 : ret;
> }
>
> static int start_frame_main(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
> {
> AVFilterContext *ctx = inlink->dst;
> OverlayContext *over = ctx->priv;
> + int ret;
>
> - flush_frames(ctx);
> + if ((ret = flush_frames(ctx)) < 0)
> + return ret;
> inpicref->pts = av_rescale_q(inpicref->pts, ctx->inputs[MAIN]->time_base,
> ctx->outputs[0]->time_base);
> - if (try_start_frame(ctx, inpicref) < 0) {
> + if ((ret = try_start_frame(ctx, inpicref)) < 0) {
> + if (ret != AVERROR(EAGAIN))
> + return ret;
> ff_bufqueue_add(ctx, &over->queue_main, inpicref);
> av_assert1(inpicref == inlink->cur_buf);
> inlink->cur_buf = NULL;
> @@ -563,13 +577,17 @@ static int end_frame_over(AVFilterLink *inlink)
> AVFilterContext *ctx = inlink->dst;
> OverlayContext *over = ctx->priv;
> AVFilterBufferRef *inpicref = inlink->cur_buf;
> + int ret;
> +
> inlink->cur_buf = NULL;
>
> - flush_frames(ctx);
> + if ((ret = flush_frames(ctx)) < 0)
> + return ret;
> inpicref->pts = av_rescale_q(inpicref->pts, ctx->inputs[OVERLAY]->time_base,
> ctx->outputs[0]->time_base);
> ff_bufqueue_add(ctx, &over->queue_over, inpicref);
> - return try_push_frame(ctx);
> + ret = try_push_frame(ctx);
> + return ret == AVERROR(EAGAIN) ? 0 : ret;
> }
>
> static int request_frame(AVFilterLink *outlink)
> @@ -590,8 +608,8 @@ static int request_frame(AVFilterLink *outlink)
> /* EOF on main is reported immediately */
> if (ret == AVERROR_EOF && input == OVERLAY) {
> over->overlay_eof = 1;
> - if (!try_start_next_frame(ctx))
> - return 0;
> + if ((ret = try_start_next_frame(ctx)) != AVERROR(EAGAIN))
> + return ret;
> ret = 0; /* continue requesting frames on main */
> }
> if (ret < 0)
LGTM assuming it has been tested, thanks.
--
FFmpeg = Formidable Fanciful Mere Portable Elected Generator
More information about the ffmpeg-devel
mailing list