[libcamera-devel,v6,4/7] android: post_processor: Consolidate contextual information
diff mbox series

Message ID 20211023103302.152769-5-umang.jain@ideasonboard.com
State Superseded
Headers show
Series
  • Async Post Processor
Related show

Commit Message

Umang Jain Oct. 23, 2021, 10:32 a.m. UTC
Save and provide the context for post-processor of a camera stream
via Camera3RequestDescriptor::StreamBuffer. We extend the structure
to include source and destination buffers for the post processor, along
with CameraStream::Type::Internal buffer pointer (if any). In addition
to that, a back pointer to Camera3RequestDescriptor is convienient to
get access to overall descriptor (status, metadata settings etc.)

Also, migrate PostProcessor::process() signature to use
Camera3RequestDescriptor::StreamBuffer only. This will be helpful
when we move to async post-processing in subsequent commits.

Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
---
 src/android/camera_device.cpp            | 11 ++++++-----
 src/android/camera_request.cpp           |  3 ++-
 src/android/camera_request.h             |  5 +++++
 src/android/camera_stream.cpp            | 14 ++++++++------
 src/android/camera_stream.h              |  3 +--
 src/android/jpeg/post_processor_jpeg.cpp | 12 +++++++-----
 src/android/jpeg/post_processor_jpeg.h   |  4 +---
 src/android/post_processor.h             |  7 ++-----
 src/android/yuv/post_processor_yuv.cpp   |  7 ++++---
 src/android/yuv/post_processor_yuv.h     |  4 +---
 10 files changed, 37 insertions(+), 33 deletions(-)

Comments

Laurent Pinchart Oct. 25, 2021, 5:23 a.m. UTC | #1
Hi Umang,

Thank you for the patch.

On Sat, Oct 23, 2021 at 04:02:59PM +0530, Umang Jain wrote:
> Save and provide the context for post-processor of a camera stream
> via Camera3RequestDescriptor::StreamBuffer. We extend the structure
> to include source and destination buffers for the post processor, along
> with CameraStream::Type::Internal buffer pointer (if any). In addition
> to that, a back pointer to Camera3RequestDescriptor is convienient to
> get access to overall descriptor (status, metadata settings etc.)
> 
> Also, migrate PostProcessor::process() signature to use
> Camera3RequestDescriptor::StreamBuffer only. This will be helpful
> when we move to async post-processing in subsequent commits.
> 
> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
> ---
>  src/android/camera_device.cpp            | 11 ++++++-----
>  src/android/camera_request.cpp           |  3 ++-
>  src/android/camera_request.h             |  5 +++++
>  src/android/camera_stream.cpp            | 14 ++++++++------
>  src/android/camera_stream.h              |  3 +--
>  src/android/jpeg/post_processor_jpeg.cpp | 12 +++++++-----
>  src/android/jpeg/post_processor_jpeg.h   |  4 +---
>  src/android/post_processor.h             |  7 ++-----
>  src/android/yuv/post_processor_yuv.cpp   |  7 ++++---
>  src/android/yuv/post_processor_yuv.h     |  4 +---
>  10 files changed, 37 insertions(+), 33 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index f4d4fb09..2a98a2e6 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -953,6 +953,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
>  			 * once it has been processed.
>  			 */
>  			frameBuffer = cameraStream->getBuffer();
> +			buffer.internalBuffer = frameBuffer;
>  			LOG(HAL, Debug) << ss.str() << " (internal)";
>  			break;
>  		}
> @@ -1134,14 +1135,14 @@ void CameraDevice::requestComplete(Request *request)
>  			continue;
>  		}
>  

Should we store src in buffer here instead of in
CameraStream::process(), to make the signature of all process()
functions the same ?

> -		int ret = stream->process(*src, buffer, descriptor);
> +		int ret = stream->process(*src, buffer);
>  
>  		/*
> -		 * Return the FrameBuffer to the CameraStream now that we're
> -		 * done processing it.
> +		 * If the framebuffer is internal to CameraStream return it back
> +		 * now that we're done processing it.
>  		 */
> -		if (stream->type() == CameraStream::Type::Internal)
> -			stream->putBuffer(src);
> +		if (buffer.internalBuffer)
> +			stream->putBuffer(buffer.internalBuffer);
>  
>  		if (ret) {
>  			buffer.status = Camera3RequestDescriptor::Status::Error;
> diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp
> index 16cf266f..fd927167 100644
> --- a/src/android/camera_request.cpp
> +++ b/src/android/camera_request.cpp
> @@ -36,7 +36,8 @@ Camera3RequestDescriptor::Camera3RequestDescriptor(
>  			static_cast<CameraStream *>(buffer.stream->priv);
>  
>  		buffers_.push_back({ stream, buffer.buffer, nullptr,
> -				     buffer.acquire_fence, Status::Success });
> +				     buffer.acquire_fence, Status::Success,
> +				     nullptr, nullptr, nullptr, this });

A constructor will be nice at some point :-)

>  	}
>  
>  	/* Clone the controls associated with the camera3 request. */
> diff --git a/src/android/camera_request.h b/src/android/camera_request.h
> index 904886da..c4bc5d6e 100644
> --- a/src/android/camera_request.h
> +++ b/src/android/camera_request.h
> @@ -17,6 +17,7 @@
>  
>  #include <hardware/camera3.h>
>  
> +#include "camera_buffer.h"

Can you forward-declare CameraBuffer instead of including the header
here ?

>  #include "camera_metadata.h"
>  #include "camera_worker.h"
>  
> @@ -36,6 +37,10 @@ public:
>  		std::unique_ptr<libcamera::FrameBuffer> frameBuffer;
>  		int fence;
>  		Status status;
> +		libcamera::FrameBuffer *internalBuffer;
> +		std::unique_ptr<CameraBuffer> destBuffer;

Maybe dstBuffer to match srcBuffer ? I'd also place srcBuffer first to
match the usual source -> destination logical order, but that's a
detail.

