Patch Detail
Show a patch.
GET /api/1.1/patches/14062/?format=api
{ "id": 14062, "url": "https://patchwork.libcamera.org/api/1.1/patches/14062/?format=api", "web_url": "https://patchwork.libcamera.org/patch/14062/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20211006140041.964542-10-jeanmichel.hautbois@ideasonboard.com>", "date": "2021-10-06T14:00:39", "name": "[libcamera-devel,v3,09/12] ipa: ipu3: awb: Use the line stride for the stats", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "5b3237eb7b5da94a05eda22bad2cad0fd254a5fa", "submitter": { "id": 75, "url": "https://patchwork.libcamera.org/api/1.1/people/75/?format=api", "name": "Jean-Michel Hautbois", "email": "jeanmichel.hautbois@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/14062/mbox/", "series": [ { "id": 2605, "url": "https://patchwork.libcamera.org/api/1.1/series/2605/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2605", "date": "2021-10-06T14:00:30", "name": "Improve ImgU statistics usage", "version": 3, "mbox": "https://patchwork.libcamera.org/series/2605/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/14062/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/14062/checks/", "tags": {}, "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 56F8EC323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 6 Oct 2021 14:01:11 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F2EEB691DE;\n\tWed, 6 Oct 2021 16:01:10 +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 029AA691C6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 6 Oct 2021 16:01:02 +0200 (CEST)", "from tatooine.ideasonboard.com (unknown\n\t[IPv6:2a01:e0a:169:7140:843b:c831:54de:6e8c])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7DA0214D4;\n\tWed, 6 Oct 2021 16:01:02 +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=\"btt/qmd5\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1633528862;\n\tbh=gRHZ6MrYLBs6TF+k9pT9sLZTUjZaZtXT97+shNdrPPs=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=btt/qmd5w6G5OftW+JFK8qxoNuzI/Nh77KU70L0es5FMGUnJinrQJiYBbUEoCojmQ\n\tE/ZsON7zxKhqv3YIxAkX/CBEJNUxsMIsImmDfbcuDdwgOlI3BJfIuErXPNIVUqAJaS\n\tuD1ceV3opQTfVafXb36YignPZHMo497XCK/xMlcM=", "From": "Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Wed, 6 Oct 2021 16:00:39 +0200", "Message-Id": "<20211006140041.964542-10-jeanmichel.hautbois@ideasonboard.com>", "X-Mailer": "git-send-email 2.30.2", "In-Reply-To": "<20211006140041.964542-1-jeanmichel.hautbois@ideasonboard.com>", "References": "<20211006140041.964542-1-jeanmichel.hautbois@ideasonboard.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v3 09/12] ipa: ipu3: awb: Use the line\n\tstride for the stats", "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>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "The statistics buffer 'ipu3_uapi_awb_raw_buffer' stores the ImgU\ncalculation results in a buffer aligned horizontally to a multiple of 4\ncells. The AWB loop should take care of it to add the proper offset\nbetween lines and avoid any staircase effect.\n\nIt is no longer required to pass the grid configuration context to the\nprivate functions called from process() which simplifies the code flow.\n\nSigned-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/ipa/ipu3/algorithms/awb.cpp | 13 ++++++-------\n src/ipa/ipu3/algorithms/awb.h | 7 +++----\n src/ipa/ipu3/ipa_context.h | 1 +\n src/ipa/ipu3/ipu3.cpp | 6 ++++++\n 4 files changed, 16 insertions(+), 11 deletions(-)", "diff": "diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp\nindex 2d875d0b..3cff9aa4 100644\n--- a/src/ipa/ipu3/algorithms/awb.cpp\n+++ b/src/ipa/ipu3/algorithms/awb.cpp\n@@ -176,6 +176,7 @@ int Awb::configure(IPAContext &context,\n \t\t [[maybe_unused]] const IPAConfigInfo &configInfo)\n {\n \tconst ipu3_uapi_grid_config &grid = context.configuration.grid.bdsGrid;\n+\tstride_ = context.configuration.grid.stride;\n \n \tcellsPerZoneX_ = std::round(grid.width / static_cast<double>(kAwbStatsSizeX));\n \tcellsPerZoneY_ = std::round(grid.height / static_cast<double>(kAwbStatsSizeY));\n@@ -238,8 +239,7 @@ void Awb::generateZones(std::vector<RGB> &zones)\n }\n \n /* Translate the IPU3 statistics into the default statistics zone array */\n-void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats,\n-\t\t\t const ipu3_uapi_grid_config &grid)\n+void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats)\n {\n \t/*\n \t * Generate a (kAwbStatsSizeX x kAwbStatsSizeY) array from the IPU3 grid which is\n@@ -247,7 +247,7 @@ void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats,\n \t */\n \tfor (unsigned int cellY = 0; cellY < kAwbStatsSizeY * cellsPerZoneY_; cellY++) {\n \t\tfor (unsigned int cellX = 0; cellX < kAwbStatsSizeX * cellsPerZoneX_; cellX++) {\n-\t\t\tuint32_t cellPosition = (cellY * grid.width + cellX)\n+\t\t\tuint32_t cellPosition = (cellY * stride_ + cellX)\n \t\t\t\t\t * sizeof(Ipu3AwbCell);\n \t\t\tuint32_t zoneX = cellX / cellsPerZoneX_;\n \t\t\tuint32_t zoneY = cellY / cellsPerZoneY_;\n@@ -322,13 +322,12 @@ void Awb::awbGreyWorld()\n \tasyncResults_.blueGain = blueGain;\n }\n \n-void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats,\n-\t\t\t const ipu3_uapi_grid_config &grid)\n+void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats)\n {\n \tASSERT(stats->stats_3a_status.awb_en);\n \tzones_.clear();\n \tclearAwbStats();\n-\tgenerateAwbStats(stats, grid);\n+\tgenerateAwbStats(stats);\n \tgenerateZones(zones_);\n \tLOG(IPU3Awb, Debug) << \"Valid zones: \" << zones_.size();\n \tif (zones_.size() > 10) {\n@@ -340,7 +339,7 @@ void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats,\n \n void Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)\n {\n-\tcalculateWBGains(stats, context.configuration.grid.bdsGrid);\n+\tcalculateWBGains(stats);\n \n \t/*\n \t * Gains are only recalculated if enough zones were detected.\ndiff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h\nindex 681d8c2b..b3e0ad82 100644\n--- a/src/ipa/ipu3/algorithms/awb.h\n+++ b/src/ipa/ipu3/algorithms/awb.h\n@@ -74,11 +74,9 @@ public:\n \t};\n \n private:\n-\tvoid calculateWBGains(const ipu3_uapi_stats_3a *stats,\n-\t\t\t const ipu3_uapi_grid_config &grid);\n+\tvoid calculateWBGains(const ipu3_uapi_stats_3a *stats);\n \tvoid generateZones(std::vector<RGB> &zones);\n-\tvoid generateAwbStats(const ipu3_uapi_stats_3a *stats,\n-\t\t\t const ipu3_uapi_grid_config &grid);\n+\tvoid generateAwbStats(const ipu3_uapi_stats_3a *stats);\n \tvoid clearAwbStats();\n \tvoid awbGreyWorld();\n \tuint32_t estimateCCT(double red, double green, double blue);\n@@ -87,6 +85,7 @@ private:\n \tAccumulator awbStats_[kAwbStatsSizeX * kAwbStatsSizeY];\n \tAwbStatus asyncResults_;\n \n+\tuint32_t stride_;\n \tuint32_t cellsPerZoneX_;\n \tuint32_t cellsPerZoneY_;\n \tuint32_t cellsPerZoneThreshold_;\ndiff --git a/src/ipa/ipu3/ipa_context.h b/src/ipa/ipu3/ipa_context.h\nindex 9d9444dc..5bab684c 100644\n--- a/src/ipa/ipu3/ipa_context.h\n+++ b/src/ipa/ipu3/ipa_context.h\n@@ -20,6 +20,7 @@ struct IPASessionConfiguration {\n \tstruct {\n \t\tipu3_uapi_grid_config bdsGrid;\n \t\tSize bdsOutputSize;\n+\t\tuint32_t stride;\n \t} grid;\n };\n \ndiff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\nindex 757a5d50..06f53fbe 100644\n--- a/src/ipa/ipu3/ipu3.cpp\n+++ b/src/ipa/ipu3/ipu3.cpp\n@@ -91,6 +91,9 @@\n *\n * \\var IPASessionConfiguration::grid::bdsOutputSize\n * \\brief BDS output size configured by the pipeline handler\n+ *\n+ * \\var IPASessionConfiguration::grid::stride\n+ * \\brief Number of cells on one line including the ImgU padding\n */\n \n /**\n@@ -352,6 +355,9 @@ void IPAIPU3::calculateBdsGrid(const Size &bdsOutputSize)\n \tbdsGrid.height = best.height >> bestLog2.height;\n \tbdsGrid.block_height_log2 = bestLog2.height;\n \n+\t/* The ImgU pads the lines to a multiple of 4 cells. */\n+\tcontext_.configuration.grid.stride = utils::alignUp(bdsGrid.width, 4);\n+\n \tLOG(IPAIPU3, Debug) << \"Best grid found is: (\"\n \t\t\t << (int)bdsGrid.width << \" << \" << (int)bdsGrid.block_width_log2 << \") x (\"\n \t\t\t << (int)bdsGrid.height << \" << \" << (int)bdsGrid.block_height_log2 << \")\";\n", "prefixes": [ "libcamera-devel", "v3", "09/12" ] }