Show a patch.

GET /api/patches/14664/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 14664,
    "url": "https://patchwork.libcamera.org/api/patches/14664/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/14664/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/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": "<20211119210239.18540-3-laurent.pinchart@ideasonboard.com>",
    "date": "2021-11-19T21:02:36",
    "name": "[libcamera-devel,v2,2/5] ipa: ipu3: agc: Standardize vocabulary on \"relative luminance\"",
    "commit_ref": "8d9b39f8ad30c9649096bd3829f220ab90f6054d",
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "248e6c911ab6a91b1e557043e5a7452b51542222",
    "submitter": {
        "id": 2,
        "url": "https://patchwork.libcamera.org/api/people/2/?format=api",
        "name": "Laurent Pinchart",
        "email": "laurent.pinchart@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/14664/mbox/",
    "series": [
        {
            "id": 2738,
            "url": "https://patchwork.libcamera.org/api/series/2738/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2738",
            "date": "2021-11-19T21:02:34",
            "name": "ipa: ipu3: agc: Misc improvements",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/2738/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/14664/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/14664/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 5FEC8BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 19 Nov 2021 21:03:11 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 567206038C;\n\tFri, 19 Nov 2021 22:03:10 +0100 (CET)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2D91360233\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 19 Nov 2021 22:03:06 +0100 (CET)",
            "from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CDA1B1C19\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 19 Nov 2021 22:03:05 +0100 (CET)"
        ],
        "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=\"aOc3vfpc\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1637355786;\n\tbh=3Vl2pkE0XFr4qlES+kHAJcyXgVB8PRXyVCWVBMahkXw=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=aOc3vfpcc3gpytvQhNtcTQwRce3tEZK4NF62b8kNrGuvGXVF2AbYV0AAxglRvonvC\n\tby3fOtwDa2wKdbnb+/1Og4TKcsRJa5APmFSv4WwzZLrvd9Okv3bUux2qlplzVNC3Ah\n\tSjElu8km1314sIPVOhsPjBcnHBOhpUvbTR46iLJw=",
        "From": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Fri, 19 Nov 2021 23:02:36 +0200",
        "Message-Id": "<20211119210239.18540-3-laurent.pinchart@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.32.0",
        "In-Reply-To": "<20211119210239.18540-1-laurent.pinchart@ideasonboard.com>",
        "References": "<20211119210239.18540-1-laurent.pinchart@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v2 2/5] ipa: ipu3: agc: Standardize\n\tvocabulary on \"relative luminance\"",
        "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 AGC computes the average relative luminance of the frame and calls\nthe value \"normalized luma\", \"brightness\" or \"initialY\". The latter is\nthe most accurate term, as the relative luminance is abbreviated Y, but\nthe \"initial\" prefix isn't accurate.\n\nStandardize the vocabulary on \"relative luminance\" in code and comments,\nabbreviating it to Y when needed.\n\nWhile at it, rename variables to match the libcamera coding style.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\nChanges since v1:\n\n- Improve comment about relative luminance computation\n---\n src/ipa/ipu3/algorithms/agc.cpp | 44 ++++++++++++++++-----------------\n src/ipa/ipu3/algorithms/agc.h   |  8 +++---\n 2 files changed, 26 insertions(+), 26 deletions(-)",
    "diff": "diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\nindex 43a39ffd57d6..9cd2ded501ed 100644\n--- a/src/ipa/ipu3/algorithms/agc.cpp\n+++ b/src/ipa/ipu3/algorithms/agc.cpp\n@@ -62,12 +62,12 @@ static constexpr double kEvGainTarget = 0.5;\n static constexpr uint32_t kNumStartupFrames = 10;\n \n /*\n- * Normalized luma value target.\n+ * Relative luminance target.\n  *\n  * It's a number that's chosen so that, when the camera points at a grey\n  * target, the resulting image brightness is considered right.\n  */\n-static constexpr double kNormalizedLumaTarget = 0.16;\n+static constexpr double kRelativeLuminanceTarget = 0.16;\n \n Agc::Agc()\n \t: frameCount_(0), iqMean_(0.0), lineDuration_(0s), minShutterSpeed_(0s),\n@@ -250,12 +250,12 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double currentYGain)\n }\n \n /**\n- * \\brief Estimate the average brightness of the frame\n+ * \\brief Estimate the relative luminance of the frame with a given gain\n  * \\param[in] frameContext The shared IPA frame context\n  * \\param[in] grid The grid used to store the statistics in the IPU3\n  * \\param[in] stats The IPU3 statistics and ISP results\n  * \\param[in] currentYGain The gain calculated on the current brightness level\n- * \\return The normalized luma\n+ * \\return The relative luminance\n  *\n  * Luma is the weighted sum of gamma-compressed R′G′B′ components of a color\n  * video. The luma values are normalized as 0.0 to 1.0, with 1.0 being a\n@@ -263,12 +263,12 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double currentYGain)\n  * luma here.\n  *\n  * More detailed information can be found in:\n- * https://en.wikipedia.org/wiki/Luma_(video)\n+ * https://en.wikipedia.org/wiki/Relative_luminance\n  */\n-double Agc::computeInitialY(IPAFrameContext &frameContext,\n-\t\t\t    const ipu3_uapi_grid_config &grid,\n-\t\t\t    const ipu3_uapi_stats_3a *stats,\n-\t\t\t    double currentYGain)\n+double Agc::estimateLuminance(IPAFrameContext &frameContext,\n+\t\t\t      const ipu3_uapi_grid_config &grid,\n+\t\t\t      const ipu3_uapi_stats_3a *stats,\n+\t\t\t      double currentYGain)\n {\n \tdouble redSum = 0, greenSum = 0, blueSum = 0;\n \n@@ -288,14 +288,14 @@ double Agc::computeInitialY(IPAFrameContext &frameContext,\n \t}\n \n \t/*\n-\t * Estimate the sum of the brightness values, weighted with the gains\n-\t * applied on the channels in AWB as the Rec. 601 luma.\n+\t * Apply the AWB gains to approximate colours correctly, use the Rec.\n+\t * 601 formula to calculate the relative luminance, and normalize it.\n \t */\n-\tdouble Y_sum = redSum * frameContext.awb.gains.red * .299 +\n-\t\t       greenSum * frameContext.awb.gains.green * .587 +\n-\t\t       blueSum * frameContext.awb.gains.blue * .114;\n+\tdouble ySum = redSum * frameContext.awb.gains.red * 0.299\n+\t\t    + greenSum * frameContext.awb.gains.green * 0.587\n+\t\t    + blueSum * frameContext.awb.gains.blue * 0.114;\n \n-\treturn Y_sum / (grid.height * grid.width) / 255;\n+\treturn ySum / (grid.height * grid.width) / 255;\n }\n \n /**\n@@ -311,22 +311,22 @@ void Agc::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)\n \tmeasureBrightness(stats, context.configuration.grid.bdsGrid);\n \n \tdouble currentYGain = 1.0;\n-\tdouble targetY = kNormalizedLumaTarget;\n+\tdouble yTarget = kRelativeLuminanceTarget;\n \n \t/*\n \t * Do this calculation a few times as brightness increase can be\n \t * non-linear when there are saturated regions.\n \t */\n-\tfor (int i = 0; i < 8; i++) {\n-\t\tdouble initialY = computeInitialY(context.frameContext,\n+\tfor (unsigned int i = 0; i < 8; i++) {\n+\t\tdouble yValue = estimateLuminance(context.frameContext,\n \t\t\t\t\t\t  context.configuration.grid.bdsGrid,\n \t\t\t\t\t\t  stats, currentYGain);\n-\t\tdouble extra_gain = std::min(10.0, targetY / (initialY + .001));\n+\t\tdouble extra_gain = std::min(10.0, yTarget / (yValue + .001));\n \n \t\tcurrentYGain *= extra_gain;\n-\t\tLOG(IPU3Agc, Debug) << \"Initial Y \" << initialY\n-\t\t\t\t    << \" target \" << targetY\n-\t\t\t\t    << \" gives gain \" << currentYGain;\n+\t\tLOG(IPU3Agc, Debug) << \"Y value: \" << yValue\n+\t\t\t\t    << \", Y target: \" << yTarget\n+\t\t\t\t    << \", gives gain \" << currentYGain;\n \t\tif (extra_gain < 1.01)\n \t\t\tbreak;\n \t}\ndiff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h\nindex 31c5a6e519d4..943c354a820e 100644\n--- a/src/ipa/ipu3/algorithms/agc.h\n+++ b/src/ipa/ipu3/algorithms/agc.h\n@@ -35,10 +35,10 @@ private:\n \t\t\t       const ipu3_uapi_grid_config &grid);\n \tvoid filterExposure();\n \tvoid computeExposure(IPAFrameContext &frameContext, double currentYGain);\n-\tdouble computeInitialY(IPAFrameContext &frameContext,\n-\t\t\t       const ipu3_uapi_grid_config &grid,\n-\t\t\t       const ipu3_uapi_stats_3a *stats,\n-\t\t\t       double currentYGain);\n+\tdouble estimateLuminance(IPAFrameContext &frameContext,\n+\t\t\t\t const ipu3_uapi_grid_config &grid,\n+\t\t\t\t const ipu3_uapi_stats_3a *stats,\n+\t\t\t\t double currentYGain);\n \n \tuint64_t frameCount_;\n \n",
    "prefixes": [
        "libcamera-devel",
        "v2",
        "2/5"
    ]
}