Show a patch.

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

{
    "id": 10460,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/10460/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/10460/",
    "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": "<20201123073804.3125-2-david.plowman@raspberrypi.com>",
    "date": "2020-11-23T07:37:55",
    "name": "[libcamera-devel,v2,01/10] libcamera: ipa: raspberrypi: agc: Use libcamera debug",
    "commit_ref": "dbe573979ccb0989ea288e782b5fb700519f84e9",
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "98c811f6f74b7608ae222ce79497f208bed78ecb",
    "submitter": {
        "id": 42,
        "url": "https://patchwork.libcamera.org/api/1.1/people/42/?format=api",
        "name": "David Plowman",
        "email": "david.plowman@raspberrypi.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/10460/mbox/",
    "series": [
        {
            "id": 1475,
            "url": "https://patchwork.libcamera.org/api/1.1/series/1475/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1475",
            "date": "2020-11-23T07:37:54",
            "name": "Raspberry Pi AGC",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/1475/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/10460/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/10460/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 DF8C3BE08A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 23 Nov 2020 07:38:33 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 956C86332E;\n\tMon, 23 Nov 2020 08:38:33 +0100 (CET)",
            "from mail-wr1-x432.google.com (mail-wr1-x432.google.com\n\t[IPv6:2a00:1450:4864:20::432])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5E78163320\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 23 Nov 2020 08:38:31 +0100 (CET)",
            "by mail-wr1-x432.google.com with SMTP id p8so17578082wrx.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 22 Nov 2020 23:38:31 -0800 (PST)",
            "from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72])\n\tby smtp.gmail.com with ESMTPSA id\n\th15sm17841822wrw.15.2020.11.22.23.38.29\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSun, 22 Nov 2020 23:38:30 -0800 (PST)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"nmqyWuDu\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=u46CcECDOCNqmkIJKCIsZpcth4nWLgktLU0Jsd2RAiw=;\n\tb=nmqyWuDuca7SE4PrYHEMKsdmHIcof61/h9ocmJtQ18mDEESqNDGut6KNfp6ut90Gkz\n\tI7IoZ8ZSPO/XlDNjSE5+CvW1DbJYH8tp4dXuN0VZJghpA0I4Y6aHpfc/tBpEwxIUvD/2\n\tM9SwUtTfFrv65ge4PQA8kGx8o84NgDl9105X9UIxpV1AWlgsPinedELvnbM/Znt2MYua\n\tvE/sTMu7G+9XL6EnyxC8yJF7BkOCcr78IjKvGPmRj3Sy8gSE19GgDHkHq7V/QlSJhVPk\n\td7+2YZvA6KugLE8Rbqkhh7tW6wnrh0Gx+bM/tywmnMCfFRZ8+w3pkUC7/0AlIpwNfmoe\n\t7q5Q==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:mime-version:content-transfer-encoding;\n\tbh=u46CcECDOCNqmkIJKCIsZpcth4nWLgktLU0Jsd2RAiw=;\n\tb=iQiVa2nqGt7MuiOBywBnyu/7kcIa/XY1nCjtTe7u4rvW04mi8ZK1jcHLRgyJIFI3/P\n\ttOoegL8beE+w0/0TUTUMEzJBE5InJD8BgxtIljAQs9H7+acbl6XFs5gmmOZwx9CDNCth\n\txYQA3Li4eFsLTtxryyDl5nw+1GE6Dw8I3zlnvkE7G0wOJTXyVXcYie8vHFiRdyngHyRS\n\tVG6/qX200J4S1HvBDriLbPgosO+vQUrAQ5Td2JCOYFZyqB339Ol7Uq20suhU3kyqZXlw\n\tYHYwSqyPs+LpRDgXK3WznTxFJCr8SIJ5D6ox/UjJ1DU3f4x2zZ3EM+AlQAdxaKz5u6TO\n\tWW3A==",
        "X-Gm-Message-State": "AOAM532ZC7UuClSVSFPWlr+sSfzFjbHgb1PaSx1+pW6S01nqFy3G3q1r\n\tJPrytgxarJoFuBnjCSOEFuGisu1Ibo/9bKcF",
        "X-Google-Smtp-Source": "ABdhPJw+18J+5cMXhCSFI+G9rob45GmtnNR/So1sGe1sIcEO/s5voLE6HR/d3bcOQlZHngQ7shZ56g==",
        "X-Received": "by 2002:adf:814f:: with SMTP id\n\t73mr29115330wrm.174.1606117110646; \n\tSun, 22 Nov 2020 23:38:30 -0800 (PST)",
        "From": "David Plowman <david.plowman@raspberrypi.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Mon, 23 Nov 2020 07:37:55 +0000",
        "Message-Id": "<20201123073804.3125-2-david.plowman@raspberrypi.com>",
        "X-Mailer": "git-send-email 2.20.1",
        "In-Reply-To": "<20201123073804.3125-1-david.plowman@raspberrypi.com>",
        "References": "<20201123073804.3125-1-david.plowman@raspberrypi.com>",
        "MIME-Version": "1.0",
        "Subject": "[libcamera-devel] [PATCH v2 01/10] libcamera: ipa: raspberrypi:\n\tagc: Use libcamera debug",
        "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>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "Replace Raspberry Pi debug with libcamera debug.\n\nSigned-off-by: David Plowman <david.plowman@raspberrypi.com>\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\n---\n src/ipa/raspberrypi/controller/rpi/agc.cpp | 90 +++++++++++-----------\n 1 file changed, 47 insertions(+), 43 deletions(-)",
    "diff": "diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp\nindex df4d3647..8079345b 100644\n--- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n@@ -9,16 +9,20 @@\n \n #include \"linux/bcm2835-isp.h\"\n \n+#include \"libcamera/internal/log.h\"\n+\n #include \"../awb_status.h\"\n #include \"../device_status.h\"\n #include \"../histogram.hpp\"\n-#include \"../logging.hpp\"\n #include \"../lux_status.h\"\n #include \"../metadata.hpp\"\n \n #include \"agc.hpp\"\n \n using namespace RPiController;\n+using namespace libcamera;\n+\n+LOG_DEFINE_CATEGORY(RPiAgc)\n \n #define NAME \"rpi.agc\"\n \n@@ -128,7 +132,7 @@ static std::string read_constraint_modes(\n \n void AgcConfig::Read(boost::property_tree::ptree const &params)\n {\n-\tRPI_LOG(\"AgcConfig\");\n+\tLOG(RPiAgc, Debug) << \"AgcConfig\";\n \tdefault_metering_mode = read_metering_modes(\n \t\tmetering_modes, params.get_child(\"metering_modes\"));\n \tdefault_exposure_mode = read_exposure_modes(\n@@ -166,7 +170,7 @@ char const *Agc::Name() const\n \n void Agc::Read(boost::property_tree::ptree const &params)\n {\n-\tRPI_LOG(\"Agc\");\n+\tLOG(RPiAgc, Debug) << \"Agc\";\n \tconfig_.Read(params);\n \t// Set the config's defaults (which are the first ones it read) as our\n \t// current modes, until someone changes them.  (they're all known to\n@@ -254,15 +258,15 @@ void Agc::Prepare(Metadata *image_metadata)\n \t\t\t\tstatus.digital_gain =\n \t\t\t\t\tstatus_.total_exposure_value /\n \t\t\t\t\tactual_exposure;\n-\t\t\t\tRPI_LOG(\"Want total exposure \" << status_.total_exposure_value);\n+\t\t\t\tLOG(RPiAgc, Debug) << \"Want total exposure \" << status_.total_exposure_value;\n \t\t\t\t// Never ask for a gain < 1.0, and also impose\n \t\t\t\t// some upper limit. Make it customisable?\n \t\t\t\tstatus.digital_gain = std::max(\n \t\t\t\t\t1.0,\n \t\t\t\t\tstd::min(status.digital_gain, 4.0));\n-\t\t\t\tRPI_LOG(\"Actual exposure \" << actual_exposure);\n-\t\t\t\tRPI_LOG(\"Use digital_gain \" << status.digital_gain);\n-\t\t\t\tRPI_LOG(\"Effective exposure \" << actual_exposure * status.digital_gain);\n+\t\t\t\tLOG(RPiAgc, Debug) << \"Actual exposure \" << actual_exposure;\n+\t\t\t\tLOG(RPiAgc, Debug) << \"Use digital_gain \" << status.digital_gain;\n+\t\t\t\tLOG(RPiAgc, Debug) << \"Effective exposure \" << actual_exposure * status.digital_gain;\n \t\t\t\t// Decide whether AEC/AGC has converged.\n \t\t\t\t// Insist AGC is steady for MAX_LOCK_COUNT\n \t\t\t\t// frames before we say we are \"locked\".\n@@ -285,11 +289,11 @@ void Agc::Prepare(Metadata *image_metadata)\n \t\t\t\t\t\t status.target_exposure_value\n \t\t\t\t\t\t - 1.5 * err)\n \t\t\t\t\t\tlock_count_ = lock_count;\n-\t\t\t\t\tRPI_LOG(\"Lock count: \" << lock_count_);\n+\t\t\t\t\tLOG(RPiAgc, Debug) << \"Lock count: \" << lock_count_;\n \t\t\t\t}\n \t\t\t}\n \t\t} else\n-\t\t\tRPI_LOG(Name() << \": no device metadata\");\n+\t\t\tLOG(RPiAgc, Debug) << Name() << \": no device metadata\";\n \t\tstatus.locked = lock_count_ >= MAX_LOCK_COUNT;\n \t\t//printf(\"%s\\n\", status.locked ? \"+++++++++\" : \"-\");\n \t\timage_metadata->Set(\"agc.status\", status);\n@@ -343,9 +347,9 @@ void Agc::housekeepConfig()\n \t\tstatus_.fixed_analogue_gain = fixed_analogue_gain_;\n \t\tstatus_.flicker_period = flicker_period_;\n \t}\n-\tRPI_LOG(\"ev \" << status_.ev << \" fixed_shutter \"\n-\t\t      << status_.fixed_shutter << \" fixed_analogue_gain \"\n-\t\t      << status_.fixed_analogue_gain);\n+\tLOG(RPiAgc, Debug) << \"ev \" << status_.ev << \" fixed_shutter \"\n+\t\t\t   << status_.fixed_shutter << \" fixed_analogue_gain \"\n+\t\t\t   << status_.fixed_analogue_gain;\n \t// Make sure the \"mode\" pointers point to the up-to-date things, if\n \t// they've changed.\n \tif (strcmp(new_metering_mode_name.c_str(), status_.metering_mode)) {\n@@ -376,10 +380,10 @@ void Agc::housekeepConfig()\n \t\tcopy_string(new_constraint_mode_name, status_.constraint_mode,\n \t\t\t    sizeof(status_.constraint_mode));\n \t}\n-\tRPI_LOG(\"exposure_mode \"\n-\t\t<< new_exposure_mode_name << \" constraint_mode \"\n-\t\t<< new_constraint_mode_name << \" metering_mode \"\n-\t\t<< new_metering_mode_name);\n+\tLOG(RPiAgc, Debug) << \"exposure_mode \"\n+\t\t\t   << new_exposure_mode_name << \" constraint_mode \"\n+\t\t\t   << new_constraint_mode_name << \" metering_mode \"\n+\t\t\t   << new_metering_mode_name;\n }\n \n void Agc::fetchCurrentExposure(Metadata *image_metadata)\n@@ -404,7 +408,7 @@ static double compute_initial_Y(bcm2835_isp_stats *stats, Metadata *image_metada\n \tstruct AwbStatus awb;\n \tawb.gain_r = awb.gain_g = awb.gain_b = 1.0; // in case no metadata\n \tif (image_metadata->Get(\"awb.status\", awb) != 0)\n-\t\tRPI_WARN(\"Agc: no AWB status found\");\n+\t\tLOG(RPiAgc, Warning) << \"Agc: no AWB status found\";\n \tdouble Y_sum = 0, weight_sum = 0;\n \tfor (int i = 0; i < AGC_STATS_SIZE; i++) {\n \t\tif (regions[i].counted == 0)\n@@ -443,7 +447,7 @@ void Agc::computeGain(bcm2835_isp_stats *statistics, Metadata *image_metadata,\n \tstruct LuxStatus lux = {};\n \tlux.lux = 400; // default lux level to 400 in case no metadata found\n \tif (image_metadata->Get(\"lux.status\", lux) != 0)\n-\t\tRPI_WARN(\"Agc: no lux level found\");\n+\t\tLOG(RPiAgc, Warning) << \"Agc: no lux level found\";\n \tHistogram h(statistics->hist[0].g_hist, NUM_HISTOGRAM_BINS);\n \tdouble ev_gain = status_.ev * config_.base_ev;\n \t// The initial gain and target_Y come from some of the regions. After\n@@ -454,28 +458,28 @@ void Agc::computeGain(bcm2835_isp_stats *statistics, Metadata *image_metadata,\n \tdouble initial_Y = compute_initial_Y(statistics, image_metadata,\n \t\t\t\t\t     metering_mode_->weights);\n \tgain = std::min(10.0, target_Y / (initial_Y + .001));\n-\tRPI_LOG(\"Initially Y \" << initial_Y << \" target \" << target_Y\n-\t\t\t       << \" gives gain \" << gain);\n+\tLOG(RPiAgc, Debug) << \"Initially Y \" << initial_Y << \" target \" << target_Y\n+\t\t\t   << \" gives gain \" << gain;\n \tfor (auto &c : *constraint_mode_) {\n \t\tdouble new_target_Y;\n \t\tdouble new_gain =\n \t\t\tconstraint_compute_gain(c, h, lux.lux, ev_gain,\n \t\t\t\t\t\tnew_target_Y);\n-\t\tRPI_LOG(\"Constraint has target_Y \"\n-\t\t\t<< new_target_Y << \" giving gain \" << new_gain);\n+\t\tLOG(RPiAgc, Debug) << \"Constraint has target_Y \"\n+\t\t\t\t   << new_target_Y << \" giving gain \" << new_gain;\n \t\tif (c.bound == AgcConstraint::Bound::LOWER &&\n \t\t    new_gain > gain) {\n-\t\t\tRPI_LOG(\"Lower bound constraint adopted\");\n+\t\t\tLOG(RPiAgc, Debug) << \"Lower bound constraint adopted\";\n \t\t\tgain = new_gain, target_Y = new_target_Y;\n \t\t} else if (c.bound == AgcConstraint::Bound::UPPER &&\n \t\t\t   new_gain < gain) {\n-\t\t\tRPI_LOG(\"Upper bound constraint adopted\");\n+\t\t\tLOG(RPiAgc, Debug) << \"Upper bound constraint adopted\";\n \t\t\tgain = new_gain, target_Y = new_target_Y;\n \t\t}\n \t}\n-\tRPI_LOG(\"Final gain \" << gain << \" (target_Y \" << target_Y << \" ev \"\n-\t\t\t      << status_.ev << \" base_ev \" << config_.base_ev\n-\t\t\t      << \")\");\n+\tLOG(RPiAgc, Debug) << \"Final gain \" << gain << \" (target_Y \" << target_Y << \" ev \"\n+\t\t\t   << status_.ev << \" base_ev \" << config_.base_ev\n+\t\t\t   << \")\";\n }\n \n void Agc::computeTargetExposure(double gain)\n@@ -494,7 +498,7 @@ void Agc::computeTargetExposure(double gain)\n \t\t\t : exposure_mode_->gain.back());\n \ttarget_.total_exposure = std::min(target_.total_exposure,\n \t\t\t\t\t  max_total_exposure);\n-\tRPI_LOG(\"Target total_exposure \" << target_.total_exposure);\n+\tLOG(RPiAgc, Debug) << \"Target total_exposure \" << target_.total_exposure;\n }\n \n bool Agc::applyDigitalGain(Metadata *image_metadata, double gain,\n@@ -509,9 +513,9 @@ bool Agc::applyDigitalGain(Metadata *image_metadata, double gain,\n \t\t\t\t\t   std::min(awb.gain_g, awb.gain_b));\n \t\tdg *= std::max(1.0, 1.0 / min_gain);\n \t} else\n-\t\tRPI_WARN(\"Agc: no AWB status found\");\n-\tRPI_LOG(\"after AWB, target dg \" << dg << \" gain \" << gain\n-\t\t\t\t\t<< \" target_Y \" << target_Y);\n+\t\tLOG(RPiAgc, Warning) << \"Agc: no AWB status found\";\n+\tLOG(RPiAgc, Debug) << \"after AWB, target dg \" << dg << \" gain \" << gain\n+\t\t\t   << \" target_Y \" << target_Y;\n \t// Finally, if we're trying to reduce exposure but the target_Y is\n \t// \"close\" to 1.0, then the gain computed for that constraint will be\n \t// only slightly less than one, because the measured Y can never be\n@@ -523,9 +527,9 @@ bool Agc::applyDigitalGain(Metadata *image_metadata, double gain,\n \t\t\t  gain < sqrt(target_Y);\n \tif (desaturate)\n \t\tdg /= config_.fast_reduce_threshold;\n-\tRPI_LOG(\"Digital gain \" << dg << \" desaturate? \" << desaturate);\n+\tLOG(RPiAgc, Debug) << \"Digital gain \" << dg << \" desaturate? \" << desaturate;\n \ttarget_.total_exposure_no_dg = target_.total_exposure / dg;\n-\tRPI_LOG(\"Target total_exposure_no_dg \" << target_.total_exposure_no_dg);\n+\tLOG(RPiAgc, Debug) << \"Target total_exposure_no_dg \" << target_.total_exposure_no_dg;\n \treturn desaturate;\n }\n \n@@ -560,8 +564,8 @@ void Agc::filterExposure(bool desaturate)\n \t    filtered_.total_exposure * config_.fast_reduce_threshold)\n \t\tfiltered_.total_exposure_no_dg = filtered_.total_exposure *\n \t\t\t\t\t\t config_.fast_reduce_threshold;\n-\tRPI_LOG(\"After filtering, total_exposure \" << filtered_.total_exposure <<\n-\t\t\" no dg \" << filtered_.total_exposure_no_dg);\n+\tLOG(RPiAgc, Debug) << \"After filtering, total_exposure \" << filtered_.total_exposure\n+\t\t\t   << \" no dg \" << filtered_.total_exposure_no_dg;\n }\n \n void Agc::divvyupExposure()\n@@ -602,8 +606,8 @@ void Agc::divvyupExposure()\n \t\t\t}\n \t\t}\n \t}\n-\tRPI_LOG(\"Divided up shutter and gain are \" << shutter_time << \" and \"\n-\t\t\t\t\t\t   << analogue_gain);\n+\tLOG(RPiAgc, Debug) << \"Divided up shutter and gain are \" << shutter_time << \" and \"\n+\t\t\t   << analogue_gain;\n \t// Finally adjust shutter time for flicker avoidance (require both\n \t// shutter and gain not to be fixed).\n \tif (status_.fixed_shutter == 0.0 &&\n@@ -621,8 +625,8 @@ void Agc::divvyupExposure()\n \t\t\t\t\t\t exposure_mode_->gain.back());\n \t\t\tshutter_time = new_shutter_time;\n \t\t}\n-\t\tRPI_LOG(\"After flicker avoidance, shutter \"\n-\t\t\t<< shutter_time << \" gain \" << analogue_gain);\n+\t\tLOG(RPiAgc, Debug) << \"After flicker avoidance, shutter \"\n+\t\t\t\t   << shutter_time << \" gain \" << analogue_gain;\n \t}\n \tfiltered_.shutter = shutter_time;\n \tfiltered_.analogue_gain = analogue_gain;\n@@ -641,10 +645,10 @@ void Agc::writeAndFinish(Metadata *image_metadata, bool desaturate)\n \t// Write to metadata as well, in case anyone wants to update the camera\n \t// immediately.\n \timage_metadata->Set(\"agc.status\", status_);\n-\tRPI_LOG(\"Output written, total exposure requested is \"\n-\t\t<< filtered_.total_exposure);\n-\tRPI_LOG(\"Camera exposure update: shutter time \" << filtered_.shutter <<\n-\t\t\" analogue gain \" << filtered_.analogue_gain);\n+\tLOG(RPiAgc, Debug) << \"Output written, total exposure requested is \"\n+\t\t\t   << filtered_.total_exposure;\n+\tLOG(RPiAgc, Debug) << \"Camera exposure update: shutter time \" << filtered_.shutter\n+\t\t\t   << \" analogue gain \" << filtered_.analogue_gain;\n }\n \n // Register algorithm with the system.\n",
    "prefixes": [
        "libcamera-devel",
        "v2",
        "01/10"
    ]
}