[{"id":26014,"web_url":"https://patchwork.libcamera.org/comment/26014/","msgid":"<Y5Ac4mb1cHwK6dhN@pendragon.ideasonboard.com>","date":"2022-12-07T04:56:02","subject":"Re: [libcamera-devel] [PATCH v7 5/6] Pass StreamBuffer to\n\tEncoder::encoder","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Harvey,\n\nThank you for the patch.\n\nOn Thu, Dec 01, 2022 at 09:27:32AM +0000, Harvey Yang via libcamera-devel wrote:\n> From: Harvey Yang <chenghaoyang@chromium.org>\n> \n> To prepare for the JEA encoder in the following patches, StreamBuffer is\n> passed to Encoder::encoder, which contains the original FrameBuffer and\n> Span |destination|.\n> \n> Signed-off-by: Harvey Yang <chenghaoyang@chromium.org>\n> ---\n>  src/android/jpeg/encoder.h               |  5 +++--\n>  src/android/jpeg/encoder_libjpeg.cpp     | 11 +++++++++++\n>  src/android/jpeg/encoder_libjpeg.h       |  7 +++++--\n>  src/android/jpeg/post_processor_jpeg.cpp |  3 +--\n>  4 files changed, 20 insertions(+), 6 deletions(-)\n> \n> diff --git a/src/android/jpeg/encoder.h b/src/android/jpeg/encoder.h\n> index 7dc1ee27..eeff87b1 100644\n> --- a/src/android/jpeg/encoder.h\n> +++ b/src/android/jpeg/encoder.h\n> @@ -12,14 +12,15 @@\n>  #include <libcamera/framebuffer.h>\n>  #include <libcamera/stream.h>\n>  \n> +#include \"../camera_request.h\"\n> +\n>  class Encoder\n>  {\n>  public:\n>  \tvirtual ~Encoder() = default;\n>  \n>  \tvirtual int configure(const libcamera::StreamConfiguration &cfg) = 0;\n> -\tvirtual int encode(const libcamera::FrameBuffer &source,\n> -\t\t\t   libcamera::Span<uint8_t> destination,\n> +\tvirtual int encode(Camera3RequestDescriptor::StreamBuffer *streamBuffer,\n>  \t\t\t   libcamera::Span<const uint8_t> exifData,\n>  \t\t\t   unsigned int quality) = 0;\n>  \tvirtual int generateThumbnail(\n> diff --git a/src/android/jpeg/encoder_libjpeg.cpp b/src/android/jpeg/encoder_libjpeg.cpp\n> index cc37fde3..d8d72fbd 100644\n> --- a/src/android/jpeg/encoder_libjpeg.cpp\n> +++ b/src/android/jpeg/encoder_libjpeg.cpp\n> @@ -24,6 +24,8 @@\n>  #include \"libcamera/internal/formats.h\"\n>  #include \"libcamera/internal/mapped_framebuffer.h\"\n>  \n> +#include \"../camera_buffer.h\"\n> +\n>  using namespace libcamera;\n>  \n>  LOG_DECLARE_CATEGORY(JPEG)\n> @@ -192,6 +194,15 @@ void EncoderLibJpeg::compressNV(const std::vector<Span<uint8_t>> &planes)\n>  \t}\n>  }\n>  \n> +int EncoderLibJpeg::encode(Camera3RequestDescriptor::StreamBuffer *streamBuffer,\n> +\t\t\t   libcamera::Span<const uint8_t> exifData,\n> +\t\t\t   unsigned int quality)\n> +{\n> +\treturn encode(*streamBuffer->srcBuffer,\n> +\t\t      streamBuffer->dstBuffer.get()->plane(0), exifData,\n> +\t\t      quality);\n> +}\n\nDo you need to create a wrapper around the encode() function that takes a\nFrameBuffer, or could you merge the two together ? It seems to be called\nfrom here only. The following diff compiles:\n\ndiff --git a/src/android/jpeg/encoder_libjpeg.cpp b/src/android/jpeg/encoder_libjpeg.cpp\nindex d8d72fbdd6b8..6d7a3cbf586d 100644\n--- a/src/android/jpeg/encoder_libjpeg.cpp\n+++ b/src/android/jpeg/encoder_libjpeg.cpp\n@@ -198,9 +198,19 @@ int EncoderLibJpeg::encode(Camera3RequestDescriptor::StreamBuffer *streamBuffer,\n \t\t\t   libcamera::Span<const uint8_t> exifData,\n \t\t\t   unsigned int quality)\n {\n-\treturn encode(*streamBuffer->srcBuffer,\n-\t\t      streamBuffer->dstBuffer.get()->plane(0), exifData,\n-\t\t      quality);\n+\tconst FrameBuffer &source = *streamBuffer->srcBuffer;\n+\tSpan<uint8_t> dest = streamBuffer->dstBuffer.get()->plane(0);\n+\n+\tcompress_ = &image_data_.compress;\n+\n+\tMappedFrameBuffer frame(&source, MappedFrameBuffer::MapFlag::Read);\n+\tif (!frame.isValid()) {\n+\t\tLOG(JPEG, Error) << \"Failed to map FrameBuffer : \"\n+\t\t\t\t << strerror(frame.error());\n+\t\treturn frame.error();\n+\t}\n+\n+\treturn encode(frame.planes(), dest, exifData, quality);\n }\n \n int EncoderLibJpeg::generateThumbnail(const libcamera::FrameBuffer &source,\n@@ -255,21 +265,6 @@ int EncoderLibJpeg::generateThumbnail(const libcamera::FrameBuffer &source,\n \treturn -1;\n }\n \n-int EncoderLibJpeg::encode(const FrameBuffer &source, Span<uint8_t> dest,\n-\t\t\t   Span<const uint8_t> exifData, unsigned int quality)\n-{\n-\tcompress_ = &image_data_.compress;\n-\n-\tMappedFrameBuffer frame(&source, MappedFrameBuffer::MapFlag::Read);\n-\tif (!frame.isValid()) {\n-\t\tLOG(JPEG, Error) << \"Failed to map FrameBuffer : \"\n-\t\t\t\t << strerror(frame.error());\n-\t\treturn frame.error();\n-\t}\n-\n-\treturn encode(frame.planes(), dest, exifData, quality);\n-}\n-\n int EncoderLibJpeg::encode(const std::vector<Span<uint8_t>> &src,\n \t\t\t   Span<uint8_t> dest, Span<const uint8_t> exifData,\n \t\t\t   unsigned int quality)\ndiff --git a/src/android/jpeg/encoder_libjpeg.h b/src/android/jpeg/encoder_libjpeg.h\nindex 6e9b65d4fc94..5928837367dc 100644\n--- a/src/android/jpeg/encoder_libjpeg.h\n+++ b/src/android/jpeg/encoder_libjpeg.h\n@@ -43,10 +43,6 @@ private:\n \t\t\t     libcamera::PixelFormat pixelFormat,\n \t\t\t     libcamera::Size size);\n \n-\tint encode(const libcamera::FrameBuffer &source,\n-\t\t   libcamera::Span<uint8_t> destination,\n-\t\t   libcamera::Span<const uint8_t> exifData,\n-\t\t   unsigned int quality);\n \tint encode(const std::vector<libcamera::Span<uint8_t>> &planes,\n \t\t   libcamera::Span<uint8_t> destination,\n \t\t   libcamera::Span<const uint8_t> exifData,\n\n\nWith that addressed,\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\n>  int EncoderLibJpeg::generateThumbnail(const libcamera::FrameBuffer &source,\n>  \t\t\t\t      const libcamera::Size &targetSize,\n>  \t\t\t\t      unsigned int quality,\n> diff --git a/src/android/jpeg/encoder_libjpeg.h b/src/android/jpeg/encoder_libjpeg.h\n> index 1ec2ba13..6e9b65d4 100644\n> --- a/src/android/jpeg/encoder_libjpeg.h\n> +++ b/src/android/jpeg/encoder_libjpeg.h\n> @@ -24,8 +24,7 @@ public:\n>  \t~EncoderLibJpeg();\n>  \n>  \tint configure(const libcamera::StreamConfiguration &cfg) override;\n> -\tint encode(const libcamera::FrameBuffer &source,\n> -\t\t   libcamera::Span<uint8_t> destination,\n> +\tint encode(Camera3RequestDescriptor::StreamBuffer *streamBuffer,\n>  \t\t   libcamera::Span<const uint8_t> exifData,\n>  \t\t   unsigned int quality) override;\n>  \tint generateThumbnail(\n> @@ -44,6 +43,10 @@ private:\n>  \t\t\t     libcamera::PixelFormat pixelFormat,\n>  \t\t\t     libcamera::Size size);\n>  \n> +\tint encode(const libcamera::FrameBuffer &source,\n> +\t\t   libcamera::Span<uint8_t> destination,\n> +\t\t   libcamera::Span<const uint8_t> exifData,\n> +\t\t   unsigned int quality);\n>  \tint encode(const std::vector<libcamera::Span<uint8_t>> &planes,\n>  \t\t   libcamera::Span<uint8_t> destination,\n>  \t\t   libcamera::Span<const uint8_t> exifData,\n> diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp\n> index 60eebb11..10ac4666 100644\n> --- a/src/android/jpeg/post_processor_jpeg.cpp\n> +++ b/src/android/jpeg/post_processor_jpeg.cpp\n> @@ -146,8 +146,7 @@ void PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBu\n>  \tconst uint8_t quality = ret ? *entry.data.u8 : 95;\n>  \tresultMetadata->addEntry(ANDROID_JPEG_QUALITY, quality);\n>  \n> -\tint jpeg_size = encoder_->encode(source, destination->plane(0),\n> -\t\t\t\t\t exif.data(), quality);\n> +\tint jpeg_size = encoder_->encode(streamBuffer, exif.data(), quality);\n>  \tif (jpeg_size < 0) {\n>  \t\tLOG(JPEG, Error) << \"Failed to encode stream image\";\n>  \t\tprocessComplete.emit(streamBuffer, PostProcessor::Status::Error);","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 0CAD7BDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  7 Dec 2022 04:56:07 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 77BE66333F;\n\tWed,  7 Dec 2022 05:56:06 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 559CE61F1C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  7 Dec 2022 05:56:05 +0100 (CET)","from pendragon.ideasonboard.com (213-243-189-158.bb.dnainternet.fi\n\t[213.243.189.158])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A49F03D7;\n\tWed,  7 Dec 2022 05:56:04 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1670388966;\n\tbh=j7peTLUmiLQvFJuL72Axp3uyEm8YP6x/NqWSAIaf0BU=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=snk6Dj5DozY6O2l+iu4xwmWokjbNKxeHMzyCINRHwxrnEzMmTkbJPM5qiXJORZGnr\n\t3nHRE9iY2icYP+sgQWgbz+7h8ER2lqw9JFqOFdj1DYY6byTLDo2oVXTYE2JWg08gYg\n\tHHU/A3gtX4x2HmW4/1jjqn6h+taQ4SQzhUCaVVsdgGz85/huS/L0S0ILwtuRceYi8g\n\tY7b4YBsq+kS/ghSaFsdsme6F05shnd5VvwjNpjfdnzU5KjUwvvr15AQYMcFGCtjOSp\n\tbrven97I0wM761iaoiMtwaHZGIXPbM3jPk0p4BRCoOwOFrei2IolK/wpGySEnZwQk/\n\tSqmn/yzHJ2NCQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1670388964;\n\tbh=j7peTLUmiLQvFJuL72Axp3uyEm8YP6x/NqWSAIaf0BU=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=BEhvOOVl5D19HzxsN6iE6D75i5gz0vmjZMTdX/sTpfGhZ/rOfy7WFmjTeUKhS9t7b\n\tF/hlBqnKm5rUTJFk4X7myXXeN4lJVt+eA+ochlZ/5MDY3URRkbpDM4y1XWP20ZwXP/\n\t/Oi2G53AjmmFBmximzVEBcGkxqsbA1xGKfrl6/GY="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"BEhvOOVl\"; dkim-atps=neutral","Date":"Wed, 7 Dec 2022 06:56:02 +0200","To":"Harvey Yang <chenghaoyang@chromium.org>","Message-ID":"<Y5Ac4mb1cHwK6dhN@pendragon.ideasonboard.com>","References":"<20221201092733.2042078-1-chenghaoyang@google.com>\n\t<20221201092733.2042078-6-chenghaoyang@google.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20221201092733.2042078-6-chenghaoyang@google.com>","Subject":"Re: [libcamera-devel] [PATCH v7 5/6] Pass StreamBuffer to\n\tEncoder::encoder","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>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":26068,"web_url":"https://patchwork.libcamera.org/comment/26068/","msgid":"<CAEB1ahvxGpA3esfqPuRN9bB3UnGQSvPPNqAknF2HW6iAffPszg@mail.gmail.com>","date":"2022-12-14T09:35:48","subject":"Re: [libcamera-devel] [PATCH v7 5/6] Pass StreamBuffer to\n\tEncoder::encoder","submitter":{"id":117,"url":"https://patchwork.libcamera.org/api/people/117/","name":"Cheng-Hao Yang","email":"chenghaoyang@chromium.org"},"content":"Thanks Laurent!\n\nAdopted.\n\nOn Wed, Dec 7, 2022 at 12:56 PM Laurent Pinchart <\nlaurent.pinchart@ideasonboard.com> wrote:\n\n> Hi Harvey,\n>\n> Thank you for the patch.\n>\n> On Thu, Dec 01, 2022 at 09:27:32AM +0000, Harvey Yang via libcamera-devel\n> wrote:\n> > From: Harvey Yang <chenghaoyang@chromium.org>\n> >\n> > To prepare for the JEA encoder in the following patches, StreamBuffer is\n> > passed to Encoder::encoder, which contains the original FrameBuffer and\n> > Span |destination|.\n> >\n> > Signed-off-by: Harvey Yang <chenghaoyang@chromium.org>\n> > ---\n> >  src/android/jpeg/encoder.h               |  5 +++--\n> >  src/android/jpeg/encoder_libjpeg.cpp     | 11 +++++++++++\n> >  src/android/jpeg/encoder_libjpeg.h       |  7 +++++--\n> >  src/android/jpeg/post_processor_jpeg.cpp |  3 +--\n> >  4 files changed, 20 insertions(+), 6 deletions(-)\n> >\n> > diff --git a/src/android/jpeg/encoder.h b/src/android/jpeg/encoder.h\n> > index 7dc1ee27..eeff87b1 100644\n> > --- a/src/android/jpeg/encoder.h\n> > +++ b/src/android/jpeg/encoder.h\n> > @@ -12,14 +12,15 @@\n> >  #include <libcamera/framebuffer.h>\n> >  #include <libcamera/stream.h>\n> >\n> > +#include \"../camera_request.h\"\n> > +\n> >  class Encoder\n> >  {\n> >  public:\n> >       virtual ~Encoder() = default;\n> >\n> >       virtual int configure(const libcamera::StreamConfiguration &cfg) =\n> 0;\n> > -     virtual int encode(const libcamera::FrameBuffer &source,\n> > -                        libcamera::Span<uint8_t> destination,\n> > +     virtual int encode(Camera3RequestDescriptor::StreamBuffer\n> *streamBuffer,\n> >                          libcamera::Span<const uint8_t> exifData,\n> >                          unsigned int quality) = 0;\n> >       virtual int generateThumbnail(\n> > diff --git a/src/android/jpeg/encoder_libjpeg.cpp\n> b/src/android/jpeg/encoder_libjpeg.cpp\n> > index cc37fde3..d8d72fbd 100644\n> > --- a/src/android/jpeg/encoder_libjpeg.cpp\n> > +++ b/src/android/jpeg/encoder_libjpeg.cpp\n> > @@ -24,6 +24,8 @@\n> >  #include \"libcamera/internal/formats.h\"\n> >  #include \"libcamera/internal/mapped_framebuffer.h\"\n> >\n> > +#include \"../camera_buffer.h\"\n> > +\n> >  using namespace libcamera;\n> >\n> >  LOG_DECLARE_CATEGORY(JPEG)\n> > @@ -192,6 +194,15 @@ void EncoderLibJpeg::compressNV(const\n> std::vector<Span<uint8_t>> &planes)\n> >       }\n> >  }\n> >\n> > +int EncoderLibJpeg::encode(Camera3RequestDescriptor::StreamBuffer\n> *streamBuffer,\n> > +                        libcamera::Span<const uint8_t> exifData,\n> > +                        unsigned int quality)\n> > +{\n> > +     return encode(*streamBuffer->srcBuffer,\n> > +                   streamBuffer->dstBuffer.get()->plane(0), exifData,\n> > +                   quality);\n> > +}\n>\n> Do you need to create a wrapper around the encode() function that takes a\n> FrameBuffer, or could you merge the two together ? It seems to be called\n> from here only. The following diff compiles:\n>\n> diff --git a/src/android/jpeg/encoder_libjpeg.cpp\n> b/src/android/jpeg/encoder_libjpeg.cpp\n> index d8d72fbdd6b8..6d7a3cbf586d 100644\n> --- a/src/android/jpeg/encoder_libjpeg.cpp\n> +++ b/src/android/jpeg/encoder_libjpeg.cpp\n> @@ -198,9 +198,19 @@ int\n> EncoderLibJpeg::encode(Camera3RequestDescriptor::StreamBuffer *streamBuffer,\n>                            libcamera::Span<const uint8_t> exifData,\n>                            unsigned int quality)\n>  {\n> -       return encode(*streamBuffer->srcBuffer,\n> -                     streamBuffer->dstBuffer.get()->plane(0), exifData,\n> -                     quality);\n> +       const FrameBuffer &source = *streamBuffer->srcBuffer;\n> +       Span<uint8_t> dest = streamBuffer->dstBuffer.get()->plane(0);\n> +\n> +       compress_ = &image_data_.compress;\n> +\n> +       MappedFrameBuffer frame(&source, MappedFrameBuffer::MapFlag::Read);\n> +       if (!frame.isValid()) {\n> +               LOG(JPEG, Error) << \"Failed to map FrameBuffer : \"\n> +                                << strerror(frame.error());\n> +               return frame.error();\n> +       }\n> +\n> +       return encode(frame.planes(), dest, exifData, quality);\n>  }\n>\n>  int EncoderLibJpeg::generateThumbnail(const libcamera::FrameBuffer\n> &source,\n> @@ -255,21 +265,6 @@ int EncoderLibJpeg::generateThumbnail(const\n> libcamera::FrameBuffer &source,\n>         return -1;\n>  }\n>\n> -int EncoderLibJpeg::encode(const FrameBuffer &source, Span<uint8_t> dest,\n> -                          Span<const uint8_t> exifData, unsigned int\n> quality)\n> -{\n> -       compress_ = &image_data_.compress;\n> -\n> -       MappedFrameBuffer frame(&source, MappedFrameBuffer::MapFlag::Read);\n> -       if (!frame.isValid()) {\n> -               LOG(JPEG, Error) << \"Failed to map FrameBuffer : \"\n> -                                << strerror(frame.error());\n> -               return frame.error();\n> -       }\n> -\n> -       return encode(frame.planes(), dest, exifData, quality);\n> -}\n> -\n>  int EncoderLibJpeg::encode(const std::vector<Span<uint8_t>> &src,\n>                            Span<uint8_t> dest, Span<const uint8_t>\n> exifData,\n>                            unsigned int quality)\n> diff --git a/src/android/jpeg/encoder_libjpeg.h\n> b/src/android/jpeg/encoder_libjpeg.h\n> index 6e9b65d4fc94..5928837367dc 100644\n> --- a/src/android/jpeg/encoder_libjpeg.h\n> +++ b/src/android/jpeg/encoder_libjpeg.h\n> @@ -43,10 +43,6 @@ private:\n>                              libcamera::PixelFormat pixelFormat,\n>                              libcamera::Size size);\n>\n> -       int encode(const libcamera::FrameBuffer &source,\n> -                  libcamera::Span<uint8_t> destination,\n> -                  libcamera::Span<const uint8_t> exifData,\n> -                  unsigned int quality);\n>         int encode(const std::vector<libcamera::Span<uint8_t>> &planes,\n>                    libcamera::Span<uint8_t> destination,\n>                    libcamera::Span<const uint8_t> exifData,\n>\n>\n> With that addressed,\n>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>\n> > +\n> >  int EncoderLibJpeg::generateThumbnail(const libcamera::FrameBuffer\n> &source,\n> >                                     const libcamera::Size &targetSize,\n> >                                     unsigned int quality,\n> > diff --git a/src/android/jpeg/encoder_libjpeg.h\n> b/src/android/jpeg/encoder_libjpeg.h\n> > index 1ec2ba13..6e9b65d4 100644\n> > --- a/src/android/jpeg/encoder_libjpeg.h\n> > +++ b/src/android/jpeg/encoder_libjpeg.h\n> > @@ -24,8 +24,7 @@ public:\n> >       ~EncoderLibJpeg();\n> >\n> >       int configure(const libcamera::StreamConfiguration &cfg) override;\n> > -     int encode(const libcamera::FrameBuffer &source,\n> > -                libcamera::Span<uint8_t> destination,\n> > +     int encode(Camera3RequestDescriptor::StreamBuffer *streamBuffer,\n> >                  libcamera::Span<const uint8_t> exifData,\n> >                  unsigned int quality) override;\n> >       int generateThumbnail(\n> > @@ -44,6 +43,10 @@ private:\n> >                            libcamera::PixelFormat pixelFormat,\n> >                            libcamera::Size size);\n> >\n> > +     int encode(const libcamera::FrameBuffer &source,\n> > +                libcamera::Span<uint8_t> destination,\n> > +                libcamera::Span<const uint8_t> exifData,\n> > +                unsigned int quality);\n> >       int encode(const std::vector<libcamera::Span<uint8_t>> &planes,\n> >                  libcamera::Span<uint8_t> destination,\n> >                  libcamera::Span<const uint8_t> exifData,\n> > diff --git a/src/android/jpeg/post_processor_jpeg.cpp\n> b/src/android/jpeg/post_processor_jpeg.cpp\n> > index 60eebb11..10ac4666 100644\n> > --- a/src/android/jpeg/post_processor_jpeg.cpp\n> > +++ b/src/android/jpeg/post_processor_jpeg.cpp\n> > @@ -146,8 +146,7 @@ void\n> PostProcessorJpeg::process(Camera3RequestDescriptor::StreamBuffer *streamBu\n> >       const uint8_t quality = ret ? *entry.data.u8 : 95;\n> >       resultMetadata->addEntry(ANDROID_JPEG_QUALITY, quality);\n> >\n> > -     int jpeg_size = encoder_->encode(source, destination->plane(0),\n> > -                                      exif.data(), quality);\n> > +     int jpeg_size = encoder_->encode(streamBuffer, exif.data(),\n> quality);\n> >       if (jpeg_size < 0) {\n> >               LOG(JPEG, Error) << \"Failed to encode stream image\";\n> >               processComplete.emit(streamBuffer,\n> PostProcessor::Status::Error);\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","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 3B4CBC31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 14 Dec 2022 09:36:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DCDF063354;\n\tWed, 14 Dec 2022 10:36:01 +0100 (CET)","from mail-ua1-x935.google.com (mail-ua1-x935.google.com\n\t[IPv6:2607:f8b0:4864:20::935])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BB83E603D0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 14 Dec 2022 10:35:59 +0100 (CET)","by mail-ua1-x935.google.com with SMTP id v4so4755023ual.11\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 14 Dec 2022 01:35:59 -0800 (PST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1671010561;\n\tbh=eKRwbZx2klMj59blkXTqbp4jCJNxOR1HaEeDqUn+2Qc=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=ThEp+H+A3cdD8BXk6avjssWWrpYQF2fRb+2hBFlOkXwox6UW8RicB+ATdXrPSe9w3\n\tLc9m+go6JBvvhKtd1epyYSg6UyoevBFBay3E+HmvyaB6ArDLXAN0Tk9AxkldvdpUZq\n\t49DJ8Gvs0WYliVFM5oxW8r+Q2lCFDTVTaqWkeizwUDe7eehzIP/yBwMnJhWRV6Sf1j\n\tLYaMv0mOIOtS0rmpDBuWDMCezKQjUa9bpsZTScz3mK0es+m8rwoKsNPsGcDMjd79Qy\n\t4cnP2vXjYYxGvUxoUVFCGmsdR2F4+0q+O4TApS4gVoN+YNYTTSjiATxzw47vIFVvnS\n\t/+1CD8Xlj90xg==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=VhFxvKgiaBlWB/iINFLXYxHo/jplwDJ9K8wSmSV7ckQ=;\n\tb=id6iDJCKy5ws4Dse796wd9ar+DF+DbGKcVr+0uIr3tIKOMEy8elJWmGtNBPwm2S+kW\n\tCV48ih5vSrvZt5gq0KBiD6ZorUqeIIlwj4ZA0zvl+rToVyiZCaJAuuoGAZeWHshdo4/x\n\t+lIa85B7CDCShiM34OAxWCFG006LFDhObhmlQ="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=chromium.org\n\theader.i=@chromium.org header.b=\"id6iDJCK\"; \n\tdkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=VhFxvKgiaBlWB/iINFLXYxHo/jplwDJ9K8wSmSV7ckQ=;\n\tb=Amt/NuZkXP8fJuf1XW2jaaoFQ2d+yZmeUJN/gT0LLXM46nhqozl+F/bgECRD9UI26D\n\tiVwayVNDdAPLvpFfQsODfBn9FxeX4cWmYDoBX+uUedS65VwXD9WhLRFVC2oXH7qb/LuS\n\t8f0WvhqYSKh8pV9B1zk8q5jP9TVSJwRLE2vZHUnkSdW6HyO+mtfxD4FEjNuBK/nyKBHn\n\tM+wmPOcg9fq5K+XAX1PWQXCfmU3Q9py29Kdn282Xe1PncQsckClxXZGrPrTY1SOCLW9I\n\t5or2i5TuqC6yOfrRxUqkoHiiDgEXkccTNJv5b2FSlVvkvK3suQFsw2FPddBqZCB7Z4U8\n\tIFHQ==","X-Gm-Message-State":"ANoB5plbj17gBN/MASlYCUSv7ug9bElEiwjmPXqwi4GCx42za+8+ANdE\n\tlgLTr1JlNrwIPynL9HJr7Cm1HFamLYGUG8+N0dv+Kw==","X-Google-Smtp-Source":"AA0mqf6HddwEssaiOGX8NQyI+ATvaAUsMMjg7bxOEyA4OqkWrVfMG8CXi/QECsTtDOOV3Jv3J25HN21uA/FxueJnfDs=","X-Received":"by 2002:a05:6130:a8:b0:419:aad1:6d31 with SMTP id\n\tx40-20020a05613000a800b00419aad16d31mr15137838uaf.99.1671010558703;\n\tWed, 14 Dec 2022 01:35:58 -0800 (PST)","MIME-Version":"1.0","References":"<20221201092733.2042078-1-chenghaoyang@google.com>\n\t<20221201092733.2042078-6-chenghaoyang@google.com>\n\t<Y5Ac4mb1cHwK6dhN@pendragon.ideasonboard.com>","In-Reply-To":"<Y5Ac4mb1cHwK6dhN@pendragon.ideasonboard.com>","Date":"Wed, 14 Dec 2022 17:35:48 +0800","Message-ID":"<CAEB1ahvxGpA3esfqPuRN9bB3UnGQSvPPNqAknF2HW6iAffPszg@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"000000000000c48e9205efc6766a\"","Subject":"Re: [libcamera-devel] [PATCH v7 5/6] Pass StreamBuffer to\n\tEncoder::encoder","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>","From":"Cheng-Hao Yang via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Cheng-Hao Yang <chenghaoyang@chromium.org>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]