> +		const libcamera::FrameBuffer *srcBuffer;
> +		Camera3RequestDescriptor *request;
>  	};
>  
>  	Camera3RequestDescriptor(libcamera::Camera *camera,
> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
> index ca25c4db..0e268cdf 100644
> --- a/src/android/camera_stream.cpp
> +++ b/src/android/camera_stream.cpp
> @@ -147,8 +147,7 @@ int CameraStream::waitFence(int fence)
>  }
>  
>  int CameraStream::process(const FrameBuffer &source,
> -			  Camera3RequestDescriptor::StreamBuffer &dest,
> -			  Camera3RequestDescriptor *request)
> +			  Camera3RequestDescriptor::StreamBuffer &dest)
>  {
>  	/* Handle waiting on fences on the destination buffer. */
>  	if (dest.fence != -1) {
> @@ -170,14 +169,17 @@ int CameraStream::process(const FrameBuffer &source,
>  	 * separate thread.
>  	 */
>  	const StreamConfiguration &output = configuration();
> -	CameraBuffer destBuffer(*dest.camera3Buffer, output.pixelFormat,
> -				output.size, PROT_READ | PROT_WRITE);
> -	if (!destBuffer.isValid()) {
> +	dest.destBuffer = std::make_unique<CameraBuffer>(
> +		*dest.camera3Buffer, output.pixelFormat, output.size,
> +		PROT_READ | PROT_WRITE);
> +	if (!dest.destBuffer->isValid()) {
>  		LOG(HAL, Error) << "Failed to create destination buffer";
>  		return -EINVAL;
>  	}
>  
> -	return postProcessor_->process(source, &destBuffer, request);
> +	dest.srcBuffer = &source;
> +
> +	return postProcessor_->process(&dest);
>  }
>  
>  FrameBuffer *CameraStream::getBuffer()
> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
> index f242336e..e9c320b1 100644
> --- a/src/android/camera_stream.h
> +++ b/src/android/camera_stream.h
> @@ -122,8 +122,7 @@ public:
>  
>  	int configure();
>  	int process(const libcamera::FrameBuffer &source,
> -		    Camera3RequestDescriptor::StreamBuffer &dest,
> -		    Camera3RequestDescriptor *request);
> +		    Camera3RequestDescriptor::StreamBuffer &dest);

You're passing a reference here, and a pointer in
PostProcessor::process(). Could you pick one of the two and use it
consistently ?

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

>  	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 49483836..da71f113 100644
> --- a/src/android/jpeg/post_processor_jpeg.cpp
> +++ b/src/android/jpeg/post_processor_jpeg.cpp
> @@ -98,15 +98,17 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
>  	}
>  }
>  
> -int PostProcessorJpeg::process(const FrameBuffer &source,
> -			       CameraBuffer *destination,
> -			       Camera3RequestDescriptor *request)
> +int PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
>  {
>  	ASSERT(encoder_);
> +
> +	const FrameBuffer &source = *streamBuffer->srcBuffer;
> +	CameraBuffer *destination = streamBuffer->destBuffer.get();
> +
>  	ASSERT(destination->numPlanes() == 1);
>  
> -	const CameraMetadata &requestMetadata = request->settings_;
> -	CameraMetadata *resultMetadata = request->resultMetadata_.get();
> +	const CameraMetadata &requestMetadata = streamBuffer->request->settings_;
> +	CameraMetadata *resultMetadata = streamBuffer->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 0184d77e..92385548 100644
> --- a/src/android/jpeg/post_processor_jpeg.h
> +++ b/src/android/jpeg/post_processor_jpeg.h
> @@ -22,9 +22,7 @@ public:
>  
>  	int configure(const libcamera::StreamConfiguration &incfg,
>  		      const libcamera::StreamConfiguration &outcfg) override;
> -	int process(const libcamera::FrameBuffer &source,
> -		    CameraBuffer *destination,
> -		    Camera3RequestDescriptor *request) override;
> +	int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
>  
>  private:
>  	void generateThumbnail(const libcamera::FrameBuffer &source,
> diff --git a/src/android/post_processor.h b/src/android/post_processor.h
> index 27eaef88..128161c8 100644
> --- a/src/android/post_processor.h
> +++ b/src/android/post_processor.h
> @@ -11,8 +11,7 @@
>  #include <libcamera/stream.h>
>  
>  #include "camera_buffer.h"
> -
> -class Camera3RequestDescriptor;
> +#include "camera_request.h"
>  
>  class PostProcessor
>  {
> @@ -21,9 +20,7 @@ public:
>  
>  	virtual int configure(const libcamera::StreamConfiguration &inCfg,
>  			      const libcamera::StreamConfiguration &outCfg) = 0;
> -	virtual int process(const libcamera::FrameBuffer &source,
> -			    CameraBuffer *destination,
> -			    Camera3RequestDescriptor *request) = 0;
> +	virtual int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) = 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 8110a1f1..eeb8f1f4 100644
> --- a/src/android/yuv/post_processor_yuv.cpp
> +++ b/src/android/yuv/post_processor_yuv.cpp
> @@ -49,10 +49,11 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,
>  	return 0;
>  }
>  
> -int PostProcessorYuv::process(const FrameBuffer &source,
> -			      CameraBuffer *destination,
> -			      [[maybe_unused]] Camera3RequestDescriptor *request)
> +int PostProcessorYuv::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
>  {
> +	const FrameBuffer &source = *streamBuffer->srcBuffer;
> +	CameraBuffer *destination = streamBuffer->destBuffer.get();
> +
>  	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 a4e0ff5d..5954e11b 100644
> --- a/src/android/yuv/post_processor_yuv.h
> +++ b/src/android/yuv/post_processor_yuv.h
> @@ -18,9 +18,7 @@ public:
>  
>  	int configure(const libcamera::StreamConfiguration &incfg,
>  		      const libcamera::StreamConfiguration &outcfg) override;
> -	int process(const libcamera::FrameBuffer &source,
> -		    CameraBuffer *destination,
> -		    Camera3RequestDescriptor *request) override;
> +	int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
>  
>  private:
>  	bool isValidBuffers(const libcamera::FrameBuffer &source,
Hirokazu Honda Oct. 25, 2021, 11:13 a.m. UTC | #2
Hi Umang, thank you for the patch.

On Mon, Oct 25, 2021 at 2:23 PM Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
>
> Hi Umang,
>
> Thank you for the patch.
>
> On Sat, Oct 23, 2021 at 04:02:59PM +0530, Umang Jain wrote:
> > Save and provide the context for post-processor of a camera stream
> > via Camera3RequestDescriptor::StreamBuffer. We extend the structure
> > to include source and destination buffers for the post processor, along
> > with CameraStream::Type::Internal buffer pointer (if any). In addition
> > to that, a back pointer to Camera3RequestDescriptor is convienient to
> > get access to overall descriptor (status, metadata settings etc.)
> >
> > Also, migrate PostProcessor::process() signature to use
> > Camera3RequestDescriptor::StreamBuffer only. This will be helpful
> > when we move to async post-processing in subsequent commits.
> >
> > Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
> > ---
> >  src/android/camera_device.cpp            | 11 ++++++-----
> >  src/android/camera_request.cpp           |  3 ++-
> >  src/android/camera_request.h             |  5 +++++
> >  src/android/camera_stream.cpp            | 14 ++++++++------
> >  src/android/camera_stream.h              |  3 +--
> >  src/android/jpeg/post_processor_jpeg.cpp | 12 +++++++-----
> >  src/android/jpeg/post_processor_jpeg.h   |  4 +---
> >  src/android/post_processor.h             |  7 ++-----
> >  src/android/yuv/post_processor_yuv.cpp   |  7 ++++---
> >  src/android/yuv/post_processor_yuv.h     |  4 +---
> >  10 files changed, 37 insertions(+), 33 deletions(-)
> >
> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> > index f4d4fb09..2a98a2e6 100644
> > --- a/src/android/camera_device.cpp
> > +++ b/src/android/camera_device.cpp
> > @@ -953,6 +953,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
> >                        * once it has been processed.
> >                        */
> >                       frameBuffer = cameraStream->getBuffer();
> > +                     buffer.internalBuffer = frameBuffer;
> >                       LOG(HAL, Debug) << ss.str() << " (internal)";
> >                       break;
> >               }
> > @@ -1134,14 +1135,14 @@ void CameraDevice::requestComplete(Request *request)
> >                       continue;
> >               }
> >
>
> Should we store src in buffer here instead of in
> CameraStream::process(), to make the signature of all process()
> functions the same ?
>
> > -             int ret = stream->process(*src, buffer, descriptor);
> > +             int ret = stream->process(*src, buffer);
> >
> >               /*
> > -              * Return the FrameBuffer to the CameraStream now that we're
> > -              * done processing it.
> > +              * If the framebuffer is internal to CameraStream return it back
> > +              * now that we're done processing it.
> >                */
> > -             if (stream->type() == CameraStream::Type::Internal)
> > -                     stream->putBuffer(src);
> > +             if (buffer.internalBuffer)
> > +                     stream->putBuffer(buffer.internalBuffer);
> >
> >               if (ret) {
> >                       buffer.status = Camera3RequestDescriptor::Status::Error;
> > diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp
> > index 16cf266f..fd927167 100644
> > --- a/src/android/camera_request.cpp
> > +++ b/src/android/camera_request.cpp
> > @@ -36,7 +36,8 @@ Camera3RequestDescriptor::Camera3RequestDescriptor(
> >                       static_cast<CameraStream *>(buffer.stream->priv);
> >
> >               buffers_.push_back({ stream, buffer.buffer, nullptr,
> > -                                  buffer.acquire_fence, Status::Success });
> > +                                  buffer.acquire_fence, Status::Success,
> > +                                  nullptr, nullptr, nullptr, this });
>
> A constructor will be nice at some point :-)
>
> >       }
> >
> >       /* Clone the controls associated with the camera3 request. */
> > diff --git a/src/android/camera_request.h b/src/android/camera_request.h
> > index 904886da..c4bc5d6e 100644
> > --- a/src/android/camera_request.h
> > +++ b/src/android/camera_request.h
> > @@ -17,6 +17,7 @@
> >
> >  #include <hardware/camera3.h>
> >
> > +#include "camera_buffer.h"
>
> Can you forward-declare CameraBuffer instead of including the header
> here ?
>
> >  #include "camera_metadata.h"
> >  #include "camera_worker.h"
> >
> > @@ -36,6 +37,10 @@ public:
> >               std::unique_ptr<libcamera::FrameBuffer> frameBuffer;
> >               int fence;
> >               Status status;
> > +             libcamera::FrameBuffer *internalBuffer;
> > +             std::unique_ptr<CameraBuffer> destBuffer;
>
> Maybe dstBuffer to match srcBuffer ? I'd also place srcBuffer first to
> match the usual source -> destination logical order, but that's a
> detail.
>
> > +             const libcamera::FrameBuffer *srcBuffer;
> > +             Camera3RequestDescriptor *request;
> >       };
> >

