[{"id":20483,"web_url":"https://patchwork.libcamera.org/comment/20483/","msgid":"<YXcm/RBrryu5UYM8@pendragon.ideasonboard.com>","date":"2021-10-25T21:51:57","subject":"Re: [libcamera-devel] [PATCH v7 4/7] android: post_processor:\n\tConsolidate contextual information","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Umang,\n\nThank you for the patch.\n\nOn Tue, Oct 26, 2021 at 02:08:30AM +0530, Umang Jain wrote:\n> Save and provide the context for post-processor of a camera stream\n> via Camera3RequestDescriptor::StreamBuffer. We extend the structure\n> to include source and destination buffers for the post processor, along\n> with CameraStream::Type::Internal buffer pointer (if any). In addition\n> to that, a back pointer to Camera3RequestDescriptor is convienient to\n> get access to overall descriptor (status, metadata settings etc.)\n> \n> Also, migrate CameraStream::process() and PostProcessor::process()\n> signature to use Camera3RequestDescriptor::StreamBuffer only. This\n> will be helpful when we move to async post-processing in subsequent\n> commits.\n> \n> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Reviewed-by: Hirokazu Honda <hiroh@chromium.org>\n> ---\n>  src/android/camera_device.cpp            | 13 ++++++++-----\n>  src/android/camera_request.cpp           |  5 ++++-\n>  src/android/camera_request.h             |  5 +++++\n>  src/android/camera_stream.cpp            | 23 +++++++++++------------\n>  src/android/camera_stream.h              |  4 +---\n>  src/android/jpeg/post_processor_jpeg.cpp | 12 +++++++-----\n>  src/android/jpeg/post_processor_jpeg.h   |  4 +---\n>  src/android/post_processor.h             |  7 ++-----\n>  src/android/yuv/post_processor_yuv.cpp   |  7 ++++---\n>  src/android/yuv/post_processor_yuv.h     |  4 +---\n>  10 files changed, 44 insertions(+), 40 deletions(-)\n> \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index bf9a2e69..9155728a 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -953,6 +953,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>  \t\t\t * once it has been processed.\n>  \t\t\t */\n>  \t\t\tframeBuffer = cameraStream->getBuffer();\n> +\t\t\tbuffer.internalBuffer = frameBuffer;\n>  \t\t\tLOG(HAL, Debug) << ss.str() << \" (internal)\";\n>  \t\t\tbreak;\n>  \t\t}\n> @@ -1133,14 +1134,16 @@ void CameraDevice::requestComplete(Request *request)\n>  \t\t\tcontinue;\n>  \t\t}\n>  \n> -\t\tint ret = stream->process(*src, buffer, descriptor);\n> +\t\tbuffer.srcBuffer = src;\n> +\n> +\t\tint ret = stream->process(&buffer);\n>  \n>  \t\t/*\n> -\t\t * Return the FrameBuffer to the CameraStream now that we're\n> -\t\t * done processing it.\n> +\t\t * If the framebuffer is internal to CameraStream return it back\n> +\t\t * now that we're done processing it.\n>  \t\t */\n> -\t\tif (stream->type() == CameraStream::Type::Internal)\n> -\t\t\tstream->putBuffer(src);\n> +\t\tif (buffer.internalBuffer)\n> +\t\t\tstream->putBuffer(buffer.internalBuffer);\n>  \n>  \t\tif (ret) {\n>  \t\t\tbuffer.status = Camera3RequestDescriptor::Status::Error;\n> diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp\n> index 16cf266f..5bac1b8f 100644\n> --- a/src/android/camera_request.cpp\n> +++ b/src/android/camera_request.cpp\n> @@ -9,6 +9,8 @@\n>  \n>  #include <libcamera/base/span.h>\n>  \n> +#include \"camera_buffer.h\"\n> +\n>  using namespace libcamera;\n>  \n>  /*\n> @@ -36,7 +38,8 @@ Camera3RequestDescriptor::Camera3RequestDescriptor(\n>  \t\t\tstatic_cast<CameraStream *>(buffer.stream->priv);\n>  \n>  \t\tbuffers_.push_back({ stream, buffer.buffer, nullptr,\n> -\t\t\t\t     buffer.acquire_fence, Status::Success });\n> +\t\t\t\t     buffer.acquire_fence, Status::Success,\n> +\t\t\t\t     nullptr, nullptr, nullptr, this });\n>  \t}\n>  \n>  \t/* Clone the controls associated with the camera3 request. */\n> diff --git a/src/android/camera_request.h b/src/android/camera_request.h\n> index 4d80ef32..c7fda00d 100644\n> --- a/src/android/camera_request.h\n> +++ b/src/android/camera_request.h\n> @@ -21,6 +21,7 @@\n>  #include \"camera_worker.h\"\n>  \n>  class CameraStream;\n> +class CameraBuffer;\n\nAlphabetical order please :-)\n\n>  \n>  class Camera3RequestDescriptor\n>  {\n> @@ -36,6 +37,10 @@ public:\n>  \t\tstd::unique_ptr<libcamera::FrameBuffer> frameBuffer;\n>  \t\tint fence;\n>  \t\tStatus status;\n> +\t\tlibcamera::FrameBuffer *internalBuffer;\n> +\t\tconst libcamera::FrameBuffer *srcBuffer;\n> +\t\tstd::unique_ptr<CameraBuffer> dstBuffer;\n> +\t\tCamera3RequestDescriptor *request;\n>  \t};\n>  \n>  \tCamera3RequestDescriptor(libcamera::Camera *camera,\n> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n> index 5d991fe5..282b19b0 100644\n> --- a/src/android/camera_stream.cpp\n> +++ b/src/android/camera_stream.cpp\n> @@ -146,23 +146,21 @@ int CameraStream::waitFence(int fence)\n>  \treturn -errno;\n>  }\n>  \n> -int CameraStream::process(const FrameBuffer &source,\n> -\t\t\t  Camera3RequestDescriptor::StreamBuffer &dest,\n> -\t\t\t  Camera3RequestDescriptor *request)\n> +int CameraStream::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)\n>  {\n>  \tASSERT(type_ != Type::Direct);\n>  \n>  \t/* Handle waiting on fences on the destination buffer. */\n> -\tif (dest.fence != -1) {\n> -\t\tint ret = waitFence(dest.fence);\n> +\tif (streamBuffer->fence != -1) {\n> +\t\tint ret = waitFence(streamBuffer->fence);\n>  \t\tif (ret < 0) {\n>  \t\t\tLOG(HAL, Error) << \"Failed waiting for fence: \"\n> -\t\t\t\t\t<< dest.fence << \": \" << strerror(-ret);\n> +\t\t\t\t\t<< streamBuffer->fence << \": \" << strerror(-ret);\n>  \t\t\treturn ret;\n>  \t\t}\n>  \n> -\t\t::close(dest.fence);\n> -\t\tdest.fence = -1;\n> +\t\t::close(streamBuffer->fence);\n> +\t\tstreamBuffer->fence = -1;\n>  \t}\n>  \n>  \t/*\n> @@ -170,14 +168,15 @@ int CameraStream::process(const FrameBuffer &source,\n>  \t * separate thread.\n>  \t */\n>  \tconst StreamConfiguration &output = configuration();\n> -\tCameraBuffer destBuffer(*dest.camera3Buffer, output.pixelFormat,\n> -\t\t\t\toutput.size, PROT_READ | PROT_WRITE);\n> -\tif (!destBuffer.isValid()) {\n> +\tstreamBuffer->dstBuffer = std::make_unique<CameraBuffer>(\n> +\t\t*streamBuffer->camera3Buffer, output.pixelFormat, output.size,\n> +\t\tPROT_READ | PROT_WRITE);\n> +\tif (!streamBuffer->dstBuffer->isValid()) {\n>  \t\tLOG(HAL, Error) << \"Failed to create destination buffer\";\n>  \t\treturn -EINVAL;\n>  \t}\n>  \n> -\treturn postProcessor_->process(source, &destBuffer, request);\n> +\treturn postProcessor_->process(streamBuffer);\n>  }\n>  \n>  FrameBuffer *CameraStream::getBuffer()\n> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n> index f242336e..e74a9a3b 100644\n> --- a/src/android/camera_stream.h\n> +++ b/src/android/camera_stream.h\n> @@ -121,9 +121,7 @@ public:\n>  \tlibcamera::Stream *stream() const;\n>  \n>  \tint configure();\n> -\tint process(const libcamera::FrameBuffer &source,\n> -\t\t    Camera3RequestDescriptor::StreamBuffer &dest,\n> -\t\t    Camera3RequestDescriptor *request);\n> +\tint process(Camera3RequestDescriptor::StreamBuffer *streamBuffer);\n>  \tlibcamera::FrameBuffer *getBuffer();\n>  \tvoid putBuffer(libcamera::FrameBuffer *buffer);\n>  \n> diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp\n> index 49483836..240e29f6 100644\n> --- a/src/android/jpeg/post_processor_jpeg.cpp\n> +++ b/src/android/jpeg/post_processor_jpeg.cpp\n> @@ -98,15 +98,17 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,\n>  \t}\n>  }\n>  \n> -int PostProcessorJpeg::process(const FrameBuffer &source,\n> -\t\t\t       CameraBuffer *destination,\n> -\t\t\t       Camera3RequestDescriptor *request)\n> +int PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)\n>  {\n>  \tASSERT(encoder_);\n> +\n> +\tconst FrameBuffer &source = *streamBuffer->srcBuffer;\n> +\tCameraBuffer *destination = streamBuffer->dstBuffer.get();\n> +\n>  \tASSERT(destination->numPlanes() == 1);\n>  \n> -\tconst CameraMetadata &requestMetadata = request->settings_;\n> -\tCameraMetadata *resultMetadata = request->resultMetadata_.get();\n> +\tconst CameraMetadata &requestMetadata = streamBuffer->request->settings_;\n> +\tCameraMetadata *resultMetadata = streamBuffer->request->resultMetadata_.get();\n>  \tcamera_metadata_ro_entry_t entry;\n>  \tint ret;\n>  \n> diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h\n> index 0184d77e..92385548 100644\n> --- a/src/android/jpeg/post_processor_jpeg.h\n> +++ b/src/android/jpeg/post_processor_jpeg.h\n> @@ -22,9 +22,7 @@ public:\n>  \n>  \tint configure(const libcamera::StreamConfiguration &incfg,\n>  \t\t      const libcamera::StreamConfiguration &outcfg) override;\n> -\tint process(const libcamera::FrameBuffer &source,\n> -\t\t    CameraBuffer *destination,\n> -\t\t    Camera3RequestDescriptor *request) override;\n> +\tint process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;\n>  \n>  private:\n>  \tvoid generateThumbnail(const libcamera::FrameBuffer &source,\n> diff --git a/src/android/post_processor.h b/src/android/post_processor.h\n> index 27eaef88..128161c8 100644\n> --- a/src/android/post_processor.h\n> +++ b/src/android/post_processor.h\n> @@ -11,8 +11,7 @@\n>  #include <libcamera/stream.h>\n>  \n>  #include \"camera_buffer.h\"\n> -\n> -class Camera3RequestDescriptor;\n> +#include \"camera_request.h\"\n>  \n>  class PostProcessor\n>  {\n> @@ -21,9 +20,7 @@ public:\n>  \n>  \tvirtual int configure(const libcamera::StreamConfiguration &inCfg,\n>  \t\t\t      const libcamera::StreamConfiguration &outCfg) = 0;\n> -\tvirtual int process(const libcamera::FrameBuffer &source,\n> -\t\t\t    CameraBuffer *destination,\n> -\t\t\t    Camera3RequestDescriptor *request) = 0;\n> +\tvirtual int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) = 0;\n>  };\n>  \n>  #endif /* __ANDROID_POST_PROCESSOR_H__ */\n> diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp\n> index 8110a1f1..70385ab3 100644\n> --- a/src/android/yuv/post_processor_yuv.cpp\n> +++ b/src/android/yuv/post_processor_yuv.cpp\n> @@ -49,10 +49,11 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,\n>  \treturn 0;\n>  }\n>  \n> -int PostProcessorYuv::process(const FrameBuffer &source,\n> -\t\t\t      CameraBuffer *destination,\n> -\t\t\t      [[maybe_unused]] Camera3RequestDescriptor *request)\n> +int PostProcessorYuv::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)\n>  {\n> +\tconst FrameBuffer &source = *streamBuffer->srcBuffer;\n> +\tCameraBuffer *destination = streamBuffer->dstBuffer.get();\n> +\n>  \tif (!isValidBuffers(source, *destination))\n>  \t\treturn -EINVAL;\n>  \n> diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h\n> index a4e0ff5d..5954e11b 100644\n> --- a/src/android/yuv/post_processor_yuv.h\n> +++ b/src/android/yuv/post_processor_yuv.h\n> @@ -18,9 +18,7 @@ public:\n>  \n>  \tint configure(const libcamera::StreamConfiguration &incfg,\n>  \t\t      const libcamera::StreamConfiguration &outcfg) override;\n> -\tint process(const libcamera::FrameBuffer &source,\n> -\t\t    CameraBuffer *destination,\n> -\t\t    Camera3RequestDescriptor *request) override;\n> +\tint process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;\n>  \n>  private:\n>  \tbool isValidBuffers(const libcamera::FrameBuffer &source,","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 5234CBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 25 Oct 2021 21:52:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 945EB64878;\n\tMon, 25 Oct 2021 23:52:21 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6450260125\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 25 Oct 2021 23:52:20 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C8691E0A;\n\tMon, 25 Oct 2021 23:52:19 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"lx2G2oJQ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1635198740;\n\tbh=uBHIz4PfUL0DlUoVy5y67ikJl8w7KZt9MzIRLe2eM/M=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=lx2G2oJQAzwZo8DoE2MxuM2GGnMOEgjJHk86uPAuxNQtOzA03CM+ZctLN6XVXWQ3P\n\tBAxtkIAvpAx1bLt0XHDvC9wFUMi3K8sfaYsO2tPHpchE/kLshRhH64zbbcU6hF4CSK\n\tEI0mq/VfupfF2JDevn+FEUz0p7/p4YreCVMTVSlA=","Date":"Tue, 26 Oct 2021 00:51:57 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Umang Jain <umang.jain@ideasonboard.com>","Message-ID":"<YXcm/RBrryu5UYM8@pendragon.ideasonboard.com>","References":"<20211025203833.122460-1-umang.jain@ideasonboard.com>\n\t<20211025203833.122460-5-umang.jain@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211025203833.122460-5-umang.jain@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v7 4/7] android: post_processor:\n\tConsolidate contextual information","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":20487,"web_url":"https://patchwork.libcamera.org/comment/20487/","msgid":"<163519919661.1095920.17915140015814982476@Monstersaurus>","date":"2021-10-25T21:59:56","subject":"Re: [libcamera-devel] [PATCH v7 4/7] android: post_processor:\n\tConsolidate contextual information","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart (2021-10-25 22:51:57)\n> Hi Umang,\n> \n> Thank you for the patch.\n> \n> On Tue, Oct 26, 2021 at 02:08:30AM +0530, Umang Jain wrote:\n> > Save and provide the context for post-processor of a camera stream\n> > via Camera3RequestDescriptor::StreamBuffer. We extend the structure\n> > to include source and destination buffers for the post processor, along\n> > with CameraStream::Type::Internal buffer pointer (if any). In addition\n> > to that, a back pointer to Camera3RequestDescriptor is convienient to\n> > get access to overall descriptor (status, metadata settings etc.)\n> > \n> > Also, migrate CameraStream::process() and PostProcessor::process()\n> > signature to use Camera3RequestDescriptor::StreamBuffer only. This\n> > will be helpful when we move to async post-processing in subsequent\n> > commits.\n> > \n> > Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > Reviewed-by: Hirokazu Honda <hiroh@chromium.org>\n> > ---\n> >  src/android/camera_device.cpp            | 13 ++++++++-----\n> >  src/android/camera_request.cpp           |  5 ++++-\n> >  src/android/camera_request.h             |  5 +++++\n> >  src/android/camera_stream.cpp            | 23 +++++++++++------------\n> >  src/android/camera_stream.h              |  4 +---\n> >  src/android/jpeg/post_processor_jpeg.cpp | 12 +++++++-----\n> >  src/android/jpeg/post_processor_jpeg.h   |  4 +---\n> >  src/android/post_processor.h             |  7 ++-----\n> >  src/android/yuv/post_processor_yuv.cpp   |  7 ++++---\n> >  src/android/yuv/post_processor_yuv.h     |  4 +---\n> >  10 files changed, 44 insertions(+), 40 deletions(-)\n> > \n> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > index bf9a2e69..9155728a 100644\n> > --- a/src/android/camera_device.cpp\n> > +++ b/src/android/camera_device.cpp\n> > @@ -953,6 +953,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n> >                        * once it has been processed.\n> >                        */\n> >                       frameBuffer = cameraStream->getBuffer();\n> > +                     buffer.internalBuffer = frameBuffer;\n> >                       LOG(HAL, Debug) << ss.str() << \" (internal)\";\n> >                       break;\n> >               }\n> > @@ -1133,14 +1134,16 @@ void CameraDevice::requestComplete(Request *request)\n> >                       continue;\n> >               }\n> >  \n> > -             int ret = stream->process(*src, buffer, descriptor);\n> > +             buffer.srcBuffer = src;\n> > +\n> > +             int ret = stream->process(&buffer);\n> >  \n> >               /*\n> > -              * Return the FrameBuffer to the CameraStream now that we're\n> > -              * done processing it.\n> > +              * If the framebuffer is internal to CameraStream return it back\n> > +              * now that we're done processing it.\n> >                */\n> > -             if (stream->type() == CameraStream::Type::Internal)\n> > -                     stream->putBuffer(src);\n> > +             if (buffer.internalBuffer)\n> > +                     stream->putBuffer(buffer.internalBuffer);\n> >  \n> >               if (ret) {\n> >                       buffer.status = Camera3RequestDescriptor::Status::Error;\n> > diff --git a/src/android/camera_request.cpp b/src/android/camera_request.cpp\n> > index 16cf266f..5bac1b8f 100644\n> > --- a/src/android/camera_request.cpp\n> > +++ b/src/android/camera_request.cpp\n> > @@ -9,6 +9,8 @@\n> >  \n> >  #include <libcamera/base/span.h>\n> >  \n> > +#include \"camera_buffer.h\"\n> > +\n> >  using namespace libcamera;\n> >  \n> >  /*\n> > @@ -36,7 +38,8 @@ Camera3RequestDescriptor::Camera3RequestDescriptor(\n> >                       static_cast<CameraStream *>(buffer.stream->priv);\n> >  \n> >               buffers_.push_back({ stream, buffer.buffer, nullptr,\n> > -                                  buffer.acquire_fence, Status::Success });\n> > +                                  buffer.acquire_fence, Status::Success,\n> > +                                  nullptr, nullptr, nullptr, this });\n> >       }\n> >  \n> >       /* Clone the controls associated with the camera3 request. */\n> > diff --git a/src/android/camera_request.h b/src/android/camera_request.h\n> > index 4d80ef32..c7fda00d 100644\n> > --- a/src/android/camera_request.h\n> > +++ b/src/android/camera_request.h\n> > @@ -21,6 +21,7 @@\n> >  #include \"camera_worker.h\"\n> >  \n> >  class CameraStream;\n> > +class CameraBuffer;\n> \n> Alphabetical order please :-)\n\nI can't find an option for forward declarations in clang-format ;-(\n\nI would have expected this to be something it could handle.\n\nNever mind ...\n\n--\nKieran\n\n\n> \n> >  \n> >  class Camera3RequestDescriptor\n> >  {\n> > @@ -36,6 +37,10 @@ public:\n> >               std::unique_ptr<libcamera::FrameBuffer> frameBuffer;\n> >               int fence;\n> >               Status status;\n> > +             libcamera::FrameBuffer *internalBuffer;\n> > +             const libcamera::FrameBuffer *srcBuffer;\n> > +             std::unique_ptr<CameraBuffer> dstBuffer;\n> > +             Camera3RequestDescriptor *request;\n> >       };\n> >  \n> >       Camera3RequestDescriptor(libcamera::Camera *camera,\n> > diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n> > index 5d991fe5..282b19b0 100644\n> > --- a/src/android/camera_stream.cpp\n> > +++ b/src/android/camera_stream.cpp\n> > @@ -146,23 +146,21 @@ int CameraStream::waitFence(int fence)\n> >       return -errno;\n> >  }\n> >  \n> > -int CameraStream::process(const FrameBuffer &source,\n> > -                       Camera3RequestDescriptor::StreamBuffer &dest,\n> > -                       Camera3RequestDescriptor *request)\n> > +int CameraStream::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)\n> >  {\n> >       ASSERT(type_ != Type::Direct);\n> >  \n> >       /* Handle waiting on fences on the destination buffer. */\n> > -     if (dest.fence != -1) {\n> > -             int ret = waitFence(dest.fence);\n> > +     if (streamBuffer->fence != -1) {\n> > +             int ret = waitFence(streamBuffer->fence);\n> >               if (ret < 0) {\n> >                       LOG(HAL, Error) << \"Failed waiting for fence: \"\n> > -                                     << dest.fence << \": \" << strerror(-ret);\n> > +                                     << streamBuffer->fence << \": \" << strerror(-ret);\n> >                       return ret;\n> >               }\n> >  \n> > -             ::close(dest.fence);\n> > -             dest.fence = -1;\n> > +             ::close(streamBuffer->fence);\n> > +             streamBuffer->fence = -1;\n> >       }\n> >  \n> >       /*\n> > @@ -170,14 +168,15 @@ int CameraStream::process(const FrameBuffer &source,\n> >        * separate thread.\n> >        */\n> >       const StreamConfiguration &output = configuration();\n> > -     CameraBuffer destBuffer(*dest.camera3Buffer, output.pixelFormat,\n> > -                             output.size, PROT_READ | PROT_WRITE);\n> > -     if (!destBuffer.isValid()) {\n> > +     streamBuffer->dstBuffer = std::make_unique<CameraBuffer>(\n> > +             *streamBuffer->camera3Buffer, output.pixelFormat, output.size,\n> > +             PROT_READ | PROT_WRITE);\n> > +     if (!streamBuffer->dstBuffer->isValid()) {\n> >               LOG(HAL, Error) << \"Failed to create destination buffer\";\n> >               return -EINVAL;\n> >       }\n> >  \n> > -     return postProcessor_->process(source, &destBuffer, request);\n> > +     return postProcessor_->process(streamBuffer);\n> >  }\n> >  \n> >  FrameBuffer *CameraStream::getBuffer()\n> > diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n> > index f242336e..e74a9a3b 100644\n> > --- a/src/android/camera_stream.h\n> > +++ b/src/android/camera_stream.h\n> > @@ -121,9 +121,7 @@ public:\n> >       libcamera::Stream *stream() const;\n> >  \n> >       int configure();\n> > -     int process(const libcamera::FrameBuffer &source,\n> > -                 Camera3RequestDescriptor::StreamBuffer &dest,\n> > -                 Camera3RequestDescriptor *request);\n> > +     int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer);\n> >       libcamera::FrameBuffer *getBuffer();\n> >       void putBuffer(libcamera::FrameBuffer *buffer);\n> >  \n> > diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp\n> > index 49483836..240e29f6 100644\n> > --- a/src/android/jpeg/post_processor_jpeg.cpp\n> > +++ b/src/android/jpeg/post_processor_jpeg.cpp\n> > @@ -98,15 +98,17 @@ void PostProcessorJpeg::generateThumbnail(const FrameBuffer &source,\n> >       }\n> >  }\n> >  \n> > -int PostProcessorJpeg::process(const FrameBuffer &source,\n> > -                            CameraBuffer *destination,\n> > -                            Camera3RequestDescriptor *request)\n> > +int PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)\n> >  {\n> >       ASSERT(encoder_);\n> > +\n> > +     const FrameBuffer &source = *streamBuffer->srcBuffer;\n> > +     CameraBuffer *destination = streamBuffer->dstBuffer.get();\n> > +\n> >       ASSERT(destination->numPlanes() == 1);\n> >  \n> > -     const CameraMetadata &requestMetadata = request->settings_;\n> > -     CameraMetadata *resultMetadata = request->resultMetadata_.get();\n> > +     const CameraMetadata &requestMetadata = streamBuffer->request->settings_;\n> > +     CameraMetadata *resultMetadata = streamBuffer->request->resultMetadata_.get();\n> >       camera_metadata_ro_entry_t entry;\n> >       int ret;\n> >  \n> > diff --git a/src/android/jpeg/post_processor_jpeg.h b/src/android/jpeg/post_processor_jpeg.h\n> > index 0184d77e..92385548 100644\n> > --- a/src/android/jpeg/post_processor_jpeg.h\n> > +++ b/src/android/jpeg/post_processor_jpeg.h\n> > @@ -22,9 +22,7 @@ public:\n> >  \n> >       int configure(const libcamera::StreamConfiguration &incfg,\n> >                     const libcamera::StreamConfiguration &outcfg) override;\n> > -     int process(const libcamera::FrameBuffer &source,\n> > -                 CameraBuffer *destination,\n> > -                 Camera3RequestDescriptor *request) override;\n> > +     int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;\n> >  \n> >  private:\n> >       void generateThumbnail(const libcamera::FrameBuffer &source,\n> > diff --git a/src/android/post_processor.h b/src/android/post_processor.h\n> > index 27eaef88..128161c8 100644\n> > --- a/src/android/post_processor.h\n> > +++ b/src/android/post_processor.h\n> > @@ -11,8 +11,7 @@\n> >  #include <libcamera/stream.h>\n> >  \n> >  #include \"camera_buffer.h\"\n> > -\n> > -class Camera3RequestDescriptor;\n> > +#include \"camera_request.h\"\n> >  \n> >  class PostProcessor\n> >  {\n> > @@ -21,9 +20,7 @@ public:\n> >  \n> >       virtual int configure(const libcamera::StreamConfiguration &inCfg,\n> >                             const libcamera::StreamConfiguration &outCfg) = 0;\n> > -     virtual int process(const libcamera::FrameBuffer &source,\n> > -                         CameraBuffer *destination,\n> > -                         Camera3RequestDescriptor *request) = 0;\n> > +     virtual int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) = 0;\n> >  };\n> >  \n> >  #endif /* __ANDROID_POST_PROCESSOR_H__ */\n> > diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp\n> > index 8110a1f1..70385ab3 100644\n> > --- a/src/android/yuv/post_processor_yuv.cpp\n> > +++ b/src/android/yuv/post_processor_yuv.cpp\n> > @@ -49,10 +49,11 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,\n> >       return 0;\n> >  }\n> >  \n> > -int PostProcessorYuv::process(const FrameBuffer &source,\n> > -                           CameraBuffer *destination,\n> > -                           [[maybe_unused]] Camera3RequestDescriptor *request)\n> > +int PostProcessorYuv::process(Camera3RequestDescriptor::StreamBuffer *streamBuffer)\n> >  {\n> > +     const FrameBuffer &source = *streamBuffer->srcBuffer;\n> > +     CameraBuffer *destination = streamBuffer->dstBuffer.get();\n> > +\n> >       if (!isValidBuffers(source, *destination))\n> >               return -EINVAL;\n> >  \n> > diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h\n> > index a4e0ff5d..5954e11b 100644\n> > --- a/src/android/yuv/post_processor_yuv.h\n> > +++ b/src/android/yuv/post_processor_yuv.h\n> > @@ -18,9 +18,7 @@ public:\n> >  \n> >       int configure(const libcamera::StreamConfiguration &incfg,\n> >                     const libcamera::StreamConfiguration &outcfg) override;\n> > -     int process(const libcamera::FrameBuffer &source,\n> > -                 CameraBuffer *destination,\n> > -                 Camera3RequestDescriptor *request) override;\n> > +     int process(Camera3RequestDescriptor::StreamBuffer *streamBuffer) override;\n> >  \n> >  private:\n> >       bool isValidBuffers(const libcamera::FrameBuffer &source,\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 7A796BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 25 Oct 2021 22:00:01 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2DEEB64878;\n\tTue, 26 Oct 2021 00:00:01 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 85ADC60125\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 25 Oct 2021 23:59:59 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 3AE68E0A;\n\tMon, 25 Oct 2021 23:59:59 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"IP9l2upM\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1635199199;\n\tbh=KLKYPeRQb0F7jLGIO2dqfWDH8L7cByYiPp2/0GiNOaA=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=IP9l2upM5mrEZJWTWwjM0exZbZ72DM9j+o58na3cqsO7icncFqDvLY/Ls8VUXgg/K\n\troQLHQV2vbQB994HrxLdWc5bS+/ZgA7DH8l9v8ttzUaECJzeJEFMaFJMC6PgSGo7EA\n\tdNcne9lZH/dbaAhJP8OuaZVNPH2+F0Ifs8hxYqv4=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<YXcm/RBrryu5UYM8@pendragon.ideasonboard.com>","References":"<20211025203833.122460-1-umang.jain@ideasonboard.com>\n\t<20211025203833.122460-5-umang.jain@ideasonboard.com>\n\t<YXcm/RBrryu5UYM8@pendragon.ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tUmang Jain <umang.jain@ideasonboard.com>","Date":"Mon, 25 Oct 2021 22:59:56 +0100","Message-ID":"<163519919661.1095920.17915140015814982476@Monstersaurus>","User-Agent":"alot/0.9.1","Subject":"Re: [libcamera-devel] [PATCH v7 4/7] android: post_processor:\n\tConsolidate contextual information","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]