From d78e4bc70ec1d97e22c5f0365c027574e740923f Mon Sep 17 00:00:00 2001 From: CTCaer Date: Fri, 18 Mar 2022 21:50:20 +0000 Subject: [PATCH 12/39] codecs: nvv4l2: fix hanging on event wait if no full frame info Sometimes the decoder can be opened with no packet sent or not many for a frame to be decoded. In such cases the thread will get stuck for 50s waiting for a resolution event to happen. Use the streamon and eos checks properly to get out of such a loop. --- libavcodec/nvv4l2_dec.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavcodec/nvv4l2_dec.c b/libavcodec/nvv4l2_dec.c index 0779f3a4bf..e242857b2e 100644 --- a/libavcodec/nvv4l2_dec.c +++ b/libavcodec/nvv4l2_dec.c @@ -417,7 +417,8 @@ static void *dec_capture_thread(void *arg) break; } } - while ((event.type != V4L2_EVENT_RESOLUTION_CHANGE) && !ctx->in_error); + while ((event.type != V4L2_EVENT_RESOLUTION_CHANGE) && + !ctx->in_error && !ctx->eos); /* Received first resolution change event ** Format and buffers are now set on capture. @@ -816,6 +817,8 @@ int nvv4l2_decoder_close(AVCodecContext *avctx, nvv4l2_ctx_t *ctx) /* Stop streaming on both planes. */ ret = v4l2_ioctl(ctx->fd, VIDIOC_STREAMOFF, &ctx->op_buf_type); ret = v4l2_ioctl(ctx->fd, VIDIOC_STREAMOFF, &ctx->cp_buf_type); + ctx->op_streamon = false; + ctx->cp_streamon = false; /* Wait for capture thread to exit. */ if (ctx->capture_thread) { -- 2.25.1