Could you add a document about these in .cpp?
It becomes more and more difficult to track

> >       Camera3RequestDescriptor(libcamera::Camera *camera,
> > diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
> > index ca25c4db..0e268cdf 100644
> > --- a/src/android/camera_stream.cpp
> > +++ b/src/android/camera_stream.cpp
> > @@ -147,8 +147,7 @@ int CameraStream::waitFence(int fence)
> >  }
> >
> >  int CameraStream::process(const FrameBuffer &source,
> > -                       Camera3RequestDescriptor::StreamBuffer &dest,
> > -                       Camera3RequestDescriptor *request)
> > +                       Camera3RequestDescriptor::StreamBuffer &dest)
> >  {
> >       /* Handle waiting on fences on the destination buffer. */
> >       if (dest.fence != -1) {
> > @@ -170,14 +169,17 @@ int CameraStream::process(const FrameBuffer &source,
> >        * separate thread.
> >        */
> >       const StreamConfiguration &output = configuration();
> > -     CameraBuffer destBuffer(*dest.camera3Buffer, output.pixelFormat,
> > -                             output.size, PROT_READ | PROT_WRITE);
> > -     if (!destBuffer.isValid()) {
> > +     dest.destBuffer = std::make_unique<CameraBuffer>(
> > +             *dest.camera3Buffer, output.pixelFormat, output.size,
> > +             PROT_READ | PROT_WRITE);
> > +     if (!dest.destBuffer->isValid()) {
> >               LOG(HAL, Error) << "Failed to create destination buffer";
> >               return -EINVAL;
> >       }
> >
> > -     return postProcessor_->process(source, &destBuffer, request);
> > +     dest.srcBuffer = &source;
> > +
> > +     return postProcessor_->process(&dest);
> >  }
> >
> >  FrameBuffer *CameraStream::getBuffer()
> > diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
> > index f242336e..e9c320b1 100644
> > --- a/src/android/camera_stream.h
> > +++ b/src/android/camera_stream.h
> > @@ -122,8 +122,7 @@ public:
> >
> >       int configure();
> >       int process(const libcamera::FrameBuffer &source,
> > -                 Camera3RequestDescriptor::StreamBuffer &dest,
> > -                 Camera3RequestDescriptor *request);
> > +                 Camera3RequestDescriptor::StreamBuffer &dest);
>

dest seems to be no longer a proper name.
As Laurent said, if we set streamBuffer.srcBuffer to source in a
caller side, perhaps shall this renamed to streamBuffer?

Reviewed-by: Hirokazu Honda <hiroh@chromium.org>

> You're passing a reference here, and a pointer in
> PostProcessor::process(). Could you pick one of the two and use it
> consistently ?
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>
> >       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 49483836..da71f113 100644
> > --- a/src/android/jpeg/post_processor_jpeg.cpp
> > +++ b/src/android/jpeg/post_processor_jpeg.cpp
> > @@ -98,15 +98,17 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
> >       }
> >  }
> >
> > -int PostProcessorJpeg::process(const FrameBuffer &source,
> > -                            CameraBuffer *destination,
> > -                            Camera3RequestDescriptor *request)
> > +int PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
> >  {
> >       ASSERT(encoder_);
> > +
> > +     const FrameBuffer &source = *streamBuffer->srcBuffer;
> > +     CameraBuffer *destination = streamBuffer->destBuffer.get();
> > +
> >       ASSERT(destination->numPlanes() == 1);
> >
> > -     const CameraMetadata &requestMetadata = request->settings_;
> > -     CameraMetadata *resultMetadata = request->resultMetadata_.get();
> > +     const CameraMetadata &requestMetadata = streamBuffer->request->settings_;
> > +     CameraMetadata *resultMetadata = streamBuffer->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 0184d77e..92385548 100644
> > --- a/src/android/jpeg/post_processor_jpeg.h
> > +++ b/src/android/jpeg/post_processor_jpeg.h
> > @@ -22,9 +22,7 @@ public:
> >
> >       int configure(const libcamera::StreamConfiguration &incfg,
> >                     const libcamera::StreamConfiguration &outcfg) override;
> > -     int process(const libcamera::FrameBuffer &source,
> > -                 CameraBuffer *destination,
> > -                 Camera3RequestDescriptor *request) override;
> > +     int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
> >
> >  private:
> >       void generateThumbnail(const libcamera::FrameBuffer &source,
> > diff --git a/src/android/post_processor.h b/src/android/post_processor.h
> > index 27eaef88..128161c8 100644
> > --- a/src/android/post_processor.h
> > +++ b/src/android/post_processor.h
> > @@ -11,8 +11,7 @@
> >  #include <libcamera/stream.h>
> >
> >  #include "camera_buffer.h"
> > -
> > -class Camera3RequestDescriptor;
> > +#include "camera_request.h"
> >
> >  class PostProcessor
> >  {
> > @@ -21,9 +20,7 @@ public:
> >
> >       virtual int configure(const libcamera::StreamConfiguration &inCfg,
> >                             const libcamera::StreamConfiguration &outCfg) = 0;
> > -     virtual int process(const libcamera::FrameBuffer &source,
> > -                         CameraBuffer *destination,
> > -                         Camera3RequestDescriptor *request) = 0;
> > +     virtual int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) = 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 8110a1f1..eeb8f1f4 100644
> > --- a/src/android/yuv/post_processor_yuv.cpp
> > +++ b/src/android/yuv/post_processor_yuv.cpp
> > @@ -49,10 +49,11 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,
> >       return 0;
> >  }
> >
> > -int PostProcessorYuv::process(const FrameBuffer &source,
> > -                           CameraBuffer *destination,
> > -                           [[maybe_unused]] Camera3RequestDescriptor *request)
> > +int PostProcessorYuv::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
> >  {
> > +     const FrameBuffer &source = *streamBuffer->srcBuffer;
> > +     CameraBuffer *destination = streamBuffer->destBuffer.get();
> > +
> >       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 a4e0ff5d..5954e11b 100644
> > --- a/src/android/yuv/post_processor_yuv.h
> > +++ b/src/android/yuv/post_processor_yuv.h
> > @@ -18,9 +18,7 @@ public:
> >
> >       int configure(const libcamera::StreamConfiguration &incfg,
> >                     const libcamera::StreamConfiguration &outcfg) override;
> > -     int process(const libcamera::FrameBuffer &source,
> > -                 CameraBuffer *destination,
> > -                 Camera3RequestDescriptor *request) override;
> > +     int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
> >
> >  private:
> >       bool isValidBuffers(const libcamera::FrameBuffer &source,
>
> --
> Regards,
>
> Laurent Pinchart
Umang Jain Oct. 25, 2021, 1 p.m. UTC | #3
Hi Laurent,

On 10/25/21 10:53 AM, Laurent Pinchart wrote:
> Hi Umang,
>
> Thank you for the patch.
>
> On Sat, Oct 23, 2021 at 04:02:59PM +0530, Umang Jain wrote:
>> Save and provide the context for post-processor of a camera stream
>> via Camera3RequestDescriptor::StreamBuffer. We extend the structure
>> to include source and destination buffers for the post processor, along
>> with CameraStream::Type::Internal buffer pointer (if any). In addition
>> to that, a back pointer to Camera3RequestDescriptor is convienient to
>> get access to overall descriptor (status, metadata settings etc.)
>>
>> Also, migrate PostProcessor::process() signature to use
>> Camera3RequestDescriptor::StreamBuffer only. This will be helpful
>> when we move to async post-processing in subsequent commits.
>>
>> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
>> ---
>>   src/android/camera_device.cpp            | 11 ++++++-----
>>   src/android/camera_request.cpp           |  3 ++-
>>   src/android/camera_request.h             |  5 +++++
>>   src/android/camera_stream.cpp            | 14 ++++++++------
>>   src/android/camera_stream.h              |  3 +--
>>   src/android/jpeg/post_processor_jpeg.cpp | 12 +++++++-----
>>   src/android/jpeg/post_processor_jpeg.h   |  4 +---
>>   src/android/post_processor.h             |  7 ++-----
>>   src/android/yuv/post_processor_yuv.cpp   |  7 ++++---
>>   src/android/yuv/post_processor_yuv.h     |  4 +---
>>   10 files changed, 37 insertions(+), 33 deletions(-)
>>
>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
>> index f4d4fb09..2a98a2e6 100644
>> --- a/src/android/camera_device.cpp
>> +++ b/src/android/camera_device.cpp
>> @@ -953,6 +953,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
>>   			 * once it has been processed.
>>   			 */
>>   			frameBuffer = cameraStream->getBuffer();
>> +			buffer.internalBuffer = frameBuffer;
>>   			LOG(HAL, Debug) << ss.str() << " (internal)";
>>   			break;
>>   		}
>> @@ -1134,14 +1135,14 @@ void CameraDevice::requestComplete(Request *request)
>>   			continue;
>>   		}
>>   
> Should we store src in buffer here instead of in
> CameraStream::process(), to make the signature of all process()
> functions the same ?


That's a good point.

I'll try to address it in this series, but see if it's easy enough 
changeset for a fixup! patch? If I see major conflicts, would it be OK 
on top?

>
>> -		int ret = stream->process(*src, buffer, descriptor);
>> +		int ret = stream->process(*src, buffer);
>>   
>>   		/*
>> -		 * Return the FrameBuffer to the CameraStream now that we're
>> -		 * done processing it.
>> +		 * If the framebuffer is internal to CameraStream return it back
>> +		 * now that we're done processing it.
>>   		 */
>> -		if (stream->type() == CameraStream::Type::Internal)
>> -			stream->putBuffer(src);
>> +		if (buffer.internalBuffer)
>> +			stream->putBuffer(buffer.internalBuffer);
>>   
>>   		if (ret) {
>>   			buffer.status = Camera3RequestDescriptor::Status::Error;
>> diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp
>> index 16cf266f..fd927167 100644
>> --- a/src/android/camera_request.cpp
>> +++ b/src/android/camera_request.cpp
>> @@ -36,7 +36,8 @@ Camera3RequestDescriptor::Camera3RequestDescriptor(
>>   			static_cast<CameraStream *>(buffer.stream->priv);
>>   
>>   		buffers_.push_back({ stream, buffer.buffer, nullptr,
>> -				     buffer.acquire_fence, Status::Success });
>> +				     buffer.acquire_fence, Status::Success,
>> +				     nullptr, nullptr, nullptr, this });
> A constructor will be nice at some point :-)
>
>>   	}
>>   
>>   	/* Clone the controls associated with the camera3 request. */
>> diff --git a/src/android/camera_request.h b/src/android/camera_request.h
>> index 904886da..c4bc5d6e 100644
>> --- a/src/android/camera_request.h
>> +++ b/src/android/camera_request.h
>> @@ -17,6 +17,7 @@
>>   
>>   #include <hardware/camera3.h>
>>   
>> +#include "camera_buffer.h"
> Can you forward-declare CameraBuffer instead of including the header
> here ?
>
>>   #include "camera_metadata.h"
>>   #include "camera_worker.h"
>>   
>> @@ -36,6 +37,10 @@ public:
>>   		std::unique_ptr<libcamera::FrameBuffer> frameBuffer;
>>   		int fence;
>>   		Status status;
>> +		libcamera::FrameBuffer *internalBuffer;
>> +		std::unique_ptr<CameraBuffer> destBuffer;
> Maybe dstBuffer to match srcBuffer ? I'd also place srcBuffer first to
> match the usual source -> destination logical order, but that's a
> detail.


