[libcamera-devel] [PATCH 07/10] libcamera: buffer: Add buffer completion status

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Feb 28 17:29:10 CET 2019


Add a new field to the Buffer class to report its completion status,
with a new cancel() method to mark the buffer as cancelled.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 include/libcamera/buffer.h    | 10 ++++++++++
 src/libcamera/buffer.cpp      | 35 +++++++++++++++++++++++++++++++++++
 src/libcamera/v4l2_device.cpp |  2 ++
 3 files changed, 47 insertions(+)

diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h
index dc9aaad12a81..f740ade9bb4f 100644
--- a/include/libcamera/buffer.h
+++ b/include/libcamera/buffer.h
@@ -40,12 +40,19 @@ private:
 class Buffer final
 {
 public:
+	enum Status {
+		BufferSuccess,
+		BufferError,
+		BufferCancelled,
+	};
+
 	Buffer();
 
 	unsigned int index() const { return index_; }
 	unsigned int bytesused() const { return bytesused_; }
 	uint64_t timestamp() const { return timestamp_; }
 	unsigned int sequence() const { return sequence_; }
+	Status status() const { return status_; }
 	std::vector<Plane> &planes() { return planes_; }
 
 	Signal<Buffer *> completed;
@@ -54,10 +61,13 @@ private:
 	friend class BufferPool;
 	friend class V4L2Device;
 
+	void cancel();
+
 	unsigned int index_;
 	unsigned int bytesused_;
 	uint64_t timestamp_;
 	unsigned int sequence_;
+	Status status_;
 
 	std::vector<Plane> planes_;
 };
diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp
index 80dd9c854a4b..524eb47d4364 100644
--- a/src/libcamera/buffer.cpp
+++ b/src/libcamera/buffer.cpp
@@ -181,6 +181,20 @@ void *Plane::mem()
  * objects if the image format is multi-planar.
  */
 
+/**
+ * \enum Buffer::Status
+ * Buffer completion status
+ * \var Buffer::BufferSuccess
+ * The buffer has completed with success and contains valid data. All its other
+ * metadata (such as bytesused(), timestamp() or sequence() number) are valid.
+ * \var Buffer::BufferError
+ * The buffer has completed with an error and doesn't contain valid data. Its
+ * other metadata are valid.
+ * \var Buffer::BufferCancelled
+ * The buffer has been cancelled due to capture stop. Its other metadata are
+ * invalid and shall not be used.
+ */
+
 Buffer::Buffer()
 	: index_(-1)
 {
@@ -229,6 +243,27 @@ Buffer::Buffer()
  * \return Sequence number of the buffer
  */
 
+/**
+ * \fn Buffer::status()
+ * \brief Retrieve the buffer status
+ *
+ * The buffer status reports whether the buffer has completed successfully
+ * (BufferSuccess) or if an error occurred (BufferError).
+ *
+ * \return The buffer status
+ */
+
+/**
+ * \brief Mark a buffer as cancel by setting its status to BufferCancelled
+ */
+void Buffer::cancel()
+{
+	bytesused_ = 0;
+	timestamp_ = 0;
+	sequence_ = 0;
+	status_ = BufferCancelled;
+}
+
 /**
  * \class BufferPool
  * \brief A pool of buffers
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index 31200a6e7d6f..054499e4b888 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -793,6 +793,8 @@ Buffer *V4L2Device::dequeueBuffer()
 	buffer->timestamp_ = buf.timestamp.tv_sec * 1000000000ULL
 			   + buf.timestamp.tv_usec * 1000ULL;
 	buffer->sequence_ = buf.sequence;
+	buffer->status_ = buf.flags & V4L2_BUF_FLAG_ERROR
+			? Buffer::BufferError : Buffer::BufferSuccess;
 
 	return buffer;
 }
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list