[FFmpeg-devel] [PATCH 1/2] avcodec/v4l2_context: Drop empty packet while draining
Andriy Gelman
andriy.gelman at gmail.com
Thu Apr 30 00:29:41 EEST 2020
From: Andriy Gelman <andriy.gelman at gmail.com>
v4l2_m2m devices may send an empty packet/frame while draining
to indicate that all capture buffers have been flushed.
Currently, the empty packet/frame is not handled correctly:
When encoding, the empty packet is forwarded to the muxer, usually
creating warnings.
When decoding, a reference to the memory is created anyway.. Since in
the past this memory contained a decoded frame, it results in an extra
frame being decoded.
This commit discards the empty packet/frame.
References:
linux/Documentation/media/uapi/v4l/dev-decoder.rst:
"The last buffer may be empty (with :c:type:`v4l2_buffer` bytesused = 0)
and in that case it must be ignored by the client, as it does not
contain a decoded frame."
linux/Documentation/media/uapi/media/v4l/vidioc-encoder-cmd.rst:
"...This buffer may be empty, indicated by the
driver setting the ``bytesused`` field to 0."
Signed-off-by: Andriy Gelman <andriy.gelman at gmail.com>
---
libavcodec/v4l2_context.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c
index 6c2db5c849..f0ecc18ebd 100644
--- a/libavcodec/v4l2_context.c
+++ b/libavcodec/v4l2_context.c
@@ -393,6 +393,15 @@ dequeue:
return NULL;
}
+ if (ctx_to_m2mctx(ctx)->draining && !V4L2_TYPE_IS_OUTPUT(ctx->type)) {
+ int bytesused = V4L2_TYPE_IS_MULTIPLANAR(buf.type) ?
+ buf.m.planes[0].bytesused : buf.bytesused;
+ if (bytesused == 0) {
+ ctx->done = 1;
+ return NULL;
+ }
+ }
+
avbuf = &ctx->buffers[buf.index];
avbuf->status = V4L2BUF_AVAILABLE;
avbuf->buf = buf;
--
2.25.1
More information about the ffmpeg-devel
mailing list