[libcamera-devel] [PATCH 1/2] android: CameraBuffer: Add option of not mapping a buffer

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Aug 20 13:25:49 CEST 2021


Hello,

On Tue, Apr 06, 2021 at 02:47:34PM +0200, Jacopo Mondi wrote:
> On Mon, Apr 05, 2021 at 01:04:23PM +0900, Hirokazu Honda wrote:
> > CameraBuffer always maps a buffer in constructor. This adds an
> > option to not map a buffer within CameraBuffer. The option is
> > useful for a caller to only validate a buffer and not have to
> > map the buffer.
> 
> Although this requires CameraDevice to create a CameraBuffer in
> processCaptureRequest() only to validate. Would a static method work
> better ? After all if the validation shall happen before mapping, it
> means it is based on static attribute of buffer_handle_t
> 
> Also, I don't really like the 'map' flag, as it seems to me if only
> construction is required, but not mapping, we should rather split the
> two operations in two methods (ie adding an explicit
> CameraBuffer::map() method)

I agree, I think that the constructor should not map the buffer, this
should instead be done in plane() the first time it's called.

> > Signed-off-by: Hirokazu Honda <hiroh at chromium.org>
> > ---
> >  src/android/camera_buffer.h              |  7 ++++---
> >  src/android/mm/cros_camera_buffer.cpp    | 17 +++++++++++++----
> >  src/android/mm/generic_camera_buffer.cpp | 20 ++++++++++++--------
> >  3 files changed, 29 insertions(+), 15 deletions(-)
> >
> > diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h
> > index 7e8970b4..1fdb76a6 100644
> > --- a/src/android/camera_buffer.h
> > +++ b/src/android/camera_buffer.h
> > @@ -17,7 +17,7 @@ class CameraBuffer final : public libcamera::Extensible
> >  	LIBCAMERA_DECLARE_PRIVATE(CameraBuffer)
> >
> >  public:
> > -	CameraBuffer(buffer_handle_t camera3Buffer, int flags);
> > +	CameraBuffer(buffer_handle_t camera3Buffer, int flags, bool map = true);
> >  	~CameraBuffer();
> >
> >  	bool isValid() const;
> > @@ -31,8 +31,9 @@ public:
> >  };
> >
> >  #define PUBLIC_CAMERA_BUFFER_IMPLEMENTATION				\
> > -CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags)	\
> > -	: Extensible(new Private(this, camera3Buffer, flags))		\
> > +	CameraBuffer::CameraBuffer(buffer_handle_t camera3Buffer, int flags, \
> > +				   bool map)				\
> > +		: Extensible(new Private(this, camera3Buffer, flags, map))\
> >  {									\
> >  }									\
> >  CameraBuffer::~CameraBuffer()						\
> > diff --git a/src/android/mm/cros_camera_buffer.cpp b/src/android/mm/cros_camera_buffer.cpp
> > index 1a4fd5d1..71e03766 100644
> > --- a/src/android/mm/cros_camera_buffer.cpp
> > +++ b/src/android/mm/cros_camera_buffer.cpp
> > @@ -21,7 +21,7 @@ class CameraBuffer::Private : public Extensible::Private
> >
> >  public:
> >  	Private(CameraBuffer *cameraBuffer,
> > -		buffer_handle_t camera3Buffer, int flags);
> > +		buffer_handle_t camera3Buffer, int flags, bool map);
> >  	~Private();
> >
> >  	bool isValid() const { return valid_; }
> > @@ -38,6 +38,7 @@ private:
> >  	unsigned int numPlanes_;
> >  	bool valid_;
> >  	bool registered_;
> > +	bool map_;
> >  	union {
> >  		void *addr;
> >  		android_ycbcr ycbcr;
> > @@ -48,9 +49,10 @@ private:
> >  };
> >
> >  CameraBuffer::Private::Private(CameraBuffer *cameraBuffer,
> > -			       buffer_handle_t camera3Buffer, int flags)
> > +			       buffer_handle_t camera3Buffer, int flags,
> > +			       bool map)
> >  	: Extensible::Private(cameraBuffer), handle_(camera3Buffer),
> > -	  numPlanes_(0), valid_(false), registered_(false)
> > +	  numPlanes_(0), valid_(false), registered_(false), map_(map)
> >  {
> >  	bufferManager_ = cros::CameraBufferManager::GetInstance();
> >
> > @@ -62,6 +64,13 @@ CameraBuffer::Private::Private(CameraBuffer *cameraBuffer,
> >
> >  	registered_ = true;
> >  	numPlanes_ = bufferManager_->GetNumPlanes(camera3Buffer);
> > +
> > +	memset(&mem, 0, sizeof(mem));
> > +	if (!map_) {
> > +		valid_ = true;
> > +		return;
> > +	}
> > +
> >  	switch (numPlanes_) {
> >  	case 1: {
> >  		ret = bufferManager_->Lock(handle_, 0, 0, 0, 0, 0, &mem.addr);
> > @@ -91,7 +100,7 @@ CameraBuffer::Private::Private(CameraBuffer *cameraBuffer,
> >
> >  CameraBuffer::Private::~Private()
> >  {
> > -	if (valid_)
> > +	if (map_ && valid_)
> >  		bufferManager_->Unlock(handle_);
> >  	if (registered_)
> >  		bufferManager_->Deregister(handle_);
> > diff --git a/src/android/mm/generic_camera_buffer.cpp b/src/android/mm/generic_camera_buffer.cpp
> > index 929e078a..8fa79889 100644
> > --- a/src/android/mm/generic_camera_buffer.cpp
> > +++ b/src/android/mm/generic_camera_buffer.cpp
> > @@ -21,7 +21,7 @@ class CameraBuffer::Private : public Extensible::Private,
> >
> >  public:
> >  	Private(CameraBuffer *cameraBuffer,
> > -		buffer_handle_t camera3Buffer, int flags);
> > +		buffer_handle_t camera3Buffer, int flags, bool map);
> >  	~Private();
> >
> >  	unsigned int numPlanes() const;
> > @@ -32,7 +32,8 @@ public:
> >  };
> >
> >  CameraBuffer::Private::Private(CameraBuffer *cameraBuffer,
> > -			       buffer_handle_t camera3Buffer, int flags)
> > +			       buffer_handle_t camera3Buffer,
> > +			       int flags, bool map)
> >  	: Extensible::Private(cameraBuffer)
> >  {
> >  	maps_.reserve(camera3Buffer->numFds);
> > @@ -49,12 +50,15 @@ CameraBuffer::Private::Private(CameraBuffer *cameraBuffer,
> >  			break;
> >  		}
> >
> > -		void *address = mmap(nullptr, length, flags, MAP_SHARED,
> > -				     camera3Buffer->data[i], 0);
> > -		if (address == MAP_FAILED) {
> > -			error_ = -errno;
> > -			LOG(HAL, Error) << "Failed to mmap plane";
> > -			break;
> > +		void *address = nullptr;
> > +		if (map) {
> > +			mmap(nullptr, length, flags, MAP_SHARED,
> > +			     camera3Buffer->data[i], 0);
> > +			if (address == MAP_FAILED) {
> > +				error_ = -errno;
> > +				LOG(HAL, Error) << "Failed to mmap plane";
> > +				break;
> > +			}
> >  		}
> >
> >  		maps_.emplace_back(static_cast<uint8_t *>(address),

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list