[libcamera-devel] [PATCH v3 03/10] android: camera_stream: Pass FrameBuffer pointer instead of reference

Jacopo Mondi jacopo at jmondi.org
Tue Sep 21 13:08:27 CEST 2021


Hi Umang,

On Mon, Sep 20, 2021 at 11:07:45PM +0530, Umang Jain wrote:
> Pass the libcamera::FrameBuffer pointer to the post-processor instead
> of passing it by reference. Passing by reference is fine as long as
> the post processing is done synchronously.
>
> However in subsequent commits, the post processing is planned to be
> moved to a separate thread. The reference argument (in current case
> 'source') is copied when we will try to invoke a method on separate
> thread (which will run the post-processor) using Object::invokeMethod().
> As the 'source' is an instance of FrameBuffer class, which is
> restricted by LIBCAMERA_DISABLE_COPY_AND_MOVE, passing the reference
> to Object::invokeMethod() will try to copy it. Hence to avoid this copy,
> pass in the FrameBuffer pointer instead of reference.
>
> This requires changes to the existing PostProcessor interface and all
> its implemented classes.
>
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>

Thanks
  j

> ---
>  src/android/camera_device.cpp            |  2 +-
>  src/android/camera_stream.cpp            |  2 +-
>  src/android/camera_stream.h              |  2 +-
>  src/android/jpeg/encoder.h               |  2 +-
>  src/android/jpeg/encoder_libjpeg.cpp     |  4 ++--
>  src/android/jpeg/encoder_libjpeg.h       |  2 +-
>  src/android/jpeg/post_processor_jpeg.cpp |  4 ++--
>  src/android/jpeg/post_processor_jpeg.h   |  4 ++--
>  src/android/jpeg/thumbnailer.cpp         |  4 ++--
>  src/android/jpeg/thumbnailer.h           |  2 +-
>  src/android/post_processor.h             |  2 +-
>  src/android/yuv/post_processor_yuv.cpp   | 18 +++++++++---------
>  src/android/yuv/post_processor_yuv.h     |  4 ++--
>  13 files changed, 26 insertions(+), 26 deletions(-)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 0562c225..cc078fe4 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -1148,7 +1148,7 @@ void CameraDevice::requestComplete(Request *request)
>  			continue;
>  		}
>
> -		int ret = cameraStream->process(*src, *buffer.buffer,
> +		int ret = cameraStream->process(src, *buffer.buffer,
>  						descriptor->settings_,
>  						resultMetadata.get());
>  		/*
> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
> index 0f5ae947..0fed5382 100644
> --- a/src/android/camera_stream.cpp
> +++ b/src/android/camera_stream.cpp
> @@ -98,7 +98,7 @@ int CameraStream::configure()
>  	return 0;
>  }
>
> -int CameraStream::process(const FrameBuffer &source,
> +int CameraStream::process(const FrameBuffer *source,
>  			  buffer_handle_t camera3Dest,
>  			  const CameraMetadata &requestMetadata,
>  			  CameraMetadata *resultMetadata)
> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
> index 2dab6c3a..5c232cb6 100644
> --- a/src/android/camera_stream.h
> +++ b/src/android/camera_stream.h
> @@ -118,7 +118,7 @@ public:
>  	libcamera::Stream *stream() const;
>
>  	int configure();
> -	int process(const libcamera::FrameBuffer &source,
> +	int process(const libcamera::FrameBuffer *source,
>  		    buffer_handle_t camera3Dest,
>  		    const CameraMetadata &requestMetadata,
>  		    CameraMetadata *resultMetadata);
> diff --git a/src/android/jpeg/encoder.h b/src/android/jpeg/encoder.h
> index a28522f4..7b6140e7 100644
> --- a/src/android/jpeg/encoder.h
> +++ b/src/android/jpeg/encoder.h
> @@ -18,7 +18,7 @@ public:
>  	virtual ~Encoder() = default;
>
>  	virtual int configure(const libcamera::StreamConfiguration &cfg) = 0;
> -	virtual int encode(const libcamera::FrameBuffer &source,
> +	virtual int encode(const libcamera::FrameBuffer *source,
>  			   libcamera::Span<uint8_t> destination,
>  			   libcamera::Span<const uint8_t> exifData,
>  			   unsigned int quality) = 0;
> diff --git a/src/android/jpeg/encoder_libjpeg.cpp b/src/android/jpeg/encoder_libjpeg.cpp
> index 21a3b33d..3114ed4b 100644
> --- a/src/android/jpeg/encoder_libjpeg.cpp
> +++ b/src/android/jpeg/encoder_libjpeg.cpp
> @@ -178,10 +178,10 @@ void EncoderLibJpeg::compressNV(const std::vector<Span<uint8_t>> &planes)
>  	}
>  }
>
> -int EncoderLibJpeg::encode(const FrameBuffer &source, Span<uint8_t> dest,
> +int EncoderLibJpeg::encode(const FrameBuffer *source, Span<uint8_t> dest,
>  			   Span<const uint8_t> exifData, unsigned int quality)
>  {
> -	MappedFrameBuffer frame(&source, MappedFrameBuffer::MapFlag::Read);
> +	MappedFrameBuffer frame(source, MappedFrameBuffer::MapFlag::Read);
>  	if (!frame.isValid()) {
>  		LOG(JPEG, Error) << "Failed to map FrameBuffer : "
>  				 << strerror(frame.error());
> diff --git a/src/android/jpeg/encoder_libjpeg.h b/src/android/jpeg/encoder_libjpeg.h
> index 45ffbd7f..ae4e1e32 100644
> --- a/src/android/jpeg/encoder_libjpeg.h
> +++ b/src/android/jpeg/encoder_libjpeg.h
> @@ -22,7 +22,7 @@ public:
>  	~EncoderLibJpeg();
>
>  	int configure(const libcamera::StreamConfiguration &cfg) override;
> -	int encode(const libcamera::FrameBuffer &source,
> +	int encode(const libcamera::FrameBuffer *source,
>  		   libcamera::Span<uint8_t> destination,
>  		   libcamera::Span<const uint8_t> exifData,
>  		   unsigned int quality) override;
> diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp
> index ef2d98cc..cb45f86b 100644
> --- a/src/android/jpeg/post_processor_jpeg.cpp
> +++ b/src/android/jpeg/post_processor_jpeg.cpp
> @@ -50,7 +50,7 @@ int PostProcessorJpeg::configure(const StreamConfiguration &inCfg,
>  	return encoder_->configure(inCfg);
>  }
>
> -void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
> +void PostProcessorJpeg::generateThumbnail(const FrameBuffer *source,
>  					  const Size &targetSize,
>  					  unsigned int quality,
>  					  std::vector<unsigned char> *thumbnail)
> @@ -97,7 +97,7 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
>  	}
>  }
>
> -int PostProcessorJpeg::process(const FrameBuffer &source,
> +int PostProcessorJpeg::process(const FrameBuffer *source,
>  			       CameraBuffer *destination,
>  			       const CameraMetadata &requestMetadata,
>  			       CameraMetadata *resultMetadata)
> diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h
> index 6fd31022..c4b2e9ef 100644
> --- a/src/android/jpeg/post_processor_jpeg.h
> +++ b/src/android/jpeg/post_processor_jpeg.h
> @@ -22,13 +22,13 @@ public:
>
>  	int configure(const libcamera::StreamConfiguration &incfg,
>  		      const libcamera::StreamConfiguration &outcfg) override;
> -	int process(const libcamera::FrameBuffer &source,
> +	int process(const libcamera::FrameBuffer *source,
>  		    CameraBuffer *destination,
>  		    const CameraMetadata &requestMetadata,
>  		    CameraMetadata *resultMetadata) override;
>
>  private:
> -	void generateThumbnail(const libcamera::FrameBuffer &source,
> +	void generateThumbnail(const libcamera::FrameBuffer *source,
>  			       const libcamera::Size &targetSize,
>  			       unsigned int quality,
>  			       std::vector<unsigned char> *thumbnail);
> diff --git a/src/android/jpeg/thumbnailer.cpp b/src/android/jpeg/thumbnailer.cpp
> index 1fab8072..ffac6a15 100644
> --- a/src/android/jpeg/thumbnailer.cpp
> +++ b/src/android/jpeg/thumbnailer.cpp
> @@ -37,11 +37,11 @@ void Thumbnailer::configure(const Size &sourceSize, PixelFormat pixelFormat)
>  	valid_ = true;
>  }
>
> -void Thumbnailer::createThumbnail(const FrameBuffer &source,
> +void Thumbnailer::createThumbnail(const FrameBuffer *source,
>  				  const Size &targetSize,
>  				  std::vector<unsigned char> *destination)
>  {
> -	MappedFrameBuffer frame(&source, MappedFrameBuffer::MapFlag::Read);
> +	MappedFrameBuffer frame(source, MappedFrameBuffer::MapFlag::Read);
>  	if (!frame.isValid()) {
>  		LOG(Thumbnailer, Error)
>  			<< "Failed to map FrameBuffer : "
> diff --git a/src/android/jpeg/thumbnailer.h b/src/android/jpeg/thumbnailer.h
> index 4d086c49..0f3caf40 100644
> --- a/src/android/jpeg/thumbnailer.h
> +++ b/src/android/jpeg/thumbnailer.h
> @@ -19,7 +19,7 @@ public:
>
>  	void configure(const libcamera::Size &sourceSize,
>  		       libcamera::PixelFormat pixelFormat);
> -	void createThumbnail(const libcamera::FrameBuffer &source,
> +	void createThumbnail(const libcamera::FrameBuffer *source,
>  			     const libcamera::Size &targetSize,
>  			     std::vector<unsigned char> *dest);
>  	const libcamera::PixelFormat &pixelFormat() const { return pixelFormat_; }
> diff --git a/src/android/post_processor.h b/src/android/post_processor.h
> index ab2b2c60..61dfb6d4 100644
> --- a/src/android/post_processor.h
> +++ b/src/android/post_processor.h
> @@ -21,7 +21,7 @@ public:
>
>  	virtual int configure(const libcamera::StreamConfiguration &inCfg,
>  			      const libcamera::StreamConfiguration &outCfg) = 0;
> -	virtual int process(const libcamera::FrameBuffer &source,
> +	virtual int process(const libcamera::FrameBuffer *source,
>  			    CameraBuffer *destination,
>  			    const CameraMetadata &requestMetadata,
>  			    CameraMetadata *resultMetadata) = 0;
> diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp
> index 7b3b4960..0a874886 100644
> --- a/src/android/yuv/post_processor_yuv.cpp
> +++ b/src/android/yuv/post_processor_yuv.cpp
> @@ -49,7 +49,7 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,
>  	return 0;
>  }
>
> -int PostProcessorYuv::process(const FrameBuffer &source,
> +int PostProcessorYuv::process(const FrameBuffer *source,
>  			      CameraBuffer *destination,
>  			      [[maybe_unused]] const CameraMetadata &requestMetadata,
>  			      [[maybe_unused]] CameraMetadata *metadata)
> @@ -57,7 +57,7 @@ int PostProcessorYuv::process(const FrameBuffer &source,
>  	if (!isValidBuffers(source, *destination))
>  		return -EINVAL;
>
> -	const MappedFrameBuffer sourceMapped(&source, MappedFrameBuffer::MapFlag::Read);
> +	const MappedFrameBuffer sourceMapped(source, MappedFrameBuffer::MapFlag::Read);
>  	if (!sourceMapped.isValid()) {
>  		LOG(YUV, Error) << "Failed to mmap camera frame buffer";
>  		return -EINVAL;
> @@ -83,12 +83,12 @@ int PostProcessorYuv::process(const FrameBuffer &source,
>  	return 0;
>  }
>
> -bool PostProcessorYuv::isValidBuffers(const FrameBuffer &source,
> +bool PostProcessorYuv::isValidBuffers(const FrameBuffer *source,
>  				      const CameraBuffer &destination) const
>  {
> -	if (source.planes().size() != 2) {
> +	if (source->planes().size() != 2) {
>  		LOG(YUV, Error) << "Invalid number of source planes: "
> -				<< source.planes().size();
> +				<< source->planes().size();
>  		return false;
>  	}
>  	if (destination.numPlanes() != 2) {
> @@ -97,12 +97,12 @@ bool PostProcessorYuv::isValidBuffers(const FrameBuffer &source,
>  		return false;
>  	}
>
> -	if (source.planes()[0].length < sourceLength_[0] ||
> -	    source.planes()[1].length < sourceLength_[1]) {
> +	if (source->planes()[0].length < sourceLength_[0] ||
> +	    source->planes()[1].length < sourceLength_[1]) {
>  		LOG(YUV, Error)
>  			<< "The source planes lengths are too small, actual size: {"
> -			<< source.planes()[0].length << ", "
> -			<< source.planes()[1].length
> +			<< source->planes()[0].length << ", "
> +			<< source->planes()[1].length
>  			<< "}, expected size: {"
>  			<< sourceLength_[0] << ", "
>  			<< sourceLength_[1] << "}";
> diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h
> index f8b1ba23..44a04113 100644
> --- a/src/android/yuv/post_processor_yuv.h
> +++ b/src/android/yuv/post_processor_yuv.h
> @@ -20,13 +20,13 @@ public:
>
>  	int configure(const libcamera::StreamConfiguration &incfg,
>  		      const libcamera::StreamConfiguration &outcfg) override;
> -	int process(const libcamera::FrameBuffer &source,
> +	int process(const libcamera::FrameBuffer *source,
>  		    CameraBuffer *destination,
>  		    const CameraMetadata &requestMetadata,
>  		    CameraMetadata *metadata) override;
>
>  private:
> -	bool isValidBuffers(const libcamera::FrameBuffer &source,
> +	bool isValidBuffers(const libcamera::FrameBuffer *source,
>  			    const CameraBuffer &destination) const;
>  	void calculateLengths(const libcamera::StreamConfiguration &inCfg,
>  			      const libcamera::StreamConfiguration &outCfg);
> --
> 2.31.1
>


More information about the libcamera-devel mailing list