Show a patch.

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

{
    "id": 25048,
    "url": "https://patchwork.libcamera.org/api/patches/25048/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/25048/",
    "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": "<20251114005428.90024-19-kieran.bingham@ideasonboard.com>",
    "date": "2025-11-14T00:54:22",
    "name": "[v4,18/21] ipa: mali-c55: agc: Quantise the ISP Digital Gain",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "9060167558fcf8933071376af1d02c7c90d8604d",
    "submitter": {
        "id": 4,
        "url": "https://patchwork.libcamera.org/api/people/4/?format=api",
        "name": "Kieran Bingham",
        "email": "kieran.bingham@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/25048/mbox/",
    "series": [
        {
            "id": 5589,
            "url": "https://patchwork.libcamera.org/api/series/5589/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5589",
            "date": "2025-11-14T00:54:04",
            "name": "libipa: Introduce a Quantized type",
            "version": 4,
            "mbox": "https://patchwork.libcamera.org/series/5589/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/25048/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/25048/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 75126C3241\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 14 Nov 2025 00:55:11 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 28B4760AAD;\n\tFri, 14 Nov 2025 01:55:11 +0100 (CET)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 47E9C6069A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 14 Nov 2025 01:54:54 +0100 (CET)",
            "from charm.hippo-penny.ts.net\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id BC94420A4;\n\tFri, 14 Nov 2025 01:52:53 +0100 (CET)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"XOvCWz02\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1763081573;\n\tbh=58vba508uZ769PzpojQWpViY+uYaqEr0rRQ22PkPNSA=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=XOvCWz02E5t5BDWWeXGI0tAdc+Q0wJrEVSkj0BNwRotHiSxdN/Wkt7RuiRISRonDd\n\tXiNM92ru55tQEhbxDT5SUiELiGu/OKE3kz2FJM7q0gVA+EQmtoqsReA1JouXANts6/\n\t3PWr/048xedSFnqSq2YNM394/rQ25oX+fpYemmV8=",
        "From": "Kieran Bingham <kieran.bingham@ideasonboard.com>",
        "To": "libcamera devel <libcamera-devel@lists.libcamera.org>",
        "Cc": "Kieran Bingham <kieran.bingham@ideasonboard.com>",
        "Subject": "[PATCH v4 18/21] ipa: mali-c55: agc: Quantise the ISP Digital Gain",
        "Date": "Fri, 14 Nov 2025 00:54:22 +0000",
        "Message-ID": "<20251114005428.90024-19-kieran.bingham@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.51.1",
        "In-Reply-To": "<20251114005428.90024-1-kieran.bingham@ideasonboard.com>",
        "References": "<20251114005428.90024-1-kieran.bingham@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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 Mali-C55 ISP has a digital gain block which allows setting gain in Q5.8\nformat, a range of 0.0 to (very nearly) 32.0.\n\nConvert usage to the new UQ5_8 FixedPoint Quantised type which will\nsupport the conversion, clamping and quantisation so that the metadata\nand debug prints can now report the effective gain applied instead of\nthe potentially inaccurate float.\n\nAs the UQ5_8 type already clamps values, remove the explicit clamping.\nThis removes the clamping to a minimum of 1.0 gain, so we rely on\ncalculateNewEv to provide a valid gain.\n\nSigned-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n---\n src/ipa/mali-c55/algorithms/agc.cpp | 20 ++++++++++----------\n src/ipa/mali-c55/ipa_context.h      |  6 +++---\n 2 files changed, 13 insertions(+), 13 deletions(-)",
    "diff": "diff --git a/src/ipa/mali-c55/algorithms/agc.cpp b/src/ipa/mali-c55/algorithms/agc.cpp\nindex f60fddac3f04..3f10b237f581 100644\n--- a/src/ipa/mali-c55/algorithms/agc.cpp\n+++ b/src/ipa/mali-c55/algorithms/agc.cpp\n@@ -38,8 +38,8 @@ static constexpr unsigned int kNumHistogramBins = 256;\n  * format, a range of 0.0 to (very nearly) 32.0. We clamp from 1.0 to the actual\n  * max value which is 8191 * 2^-8.\n  */\n-static constexpr double kMinDigitalGain = 1.0;\n-static constexpr double kMaxDigitalGain = 31.99609375;\n+static constexpr float kMinDigitalGain = 1.0;\n+static constexpr float kMaxDigitalGain = UQ5_8::TraitsType::max;\n \n uint32_t AgcStatistics::decodeBinValue(uint16_t binVal)\n {\n@@ -236,7 +236,7 @@ void Agc::queueRequest(IPAContext &context, const uint32_t frame,\n \t\tagc.manual.ispGain = *digitalGain;\n \n \t\tLOG(MaliC55Agc, Debug)\n-\t\t\t<< \"Digital gain set to \" << agc.manual.ispGain\n+\t\t\t<< \"Digital gain set to \" << agc.manual.ispGain.value()\n \t\t\t<< \" on request sequence \" << frame;\n \t}\n }\n@@ -245,7 +245,7 @@ size_t Agc::fillGainParamBlock(IPAContext &context, IPAFrameContext &frameContex\n \t\t\t       mali_c55_params_block block)\n {\n \tIPAActiveState &activeState = context.activeState;\n-\tdouble gain;\n+\tUQ5_8 gain;\n \n \tif (activeState.agc.autoEnabled)\n \t\tgain = activeState.agc.automatic.ispGain;\n@@ -256,7 +256,7 @@ size_t Agc::fillGainParamBlock(IPAContext &context, IPAFrameContext &frameContex\n \tblock.header->flags = MALI_C55_PARAM_BLOCK_FL_NONE;\n \tblock.header->size = sizeof(struct mali_c55_params_digital_gain);\n \n-\tblock.digital_gain->gain = floatingToFixedPoint<5, 8, uint16_t, double>(gain);\n+\tblock.digital_gain->gain = gain.quantized();\n \tframeContext.agc.ispGain = gain;\n \n \treturn block.header->size;\n@@ -376,7 +376,7 @@ void Agc::process(IPAContext &context,\n \t */\n \tuint32_t exposure = frameContext.agc.exposure;\n \tdouble analogueGain = frameContext.agc.sensorGain;\n-\tdouble digitalGain = frameContext.agc.ispGain;\n+\tdouble digitalGain = frameContext.agc.ispGain.value();\n \tdouble totalGain = analogueGain * digitalGain;\n \tutils::Duration currentShutter = exposure * configuration.sensor.lineDuration;\n \tutils::Duration effectiveExposureValue = currentShutter * totalGain;\n@@ -388,19 +388,19 @@ void Agc::process(IPAContext &context,\n \t\t\t       activeState.agc.exposureMode, statistics_.yHist,\n \t\t\t       effectiveExposureValue);\n \n-\tdGain = std::clamp(dGain, kMinDigitalGain, kMaxDigitalGain);\n+\tUQ5_8 dGainQ = static_cast<float>(dGain);\n \n \tLOG(MaliC55Agc, Debug)\n \t\t<< \"Divided up shutter, analogue gain and digital gain are \"\n-\t\t<< shutterTime << \", \" << aGain << \" and \" << dGain;\n+\t\t<< shutterTime << \", \" << aGain << \" and \" << dGainQ.value();\n \n \tactiveState.agc.automatic.exposure = shutterTime / configuration.sensor.lineDuration;\n \tactiveState.agc.automatic.sensorGain = aGain;\n-\tactiveState.agc.automatic.ispGain = dGain;\n+\tactiveState.agc.automatic.ispGain = dGainQ;\n \n \tmetadata.set(controls::ExposureTime, currentShutter.get<std::micro>());\n \tmetadata.set(controls::AnalogueGain, frameContext.agc.sensorGain);\n-\tmetadata.set(controls::DigitalGain, frameContext.agc.ispGain);\n+\tmetadata.set(controls::DigitalGain, frameContext.agc.ispGain.value());\n \tmetadata.set(controls::ColourTemperature, context.activeState.agc.temperatureK);\n }\n \ndiff --git a/src/ipa/mali-c55/ipa_context.h b/src/ipa/mali-c55/ipa_context.h\nindex 86d060a731cb..2db3fdf9e5cf 100644\n--- a/src/ipa/mali-c55/ipa_context.h\n+++ b/src/ipa/mali-c55/ipa_context.h\n@@ -41,12 +41,12 @@ struct IPAActiveState {\n \t\tstruct {\n \t\t\tuint32_t exposure;\n \t\t\tdouble sensorGain;\n-\t\t\tdouble ispGain;\n+\t\t\tUQ5_8 ispGain;\n \t\t} automatic;\n \t\tstruct {\n \t\t\tuint32_t exposure;\n \t\t\tdouble sensorGain;\n-\t\t\tdouble ispGain;\n+\t\t\tUQ5_8 ispGain;\n \t\t} manual;\n \t\tbool autoEnabled;\n \t\tuint32_t constraintMode;\n@@ -64,7 +64,7 @@ struct IPAFrameContext : public FrameContext {\n \tstruct {\n \t\tuint32_t exposure;\n \t\tdouble sensorGain;\n-\t\tdouble ispGain;\n+\t\tUQ5_8 ispGain;\n \t} agc;\n \n \tstruct {\n",
    "prefixes": [
        "v4",
        "18/21"
    ]
}