mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-13 18:55:08 +00:00
avcodec/v4l2_context: Drop empty packet while draining
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." Reviewed-by: Ming Qian <ming.qian@nxp.com> Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
This commit is contained in:
parent
785f194cd4
commit
e3b49aaa4e
@ -405,6 +405,15 @@ dequeue:
|
|||||||
return NULL;
|
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 = &ctx->buffers[buf.index];
|
||||||
avbuf->status = V4L2BUF_AVAILABLE;
|
avbuf->status = V4L2BUF_AVAILABLE;
|
||||||
avbuf->buf = buf;
|
avbuf->buf = buf;
|
||||||
|
Loading…
Reference in New Issue
Block a user