Message ID | 20190228162913.6508-8-laurent.pinchart@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Laurent, Thanks for your work. On 2019-02-28 18:29:10 +0200, Laurent Pinchart wrote: > 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@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> > --- > 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 > > _______________________________________________ > libcamera-devel mailing list > libcamera-devel@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
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; }
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@ideasonboard.com> --- include/libcamera/buffer.h | 10 ++++++++++ src/libcamera/buffer.cpp | 35 +++++++++++++++++++++++++++++++++++ src/libcamera/v4l2_device.cpp | 2 ++ 3 files changed, 47 insertions(+)