Show a patch.

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

{
    "id": 12741,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/12741/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/12741/",
    "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": "<20210628202255.138874-7-jeanmichel.hautbois@ideasonboard.com>",
    "date": "2021-06-28T20:22:54",
    "name": "[libcamera-devel,v1,6/7] ipa: ipu3: Call exposure and gain controls from AGC",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": false,
    "hash": "e2c28ef17c72271564e311ebcfe08cf8c15cc198",
    "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/12741/mbox/",
    "series": [
        {
            "id": 2190,
            "url": "https://patchwork.libcamera.org/api/1.1/series/2190/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2190",
            "date": "2021-06-28T20:22:48",
            "name": "ipa: Introduce a new open AGC",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/2190/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/12741/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/12741/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 D1C54C321F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 28 Jun 2021 20:23:08 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5C64E684DA;\n\tMon, 28 Jun 2021 22:23:08 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EA189684DB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 28 Jun 2021 22:23:00 +0200 (CEST)",
            "from tatooine.ideasonboard.com (unknown\n\t[IPv6:2a01:e0a:169:7140:c3ad:78d0:405e:fc33])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8E51D26FE;\n\tMon, 28 Jun 2021 22:23:00 +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=\"QowV7j1O\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1624911780;\n\tbh=0H5RRW/aa76Aso5YRFDVtrh9+lxoQDWTFOIFvrwtN2E=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=QowV7j1OHlNii6w/9SNk1P1shqNl36idreabYlTM/PIbs4NAc/Yey3Kvufx85tP3P\n\tSXyoYouFhREUqPrMRSTyQrevpSlPubgb98Ie6jT5CUSbPxP8tfnvd1XylgELjkvM3l\n\tehUW6/mDpsaP3gL5VhNqsSLG07W8fdQgnonLGzKI=",
        "From": "Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Mon, 28 Jun 2021 22:22:54 +0200",
        "Message-Id": "<20210628202255.138874-7-jeanmichel.hautbois@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20210628202255.138874-1-jeanmichel.hautbois@ideasonboard.com>",
        "References": "<20210628202255.138874-1-jeanmichel.hautbois@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v1 6/7] ipa: ipu3: Call exposure and gain\n\tcontrols from AGC",
        "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": "IPAIPU3 does not need to directly know the exposure and gain limits.\nMove the control min and max values to IPU3Agc as for the moment it is the one which\nneeds to use the values.\n\nSigned-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n---\n src/ipa/ipu3/ipu3.cpp     | 14 +++-----------\n src/ipa/ipu3/ipu3_agc.cpp | 28 +++++++++++++++++++++++-----\n src/ipa/ipu3/ipu3_agc.h   | 11 +++++++++--\n 3 files changed, 35 insertions(+), 18 deletions(-)",
    "diff": "diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\nindex 9a2def64..40b626ed 100644\n--- a/src/ipa/ipu3/ipu3.cpp\n+++ b/src/ipa/ipu3/ipu3.cpp\n@@ -67,11 +67,7 @@ private:\n \t/* Camera sensor controls. */\n \tuint32_t defVBlank_;\n \tuint32_t exposure_;\n-\tuint32_t minExposure_;\n-\tuint32_t maxExposure_;\n \tuint32_t gain_;\n-\tuint32_t minGain_;\n-\tuint32_t maxGain_;\n \n \t/* Interface to the AWB algorithm */\n \tstd::unique_ptr<IPU3Awb> awbAlgo_;\n@@ -187,13 +183,9 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo)\n \t\treturn -EINVAL;\n \t}\n \n-\tminExposure_ = std::max(itExp->second.min().get<int32_t>(), 1);\n-\tmaxExposure_ = itExp->second.max().get<int32_t>();\n-\texposure_ = minExposure_;\n+\texposure_ = itExp->second.def().get<int32_t>();\n \n-\tminGain_ = std::max(itGain->second.min().get<int32_t>(), 1);\n-\tmaxGain_ = itGain->second.max().get<int32_t>();\n-\tgain_ = minGain_;\n+\tgain_ = itGain->second.def().get<int32_t>();\n \n \tdefVBlank_ = itVBlank->second.def().get<int32_t>();\n \n@@ -205,7 +197,7 @@ int IPAIPU3::configure(const IPAConfigInfo &configInfo)\n \tawbAlgo_->initialise(params_, configInfo.bdsOutputSize, bdsGrid_);\n \n \tagcAlgo_ = std::make_unique<IPU3Agc>();\n-\tagcAlgo_->initialise(bdsGrid_, sensorInfo_);\n+\tagcAlgo_->initialise(bdsGrid_, configInfo);\n \n \treturn 0;\n }\ndiff --git a/src/ipa/ipu3/ipu3_agc.cpp b/src/ipa/ipu3/ipu3_agc.cpp\nindex 6253ab94..042d67fa 100644\n--- a/src/ipa/ipu3/ipu3_agc.cpp\n+++ b/src/ipa/ipu3/ipu3_agc.cpp\n@@ -10,10 +10,12 @@\n #include <algorithm>\n #include <cmath>\n #include <numeric>\n+#include <stdint.h>\n \n-#include <libcamera/base/log.h>\n+#include <linux/v4l2-controls.h>\n \n-#include <libcamera/ipa/core_ipa_interface.h>\n+#include <libcamera/base/log.h>\n+#include <libcamera/base/utils.h>\n \n #include \"libipa/histogram.h\"\n \n@@ -59,12 +61,28 @@ IPU3Agc::IPU3Agc()\n {\n }\n \n-void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo)\n+void IPU3Agc::initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPAConfigInfo &configInfo)\n {\n \taeGrid_ = bdsGrid;\n+\tctrls_ = configInfo.entityControls.at(0);\n \n-\tlineDuration_ = sensorInfo.lineLength * 1.0s / sensorInfo.pixelRate;\n-\tmaxExposureTime_ = kMaxExposure * lineDuration_;\n+\tconst auto itExp = ctrls_.find(V4L2_CID_EXPOSURE);\n+\tif (itExp == ctrls_.end()) {\n+\t\tLOG(IPU3Agc, Debug) << \"Can't find exposure control\";\n+\t\treturn;\n+\t}\n+\tminExposure_ = itExp->second.min().get<int32_t>();\n+\tmaxExposure_ = itExp->second.max().get<int32_t>();\n+\tlineDuration_ = configInfo.sensorInfo.lineLength * 1.0s / configInfo.sensorInfo.pixelRate;\n+\tmaxExposureTime_ = maxExposure_ * lineDuration_;\n+\n+\tconst auto itGain = ctrls_.find(V4L2_CID_ANALOGUE_GAIN);\n+\tif (itGain == ctrls_.end()) {\n+\t\tLOG(IPU3Agc, Debug) << \"Can't find gain control\";\n+\t\treturn;\n+\t}\n+\tminGain_ = std::max(itGain->second.min().get<int32_t>(), 1);\n+\tmaxGain_ = itGain->second.max().get<int32_t>();\n }\n \n void IPU3Agc::processBrightness(const ipu3_uapi_stats_3a *stats)\ndiff --git a/src/ipa/ipu3/ipu3_agc.h b/src/ipa/ipu3/ipu3_agc.h\nindex 774c8385..ce43c534 100644\n--- a/src/ipa/ipu3/ipu3_agc.h\n+++ b/src/ipa/ipu3/ipu3_agc.h\n@@ -15,7 +15,7 @@\n #include <linux/intel-ipu3.h>\n \n #include <libcamera/base/utils.h>\n-\n+#include <libcamera/ipa/ipu3_ipa_interface.h>\n #include <libcamera/geometry.h>\n \n #include \"libipa/algorithm.h\"\n@@ -35,8 +35,8 @@ public:\n \tIPU3Agc();\n \t~IPU3Agc() = default;\n \n-\tvoid initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo);\n \tvoid process(const ipu3_uapi_stats_3a *stats, uint32_t &exposure, double &gain);\n+\tvoid initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPAConfigInfo &configInfo);\n \tbool converged() { return converged_; }\n \tbool updateControls() { return updateControls_; }\n \t/* \\todo Use a metadata exchange between IPAs */\n@@ -48,6 +48,13 @@ private:\n \tvoid lockExposureGain(uint32_t &exposure, double &gain);\n \n \tstruct ipu3_uapi_grid_config aeGrid_;\n+\tControlInfoMap ctrls_;\n+\n+\tuint32_t minExposure_;\n+\tuint32_t maxExposure_;\n+\n+\tuint32_t minGain_;\n+\tuint32_t maxGain_;\n \n \tuint64_t frameCount_;\n \tuint64_t lastFrame_;\n",
    "prefixes": [
        "libcamera-devel",
        "v1",
        "6/7"
    ]
}