[libcamera-devel] [PATCH v5 7/8] libcamera: v4l2_videodevice: Empty the V4L2 buffer cache on streamOff()

Naushir Patuck naush at raspberrypi.com
Fri Mar 25 10:09:02 CET 2022


When streamOff() is called, ensure the cache entries for the remaining queued
buffers are freed since this will not happen via the dequeueBuffer() mechanism.

Additionally, add a V4L2BufferCache::isEmpty() function and assert that the
cache is empty at the end of the streamOff() call.

Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
Tested-by: David Plowman <david.plowman at raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 include/libcamera/internal/v4l2_videodevice.h |  1 +
 src/libcamera/v4l2_videodevice.cpp            | 16 ++++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h
index 32e022543385..60d62212bfe1 100644
--- a/include/libcamera/internal/v4l2_videodevice.h
+++ b/include/libcamera/internal/v4l2_videodevice.h
@@ -124,6 +124,7 @@ public:
 	V4L2BufferCache(const std::vector<std::unique_ptr<FrameBuffer>> &buffers);
 	~V4L2BufferCache();
 
+	bool isEmpty() const;
 	int get(const FrameBuffer &buffer);
 	void put(unsigned int index);
 
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index 28f336086b49..1621a013e29d 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -201,6 +201,19 @@ V4L2BufferCache::~V4L2BufferCache()
 		LOG(V4L2, Debug) << "Cache misses: " << missCounter_;
 }
 
+/**
+ * \brief Check if all the entries in the cache are unused
+ */
+bool V4L2BufferCache::isEmpty() const
+{
+	for (auto const &entry : cache_) {
+		if (!entry.free_)
+			return false;
+	}
+
+	return true;
+}
+
 /**
  * \brief Find the best V4L2 buffer for a FrameBuffer
  * \param[in] buffer The FrameBuffer
@@ -1842,10 +1855,13 @@ int V4L2VideoDevice::streamOff()
 	for (auto it : queuedBuffers_) {
 		FrameBuffer *buffer = it.second;
 
+		cache_->put(it.first);
 		buffer->metadata_.status = FrameMetadata::FrameCancelled;
 		bufferReady.emit(buffer);
 	}
 
+	ASSERT(cache_->isEmpty());
+
 	queuedBuffers_.clear();
 	fdBufferNotifier_->setEnabled(false);
 	state_ = State::Stopped;
-- 
2.25.1



More information about the libcamera-devel mailing list