summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2022-03-25 09:09:01 +0000
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-03-28 02:18:23 +0300
commit1fb71a6ffa4c95661ecb5bf34e14bc80e47fc934 (patch)
tree1dc979608dfcbecb6aed5ac528d6f9c80affc1d1 /src
parent988ec3f417886cc8202ccc7932ac2f95e89db061 (diff)
libcamera: v4l2_videodevice: Do not allow buffer queueing in stopping state
If the device is in the process of being stopped (i.e. Stopping state), any call to queueBuffer() must fail. This is to ensure the integrity of the buffer queue, as it gets cleared at the end of streamOff. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/v4l2_videodevice.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index c016e6ad..9b5807d3 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -1491,6 +1491,9 @@ int V4L2VideoDevice::releaseBuffers()
* The best available V4L2 buffer is picked for \a buffer using the V4L2 buffer
* cache.
*
+ * Note that queueBuffer() will fail if the device is in the process of being
+ * stopped from a streaming state through streamOff().
+ *
* \return 0 on success or a negative error code otherwise
*/
int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer)
@@ -1499,6 +1502,11 @@ int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer)
struct v4l2_buffer buf = {};
int ret;
+ if (state_ == State::Stopping) {
+ LOG(V4L2, Error) << "Device is in a stopping state.";
+ return -ESHUTDOWN;
+ }
+
/*
* Pipeline handlers should not requeue buffers after releasing the
* buffers on the device. Any occurence of this error should be fixed