Show a patch.

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

{
    "id": 14232,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/14232/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/14232/",
    "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": "<20211021164401.110033-13-jeanmichel.hautbois@ideasonboard.com>",
    "date": "2021-10-21T16:43:59",
    "name": "[libcamera-devel,v3,12/14] ipa: ipu3: agc: Refactor condition on exposure correction",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "4dfa86153d6f982501704bd6747c86f8b9230654",
    "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/14232/mbox/",
    "series": [
        {
            "id": 2646,
            "url": "https://patchwork.libcamera.org/api/1.1/series/2646/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2646",
            "date": "2021-10-21T16:43:47",
            "name": "ipa: ipu3: Fix AGC bugs",
            "version": 3,
            "mbox": "https://patchwork.libcamera.org/series/2646/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/14232/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/14232/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 61B2DC324E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 21 Oct 2021 16:44:19 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 19DFD68F6F;\n\tThu, 21 Oct 2021 18:44:19 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D259168F59\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 21 Oct 2021 18:44:07 +0200 (CEST)",
            "from tatooine.ideasonboard.com (unknown\n\t[IPv6:2a01:e0a:169:7140:f9d:5926:ad90:4996])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 878581BF9;\n\tThu, 21 Oct 2021 18:44:07 +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=\"DDBrpRbS\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1634834647;\n\tbh=u4QrSlBw8RRNyogIi79NoUHOvwIRMulp/WW640l/xjM=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=DDBrpRbSSoZgFd5RXO5D571EBlBqFl0Q/lh2g9hTzKGTnvleSnj2MiesqieGorrnC\n\tIzNizPUyR0ABUJaSk50czTa+ViPfEqp5xdCXjIzcxARWXdWqtBFvUrrbZoRnCyso82\n\tQhfGVZKWZ07ysVxnYb7uce9SXtMPC1Vlh+XV3Gbw=",
        "From": "Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Thu, 21 Oct 2021 18:43:59 +0200",
        "Message-Id": "<20211021164401.110033-13-jeanmichel.hautbois@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.32.0",
        "In-Reply-To": "<20211021164401.110033-1-jeanmichel.hautbois@ideasonboard.com>",
        "References": "<20211021164401.110033-1-jeanmichel.hautbois@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v3 12/14] ipa: ipu3: agc: Refactor\n\tcondition on exposure correction",
        "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": "Until now, we can't know when the exposure and gains applied in the\nIPAIPU3::setControls() are really applied (it can be several frames). We\ndon't want to use the values calculated as if they are already applied,\nand this is done by testing the frame number.\n\nWhen the exposure is estimated, we verify if it changed enough for\nexposure and gain to be updated.\n\nKeep the indentation level removal and simply return when the change is\nso small there is no need to apply the newly calculated value.\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/agc.cpp | 91 ++++++++++++++++-----------------\n 1 file changed, 45 insertions(+), 46 deletions(-)",
    "diff": "diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\nindex 43ef89df..7ff3029b 100644\n--- a/src/ipa/ipu3/algorithms/agc.cpp\n+++ b/src/ipa/ipu3/algorithms/agc.cpp\n@@ -138,60 +138,59 @@ void Agc::lockExposureGain(uint32_t &exposure, double &analogueGain)\n \tif ((frameCount_ < kInitialFrameMinAECount) || (frameCount_ - lastFrame_ < kFrameSkipCount))\n \t\treturn;\n \n-\t/* Are we correctly exposed ? */\n-\tif (std::abs(iqMean_ - kEvGainTarget * knumHistogramBins) <= 1) {\n-\t\tLOG(IPU3Agc, Debug) << \"!!! Good exposure with iqMean = \" << iqMean_;\n-\t} else {\n-\t\tdouble evGain = kEvGainTarget * knumHistogramBins / iqMean_;\n+\tif (std::abs(iqMean_ - kEvGainTarget * knumHistogramBins) <= 1)\n+\t\treturn;\n \n-\t\t/* extracted from Rpi::Agc::computeTargetExposure */\n-\t\tutils::Duration currentShutter = exposure * lineDuration_;\n-\t\tcurrentExposureNoDg_ = currentShutter * analogueGain;\n-\t\tLOG(IPU3Agc, Debug) << \"Actual total exposure \" << currentExposureNoDg_\n-\t\t\t\t    << \" Shutter speed \" << currentShutter\n-\t\t\t\t    << \" Gain \" << analogueGain\n-\t\t\t\t    << \" Needed ev gain \" << evGain;\n+\tdouble evGain = kEvGainTarget * knumHistogramBins / iqMean_;\n \n-\t\tcurrentExposure_ = prevExposureValue_ * evGain;\n-\t\tutils::Duration minShutterSpeed = minExposureLines_ * lineDuration_;\n-\t\tutils::Duration maxShutterSpeed = maxExposureLines_ * lineDuration_;\n+\t/* extracted from Rpi::Agc::computeTargetExposure */\n+\tutils::Duration currentShutter = exposure * lineDuration_;\n+\tcurrentExposureNoDg_ = currentShutter * analogueGain;\n+\tLOG(IPU3Agc, Debug) << \"Actual total exposure \" << currentExposureNoDg_\n+\t\t\t    << \" Shutter speed \" << currentShutter\n+\t\t\t    << \" Gain \" << analogueGain\n+\t\t\t    << \" Needed ev gain \" << evGain;\n \n-\t\tutils::Duration maxTotalExposure = maxShutterSpeed * kMaxGain;\n-\t\tcurrentExposure_ = std::min(currentExposure_, maxTotalExposure);\n-\t\tLOG(IPU3Agc, Debug) << \"Target total exposure \" << currentExposure_\n-\t\t\t\t    << \", maximum is \" << maxTotalExposure;\n+\tcurrentExposure_ = prevExposureValue_ * evGain;\n+\tutils::Duration minShutterSpeed = minExposureLines_ * lineDuration_;\n+\tutils::Duration maxShutterSpeed = maxExposureLines_ * lineDuration_;\n \n-\t\t/* \\todo: estimate if we need to desaturate */\n-\t\tfilterExposure();\n+\tutils::Duration maxTotalExposure = maxShutterSpeed * kMaxGain;\n+\tcurrentExposure_ = std::min(currentExposure_, maxTotalExposure);\n+\tLOG(IPU3Agc, Debug) << \"Target total exposure \" << currentExposure_\n+\t\t\t    << \", maximum is \" << maxTotalExposure;\n \n-\t\tutils::Duration exposureValue = filteredExposure_;\n-\t\tutils::Duration shutterTime = minShutterSpeed;\n+\t/* \\todo: estimate if we need to desaturate */\n+\tfilterExposure();\n \n-\t\t/*\n-\t\t * Push the shutter time up to the maximum first, and only then\n-\t\t * increase the gain.\n-\t\t */\n-\t\tshutterTime = std::clamp<utils::Duration>(exposureValue / kMinGain,\n-\t\t\t\t\t\t\t  minShutterSpeed, maxShutterSpeed);\n-\t\tdouble stepGain = std::clamp(exposureValue / shutterTime,\n-\t\t\t\t\t     kMinGain, kMaxGain);\n-\t\tLOG(IPU3Agc, Debug) << \"Divided up shutter and gain are \"\n-\t\t\t\t    << shutterTime << \" and \"\n-\t\t\t\t    << stepGain;\n+\tutils::Duration exposureValue = filteredExposure_;\n+\tutils::Duration shutterTime = minShutterSpeed;\n \n-\t\texposure = shutterTime / lineDuration_;\n-\t\tanalogueGain = stepGain;\n+\t/*\n+\t* Push the shutter time up to the maximum first, and only then\n+\t* increase the gain.\n+\t*/\n+\tshutterTime = std::clamp<utils::Duration>(exposureValue / kMinGain,\n+\t\t\t\t\t\t  minShutterSpeed, maxShutterSpeed);\n+\tdouble stepGain = std::clamp(exposureValue / shutterTime,\n+\t\t\t\t     kMinGain, kMaxGain);\n+\tLOG(IPU3Agc, Debug) << \"Divided up shutter and gain are \"\n+\t\t\t    << shutterTime << \" and \"\n+\t\t\t    << stepGain;\n+\n+\texposure = shutterTime / lineDuration_;\n+\tanalogueGain = stepGain;\n+\n+\t/*\n+\t * Update the exposure value for the next process call.\n+\t *\n+\t * \\todo Obtain the values of the exposure time and analog gain\n+\t * that were actually used by the sensor, either from embedded\n+\t * data when available, or from the delayed controls\n+\t * infrastructure in case a slow down caused a mismatch.\n+\t */\n+\tprevExposureValue_ = shutterTime * analogueGain;\n \n-\t\t/*\n-\t\t * Update the exposure value for the next process call.\n-\t\t *\n-\t\t * \\todo Obtain the values of the exposure time and analog gain\n-\t\t * that were actually used by the sensor, either from embedded\n-\t\t * data when available, or from the delayed controls\n-\t\t * infrastructure in case a slow down caused a mismatch.\n-\t\t */\n-\t\tprevExposureValue_ = shutterTime * analogueGain;\n-\t}\n \tlastFrame_ = frameCount_;\n }\n \n",
    "prefixes": [
        "libcamera-devel",
        "v3",
        "12/14"
    ]
}