Yes, renaming that should be fine.

>
>> +		const libcamera::FrameBuffer *srcBuffer;
>> +		Camera3RequestDescriptor *request;
>>   	};
>>   
>>   	Camera3RequestDescriptor(libcamera::Camera *camera,
>> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
>> index ca25c4db..0e268cdf 100644
>> --- a/src/android/camera_stream.cpp
>> +++ b/src/android/camera_stream.cpp
>> @@ -147,8 +147,7 @@ int CameraStream::waitFence(int fence)
>>   }
>>   
>>   int CameraStream::process(const FrameBuffer &source,
>> -			  Camera3RequestDescriptor::StreamBuffer &dest,
>> -			  Camera3RequestDescriptor *request)
>> +			  Camera3RequestDescriptor::StreamBuffer &dest)
>>   {
>>   	/* Handle waiting on fences on the destination buffer. */
>>   	if (dest.fence != -1) {
>> @@ -170,14 +169,17 @@ int CameraStream::process(const FrameBuffer &source,
>>   	 * separate thread.
>>   	 */
>>   	const StreamConfiguration &output = configuration();
>> -	CameraBuffer destBuffer(*dest.camera3Buffer, output.pixelFormat,
>> -				output.size, PROT_READ | PROT_WRITE);
>> -	if (!destBuffer.isValid()) {
>> +	dest.destBuffer = std::make_unique<CameraBuffer>(
>> +		*dest.camera3Buffer, output.pixelFormat, output.size,
>> +		PROT_READ | PROT_WRITE);
>> +	if (!dest.destBuffer->isValid()) {
>>   		LOG(HAL, Error) << "Failed to create destination buffer";
>>   		return -EINVAL;
>>   	}
>>   
>> -	return postProcessor_->process(source, &destBuffer, request);
>> +	dest.srcBuffer = &source;
>> +
>> +	return postProcessor_->process(&dest);
>>   }
>>   
>>   FrameBuffer *CameraStream::getBuffer()
>> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
>> index f242336e..e9c320b1 100644
>> --- a/src/android/camera_stream.h
>> +++ b/src/android/camera_stream.h
>> @@ -122,8 +122,7 @@ public:
>>   
>>   	int configure();
>>   	int process(const libcamera::FrameBuffer &source,
>> -		    Camera3RequestDescriptor::StreamBuffer &dest,
>> -		    Camera3RequestDescriptor *request);
>> +		    Camera3RequestDescriptor::StreamBuffer &dest);
> You're passing a reference here, and a pointer in
> PostProcessor::process(). Could you pick one of the two and use it
> consistently ?


Ah right, I see that now. I will probably makeĀ  use of pointers.

>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>
>>   	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 49483836..da71f113 100644
>> --- a/src/android/jpeg/post_processor_jpeg.cpp
>> +++ b/src/android/jpeg/post_processor_jpeg.cpp
>> @@ -98,15 +98,17 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
>>   	}
>>   }
>>   
>> -int PostProcessorJpeg::process(const FrameBuffer &source,
>> -			       CameraBuffer *destination,
>> -			       Camera3RequestDescriptor *request)
>> +int PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
>>   {
>>   	ASSERT(encoder_);
>> +
>> +	const FrameBuffer &source = *streamBuffer->srcBuffer;
>> +	CameraBuffer *destination = streamBuffer->destBuffer.get();
>> +
>>   	ASSERT(destination->numPlanes() == 1);
>>   
>> -	const CameraMetadata &requestMetadata = request->settings_;
>> -	CameraMetadata *resultMetadata = request->resultMetadata_.get();
>> +	const CameraMetadata &requestMetadata = streamBuffer->request->settings_;
>> +	CameraMetadata *resultMetadata = streamBuffer->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 0184d77e..92385548 100644
>> --- a/src/android/jpeg/post_processor_jpeg.h
>> +++ b/src/android/jpeg/post_processor_jpeg.h
>> @@ -22,9 +22,7 @@ public:
>>   
>>   	int configure(const libcamera::StreamConfiguration &incfg,
>>   		      const libcamera::StreamConfiguration &outcfg) override;
>> -	int process(const libcamera::FrameBuffer &source,
>> -		    CameraBuffer *destination,
>> -		    Camera3RequestDescriptor *request) override;
>> +	int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
>>   
>>   private:
>>   	void generateThumbnail(const libcamera::FrameBuffer &source,
>> diff --git a/src/android/post_processor.h b/src/android/post_processor.h
>> index 27eaef88..128161c8 100644
>> --- a/src/android/post_processor.h
>> +++ b/src/android/post_processor.h
>> @@ -11,8 +11,7 @@
>>   #include <libcamera/stream.h>
>>   
>>   #include "camera_buffer.h"
>> -
>> -class Camera3RequestDescriptor;
>> +#include "camera_request.h"
>>   
>>   class PostProcessor
>>   {
>> @@ -21,9 +20,7 @@ public:
>>   
>>   	virtual int configure(const libcamera::StreamConfiguration &inCfg,
>>   			      const libcamera::StreamConfiguration &outCfg) = 0;
>> -	virtual int process(const libcamera::FrameBuffer &source,
>> -			    CameraBuffer *destination,
>> -			    Camera3RequestDescriptor *request) = 0;
>> +	virtual int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) = 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 8110a1f1..eeb8f1f4 100644
>> --- a/src/android/yuv/post_processor_yuv.cpp
>> +++ b/src/android/yuv/post_processor_yuv.cpp
>> @@ -49,10 +49,11 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,
>>   	return 0;
>>   }
>>   
>> -int PostProcessorYuv::process(const FrameBuffer &source,
>> -			      CameraBuffer *destination,
>> -			      [[maybe_unused]] Camera3RequestDescriptor *request)
>> +int PostProcessorYuv::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
>>   {
>> +	const FrameBuffer &source = *streamBuffer->srcBuffer;
>> +	CameraBuffer *destination = streamBuffer->destBuffer.get();
>> +
>>   	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 a4e0ff5d..5954e11b 100644
>> --- a/src/android/yuv/post_processor_yuv.h
>> +++ b/src/android/yuv/post_processor_yuv.h
>> @@ -18,9 +18,7 @@ public:
>>   
>>   	int configure(const libcamera::StreamConfiguration &incfg,
>>   		      const libcamera::StreamConfiguration &outcfg) override;
>> -	int process(const libcamera::FrameBuffer &source,
>> -		    CameraBuffer *destination,
>> -		    Camera3RequestDescriptor *request) override;
>> +	int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
>>   
>>   private:
>>   	bool isValidBuffers(const libcamera::FrameBuffer &source,
Laurent Pinchart Oct. 25, 2021, 1:26 p.m. UTC | #4
Hi Umang,

On Mon, Oct 25, 2021 at 06:30:41PM +0530, Umang Jain wrote:
> On 10/25/21 10:53 AM, Laurent Pinchart wrote:
> > On Sat, Oct 23, 2021 at 04:02:59PM +0530, Umang Jain wrote:
> >> Save and provide the context for post-processor of a camera stream
> >> via Camera3RequestDescriptor::StreamBuffer. We extend the structure
> >> to include source and destination buffers for the post processor, along
> >> with CameraStream::Type::Internal buffer pointer (if any). In addition
> >> to that, a back pointer to Camera3RequestDescriptor is convienient to
> >> get access to overall descriptor (status, metadata settings etc.)
> >>
> >> Also, migrate PostProcessor::process() signature to use
> >> Camera3RequestDescriptor::StreamBuffer only. This will be helpful
> >> when we move to async post-processing in subsequent commits.
> >>
> >> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
> >> ---
> >>   src/android/camera_device.cpp            | 11 ++++++-----
> >>   src/android/camera_request.cpp           |  3 ++-
> >>   src/android/camera_request.h             |  5 +++++
> >>   src/android/camera_stream.cpp            | 14 ++++++++------
> >>   src/android/camera_stream.h              |  3 +--
> >>   src/android/jpeg/post_processor_jpeg.cpp | 12 +++++++-----
> >>   src/android/jpeg/post_processor_jpeg.h   |  4 +---
> >>   src/android/post_processor.h             |  7 ++-----
> >>   src/android/yuv/post_processor_yuv.cpp   |  7 ++++---
> >>   src/android/yuv/post_processor_yuv.h     |  4 +---
> >>   10 files changed, 37 insertions(+), 33 deletions(-)
> >>
> >> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> >> index f4d4fb09..2a98a2e6 100644
> >> --- a/src/android/camera_device.cpp
> >> +++ b/src/android/camera_device.cpp
> >> @@ -953,6 +953,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
> >>   			 * once it has been processed.
> >>   			 */
> >>   			frameBuffer = cameraStream->getBuffer();
> >> +			buffer.internalBuffer = frameBuffer;
> >>   			LOG(HAL, Debug) << ss.str() << " (internal)";
> >>   			break;
> >>   		}
> >> @@ -1134,14 +1135,14 @@ void CameraDevice::requestComplete(Request *request)
> >>   			continue;
> >>   		}
> >>   
> >
> > Should we store src in buffer here instead of in
> > CameraStream::process(), to make the signature of all process()
> > functions the same ?
> 
> That's a good point.
> 
> I'll try to address it in this series, but see if it's easy enough 
> changeset for a fixup! patch? If I see major conflicts, would it be OK 
> on top?

If it's too difficult I think it would be ok on top.

> >> -		int ret = stream->process(*src, buffer, descriptor);
> >> +		int ret = stream->process(*src, buffer);
> >>   
> >>   		/*
> >> -		 * Return the FrameBuffer to the CameraStream now that we're
> >> -		 * done processing it.
> >> +		 * If the framebuffer is internal to CameraStream return it back
> >> +		 * now that we're done processing it.
> >>   		 */
> >> -		if (stream->type() == CameraStream::Type::Internal)
> >> -			stream->putBuffer(src);
> >> +		if (buffer.internalBuffer)
> >> +			stream->putBuffer(buffer.internalBuffer);
> >>   
> >>   		if (ret) {
> >>   			buffer.status = Camera3RequestDescriptor::Status::Error;
> >> diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp
> >> index 16cf266f..fd927167 100644
> >> --- a/src/android/camera_request.cpp
> >> +++ b/src/android/camera_request.cpp
> >> @@ -36,7 +36,8 @@ Camera3RequestDescriptor::Camera3RequestDescriptor(
> >>   			static_cast<CameraStream *>(buffer.stream->priv);
> >>   
> >>   		buffers_.push_back({ stream, buffer.buffer, nullptr,
> >> -				     buffer.acquire_fence, Status::Success });
> >> +				     buffer.acquire_fence, Status::Success,
> >> +				     nullptr, nullptr, nullptr, this });
> >
> > A constructor will be nice at some point :-)
> >
> >>   	}
> >>   
> >>   	/* Clone the controls associated with the camera3 request. */
> >> diff --git a/src/android/camera_request.h b/src/android/camera_request.h
> >> index 904886da..c4bc5d6e 100644
> >> --- a/src/android/camera_request.h
> >> +++ b/src/android/camera_request.h
> >> @@ -17,6 +17,7 @@
> >>   
> >>   #include <hardware/camera3.h>
> >>   
> >> +#include "camera_buffer.h"
> >
> > Can you forward-declare CameraBuffer instead of including the header
> > here ?
> >
> >>   #include "camera_metadata.h"
> >>   #include "camera_worker.h"
> >>   
> >> @@ -36,6 +37,10 @@ public:
> >>   		std::unique_ptr<libcamera::FrameBuffer> frameBuffer;
> >>   		int fence;
> >>   		Status status;
> >> +		libcamera::FrameBuffer *internalBuffer;
> >> +		std::unique_ptr<CameraBuffer> destBuffer;
> >
> > Maybe dstBuffer to match srcBuffer ? I'd also place srcBuffer first to
> > match the usual source -> destination logical order, but that's a
> > detail.
> 
> Yes, renaming that should be fine.
> 
> >> +		const libcamera::FrameBuffer *srcBuffer;
> >> +		Camera3RequestDescriptor *request;
> >>   	};
> >>   
> >>   	Camera3RequestDescriptor(libcamera::Camera *camera,
> >> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
> >> index ca25c4db..0e268cdf 100644
> >> --- a/src/android/camera_stream.cpp
> >> +++ b/src/android/camera_stream.cpp
> >> @@ -147,8 +147,7 @@ int CameraStream::waitFence(int fence)
> >>   }
> >>   
> >>   int CameraStream::process(const FrameBuffer &source,
> >> -			  Camera3RequestDescriptor::StreamBuffer &dest,
> >> -			  Camera3RequestDescriptor *request)
> >> +			  Camera3RequestDescriptor::StreamBuffer &dest)
> >>   {
> >>   	/* Handle waiting on fences on the destination buffer. */
> >>   	if (dest.fence != -1) {
> >> @@ -170,14 +169,17 @@ int CameraStream::process(const FrameBuffer &source,
> >>   	 * separate thread.
> >>   	 */
> >>   	const StreamConfiguration &output = configuration();
> >> -	CameraBuffer destBuffer(*dest.camera3Buffer, output.pixelFormat,
> >> -				output.size, PROT_READ | PROT_WRITE);
> >> -	if (!destBuffer.isValid()) {
> >> +	dest.destBuffer = std::make_unique<CameraBuffer>(
> >> +		*dest.camera3Buffer, output.pixelFormat, output.size,
> >> +		PROT_READ | PROT_WRITE);
> >> +	if (!dest.destBuffer->isValid()) {
> >>   		LOG(HAL, Error) << "Failed to create destination buffer";
> >>   		return -EINVAL;
> >>   	}
> >>   
> >> -	return postProcessor_->process(source, &destBuffer, request);
> >> +	dest.srcBuffer = &source;
> >> +
> >> +	return postProcessor_->process(&dest);
> >>   }
> >>   
> >>   FrameBuffer *CameraStream::getBuffer()
> >> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
> >> index f242336e..e9c320b1 100644
> >> --- a/src/android/camera_stream.h
> >> +++ b/src/android/camera_stream.h
> >> @@ -122,8 +122,7 @@ public:
> >>   
> >>   	int configure();
> >>   	int process(const libcamera::FrameBuffer &source,
> >> -		    Camera3RequestDescriptor::StreamBuffer &dest,
> >> -		    Camera3RequestDescriptor *request);
> >> +		    Camera3RequestDescriptor::StreamBuffer &dest);
> >
> > You're passing a reference here, and a pointer in
> > PostProcessor::process(). Could you pick one of the two and use it
> > consistently ?
> 
> Ah right, I see that now. I will probably makeĀ  use of pointers.
> 
> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> >
> >>   	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 49483836..da71f113 100644
> >> --- a/src/android/jpeg/post_processor_jpeg.cpp
> >> +++ b/src/android/jpeg/post_processor_jpeg.cpp
> >> @@ -98,15 +98,17 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
> >>   	}
> >>   }
> >>   
> >> -int PostProcessorJpeg::process(const FrameBuffer &source,
> >> -			       CameraBuffer *destination,
> >> -			       Camera3RequestDescriptor *request)
> >> +int PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
> >>   {
> >>   	ASSERT(encoder_);
> >> +
> >> +	const FrameBuffer &source = *streamBuffer->srcBuffer;
> >> +	CameraBuffer *destination = streamBuffer->destBuffer.get();
> >> +
> >>   	ASSERT(destination->numPlanes() == 1);
> >>   
> >> -	const CameraMetadata &requestMetadata = request->settings_;
> >> -	CameraMetadata *resultMetadata = request->resultMetadata_.get();
> >> +	const CameraMetadata &requestMetadata = streamBuffer->request->settings_;
> >> +	CameraMetadata *resultMetadata = streamBuffer->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 0184d77e..92385548 100644
> >> --- a/src/android/jpeg/post_processor_jpeg.h
> >> +++ b/src/android/jpeg/post_processor_jpeg.h
> >> @@ -22,9 +22,7 @@ public:
> >>   
> >>   	int configure(const libcamera::StreamConfiguration &incfg,
> >>   		      const libcamera::StreamConfiguration &outcfg) override;
> >> -	int process(const libcamera::FrameBuffer &source,
> >> -		    CameraBuffer *destination,
> >> -		    Camera3RequestDescriptor *request) override;
> >> +	int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
> >>   
> >>   private:
> >>   	void generateThumbnail(const libcamera::FrameBuffer &source,
> >> diff --git a/src/android/post_processor.h b/src/android/post_processor.h
> >> index 27eaef88..128161c8 100644
> >> --- a/src/android/post_processor.h
> >> +++ b/src/android/post_processor.h
> >> @@ -11,8 +11,7 @@
> >>   #include <libcamera/stream.h>
> >>   
> >>   #include "camera_buffer.h"
> >> -
> >> -class Camera3RequestDescriptor;
> >> +#include "camera_request.h"
> >>   
> >>   class PostProcessor
> >>   {
> >> @@ -21,9 +20,7 @@ public:
> >>   
> >>   	virtual int configure(const libcamera::StreamConfiguration &inCfg,
> >>   			      const libcamera::StreamConfiguration &outCfg) = 0;
> >> -	virtual int process(const libcamera::FrameBuffer &source,
> >> -			    CameraBuffer *destination,
> >> -			    Camera3RequestDescriptor *request) = 0;
> >> +	virtual int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) = 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 8110a1f1..eeb8f1f4 100644
> >> --- a/src/android/yuv/post_processor_yuv.cpp
> >> +++ b/src/android/yuv/post_processor_yuv.cpp
> >> @@ -49,10 +49,11 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,
> >>   	return 0;
> >>   }
> >>   
> >> -int PostProcessorYuv::process(const FrameBuffer &source,
> >> -			      CameraBuffer *destination,
> >> -			      [[maybe_unused]] Camera3RequestDescriptor *request)
> >> +int PostProcessorYuv::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
> >>   {
> >> +	const FrameBuffer &source = *streamBuffer->srcBuffer;
> >> +	CameraBuffer *destination = streamBuffer->destBuffer.get();
> >> +
> >>   	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 a4e0ff5d..5954e11b 100644
> >> --- a/src/android/yuv/post_processor_yuv.h
> >> +++ b/src/android/yuv/post_processor_yuv.h
> >> @@ -18,9 +18,7 @@ public:
> >>   
> >>   	int configure(const libcamera::StreamConfiguration &incfg,
> >>   		      const libcamera::StreamConfiguration &outcfg) override;
> >> -	int process(const libcamera::FrameBuffer &source,
> >> -		    CameraBuffer *destination,
> >> -		    Camera3RequestDescriptor *request) override;
> >> +	int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
> >>   
> >>   private:
> >>   	bool isValidBuffers(const libcamera::FrameBuffer &source,

Patch
diff mbox series

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index f4d4fb09..2a98a2e6 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -953,6 +953,7 @@  int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques
 			 * once it has been processed.
 			 */
 			frameBuffer = cameraStream->getBuffer();
+			buffer.internalBuffer = frameBuffer;
 			LOG(HAL, Debug) << ss.str() << " (internal)";
 			break;
 		}
@@ -1134,14 +1135,14 @@  void CameraDevice::requestComplete(Request *request)
 			continue;
 		}
 
-		int ret = stream->process(*src, buffer, descriptor);
+		int ret = stream->process(*src, buffer);
 
 		/*
-		 * Return the FrameBuffer to the CameraStream now that we're
-		 * done processing it.
+		 * If the framebuffer is internal to CameraStream return it back
+		 * now that we're done processing it.
 		 */
-		if (stream->type() == CameraStream::Type::Internal)
-			stream->putBuffer(src);
+		if (buffer.internalBuffer)
+			stream->putBuffer(buffer.internalBuffer);
 
 		if (ret) {
 			buffer.status = Camera3RequestDescriptor::Status::Error;
diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp
index 16cf266f..fd927167 100644
--- a/src/android/camera_request.cpp
+++ b/src/android/camera_request.cpp
@@ -36,7 +36,8 @@  Camera3RequestDescriptor::Camera3RequestDescriptor(
 			static_cast<CameraStream *>(buffer.stream->priv);
 
 		buffers_.push_back({ stream, buffer.buffer, nullptr,
-				     buffer.acquire_fence, Status::Success });
+				     buffer.acquire_fence, Status::Success,
+				     nullptr, nullptr, nullptr, this });
 	}
 
 	/* Clone the controls associated with the camera3 request. */
