[{"id":27443,"web_url":"https://patchwork.libcamera.org/comment/27443/","msgid":"<CAEmqJPqk9qaVZffZ+oCqv4JubtjCXVm8WN3SLcd3gv9FWieFvQ@mail.gmail.com>","date":"2023-06-30T12:54:06","subject":"Re: [libcamera-devel] [RFC PATCH 2/5] ipa: rpi: Make\n\tparsePdafData() available in the CamHelper class","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Umang,\n\nThank you for your work.\n\nOn Fri, 30 Jun 2023 at 13:03, Umang Jain <umang.jain@ideasonboard.com> wrote:\n>\n> parsePdafData() parses the PDAF section of the sensor's embedded data\n\npdaf data is not strictly part of the embedded data, so this should probably\nsay sensor metadata.\n\n> and the parsing logic is generic to all PDAF-supported sensors.\n> Once the PDAF-specific buffer section is identified correctly, any\n> sensor should be able to use this helper in order parse its PDAF data.\n\ns/in order parse/in order to parse/\n\n>\n> No functional changes intended in this patch.\n>\n> Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n> ---\n>  src/ipa/rpi/cam_helper/cam_helper.cpp        | 29 +++++++++++++++\n>  src/ipa/rpi/cam_helper/cam_helper.h          |  6 ++++\n>  src/ipa/rpi/cam_helper/cam_helper_imx708.cpp | 37 --------------------\n>  3 files changed, 35 insertions(+), 37 deletions(-)\n>\n> diff --git a/src/ipa/rpi/cam_helper/cam_helper.cpp b/src/ipa/rpi/cam_helper/cam_helper.cpp\n> index ddd5e9a4..e9e0c496 100644\n> --- a/src/ipa/rpi/cam_helper/cam_helper.cpp\n> +++ b/src/ipa/rpi/cam_helper/cam_helper.cpp\n> @@ -253,6 +253,35 @@ void CamHelper::parseEmbeddedData(Span<const uint8_t> buffer,\n>         metadata.set(\"device.status\", deviceStatus);\n>  }\n>\n> +bool CamHelper::parsePdafData(Span<const uint8_t> &data, unsigned bpp, PdafRegions &pdaf)\n> +{\n\nWhile I do agree that generalising the pdaf is a good thing to do, we must make\nit clear that this parsing is not really generic and only specific to a subset\nof Sony sensors.  No doubt other Sony/non-Sony sensors will have\nvastly different\npdaf data formats.\n\nSo could this function be called parseSonyPdafData() or something similar to\nhighlight this?  But also see below...\n\n> +       const uint8_t *ptr = data.data();\n> +       unsigned int len = data.size();\n> +       size_t step = bpp >> 1; /* bytes per PDAF grid entry */\n> +\n> +       if (bpp < 10 || bpp > 12 || len < 194 * step || ptr[0] != 0 || ptr[1] >= 0x40) {\n> +               LOG(IPARPI, Error) << \"PDAF data in unsupported format\";\n> +               return false;\n> +       }\n> +\n> +       pdaf.init({ pdafStatsCols, pdafStatsRows });\n> +\n> +       ptr += 2 * step;\n> +       for (unsigned i = 0; i < pdafStatsRows; ++i) {\n> +               for (unsigned j = 0; j < pdafStatsCols; ++j) {\n> +                       unsigned c = (ptr[0] << 3) | (ptr[1] >> 5);\n> +                       int p = (((ptr[1] & 0x0f) - (ptr[1] & 0x10)) << 6) | (ptr[2] >> 2);\n> +                       PdafData pdafData;\n> +                       pdafData.conf = c;\n> +                       pdafData.phase = c ? p : 0;\n> +                       pdaf.set(libcamera::Point(j, i), { pdafData, 1, 0 });\n> +                       ptr += step;\n> +               }\n> +       }\n> +\n> +       return true;\n> +}\n> +\n>  void CamHelper::populateMetadata([[maybe_unused]] const MdParser::RegisterMap &registers,\n>                                  [[maybe_unused]] Metadata &metadata) const\n>  {\n> diff --git a/src/ipa/rpi/cam_helper/cam_helper.h b/src/ipa/rpi/cam_helper/cam_helper.h\n> index 58a4b202..705796a2 100644\n> --- a/src/ipa/rpi/cam_helper/cam_helper.h\n> +++ b/src/ipa/rpi/cam_helper/cam_helper.h\n> @@ -16,6 +16,7 @@\n>  #include \"controller/camera_mode.h\"\n>  #include \"controller/controller.h\"\n>  #include \"controller/metadata.h\"\n> +#include \"controller/pdaf_data.h\"\n>  #include \"md_parser.h\"\n>\n>  #include \"libcamera/internal/v4l2_videodevice.h\"\n> @@ -101,11 +102,16 @@ public:\n>         virtual unsigned int mistrustFramesModeSwitch() const;\n>\n>  protected:\n> +       static bool parsePdafData(libcamera::Span<const uint8_t> &pdafData, unsigned bpp,\n> +                                 PdafRegions &pdaf);\n>         void parseEmbeddedData(libcamera::Span<const uint8_t> buffer,\n>                                Metadata &metadata);\n>         virtual void populateMetadata(const MdParser::RegisterMap &registers,\n>                                       Metadata &metadata) const;\n>\n> +       static constexpr int pdafStatsRows = 12;\n> +       static constexpr int pdafStatsCols = 16;\n\nAgain, these are very sensor specific const values.  I'm a bit worried that the\ngeneric/base camera helper is now becoming a bit sensor specific.  Maybe these\nvalues need to be passed into parsePdafData()?\n\nRegards,\nNaush\n\n> +\n>         std::unique_ptr<MdParser> parser_;\n>         CameraMode mode_;\n>\n> diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp\n> index b24ee643..d0382d63 100644\n> --- a/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp\n> +++ b/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp\n> @@ -12,8 +12,6 @@\n>\n>  #include <libcamera/base/log.h>\n>\n> -#include \"controller/pdaf_data.h\"\n> -\n>  #include \"cam_helper.h\"\n>  #include \"md_parser.h\"\n>\n> @@ -72,15 +70,9 @@ private:\n>         /* Largest long exposure scale factor given as a left shift on the frame length. */\n>         static constexpr int longExposureShiftMax = 7;\n>\n> -       static constexpr int pdafStatsRows = 12;\n> -       static constexpr int pdafStatsCols = 16;\n> -\n>         void populateMetadata(const MdParser::RegisterMap &registers,\n>                               Metadata &metadata) const override;\n>\n> -       static bool parsePdafData(libcamera::Span<const uint8_t> &pdafData, unsigned bpp,\n> -                                 PdafRegions &pdaf);\n> -\n>         bool parseAEHist(const uint8_t *ptr, size_t len, unsigned bpp);\n>         void putAGCStatistics(StatisticsPtr stats);\n>\n> @@ -243,35 +235,6 @@ void CamHelperImx708::populateMetadata(const MdParser::RegisterMap &registers,\n>         metadata.set(\"device.status\", deviceStatus);\n>  }\n>\n> -bool CamHelperImx708::parsePdafData(Span<const uint8_t> &data, unsigned bpp, PdafRegions &pdaf)\n> -{\n> -       const uint8_t *ptr = data.data();\n> -       unsigned int len = data.size();\n> -       size_t step = bpp >> 1; /* bytes per PDAF grid entry */\n> -\n> -       if (bpp < 10 || bpp > 12 || len < 194 * step || ptr[0] != 0 || ptr[1] >= 0x40) {\n> -               LOG(IPARPI, Error) << \"PDAF data in unsupported format\";\n> -               return false;\n> -       }\n> -\n> -       pdaf.init({ pdafStatsCols, pdafStatsRows });\n> -\n> -       ptr += 2 * step;\n> -       for (unsigned i = 0; i < pdafStatsRows; ++i) {\n> -               for (unsigned j = 0; j < pdafStatsCols; ++j) {\n> -                       unsigned c = (ptr[0] << 3) | (ptr[1] >> 5);\n> -                       int p = (((ptr[1] & 0x0F) - (ptr[1] & 0x10)) << 6) | (ptr[2] >> 2);\n> -                       PdafData pdafData;\n> -                       pdafData.conf = c;\n> -                       pdafData.phase = c ? p : 0;\n> -                       pdaf.set(libcamera::Point(j, i), { pdafData, 1, 0 });\n> -                       ptr += step;\n> -               }\n> -       }\n> -\n> -       return true;\n> -}\n> -\n>  bool CamHelperImx708::parseAEHist(const uint8_t *ptr, size_t len, unsigned bpp)\n>  {\n>         static constexpr unsigned int PipelineBits = Statistics::NormalisationFactorPow2;\n> --\n> 2.39.1\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 64253BE175\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 30 Jun 2023 12:54:25 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B5C7660454;\n\tFri, 30 Jun 2023 14:54:24 +0200 (CEST)","from mail-yw1-x112f.google.com (mail-yw1-x112f.google.com\n\t[IPv6:2607:f8b0:4864:20::112f])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 91CF860454\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 30 Jun 2023 14:54:23 +0200 (CEST)","by mail-yw1-x112f.google.com with SMTP id\n\t00721157ae682-56fff21c2ebso19250397b3.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 30 Jun 2023 05:54:23 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1688129664;\n\tbh=iC72al3dAMsx/+F8edF3hscTYb66XpBUwamME6/TQLk=;\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=F9GOV28DWsHLT9dQe3uBk5lgGyru5H/+XWZpMma6txBOH3YPR+yVBBWXzAPCY2YAs\n\tj1LQHHhhkoFu2FXQsvtnEvFGgHC9oURXXQDst8TUL1o+lv8XwsNnctYhzgjQ9h9ull\n\tVJM9Lugcpw90kFJmPWf5rL3ohMNR7hjIk+XrgXYHb6fDhPfWmIRZYl/qIp3/EnGO8y\n\tT9ShGIZTfqimKWLWdnOrhuOkKI7QLbKshi4ZdVJ+O76QWl6Hrd+E+mXrOzNlvTvlmg\n\t03QYFlTzUKBSUlMmFIN7opIZ1dvzUsM2/bxyp4GKl22vFnbIff04kYQKwMY6Q1lRg4\n\tJ7AMvMUGYQfxg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1688129662; x=1690721662;\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=PmPP/r+X6fSy1R27HZ3jNFM9+4CjgE2Qv4+y9F0F/VY=;\n\tb=gWI/tC743kVCvEZwGC2tPHFO/SSsTuu/9q7rJTtCvGgUADPopbmQyM9STZVh0Pg2lQ\n\tVN64GN1T3uc7WlkUpUokqNJmeN/RXR0Zv2nncojdJfKzolAdmenZy4y8A+S+5aG8hmxR\n\tQXwn+/0+SPyDwqLRa2CkPcgNW2Vz5pe2sR4WBdJrBqqmmsRZkTI2elY2VeBwo3xrrsw0\n\tBdwSg3QHmTlCyTblArviSbqkRZm1NW77hvBSp9UI/L+jPLH/8a52jV8t3IbGZtMEPyuU\n\tIb99heBnIW4EJ7abd9fpR05NQl+r32S+Ten+ejuynVUy9C0YGTVNih1PiRBr2h/Pf007\n\tc3sA=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"gWI/tC74\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20221208; t=1688129662; x=1690721662;\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=PmPP/r+X6fSy1R27HZ3jNFM9+4CjgE2Qv4+y9F0F/VY=;\n\tb=FqdRutZbQLsTBvwjr9VLf+6re/w7KfynkmTkmhM15Lip6jcGTdRKcwjooHPq3YUvmo\n\ttjJVS01w0REYyW7i1TK5MZ2NpAuuWPE77ihGObkf4Cw9NokQ6D9zknxrA1KU+acwEXxx\n\tsOZL22VKvhqCv9QbU/6SPMEp/IGhr6P82ASY1algc7a4HTjkIgZy42R6PoFphucgBCFA\n\tXGfM0RS2rNuYdRvNcbKlDxgGGS+Us/FYW2xIGMRqyVpemJfiP6ASvjtMMEuRTGuu1ZDI\n\tTZjr4eOGFOmiEtzUIjTJmXiuScjgcatvj+isUc38LoUC94ru6NlmO0DIDVCu1SUW3+Uv\n\tMdUw==","X-Gm-Message-State":"ABy/qLZd2HPLKdlbaFRfSs4NPC0H1ixfnbRKoFBEr5IPPdQ2uu3cVkku\n\tLlv9NxXyrcK0QTMmFIro0viYe2MQROIRwoETRm+wsA==","X-Google-Smtp-Source":"APBJJlFlvF15xqK63rPS/wRtKlNECP8TA8jQ5+AaUBmxWS5lAWSRGa1U8WH1gh8rKsgHEt8uiIc1AGT3iO8MnYPVpmY=","X-Received":"by 2002:a81:6d15:0:b0:56d:4f5a:bb25 with SMTP id\n\ti21-20020a816d15000000b0056d4f5abb25mr2409073ywc.22.1688129662376;\n\tFri, 30 Jun 2023 05:54:22 -0700 (PDT)","MIME-Version":"1.0","References":"<20230630120303.33023-1-umang.jain@ideasonboard.com>\n\t<20230630120303.33023-3-umang.jain@ideasonboard.com>","In-Reply-To":"<20230630120303.33023-3-umang.jain@ideasonboard.com>","Date":"Fri, 30 Jun 2023 13:54:06 +0100","Message-ID":"<CAEmqJPqk9qaVZffZ+oCqv4JubtjCXVm8WN3SLcd3gv9FWieFvQ@mail.gmail.com>","To":"Umang Jain <umang.jain@ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [RFC PATCH 2/5] ipa: rpi: Make\n\tparsePdafData() available in the CamHelper class","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>"}},{"id":27447,"web_url":"https://patchwork.libcamera.org/comment/27447/","msgid":"<CAPY8ntB1YPiGeoT6AP45b09WWWXh1nZNkn-doS2HWKs0JV5fjQ@mail.gmail.com>","date":"2023-06-30T13:32:59","subject":"Re: [libcamera-devel] [RFC PATCH 2/5] ipa: rpi: Make\n\tparsePdafData() available in the CamHelper class","submitter":{"id":27,"url":"https://patchwork.libcamera.org/api/people/27/","name":"Dave Stevenson","email":"dave.stevenson@raspberrypi.com"},"content":"On Fri, 30 Jun 2023 at 13:54, Naushir Patuck <naush@raspberrypi.com> wrote:\n>\n> Hi Umang,\n>\n> Thank you for your work.\n>\n> On Fri, 30 Jun 2023 at 13:03, Umang Jain <umang.jain@ideasonboard.com> wrote:\n> >\n> > parsePdafData() parses the PDAF section of the sensor's embedded data\n>\n> pdaf data is not strictly part of the embedded data, so this should probably\n> say sensor metadata.\n>\n> > and the parsing logic is generic to all PDAF-supported sensors.\n> > Once the PDAF-specific buffer section is identified correctly, any\n> > sensor should be able to use this helper in order parse its PDAF data.\n>\n> s/in order parse/in order to parse/\n>\n> >\n> > No functional changes intended in this patch.\n> >\n> > Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>\n> > ---\n> >  src/ipa/rpi/cam_helper/cam_helper.cpp        | 29 +++++++++++++++\n> >  src/ipa/rpi/cam_helper/cam_helper.h          |  6 ++++\n> >  src/ipa/rpi/cam_helper/cam_helper_imx708.cpp | 37 --------------------\n> >  3 files changed, 35 insertions(+), 37 deletions(-)\n> >\n> > diff --git a/src/ipa/rpi/cam_helper/cam_helper.cpp b/src/ipa/rpi/cam_helper/cam_helper.cpp\n> > index ddd5e9a4..e9e0c496 100644\n> > --- a/src/ipa/rpi/cam_helper/cam_helper.cpp\n> > +++ b/src/ipa/rpi/cam_helper/cam_helper.cpp\n> > @@ -253,6 +253,35 @@ void CamHelper::parseEmbeddedData(Span<const uint8_t> buffer,\n> >         metadata.set(\"device.status\", deviceStatus);\n> >  }\n> >\n> > +bool CamHelper::parsePdafData(Span<const uint8_t> &data, unsigned bpp, PdafRegions &pdaf)\n> > +{\n>\n> While I do agree that generalising the pdaf is a good thing to do, we must make\n> it clear that this parsing is not really generic and only specific to a subset\n> of Sony sensors.  No doubt other Sony/non-Sony sensors will have\n> vastly different\n> pdaf data formats.\n\nDefinite need for caution over making this over-generically named.\nimx708 supports two different PDAF implementations, and this is only\nsupporting one of them. The other is sending the raw shielded pixel\nvalues, with the processing having to be done on the SoC.\nimx519 and imx682 general datasheets also reference two types of PDAF data.\n\nWe may also have a slight issue over maintenance here.\nRaspberry Pi obviously support and maintain IMX708. We have no\ninformation to maintain PDAF parsing on IMX519 (or possibly IMX682),\nso who is taking on responsibility for testing any updates to PDAF\nparsing on those platforms? Or is it accepted that regressions may\nhappen there?\n\n  Dave\n\n> So could this function be called parseSonyPdafData() or something similar to\n> highlight this?  But also see below...\n>\n> > +       const uint8_t *ptr = data.data();\n> > +       unsigned int len = data.size();\n> > +       size_t step = bpp >> 1; /* bytes per PDAF grid entry */\n> > +\n> > +       if (bpp < 10 || bpp > 12 || len < 194 * step || ptr[0] != 0 || ptr[1] >= 0x40) {\n> > +               LOG(IPARPI, Error) << \"PDAF data in unsupported format\";\n> > +               return false;\n> > +       }\n> > +\n> > +       pdaf.init({ pdafStatsCols, pdafStatsRows });\n> > +\n> > +       ptr += 2 * step;\n> > +       for (unsigned i = 0; i < pdafStatsRows; ++i) {\n> > +               for (unsigned j = 0; j < pdafStatsCols; ++j) {\n> > +                       unsigned c = (ptr[0] << 3) | (ptr[1] >> 5);\n> > +                       int p = (((ptr[1] & 0x0f) - (ptr[1] & 0x10)) << 6) | (ptr[2] >> 2);\n> > +                       PdafData pdafData;\n> > +                       pdafData.conf = c;\n> > +                       pdafData.phase = c ? p : 0;\n> > +                       pdaf.set(libcamera::Point(j, i), { pdafData, 1, 0 });\n> > +                       ptr += step;\n> > +               }\n> > +       }\n> > +\n> > +       return true;\n> > +}\n> > +\n> >  void CamHelper::populateMetadata([[maybe_unused]] const MdParser::RegisterMap &registers,\n> >                                  [[maybe_unused]] Metadata &metadata) const\n> >  {\n> > diff --git a/src/ipa/rpi/cam_helper/cam_helper.h b/src/ipa/rpi/cam_helper/cam_helper.h\n> > index 58a4b202..705796a2 100644\n> > --- a/src/ipa/rpi/cam_helper/cam_helper.h\n> > +++ b/src/ipa/rpi/cam_helper/cam_helper.h\n> > @@ -16,6 +16,7 @@\n> >  #include \"controller/camera_mode.h\"\n> >  #include \"controller/controller.h\"\n> >  #include \"controller/metadata.h\"\n> > +#include \"controller/pdaf_data.h\"\n> >  #include \"md_parser.h\"\n> >\n> >  #include \"libcamera/internal/v4l2_videodevice.h\"\n> > @@ -101,11 +102,16 @@ public:\n> >         virtual unsigned int mistrustFramesModeSwitch() const;\n> >\n> >  protected:\n> > +       static bool parsePdafData(libcamera::Span<const uint8_t> &pdafData, unsigned bpp,\n> > +                                 PdafRegions &pdaf);\n> >         void parseEmbeddedData(libcamera::Span<const uint8_t> buffer,\n> >                                Metadata &metadata);\n> >         virtual void populateMetadata(const MdParser::RegisterMap &registers,\n> >                                       Metadata &metadata) const;\n> >\n> > +       static constexpr int pdafStatsRows = 12;\n> > +       static constexpr int pdafStatsCols = 16;\n>\n> Again, these are very sensor specific const values.  I'm a bit worried that the\n> generic/base camera helper is now becoming a bit sensor specific.  Maybe these\n> values need to be passed into parsePdafData()?\n>\n> Regards,\n> Naush\n>\n> > +\n> >         std::unique_ptr<MdParser> parser_;\n> >         CameraMode mode_;\n> >\n> > diff --git a/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp b/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp\n> > index b24ee643..d0382d63 100644\n> > --- a/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp\n> > +++ b/src/ipa/rpi/cam_helper/cam_helper_imx708.cpp\n> > @@ -12,8 +12,6 @@\n> >\n> >  #include <libcamera/base/log.h>\n> >\n> > -#include \"controller/pdaf_data.h\"\n> > -\n> >  #include \"cam_helper.h\"\n> >  #include \"md_parser.h\"\n> >\n> > @@ -72,15 +70,9 @@ private:\n> >         /* Largest long exposure scale factor given as a left shift on the frame length. */\n> >         static constexpr int longExposureShiftMax = 7;\n> >\n> > -       static constexpr int pdafStatsRows = 12;\n> > -       static constexpr int pdafStatsCols = 16;\n> > -\n> >         void populateMetadata(const MdParser::RegisterMap &registers,\n> >                               Metadata &metadata) const override;\n> >\n> > -       static bool parsePdafData(libcamera::Span<const uint8_t> &pdafData, unsigned bpp,\n> > -                                 PdafRegions &pdaf);\n> > -\n> >         bool parseAEHist(const uint8_t *ptr, size_t len, unsigned bpp);\n> >         void putAGCStatistics(StatisticsPtr stats);\n> >\n> > @@ -243,35 +235,6 @@ void CamHelperImx708::populateMetadata(const MdParser::RegisterMap &registers,\n> >         metadata.set(\"device.status\", deviceStatus);\n> >  }\n> >\n> > -bool CamHelperImx708::parsePdafData(Span<const uint8_t> &data, unsigned bpp, PdafRegions &pdaf)\n> > -{\n> > -       const uint8_t *ptr = data.data();\n> > -       unsigned int len = data.size();\n> > -       size_t step = bpp >> 1; /* bytes per PDAF grid entry */\n> > -\n> > -       if (bpp < 10 || bpp > 12 || len < 194 * step || ptr[0] != 0 || ptr[1] >= 0x40) {\n> > -               LOG(IPARPI, Error) << \"PDAF data in unsupported format\";\n> > -               return false;\n> > -       }\n> > -\n> > -       pdaf.init({ pdafStatsCols, pdafStatsRows });\n> > -\n> > -       ptr += 2 * step;\n> > -       for (unsigned i = 0; i < pdafStatsRows; ++i) {\n> > -               for (unsigned j = 0; j < pdafStatsCols; ++j) {\n> > -                       unsigned c = (ptr[0] << 3) | (ptr[1] >> 5);\n> > -                       int p = (((ptr[1] & 0x0F) - (ptr[1] & 0x10)) << 6) | (ptr[2] >> 2);\n> > -                       PdafData pdafData;\n> > -                       pdafData.conf = c;\n> > -                       pdafData.phase = c ? p : 0;\n> > -                       pdaf.set(libcamera::Point(j, i), { pdafData, 1, 0 });\n> > -                       ptr += step;\n> > -               }\n> > -       }\n> > -\n> > -       return true;\n> > -}\n> > -\n> >  bool CamHelperImx708::parseAEHist(const uint8_t *ptr, size_t len, unsigned bpp)\n> >  {\n> >         static constexpr unsigned int PipelineBits = Statistics::NormalisationFactorPow2;\n> > --\n> > 2.39.1\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 429B3BDB1D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 30 Jun 2023 13:33:20 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8BAC4628C0;\n\tFri, 30 Jun 2023 15:33:19 +0200 (CEST)","from mail-ot1-x331.google.com (mail-ot1-x331.google.com\n\t[IPv6:2607:f8b0:4864:20::331])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8E1E460454\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 30 Jun 2023 15:33:17 +0200 (CEST)","by mail-ot1-x331.google.com with SMTP id\n\t46e09a7af769-6b5d6a05b6dso1529184a34.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 30 Jun 2023 06:33:17 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1688131999;\n\tbh=TaYFhaT5LNXtzTMKj+/xjPsXY4jdvzusceVuFkdeiR0=;\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=lmm6BHsXMDsP2cgvhxUbYywhVOamCoWFz4XiLkTLYVniO0HTvg6GAzNJ26RfesmKd\n\tjy4JmXedB+gHN6S3wCHuvizhjcSxEdimq3F0Ke2ZV8SAnrVRk+cCRvq2PC/PIa7bpi\n\t58IqgV6qug677uUOzkFCtCVfVLfxpTfUNVSIEOeMBZ8F1n8RwORJRvUVPS9yuumhYi\n\ttVQxS2wkLv7oqEYYl+Mlopy2D7fOi8pm2fG46OaBkLF9WXvi8gez5dvlO04ZffTOpj\n\txR9kVbX7q4kJ5BWVP/sJrg4QcApVI8+7R6dZmz+1M9jtf73XPEGfiIGVPw3OfW3tuQ\n\t2WpCWd47I4y6g==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1688131996; x=1690723996;\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=AfLpUmLfUUGsWX23rIzR4IQ1ky3FlylkSAbjfnDyYBc=;\n\tb=NpCwLhLeOzLtRRczV81miu5dZ/RiXJ+Ww6Uej10S9BHgntuposDGaB2rWQ/d98hFCE\n\t3Xx3GFiEYAv4+5RcfEYIjEd/XHK4SuScx0wA5kjm/pU8hpX1BPFb2Mc2ri8tz+2fAdZ5\n\tkQWNxPHjHOdc3HncGwWWBn7TDHl7otgLBxdODa23rkQZWy9eQz+wCgOD5zLCPWcZ9yQu\n\tXm/CgGOfs/DhMXYeKDlgbe5+5D25aDHZvy4g76WoRkRAR8sNKaIpzZLaAos3xR2cKnA4\n\tKgGlU5MthnNgI2siUK2hM3Wv1AmzmNkfx9Djr1nfJH/MMv4/ghvzgdaLdF6JbRO1Jv++\n\tLS9w=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"NpCwLhLe\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20221208; t=1688131996; x=1690723996;\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=AfLpUmLfUUGsWX23rIzR4IQ1ky3FlylkSAbjfnDyYBc=;\n\tb=e2WURfwKvy607K5zkmjiJFde1uyWwmmeIm4hxIAelzWxEDHspfnqQLBF0nV71RzzfN\n\tcVwxI1xXTPbL15J53j33AEDtX0ju2ptLucNYDY4ZHiXNqbQgnM71E2HFfwqMlLEc6vwy\n\tvWPXeHtHAKbAM0/6lapRut9XRRKyjp+k8f8l60araPUeEAqj/5HlcN+4b9OsMbyhCDtX\n\trvWig4M3desJOiCE7Jr6bukV7WrL+0PIm9SiucNfS7hf5R6bM1s0GR9D0PLVwAbU+mdN\n\tbEYy8tTMfN6wLPz6DTw8Ez9uplYmhXLRmyK3jRVw3JLT9SaRSgrEgIVVPPxD2qEgFKz/\n\t03Fw==","X-Gm-Message-State":"ABy/qLbf23LV20CtPD5v7qIx3hLp/L6QxY5So6/r512THxW3kibl/x6R\n\tiR2wJaZbigfXBmc9SwaeTqBBzoDtfrVVlSDIghqzsw==","X-Google-Smtp-Source":"APBJJlH8DViphe4JTzl/AactzSMU1pMasg7UGYbyZQsbmZ+coRjNoZ3BQ5TfsATOaojLjOcXrElySXcfg9YkthFTyJs=","X-Received":"by 2002:a05:6358:615d:b0:132:d32d:d929 with SMTP id\n\t29-20020a056358615d00b00132d32dd929mr2070506rwt.20.1688131996112;\n\tFri, 30 Jun 2023 06:33:16 -0700 (PDT)","MIME-Version":"1.0","References":"<20230630120303.33023-1-umang.jain@ideasonboard.com>\n\t<20230630120303.33023-3-umang.jain@ideasonboard.com>\n\t<CAEmqJPqk9qaVZffZ+oCqv4JubtjCXVm8WN3SLcd3gv9FWieFvQ@mail.gmail.com>","In-Reply-To":"<CAEmqJPqk9qaVZffZ+oCqv4JubtjCXVm8WN3SLcd3gv9FWieFvQ@mail.gmail.com>","Date":"Fri, 30 Jun 2023 14:32:59 +0100","Message-ID":"<CAPY8ntB1YPiGeoT6AP45b09WWWXh1nZNkn-doS2HWKs0JV5fjQ@mail.gmail.com>","To":"Naushir Patuck <naush@raspberrypi.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [RFC PATCH 2/5] ipa: rpi: Make\n\tparsePdafData() available in the CamHelper class","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":"Dave Stevenson via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Dave Stevenson <dave.stevenson@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>"}}]