[{"id":27419,"web_url":"https://patchwork.libcamera.org/comment/27419/","msgid":"<20230624000858.GE1669@pendragon.ideasonboard.com>","date":"2023-06-24T00:08:58","subject":"Re: [libcamera-devel] [PATCH] ipa: rpi: imx296: Enable embedded data","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Naush,\n\nThank you for the patch.\n\nOn Wed, Jun 21, 2023 at 01:37:12PM +0100, Naushir Patuck via libcamera-devel wrote:\n> Enable embedded data parising for the imx296 sensor.\n\ns/parising/parsing/\n\n> However, the imx296 has a quirk where the embedded data is ahead by a\n> single frame, i.e. embedded data in frame N corresponds to the image\n> data in frame N+1. So make a copy of the embedded data buffer stored in\n> the camera helper state, and use that copy in the next frame.\n\nWe wouldn't make a copy if this was image data, but would instead keep\nthe buffer until the next frame. Would it make sense to do that even if\nthe amount of data is smaller ?\n\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>  src/ipa/rpi/cam_helper/cam_helper_imx296.cpp | 61 +++++++++++++++++++-\n>  1 file changed, 60 insertions(+), 1 deletion(-)\n> \n> diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp\n> index ecb845e76e12..8f06981b500e 100644\n> --- a/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp\n> +++ b/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp\n> @@ -7,6 +7,7 @@\n>  \n>  #include <algorithm>\n>  #include <cmath>\n> +#include <string.h>\n>  #include <stddef.h>\n>  \n>  #include \"cam_helper.h\"\n> @@ -15,6 +16,17 @@ using namespace RPiController;\n>  using libcamera::utils::Duration;\n>  using namespace std::literals::chrono_literals;\n>  \n> +constexpr uint32_t gainReg = 0x41ba;\n> +constexpr uint32_t shsLoReg = 0x41b4;\n> +constexpr uint32_t shsMidReg = 0x41b5;\n> +constexpr uint32_t shsHiReg = 0x41b6;\n> +constexpr uint32_t vmaxLoReg = 0x41cc;\n> +constexpr uint32_t vmaxMidReg = 0x41cd;\n> +constexpr uint32_t vmaxHiReg = 0x41ce;\n> +constexpr uint32_t tempReg = 0x41da;\n> +constexpr std::initializer_list<uint32_t> registerList =\n> +\t{ gainReg, shsLoReg, shsMidReg, shsHiReg, vmaxLoReg, vmaxMidReg, vmaxHiReg, tempReg };\n> +\n>  class CamHelperImx296 : public CamHelper\n>  {\n>  public:\n> @@ -23,8 +35,12 @@ public:\n>  \tdouble gain(uint32_t gainCode) const override;\n>  \tuint32_t exposureLines(const Duration exposure, const Duration lineLength) const override;\n>  \tDuration exposure(uint32_t exposureLines, const Duration lineLength) const override;\n> +\tvoid prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata) override;\n>  \tvoid getDelays(int &exposureDelay, int &gainDelay,\n>  \t\t       int &vblankDelay, int &hblankDelay) const override;\n> +\tbool sensorEmbeddedDataPresent() const override;\n> +\tvoid populateMetadata(const MdParser::RegisterMap &registers,\n> +\t\t\t      Metadata &metadata) const override;\n>  \n>  private:\n>  \tstatic constexpr uint32_t minExposureLines = 1;\n> @@ -36,10 +52,13 @@ private:\n>  \t * in units of lines.\n>  \t */\n>  \tstatic constexpr int frameIntegrationDiff = 4;\n> +\n> +\tstd::unique_ptr<uint8_t[]> lastEmbeddedBuffer_;\n> +\tlibcamera::Span<uint8_t> embeddedBufferSpan_;\n>  };\n>  \n>  CamHelperImx296::CamHelperImx296()\n> -\t: CamHelper(nullptr, frameIntegrationDiff)\n> +\t: CamHelper(std::make_unique<MdParserSmia>(registerList), frameIntegrationDiff)\n>  {\n>  }\n>  \n> @@ -66,6 +85,24 @@ Duration CamHelperImx296::exposure(uint32_t exposureLines,\n>  \treturn std::max<uint32_t>(minExposureLines, exposureLines) * timePerLine + 14.26us;\n>  }\n>  \n> +void CamHelperImx296::prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata)\n> +{\n> +\t/*\n> +\t * The imx296 embedded data is ahead by a single frame, i.e. embedded\n> +\t * data in frame N corresponds to the image data in frame N+1. So make\n> +\t * a copy of the embedded data buffer and use it as normal for the next\n> +\t * frame.\n> +\t */\n> +\tCamHelper::prepare(embeddedBufferSpan_, metadata);\n> +\n> +\tif (embeddedBufferSpan_.size() != buffer.size()) {\n> +\t\tlastEmbeddedBuffer_ = std::make_unique<uint8_t[]>(buffer.size());\n> +\t\tembeddedBufferSpan_ = libcamera::Span(lastEmbeddedBuffer_.get(), buffer.size());\n> +\t}\n> +\n> +\tmemcpy(embeddedBufferSpan_.data(), buffer.data(), embeddedBufferSpan_.size());\n\nIf you made lastEmbeddedBuffer_ a std::vector<uint8_t> you could\nsimplify this code and drop embeddedBufferSpan_.\n\n> +}\n> +\n>  void CamHelperImx296::getDelays(int &exposureDelay, int &gainDelay,\n>  \t\t\t\tint &vblankDelay, int &hblankDelay) const\n>  {\n> @@ -75,6 +112,28 @@ void CamHelperImx296::getDelays(int &exposureDelay, int &gainDelay,\n>  \thblankDelay = 2;\n>  }\n>  \n> +bool CamHelperImx296::sensorEmbeddedDataPresent() const\n> +{\n> +\treturn true;\n> +}\n> +\n> +void CamHelperImx296::populateMetadata(const MdParser::RegisterMap &registers,\n> +\t\t\t\t       Metadata &metadata) const\n> +{\n> +\tuint32_t shs = registers.at(shsLoReg) + (registers.at(shsMidReg) << 8) +\n> +\t\t       (registers.at(shsHiReg) << 16);\n> +\tuint32_t vmax = registers.at(vmaxLoReg) + (registers.at(vmaxMidReg) << 8) +\n> +\t\t\t(registers.at(vmaxHiReg) << 16);\n> +\n> +\tDeviceStatus deviceStatus;\n> +\tdeviceStatus.lineLength = timePerLine;\n> +\tdeviceStatus.frameLength = vmax;\n> +\tdeviceStatus.shutterSpeed = exposure(vmax - shs, timePerLine);\n> +\tdeviceStatus.analogueGain = gain(registers.at(gainReg));\n> +\n> +\tmetadata.set(\"device.status\", deviceStatus);\n> +}\n> +\n>  static CamHelper *create()\n>  {\n>  \treturn new CamHelperImx296();","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 8AA40C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 24 Jun 2023 00:09:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EBC7D6002B;\n\tSat, 24 Jun 2023 02:09: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 567306002B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 24 Jun 2023 02:09:00 +0200 (CEST)","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 05BAD2C6;\n\tSat, 24 Jun 2023 02:08:22 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1687565341;\n\tbh=wbOpS0I4qkqNFl3uQfyPr3ygQGWzFdBOnzV7DYK0BIk=;\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=qOtHpjKs4LoZD3HrOVRNA8kr4pL6A844XIEBPDgCQK+opbyN9GuJxEOCbouKoANTF\n\t/NFhs+EYjJQb3sy56/tPcHAKg3rQmiaVFN+9NH9vjrxYDT5OXHhPdS2zD8qmQcJ2xl\n\twh9xogDw4BnsPFKsSs8I7AXfu9Cjuh1pMc2L0p1RLubhWICwRUU79p8Aw2pMQMu3nH\n\tazdIG06BYEQLqepBxiF89vLvdgN9qfkqTXF7zKYHGfE8f9ijs8vIg0DQD2XP1qHgZa\n\tYX+yXT71minK8LYCw+6tr5Ytcdv8ZLJdoMWXx82g3TOb/8jN/8/pRWkKOzWP4uiKXR\n\tEfjVy4jVoj5QQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1687565303;\n\tbh=wbOpS0I4qkqNFl3uQfyPr3ygQGWzFdBOnzV7DYK0BIk=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=mTV4i2EXRQyT1dHwLdm/SKBPTVWjfMnftAub60zAMAaDxP/kTzzrzRH8cy98R4KTK\n\tLl8QMvOCv2YjLru1yva2BGNdAloCYpS5VIbi0cDS7eMb4E14gAvBQtJWBhrj1uTMSZ\n\tMunIVcydOecw+6B39BDRaHGjNkKkNT03Q+995MbM="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"mTV4i2EX\"; dkim-atps=neutral","Date":"Sat, 24 Jun 2023 03:08:58 +0300","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<20230624000858.GE1669@pendragon.ideasonboard.com>","References":"<20230621123712.7787-1-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20230621123712.7787-1-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH] ipa: rpi: imx296: Enable embedded data","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":27420,"web_url":"https://patchwork.libcamera.org/comment/27420/","msgid":"<CAEmqJPqhDgP+oBDMm4DbuJc_WAxRD9RKPJVEvAo4zGUoirhu8g@mail.gmail.com>","date":"2023-06-26T08:00:14","subject":"Re: [libcamera-devel] [PATCH] ipa: rpi: imx296: Enable embedded data","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Laurent,\n\nThank you for the feedback.\n\nOn Sat, 24 Jun 2023 at 01:09, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> Hi Naush,\n>\n> Thank you for the patch.\n>\n> On Wed, Jun 21, 2023 at 01:37:12PM +0100, Naushir Patuck via libcamera-devel wrote:\n> > Enable embedded data parising for the imx296 sensor.\n>\n> s/parising/parsing/\n>\n> > However, the imx296 has a quirk where the embedded data is ahead by a\n> > single frame, i.e. embedded data in frame N corresponds to the image\n> > data in frame N+1. So make a copy of the embedded data buffer stored in\n> > the camera helper state, and use that copy in the next frame.\n>\n> We wouldn't make a copy if this was image data, but would instead keep\n> the buffer until the next frame. Would it make sense to do that even if\n> the amount of data is smaller ?\n\nI did consider this approach but abandoned it for simplicity.  The IPA\n(ipa_base.cpp) returns the buffer to the pipeline handler to recycle.\nIf I wanted\nto defer this recycling, the IPA or pipeline handler needs to know about this\nspecific sensor behaviour and do what needs to be done.  Which means more API\nchanges or adding sensor specific understanding in the IPA base - and that's\nsomething we want to avoid entirely.  Given the size of the buffer is relatively\nsmall, a memcpy to simplify the change seems reasonable to me.\n\n>\n> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > ---\n> >  src/ipa/rpi/cam_helper/cam_helper_imx296.cpp | 61 +++++++++++++++++++-\n> >  1 file changed, 60 insertions(+), 1 deletion(-)\n> >\n> > diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp\n> > index ecb845e76e12..8f06981b500e 100644\n> > --- a/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp\n> > +++ b/src/ipa/rpi/cam_helper/cam_helper_imx296.cpp\n> > @@ -7,6 +7,7 @@\n> >\n> >  #include <algorithm>\n> >  #include <cmath>\n> > +#include <string.h>\n> >  #include <stddef.h>\n> >\n> >  #include \"cam_helper.h\"\n> > @@ -15,6 +16,17 @@ using namespace RPiController;\n> >  using libcamera::utils::Duration;\n> >  using namespace std::literals::chrono_literals;\n> >\n> > +constexpr uint32_t gainReg = 0x41ba;\n> > +constexpr uint32_t shsLoReg = 0x41b4;\n> > +constexpr uint32_t shsMidReg = 0x41b5;\n> > +constexpr uint32_t shsHiReg = 0x41b6;\n> > +constexpr uint32_t vmaxLoReg = 0x41cc;\n> > +constexpr uint32_t vmaxMidReg = 0x41cd;\n> > +constexpr uint32_t vmaxHiReg = 0x41ce;\n> > +constexpr uint32_t tempReg = 0x41da;\n> > +constexpr std::initializer_list<uint32_t> registerList =\n> > +     { gainReg, shsLoReg, shsMidReg, shsHiReg, vmaxLoReg, vmaxMidReg, vmaxHiReg, tempReg };\n> > +\n> >  class CamHelperImx296 : public CamHelper\n> >  {\n> >  public:\n> > @@ -23,8 +35,12 @@ public:\n> >       double gain(uint32_t gainCode) const override;\n> >       uint32_t exposureLines(const Duration exposure, const Duration lineLength) const override;\n> >       Duration exposure(uint32_t exposureLines, const Duration lineLength) const override;\n> > +     void prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata) override;\n> >       void getDelays(int &exposureDelay, int &gainDelay,\n> >                      int &vblankDelay, int &hblankDelay) const override;\n> > +     bool sensorEmbeddedDataPresent() const override;\n> > +     void populateMetadata(const MdParser::RegisterMap &registers,\n> > +                           Metadata &metadata) const override;\n> >\n> >  private:\n> >       static constexpr uint32_t minExposureLines = 1;\n> > @@ -36,10 +52,13 @@ private:\n> >        * in units of lines.\n> >        */\n> >       static constexpr int frameIntegrationDiff = 4;\n> > +\n> > +     std::unique_ptr<uint8_t[]> lastEmbeddedBuffer_;\n> > +     libcamera::Span<uint8_t> embeddedBufferSpan_;\n> >  };\n> >\n> >  CamHelperImx296::CamHelperImx296()\n> > -     : CamHelper(nullptr, frameIntegrationDiff)\n> > +     : CamHelper(std::make_unique<MdParserSmia>(registerList), frameIntegrationDiff)\n> >  {\n> >  }\n> >\n> > @@ -66,6 +85,24 @@ Duration CamHelperImx296::exposure(uint32_t exposureLines,\n> >       return std::max<uint32_t>(minExposureLines, exposureLines) * timePerLine + 14.26us;\n> >  }\n> >\n> > +void CamHelperImx296::prepare(libcamera::Span<const uint8_t> buffer, Metadata &metadata)\n> > +{\n> > +     /*\n> > +      * The imx296 embedded data is ahead by a single frame, i.e. embedded\n> > +      * data in frame N corresponds to the image data in frame N+1. So make\n> > +      * a copy of the embedded data buffer and use it as normal for the next\n> > +      * frame.\n> > +      */\n> > +     CamHelper::prepare(embeddedBufferSpan_, metadata);\n> > +\n> > +     if (embeddedBufferSpan_.size() != buffer.size()) {\n> > +             lastEmbeddedBuffer_ = std::make_unique<uint8_t[]>(buffer.size());\n> > +             embeddedBufferSpan_ = libcamera::Span(lastEmbeddedBuffer_.get(), buffer.size());\n> > +     }\n> > +\n> > +     memcpy(embeddedBufferSpan_.data(), buffer.data(), embeddedBufferSpan_.size());\n>\n> If you made lastEmbeddedBuffer_ a std::vector<uint8_t> you could\n> simplify this code and drop embeddedBufferSpan_.\n\nYes, I can make that change.  Will still have to construct a Span to pass into\nCamHelper::prepare above, but that can be done in-place.\n\nRegards,\nNaush\n\n>\n> > +}\n> > +\n> >  void CamHelperImx296::getDelays(int &exposureDelay, int &gainDelay,\n> >                               int &vblankDelay, int &hblankDelay) const\n> >  {\n> > @@ -75,6 +112,28 @@ void CamHelperImx296::getDelays(int &exposureDelay, int &gainDelay,\n> >       hblankDelay = 2;\n> >  }\n> >\n> > +bool CamHelperImx296::sensorEmbeddedDataPresent() const\n> > +{\n> > +     return true;\n> > +}\n> > +\n> > +void CamHelperImx296::populateMetadata(const MdParser::RegisterMap &registers,\n> > +                                    Metadata &metadata) const\n> > +{\n> > +     uint32_t shs = registers.at(shsLoReg) + (registers.at(shsMidReg) << 8) +\n> > +                    (registers.at(shsHiReg) << 16);\n> > +     uint32_t vmax = registers.at(vmaxLoReg) + (registers.at(vmaxMidReg) << 8) +\n> > +                     (registers.at(vmaxHiReg) << 16);\n> > +\n> > +     DeviceStatus deviceStatus;\n> > +     deviceStatus.lineLength = timePerLine;\n> > +     deviceStatus.frameLength = vmax;\n> > +     deviceStatus.shutterSpeed = exposure(vmax - shs, timePerLine);\n> > +     deviceStatus.analogueGain = gain(registers.at(gainReg));\n> > +\n> > +     metadata.set(\"device.status\", deviceStatus);\n> > +}\n> > +\n> >  static CamHelper *create()\n> >  {\n> >       return new CamHelperImx296();\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 410D5BE175\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 26 Jun 2023 08:00:34 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7F261628C0;\n\tMon, 26 Jun 2023 10:00:33 +0200 (CEST)","from mail-yw1-x112e.google.com (mail-yw1-x112e.google.com\n\t[IPv6:2607:f8b0:4864:20::112e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C7AE161E3B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 26 Jun 2023 10:00:30 +0200 (CEST)","by mail-yw1-x112e.google.com with SMTP id\n\t00721157ae682-5701810884aso22269607b3.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 26 Jun 2023 01:00:30 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1687766433;\n\tbh=I/9IkPjYlZcDwjBxSld9XzgIDhxWUaIu6g/RWUI4oBI=;\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=yKaw1Mn9H3YU4n+ZTkKHGl/TXzPYvIJ3HsxtE4I2Rx11W0EFspAJ2Hb946z+J0y2a\n\t14K00r34J9PS4PpcoW2Q4LnuG0Fmqe5U4xq9VjyNwU3pFrjwUsAmfQmRF2Z/tFz+hJ\n\tqSLTrLTmOCj2a6xUNJZDfMReaKR40q5cUwG9PV/gVtnpx9YQVAD1Dw5W4sngFO/3yh\n\to28O9w8ApJrTfs5u7GcrPmvTxHjbF1jq75XzHmDZU6U/+TZ17Z5LZ/jvRz4EQ7Lnlg\n\tOvVwJ6FKp+MUlQqUvHjZeLTzqYOMDcqxHsxYqxPyBssgWWueLyYiQZtcnfQdBLv9Rm\n\tjyEa36nquZCHg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1687766429; x=1690358429;\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=lTof7he9ACHUPNxXvSA1ccTrhuT9nTXRdNQfqIa0k6I=;\n\tb=RM97N9tnDKIoOQ0KGwoGDml/cVV/0OuerjCtzl7pBufqlvvnMZ0aCU+7Gzj+sAtpML\n\tGgvMYaDVqkeuinnqogwXJZGn+pLvTzpE1NlsNvEsntDYiofgzH7i71RZomMU7C0vegVj\n\thO7hYndT7BU8RiDbBd6OtBZ4T3xIjpa7J6GjBZR2liKHGAnkYMwomu9yhPqFMOK11zxm\n\tvNqJyeUbPraMS5NZK9cXtcbQeUHGyL20ELsVlUqrs+tF6ZNpHwJaMKj3Gj5wBlTWzI5y\n\tSc4T3kqL/CwlX+dzbY/VzE3FE7qdCDUka07PesYjyVnzPb8jf7TeAwpkD2ijqupUQU5F\n\tSm/g=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"RM97N9tn\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20221208; t=1687766429; x=1690358429;\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=lTof7he9ACHUPNxXvSA1ccTrhuT9nTXRdNQfqIa0k6I=;\n\tb=Ur+e7rzRKWRZhnuqocTQm5beY+n04HivyeXqiYt2FvcWGbEZZvstSZ/vLKTkyCixtz\n\tPoVzQBwFV5SmFB6eUYbX9SG5TL0ht9nANbvIb201NQCU9iYGXuc5hY25++xQzzkX9zyS\n\tIN8eUJ6PkkJrohEbx+CQ3kbHlsDlyYRS5NuOEahyTepcJZnyTjqz9NONJsRTr63S+WlC\n\tFAqr0vPz/BsXFGlU7sGK3+xATAL/xTmWAlOxivCb2qt/LerDyoObK24ttolm/M5ZBNnW\n\tHJH02SJxj5ZeH2p15824C7Y/7o4EMDKz8qizY5RspVqQCpUqf5ksCzYbSkIWjAmpEE0I\n\tdrQA==","X-Gm-Message-State":"AC+VfDwE9PYukuIlOdNuodn9eebiGbrAC/3K6R7RPUJ5V5SciE4g1EyU\n\t+fCdMliqBnS1Enpuu50cj/L383VC5Z5jVzkHQixj6FF8VKGS1vjOOrXAxQ==","X-Google-Smtp-Source":"ACHHUZ7dMJhR36QAJWK0DBDXa8fKIyY/h6SuGvDKkOzUImYRTEALdvE5s+HCfiEHgKBfk3GiXR0TuHabJfgNJ1+e/bA=","X-Received":"by 2002:a81:8346:0:b0:573:cacd:306 with SMTP id\n\tt67-20020a818346000000b00573cacd0306mr9119317ywf.16.1687766429515;\n\tMon, 26 Jun 2023 01:00:29 -0700 (PDT)","MIME-Version":"1.0","References":"<20230621123712.7787-1-naush@raspberrypi.com>\n\t<20230624000858.GE1669@pendragon.ideasonboard.com>","In-Reply-To":"<20230624000858.GE1669@pendragon.ideasonboard.com>","Date":"Mon, 26 Jun 2023 09:00:14 +0100","Message-ID":"<CAEmqJPqhDgP+oBDMm4DbuJc_WAxRD9RKPJVEvAo4zGUoirhu8g@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH] ipa: rpi: imx296: Enable embedded data","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":"Naushir Patuck via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]