diff options
author | Jorge Ramirez-Ortiz <jramirez@baylibre.com> | 2018-05-06 19:56:30 +0200 |
---|---|---|
committer | Aman Gupta <aman@tmm1.net> | 2019-09-02 15:08:34 -0700 |
commit | da45ad48f9935a3264e9a6d85127dcaf0eee38b3 (patch) | |
tree | 6f2bff7d2912054e63043bcaa3cdab9ff4a4e15f /libavcodec/v4l2_context.c | |
parent | 1d36b7b47ad421a857d22add111fd19d89964ee7 (diff) | |
download | ffmpeg-da45ad48f9935a3264e9a6d85127dcaf0eee38b3.tar.gz |
avcodec/v4l2m2m: fix error handling during buffer init
Signed-off-by: Jorge Ramirez-Ortiz <jramirez@baylibre.com>
Signed-off-by: Aman Gupta <aman@tmm1.net>
Diffstat (limited to 'libavcodec/v4l2_context.c')
-rw-r--r-- | libavcodec/v4l2_context.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c index 3e180e46b1..c28d46d777 100644 --- a/libavcodec/v4l2_context.c +++ b/libavcodec/v4l2_context.c @@ -267,6 +267,12 @@ static V4L2Buffer* v4l2_dequeue_v4l2buf(V4L2Context *ctx, int timeout) /* if we are draining and there are no more capture buffers queued in the driver we are done */ if (!V4L2_TYPE_IS_OUTPUT(ctx->type) && ctx_to_m2mctx(ctx)->draining) { for (i = 0; i < ctx->num_buffers; i++) { + /* capture buffer initialization happens during decode hence + * detection happens at runtime + */ + if (!ctx->buffers) + break; + if (ctx->buffers[i].status == V4L2BUF_IN_DRIVER) goto start; } @@ -698,9 +704,8 @@ int ff_v4l2_context_init(V4L2Context* ctx) ctx->buffers[i].context = ctx; ret = ff_v4l2_buffer_initialize(&ctx->buffers[i], i); if (ret < 0) { - av_log(logger(ctx), AV_LOG_ERROR, "%s buffer initialization (%s)\n", ctx->name, av_err2str(ret)); - av_free(ctx->buffers); - return ret; + av_log(logger(ctx), AV_LOG_ERROR, "%s buffer[%d] initialization (%s)\n", ctx->name, i, av_err2str(ret)); + goto error; } } @@ -713,4 +718,12 @@ int ff_v4l2_context_init(V4L2Context* ctx) V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? ctx->format.fmt.pix_mp.plane_fmt[0].bytesperline : ctx->format.fmt.pix.bytesperline); return 0; + +error: + v4l2_release_buffers(ctx); + + av_free(ctx->buffers); + ctx->buffers = NULL; + + return ret; } |