diff --git a/src/android/camera_request.h b/src/android/camera_request.h
index 904886da..c4bc5d6e 100644
--- a/src/android/camera_request.h
+++ b/src/android/camera_request.h
@@ -17,6 +17,7 @@ 
 
 #include <hardware/camera3.h>
 
+#include "camera_buffer.h"
 #include "camera_metadata.h"
 #include "camera_worker.h"
 
@@ -36,6 +37,10 @@  public:
 		std::unique_ptr<libcamera::FrameBuffer> frameBuffer;
 		int fence;
 		Status status;
+		libcamera::FrameBuffer *internalBuffer;
+		std::unique_ptr<CameraBuffer> destBuffer;
+		const libcamera::FrameBuffer *srcBuffer;
+		Camera3RequestDescriptor *request;
 	};
 
 	Camera3RequestDescriptor(libcamera::Camera *camera,
diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
index ca25c4db..0e268cdf 100644
--- a/src/android/camera_stream.cpp
+++ b/src/android/camera_stream.cpp
@@ -147,8 +147,7 @@  int CameraStream::waitFence(int fence)
 }
 
 int CameraStream::process(const FrameBuffer &source,
-			  Camera3RequestDescriptor::StreamBuffer &dest,
-			  Camera3RequestDescriptor *request)
+			  Camera3RequestDescriptor::StreamBuffer &dest)
 {
 	/* Handle waiting on fences on the destination buffer. */
 	if (dest.fence != -1) {
@@ -170,14 +169,17 @@  int CameraStream::process(const FrameBuffer &source,
 	 * separate thread.
 	 */
 	const StreamConfiguration &output = configuration();
-	CameraBuffer destBuffer(*dest.camera3Buffer, output.pixelFormat,
-				output.size, PROT_READ | PROT_WRITE);
-	if (!destBuffer.isValid()) {
+	dest.destBuffer = std::make_unique<CameraBuffer>(
+		*dest.camera3Buffer, output.pixelFormat, output.size,
+		PROT_READ | PROT_WRITE);
+	if (!dest.destBuffer->isValid()) {
 		LOG(HAL, Error) << "Failed to create destination buffer";
 		return -EINVAL;
 	}
 
-	return postProcessor_->process(source, &destBuffer, request);
+	dest.srcBuffer = &source;
+
+	return postProcessor_->process(&dest);
 }
 
 FrameBuffer *CameraStream::getBuffer()
diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
index f242336e..e9c320b1 100644
--- a/src/android/camera_stream.h
+++ b/src/android/camera_stream.h
@@ -122,8 +122,7 @@  public:
 
 	int configure();
 	int process(const libcamera::FrameBuffer &source,
-		    Camera3RequestDescriptor::StreamBuffer &dest,
-		    Camera3RequestDescriptor *request);
+		    Camera3RequestDescriptor::StreamBuffer &dest);
 	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 49483836..da71f113 100644
--- a/src/android/jpeg/post_processor_jpeg.cpp
+++ b/src/android/jpeg/post_processor_jpeg.cpp
@@ -98,15 +98,17 @@  void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,
 	}
 }
 
