[libcamera-devel] [PATCH v3 06/10] android: camera_stream: Plumb process() with Camera3RequestDescriptor

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Sep 20 21:15:34 CEST 2021


Hi Umang,

Thank you for the patch.

On Mon, Sep 20, 2021 at 11:07:48PM +0530, Umang Jain wrote:
> Data (or broader context) required for post processing of a camera request
> is saved via Camera3RequestDescriptor. Instead of passing individual
> arguments to CameraStream::process(), pass the Camera3RequestDescriptor
> pointer to it. All the arguments necessary to run the post-processor can
> be accessed from the descriptor.
> 
> In subsequent commits, we will prepare the post-processor to run
> asynchronously. Hence, it will require the Camera3RequestDescriptor
> pointer to be emitted back in the post-processing completion handler
> to finally complete the request (i.e. sending the capture results back
> to the framework).
> 
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/android/camera_device.cpp            | 5 ++---
>  src/android/camera_stream.cpp            | 5 ++---
>  src/android/camera_stream.h              | 5 +++--
>  src/android/jpeg/post_processor_jpeg.cpp | 5 +++--
>  src/android/jpeg/post_processor_jpeg.h   | 3 +--
>  src/android/post_processor.h             | 5 +++--
>  src/android/yuv/post_processor_yuv.cpp   | 3 +--
>  src/android/yuv/post_processor_yuv.h     | 3 +--
>  8 files changed, 16 insertions(+), 18 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 1ae4ac73..fa462368 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -1150,9 +1150,8 @@ void CameraDevice::requestComplete(Request *request)
>  			continue;
>  		}
>  
> -		int ret = cameraStream->process(src, *buffer.buffer,
> -						descriptor->settings_,
> -						descriptor->resultMetadata_.get());
> +		int ret = cameraStream->process(src, *buffer.buffer, descriptor);
> +
>  		/*
>  		 * Return the FrameBuffer to the CameraStream now that we're
>  		 * done processing it.
> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
> index 0fed5382..d494f5d5 100644
> --- a/src/android/camera_stream.cpp
> +++ b/src/android/camera_stream.cpp
> @@ -100,8 +100,7 @@ int CameraStream::configure()
>  
>  int CameraStream::process(const FrameBuffer *source,
>  			  buffer_handle_t camera3Dest,
> -			  const CameraMetadata &requestMetadata,
> -			  CameraMetadata *resultMetadata)
> +			  Camera3RequestDescriptor *request)
>  {
>  	if (!postProcessor_)
>  		return 0;
> @@ -118,7 +117,7 @@ int CameraStream::process(const FrameBuffer *source,
>  		return -EINVAL;
>  	}
>  
> -	return postProcessor_->process(source, &dest, requestMetadata, resultMetadata);
> +	return postProcessor_->process(source, &dest, request);
>  }
>  
>  FrameBuffer *CameraStream::getBuffer()
> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
> index 5c232cb6..68789700 100644
> --- a/src/android/camera_stream.h
> +++ b/src/android/camera_stream.h
> @@ -23,6 +23,8 @@ class CameraDevice;
>  class CameraMetadata;
>  class PostProcessor;
>  
> +struct Camera3RequestDescriptor;
> +
>  class CameraStream
>  {
>  public:
> @@ -120,8 +122,7 @@ public:
>  	int configure();
>  	int process(const libcamera::FrameBuffer *source,
>  		    buffer_handle_t camera3Dest,
> -		    const CameraMetadata &requestMetadata,
> -		    CameraMetadata *resultMetadata);
> +		    Camera3RequestDescriptor *request);
>  	libcamera::FrameBuffer *getBuffer();
>  	void putBuffer(libcamera::FrameBuffer *buffer);
>  
> diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp
> index cb45f86b..31f68330 100644
> --- a/src/android/jpeg/post_processor_jpeg.cpp
> +++ b/src/android/jpeg/post_processor_jpeg.cpp
> @@ -99,14 +99,15 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer *source,
>  
>  int PostProcessorJpeg::process(const FrameBuffer *source,
>  			       CameraBuffer *destination,
> -			       const CameraMetadata &requestMetadata,
> -			       CameraMetadata *resultMetadata)
> +			       Camera3RequestDescriptor *request)
>  {
>  	if (!encoder_)
>  		return 0;
>  
>  	ASSERT(destination->numPlanes() == 1);
>  
> +	const CameraMetadata &requestMetadata = request->settings_;
> +	CameraMetadata *resultMetadata = request->resultMetadata_.get();
>  	camera_metadata_ro_entry_t entry;
>  	int ret;
>  
> diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h
> index c4b2e9ef..d49c8d2b 100644
> --- a/src/android/jpeg/post_processor_jpeg.h
> +++ b/src/android/jpeg/post_processor_jpeg.h
> @@ -24,8 +24,7 @@ public:
>  		      const libcamera::StreamConfiguration &outcfg) override;
>  	int process(const libcamera::FrameBuffer *source,
>  		    CameraBuffer *destination,
> -		    const CameraMetadata &requestMetadata,
> -		    CameraMetadata *resultMetadata) override;
> +		    Camera3RequestDescriptor *request) override;
>  
>  private:
>  	void generateThumbnail(const libcamera::FrameBuffer *source,
> diff --git a/src/android/post_processor.h b/src/android/post_processor.h
> index 61dfb6d4..bdd6afe7 100644
> --- a/src/android/post_processor.h
> +++ b/src/android/post_processor.h
> @@ -14,6 +14,8 @@
>  
>  class CameraMetadata;
>  
> +struct Camera3RequestDescriptor;
> +
>  class PostProcessor
>  {
>  public:
> @@ -23,8 +25,7 @@ public:
>  			      const libcamera::StreamConfiguration &outCfg) = 0;
>  	virtual int process(const libcamera::FrameBuffer *source,
>  			    CameraBuffer *destination,
> -			    const CameraMetadata &requestMetadata,
> -			    CameraMetadata *resultMetadata) = 0;
> +			    Camera3RequestDescriptor *request) = 0;
>  };
>  
>  #endif /* __ANDROID_POST_PROCESSOR_H__ */
> diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp
> index 0a874886..5e18caee 100644
> --- a/src/android/yuv/post_processor_yuv.cpp
> +++ b/src/android/yuv/post_processor_yuv.cpp
> @@ -51,8 +51,7 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,
>  
>  int PostProcessorYuv::process(const FrameBuffer *source,
>  			      CameraBuffer *destination,
> -			      [[maybe_unused]] const CameraMetadata &requestMetadata,
> -			      [[maybe_unused]] CameraMetadata *metadata)
> +			      [[maybe_unused]] Camera3RequestDescriptor *request)
>  {
>  	if (!isValidBuffers(source, *destination))
>  		return -EINVAL;
> diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h
> index 44a04113..eddd1086 100644
> --- a/src/android/yuv/post_processor_yuv.h
> +++ b/src/android/yuv/post_processor_yuv.h
> @@ -22,8 +22,7 @@ public:
>  		      const libcamera::StreamConfiguration &outcfg) override;
>  	int process(const libcamera::FrameBuffer *source,
>  		    CameraBuffer *destination,
> -		    const CameraMetadata &requestMetadata,
> -		    CameraMetadata *metadata) override;
> +		    Camera3RequestDescriptor *context) override;

s/context/request/

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

>  
>  private:
>  	bool isValidBuffers(const libcamera::FrameBuffer *source,

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list