-int PostProcessorJpeg::process(const FrameBuffer &source,
-			       CameraBuffer *destination,
-			       Camera3RequestDescriptor *request)
+int PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
 {
 	ASSERT(encoder_);
+
+	const FrameBuffer &source = *streamBuffer->srcBuffer;
+	CameraBuffer *destination = streamBuffer->destBuffer.get();
+
 	ASSERT(destination->numPlanes() == 1);
 
-	const CameraMetadata &requestMetadata = request->settings_;
-	CameraMetadata *resultMetadata = request->resultMetadata_.get();
+	const CameraMetadata &requestMetadata = streamBuffer->request->settings_;
+	CameraMetadata *resultMetadata = streamBuffer->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 0184d77e..92385548 100644
--- a/src/android/jpeg/post_processor_jpeg.h
+++ b/src/android/jpeg/post_processor_jpeg.h
@@ -22,9 +22,7 @@  public:
 
 	int configure(const libcamera::StreamConfiguration &incfg,
 		      const libcamera::StreamConfiguration &outcfg) override;
-	int process(const libcamera::FrameBuffer &source,
-		    CameraBuffer *destination,
-		    Camera3RequestDescriptor *request) override;
+	int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
 
 private:
 	void generateThumbnail(const libcamera::FrameBuffer &source,
diff --git a/src/android/post_processor.h b/src/android/post_processor.h
index 27eaef88..128161c8 100644
--- a/src/android/post_processor.h
+++ b/src/android/post_processor.h
@@ -11,8 +11,7 @@ 
 #include <libcamera/stream.h>
 
 #include "camera_buffer.h"
-
-class Camera3RequestDescriptor;
+#include "camera_request.h"
 
 class PostProcessor
 {
@@ -21,9 +20,7 @@  public:
 
 	virtual int configure(const libcamera::StreamConfiguration &inCfg,
 			      const libcamera::StreamConfiguration &outCfg) = 0;
-	virtual int process(const libcamera::FrameBuffer &source,
-			    CameraBuffer *destination,
-			    Camera3RequestDescriptor *request) = 0;
+	virtual int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) = 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 8110a1f1..eeb8f1f4 100644
--- a/src/android/yuv/post_processor_yuv.cpp
+++ b/src/android/yuv/post_processor_yuv.cpp
@@ -49,10 +49,11 @@  int PostProcessorYuv::configure(const StreamConfiguration &inCfg,
 	return 0;
 }
 
-int PostProcessorYuv::process(const FrameBuffer &source,
-			      CameraBuffer *destination,
-			      [[maybe_unused]] Camera3RequestDescriptor *request)
+int PostProcessorYuv::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)
 {
+	const FrameBuffer &source = *streamBuffer->srcBuffer;
+	CameraBuffer *destination = streamBuffer->destBuffer.get();
+
 	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 a4e0ff5d..5954e11b 100644
--- a/src/android/yuv/post_processor_yuv.h
+++ b/src/android/yuv/post_processor_yuv.h
@@ -18,9 +18,7 @@  public:
 
 	int configure(const libcamera::StreamConfiguration &incfg,
 		      const libcamera::StreamConfiguration &outcfg) override;
-	int process(const libcamera::FrameBuffer &source,
-		    CameraBuffer *destination,
-		    Camera3RequestDescriptor *request) override;
+	int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;
 
 private:
 	bool isValidBuffers(const libcamera::FrameBuffer &source,