[{"id":27714,"web_url":"https://patchwork.libcamera.org/comment/27714/","msgid":"<u5exqk5v6ojlnsugfda5aiayp65cobof4cyqdwdoq6waxgx4nr@gtr4dinkibxd>","date":"2023-08-30T09:40:31","subject":"Re: [libcamera-devel] [PATCH v2 2/2] ipa: rpi: vc4: data: Update\n\ttuning files for HDR","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi David\n\nOn Wed, Aug 23, 2023 at 03:49:25PM +0100, David Plowman via libcamera-devel wrote:\n> All the Raspberry Pi official camera tuning files are updated for\n> HDR. As stated previously, there is no mechanism in the hardware for\n> combining images so all this does is enable multi-channel AGC to\n> produce short and long exposure frames. It will be up to the\n> application to deal with them.\n>\n> The changes are identical in every tuning file.\n>\n> 1. The existing AGC tuning is duplicated twice so that we have 3 AGC\n> channels.\n>\n> 2. The first is left alone (the default AGC channel), the second is\n> tweaked to under-expose significantly (ev -3) and the final one is\n> tweaked to over-exposure slightly (ev +0.5)\n>\n> 3. Control parameters are provided to the \"rpi.hdr\" algorithm to\n> associate these AGC channels correctly with the HDR modes.\n>\n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n\nBefore reviewing the algorithm implementation itself let me ask a few\nquestion on the configuration file\n\n> ---\n>  src/ipa/rpi/vc4/data/imx219.json           | 384 +++++++++++++++-----\n>  src/ipa/rpi/vc4/data/imx219_noir.json      | 384 +++++++++++++++-----\n>  src/ipa/rpi/vc4/data/imx477.json           | 376 +++++++++++++++-----\n>  src/ipa/rpi/vc4/data/imx477_noir.json      | 384 +++++++++++++++-----\n>  src/ipa/rpi/vc4/data/imx708.json           | 346 +++++++++++++-----\n>  src/ipa/rpi/vc4/data/imx708_noir.json      | 346 +++++++++++++-----\n>  src/ipa/rpi/vc4/data/imx708_wide.json      | 346 +++++++++++++-----\n>  src/ipa/rpi/vc4/data/imx708_wide_noir.json | 346 +++++++++++++-----\n>  src/ipa/rpi/vc4/data/ov5647.json           | 388 ++++++++++++++++-----\n>  9 files changed, 2524 insertions(+), 776 deletions(-)\n>\n> diff --git a/src/ipa/rpi/vc4/data/imx219.json b/src/ipa/rpi/vc4/data/imx219.json\n> index e8fce164..54defc0b 100644\n> --- a/src/ipa/rpi/vc4/data/imx219.json\n> +++ b/src/ipa/rpi/vc4/data/imx219.json\n> @@ -131,95 +131,282 @@\n>          {\n>              \"rpi.agc\":\n>              {\n\n[snip]\n\n> +\t\t\"channels\":\n> +\t\t[\n> +\t\t    {\n\nan index won't hurt to easly connect it to entries in the hdr section\n\n> +\t\t\t\"metering_modes\":\n> +\t\t\t{\n> +\t\t\t    \"centre-weighted\":\n> +\t\t\t    {\n> +\t\t\t\t\"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> +\t\t\t    },\n> +\t\t\t    \"spot\":\n> +\t\t\t    {\n> +\t\t\t\t\"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> +\t\t\t    },\n> +\t\t\t    \"matrix\":\n> +\t\t\t    {\n> +\t\t\t\t\"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> +\t\t\t    }\n> +\t\t\t},\n> +\t\t\t\"exposure_modes\":\n> +\t\t\t{\n> +\t\t\t    \"normal\":\n> +\t\t\t    {\n> +\t\t\t\t\"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> +\t\t\t\t\"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> +\t\t\t    },\n> +\t\t\t    \"short\":\n> +\t\t\t    {\n> +\t\t\t\t\"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> +\t\t\t\t\"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> +\t\t\t    },\n> +\t\t\t    \"long\":\n> +\t\t\t    {\n> +\t\t\t\t\"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> +\t\t\t\t\"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> +\t\t\t    }\n> +\t\t\t},\n> +\t\t\t\"constraint_modes\":\n> +\t\t\t{\n> +\t\t\t    \"normal\": [\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"LOWER\",\n> +\t\t\t\t    \"q_lo\": 0.98,\n> +\t\t\t\t    \"q_hi\": 1.0,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.5,\n> +\t\t\t\t\t1000, 0.5\n> +\t\t\t\t    ]\n> +\t\t\t\t}\n> +\t\t\t    ],\n> +\t\t\t    \"highlight\": [\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"LOWER\",\n> +\t\t\t\t    \"q_lo\": 0.98,\n> +\t\t\t\t    \"q_hi\": 1.0,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.5,\n> +\t\t\t\t\t1000, 0.5\n> +\t\t\t\t    ]\n> +\t\t\t\t},\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"UPPER\",\n> +\t\t\t\t    \"q_lo\": 0.98,\n> +\t\t\t\t    \"q_hi\": 1.0,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.8,\n> +\t\t\t\t\t1000, 0.8\n> +\t\t\t\t    ]\n> +\t\t\t\t}\n> +\t\t\t    ],\n> +\t\t\t    \"shadows\": [\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"LOWER\",\n> +\t\t\t\t    \"q_lo\": 0.0,\n> +\t\t\t\t    \"q_hi\": 0.5,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.17,\n> +\t\t\t\t\t1000, 0.17\n> +\t\t\t\t    ]\n> +\t\t\t\t}\n> +\t\t\t    ]\n> +\t\t\t},\n> +\t\t\t\"y_target\":\n> +\t\t\t[\n> +\t\t\t    0, 0.16,\n> +\t\t\t    1000, 0.165,\n> +\t\t\t    10000, 0.17\n> +\t\t\t]\n> +\t\t    },\n> +\t\t    {\n> +\t\t\t\"base_ev\": 0.125,\n\nI guess this is what makes the channel \"long exposure\"\n\n> +\t\t\t\"metering_modes\":\n> +\t\t\t{\n> +\t\t\t    \"centre-weighted\":\n> +\t\t\t    {\n> +\t\t\t\t\"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> +\t\t\t    },\n> +\t\t\t    \"spot\":\n> +\t\t\t    {\n> +\t\t\t\t\"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> +\t\t\t    },\n> +\t\t\t    \"matrix\":\n> +\t\t\t    {\n> +\t\t\t\t\"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> +\t\t\t    }\n> +\t\t\t},\n> +\t\t\t\"exposure_modes\":\n> +\t\t\t{\n> +\t\t\t    \"normal\":\n> +\t\t\t    {\n> +\t\t\t\t\"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> +\t\t\t\t\"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> +\t\t\t    },\n> +\t\t\t    \"short\":\n> +\t\t\t    {\n> +\t\t\t\t\"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> +\t\t\t\t\"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> +\t\t\t    },\n> +\t\t\t    \"long\":\n> +\t\t\t    {\n> +\t\t\t\t\"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> +\t\t\t\t\"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> +\t\t\t    }\n> +\t\t\t},\n> +\t\t\t\"constraint_modes\":\n> +\t\t\t{\n> +\t\t\t    \"normal\": [\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"LOWER\",\n> +\t\t\t\t    \"q_lo\": 0.98,\n> +\t\t\t\t    \"q_hi\": 1.0,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.5,\n> +\t\t\t\t\t1000, 0.5\n> +\t\t\t\t    ]\n> +\t\t\t\t}\n> +\t\t\t    ],\n> +\t\t\t    \"highlight\": [\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"LOWER\",\n> +\t\t\t\t    \"q_lo\": 0.98,\n> +\t\t\t\t    \"q_hi\": 1.0,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.5,\n> +\t\t\t\t\t1000, 0.5\n> +\t\t\t\t    ]\n> +\t\t\t\t},\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"UPPER\",\n> +\t\t\t\t    \"q_lo\": 0.98,\n> +\t\t\t\t    \"q_hi\": 1.0,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.8,\n> +\t\t\t\t\t1000, 0.8\n> +\t\t\t\t    ]\n> +\t\t\t\t}\n> +\t\t\t    ],\n> +\t\t\t    \"shadows\": [\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"LOWER\",\n> +\t\t\t\t    \"q_lo\": 0.0,\n> +\t\t\t\t    \"q_hi\": 0.5,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.17,\n> +\t\t\t\t\t1000, 0.17\n> +\t\t\t\t    ]\n> +\t\t\t\t}\n> +\t\t\t    ]\n> +\t\t\t},\n> +\t\t\t\"y_target\":\n> +\t\t\t[\n> +\t\t\t    0, 0.16,\n> +\t\t\t    1000, 0.165,\n> +\t\t\t    10000, 0.17\n> +\t\t\t]\n> +\t\t    },\n> +\t\t    {\n> +\t\t\t\"base_ev\": 1.5,\n> +\t\t\t\"metering_modes\":\n> +\t\t\t{\n> +\t\t\t    \"centre-weighted\":\n> +\t\t\t    {\n> +\t\t\t\t\"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> +\t\t\t    },\n> +\t\t\t    \"spot\":\n> +\t\t\t    {\n> +\t\t\t\t\"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> +\t\t\t    },\n> +\t\t\t    \"matrix\":\n> +\t\t\t    {\n> +\t\t\t\t\"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> +\t\t\t    }\n> +\t\t\t},\n> +\t\t\t\"exposure_modes\":\n> +\t\t\t{\n> +\t\t\t    \"normal\":\n> +\t\t\t    {\n> +\t\t\t\t\"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> +\t\t\t\t\"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> +\t\t\t    },\n> +\t\t\t    \"short\":\n> +\t\t\t    {\n> +\t\t\t\t\"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> +\t\t\t\t\"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> +\t\t\t    },\n> +\t\t\t    \"long\":\n> +\t\t\t    {\n> +\t\t\t\t\"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> +\t\t\t\t\"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> +\t\t\t    }\n> +\t\t\t},\n> +\t\t\t\"constraint_modes\":\n> +\t\t\t{\n> +\t\t\t    \"normal\": [\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"LOWER\",\n> +\t\t\t\t    \"q_lo\": 0.98,\n> +\t\t\t\t    \"q_hi\": 1.0,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.5,\n> +\t\t\t\t\t1000, 0.5\n> +\t\t\t\t    ]\n> +\t\t\t\t}\n> +\t\t\t    ],\n> +\t\t\t    \"highlight\": [\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"LOWER\",\n> +\t\t\t\t    \"q_lo\": 0.98,\n> +\t\t\t\t    \"q_hi\": 1.0,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.5,\n> +\t\t\t\t\t1000, 0.5\n> +\t\t\t\t    ]\n> +\t\t\t\t},\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"UPPER\",\n> +\t\t\t\t    \"q_lo\": 0.98,\n> +\t\t\t\t    \"q_hi\": 1.0,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.8,\n> +\t\t\t\t\t1000, 0.8\n> +\t\t\t\t    ]\n> +\t\t\t\t}\n> +\t\t\t    ],\n> +\t\t\t    \"shadows\": [\n> +\t\t\t\t{\n> +\t\t\t\t    \"bound\": \"LOWER\",\n> +\t\t\t\t    \"q_lo\": 0.0,\n> +\t\t\t\t    \"q_hi\": 0.5,\n> +\t\t\t\t    \"y_target\":\n> +\t\t\t\t    [\n> +\t\t\t\t\t0, 0.17,\n> +\t\t\t\t\t1000, 0.17\n> +\t\t\t\t    ]\n> +\t\t\t\t}\n> +\t\t\t    ]\n> +\t\t\t},\n> +\t\t\t\"y_target\":\n> +\t\t\t[\n> +\t\t\t    0, 0.16,\n> +\t\t\t    1000, 0.165,\n> +\t\t\t    10000, 0.17\n> +\t\t\t]\n> +\t\t    }\n> +\t\t]\n> +\t    }\n>          },\n>          {\n>              \"rpi.alsc\":\n> @@ -463,6 +650,21 @@\n>          },\n>          {\n>              \"rpi.sharpen\": { }\n> -        }\n> +        },\n> +\t{\n> +\t    \"rpi.hdr\":\n> +\t    {\n\n\n> +\t\t\"MultiExposure\":\n> +\t\t{\n> +\t\t    \"cadence\": [ 1, 2 ],\n> +\t\t    \"channel_map\": { \"short\": 1, \"long\": 2 }\n> +\t\t},\n> +\t\t\"SingleExposure\":\n> +\t\t{\n> +\t\t    \"cadence\": [ 1 ],\n> +\t\t    \"channel_map\": { \"short\": 1 }\n> +\t\t}\n\nIsn't the single exposure mode comparable to the non-hdr mode ? Do we\nneed to specify a channel to use in this case, can't the AEGC\nalgorithm be driven as usual ?\n\n[snip]","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 24951BE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 30 Aug 2023 09:40:37 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7B6D961F19;\n\tWed, 30 Aug 2023 11:40:36 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 337C961E00\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 30 Aug 2023 11:40:35 +0200 (CEST)","from ideasonboard.com (mob-5-90-48-184.net.vodafone.it\n\t[5.90.48.184])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 9B04E4E6;\n\tWed, 30 Aug 2023 11:39:12 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1693388436;\n\tbh=Y/Ulds1LPwrtxxrWGG9ZUrYmCrQ4QKu+Ot0eLICBZ40=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=GOtHvyET4tu8A1D7HItRCTHcsfBlHfhQ95bJB00VFBPVsNF5om7sQy186YeiZ+kqD\n\t7Voj2bBb4vgpj5uyHXr7jUj2AJLpqKxWa6zfOAcpu2oHcmLPxpot7tjfs0+BrVNUhu\n\t+gqybJaHKjt7MavXMAzybvvvSNUHGV8HBrk7Ot+o/Zeb1vXNNuwFFNrAzTWeX74Dpn\n\t0ChKzovAQTg0LUML0qbQhnLNr3gp1WuZ+0El4c8zGx9bEGbV+XBHmooS+3FgrNwOFu\n\tNGhbWpKbw0uGtpmfFQIf1QVGKN8kcJ+eWfKSwsycwjF1Y4HAvyZNNnVEUkmF+d6S+h\n\tRBsJe7mfxe6NQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1693388352;\n\tbh=Y/Ulds1LPwrtxxrWGG9ZUrYmCrQ4QKu+Ot0eLICBZ40=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=qQVpEgnl7Q0Ryh5B+F5WB4AvrESMArqK5bMoed4MZr+6XmQQhwcvAjZkuNaHu2cxZ\n\t331lK9C8GCNJZym9P8ii219WlTZk/My1wyyoCG7iW3UYZrCqAkqpOUgjE4Rdttaok1\n\tOkdewS0Dn1TOx1PmwEl0prhrI0feORt1+Get6BoI="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"qQVpEgnl\"; dkim-atps=neutral","Date":"Wed, 30 Aug 2023 11:40:31 +0200","To":"David Plowman <david.plowman@raspberrypi.com>","Message-ID":"<u5exqk5v6ojlnsugfda5aiayp65cobof4cyqdwdoq6waxgx4nr@gtr4dinkibxd>","References":"<20230823144925.2542-1-david.plowman@raspberrypi.com>\n\t<20230823144925.2542-3-david.plowman@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20230823144925.2542-3-david.plowman@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v2 2/2] ipa: rpi: vc4: data: Update\n\ttuning files for HDR","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>","From":"Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":27754,"web_url":"https://patchwork.libcamera.org/comment/27754/","msgid":"<CAHW6GY+COeJH6hp0Thr0ATeRiD_OZHofxRj0mz0_CFjyy+20ow@mail.gmail.com>","date":"2023-09-11T15:35:13","subject":"Re: [libcamera-devel] [PATCH v2 2/2] ipa: rpi: vc4: data: Update\n\ttuning files for HDR","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Jacopo\n\nOn Wed, 30 Aug 2023 at 10:40, Jacopo Mondi\n<jacopo.mondi@ideasonboard.com> wrote:\n>\n> Hi David\n>\n> On Wed, Aug 23, 2023 at 03:49:25PM +0100, David Plowman via libcamera-devel wrote:\n> > All the Raspberry Pi official camera tuning files are updated for\n> > HDR. As stated previously, there is no mechanism in the hardware for\n> > combining images so all this does is enable multi-channel AGC to\n> > produce short and long exposure frames. It will be up to the\n> > application to deal with them.\n> >\n> > The changes are identical in every tuning file.\n> >\n> > 1. The existing AGC tuning is duplicated twice so that we have 3 AGC\n> > channels.\n> >\n> > 2. The first is left alone (the default AGC channel), the second is\n> > tweaked to under-expose significantly (ev -3) and the final one is\n> > tweaked to over-exposure slightly (ev +0.5)\n> >\n> > 3. Control parameters are provided to the \"rpi.hdr\" algorithm to\n> > associate these AGC channels correctly with the HDR modes.\n> >\n> > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n>\n> Before reviewing the algorithm implementation itself let me ask a few\n> question on the configuration file\n\nOf course...!\n\n>\n> > ---\n> >  src/ipa/rpi/vc4/data/imx219.json           | 384 +++++++++++++++-----\n> >  src/ipa/rpi/vc4/data/imx219_noir.json      | 384 +++++++++++++++-----\n> >  src/ipa/rpi/vc4/data/imx477.json           | 376 +++++++++++++++-----\n> >  src/ipa/rpi/vc4/data/imx477_noir.json      | 384 +++++++++++++++-----\n> >  src/ipa/rpi/vc4/data/imx708.json           | 346 +++++++++++++-----\n> >  src/ipa/rpi/vc4/data/imx708_noir.json      | 346 +++++++++++++-----\n> >  src/ipa/rpi/vc4/data/imx708_wide.json      | 346 +++++++++++++-----\n> >  src/ipa/rpi/vc4/data/imx708_wide_noir.json | 346 +++++++++++++-----\n> >  src/ipa/rpi/vc4/data/ov5647.json           | 388 ++++++++++++++++-----\n> >  9 files changed, 2524 insertions(+), 776 deletions(-)\n> >\n> > diff --git a/src/ipa/rpi/vc4/data/imx219.json b/src/ipa/rpi/vc4/data/imx219.json\n> > index e8fce164..54defc0b 100644\n> > --- a/src/ipa/rpi/vc4/data/imx219.json\n> > +++ b/src/ipa/rpi/vc4/data/imx219.json\n> > @@ -131,95 +131,282 @@\n> >          {\n> >              \"rpi.agc\":\n> >              {\n>\n> [snip]\n>\n> > +             \"channels\":\n> > +             [\n> > +                 {\n>\n> an index won't hurt to easly connect it to entries in the hdr section\n\nI wasn't quite sure what you meant here. Are you suggesting including\nan index number here that identifies it as libcamera's \"long\" (or\n\"short\") channel? That's certainly possible, though I've tried to keep\nHDR and AGC channels as separate concepts, the idea being that AGC\nchannels know nothing about HDR, but are merely something HDR will\nuse. Of course, in reality they are quite closely connected... though\nI wouldn't want to predict exactly how in all cases. (Or maybe I've\nmisunderstood the question, in which case apologies!)\n\n>\n> > +                     \"metering_modes\":\n> > +                     {\n> > +                         \"centre-weighted\":\n> > +                         {\n> > +                             \"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> > +                         },\n> > +                         \"spot\":\n> > +                         {\n> > +                             \"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> > +                         },\n> > +                         \"matrix\":\n> > +                         {\n> > +                             \"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> > +                         }\n> > +                     },\n> > +                     \"exposure_modes\":\n> > +                     {\n> > +                         \"normal\":\n> > +                         {\n> > +                             \"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > +                         },\n> > +                         \"short\":\n> > +                         {\n> > +                             \"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > +                         },\n> > +                         \"long\":\n> > +                         {\n> > +                             \"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> > +                         }\n> > +                     },\n> > +                     \"constraint_modes\":\n> > +                     {\n> > +                         \"normal\": [\n> > +                             {\n> > +                                 \"bound\": \"LOWER\",\n> > +                                 \"q_lo\": 0.98,\n> > +                                 \"q_hi\": 1.0,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.5,\n> > +                                     1000, 0.5\n> > +                                 ]\n> > +                             }\n> > +                         ],\n> > +                         \"highlight\": [\n> > +                             {\n> > +                                 \"bound\": \"LOWER\",\n> > +                                 \"q_lo\": 0.98,\n> > +                                 \"q_hi\": 1.0,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.5,\n> > +                                     1000, 0.5\n> > +                                 ]\n> > +                             },\n> > +                             {\n> > +                                 \"bound\": \"UPPER\",\n> > +                                 \"q_lo\": 0.98,\n> > +                                 \"q_hi\": 1.0,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.8,\n> > +                                     1000, 0.8\n> > +                                 ]\n> > +                             }\n> > +                         ],\n> > +                         \"shadows\": [\n> > +                             {\n> > +                                 \"bound\": \"LOWER\",\n> > +                                 \"q_lo\": 0.0,\n> > +                                 \"q_hi\": 0.5,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.17,\n> > +                                     1000, 0.17\n> > +                                 ]\n> > +                             }\n> > +                         ]\n> > +                     },\n> > +                     \"y_target\":\n> > +                     [\n> > +                         0, 0.16,\n> > +                         1000, 0.165,\n> > +                         10000, 0.17\n> > +                     ]\n> > +                 },\n> > +                 {\n> > +                     \"base_ev\": 0.125,\n>\n> I guess this is what makes the channel \"long exposure\"\n\nCorrect. (Actually \"short exposure\" in this case as it will be running\nat 1/8 of normal exposure!)\n\n>\n> > +                     \"metering_modes\":\n> > +                     {\n> > +                         \"centre-weighted\":\n> > +                         {\n> > +                             \"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> > +                         },\n> > +                         \"spot\":\n> > +                         {\n> > +                             \"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> > +                         },\n> > +                         \"matrix\":\n> > +                         {\n> > +                             \"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> > +                         }\n> > +                     },\n> > +                     \"exposure_modes\":\n> > +                     {\n> > +                         \"normal\":\n> > +                         {\n> > +                             \"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > +                         },\n> > +                         \"short\":\n> > +                         {\n> > +                             \"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > +                         },\n> > +                         \"long\":\n> > +                         {\n> > +                             \"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> > +                         }\n> > +                     },\n> > +                     \"constraint_modes\":\n> > +                     {\n> > +                         \"normal\": [\n> > +                             {\n> > +                                 \"bound\": \"LOWER\",\n> > +                                 \"q_lo\": 0.98,\n> > +                                 \"q_hi\": 1.0,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.5,\n> > +                                     1000, 0.5\n> > +                                 ]\n> > +                             }\n> > +                         ],\n> > +                         \"highlight\": [\n> > +                             {\n> > +                                 \"bound\": \"LOWER\",\n> > +                                 \"q_lo\": 0.98,\n> > +                                 \"q_hi\": 1.0,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.5,\n> > +                                     1000, 0.5\n> > +                                 ]\n> > +                             },\n> > +                             {\n> > +                                 \"bound\": \"UPPER\",\n> > +                                 \"q_lo\": 0.98,\n> > +                                 \"q_hi\": 1.0,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.8,\n> > +                                     1000, 0.8\n> > +                                 ]\n> > +                             }\n> > +                         ],\n> > +                         \"shadows\": [\n> > +                             {\n> > +                                 \"bound\": \"LOWER\",\n> > +                                 \"q_lo\": 0.0,\n> > +                                 \"q_hi\": 0.5,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.17,\n> > +                                     1000, 0.17\n> > +                                 ]\n> > +                             }\n> > +                         ]\n> > +                     },\n> > +                     \"y_target\":\n> > +                     [\n> > +                         0, 0.16,\n> > +                         1000, 0.165,\n> > +                         10000, 0.17\n> > +                     ]\n> > +                 },\n> > +                 {\n> > +                     \"base_ev\": 1.5,\n> > +                     \"metering_modes\":\n> > +                     {\n> > +                         \"centre-weighted\":\n> > +                         {\n> > +                             \"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> > +                         },\n> > +                         \"spot\":\n> > +                         {\n> > +                             \"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> > +                         },\n> > +                         \"matrix\":\n> > +                         {\n> > +                             \"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> > +                         }\n> > +                     },\n> > +                     \"exposure_modes\":\n> > +                     {\n> > +                         \"normal\":\n> > +                         {\n> > +                             \"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > +                         },\n> > +                         \"short\":\n> > +                         {\n> > +                             \"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > +                         },\n> > +                         \"long\":\n> > +                         {\n> > +                             \"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> > +                         }\n> > +                     },\n> > +                     \"constraint_modes\":\n> > +                     {\n> > +                         \"normal\": [\n> > +                             {\n> > +                                 \"bound\": \"LOWER\",\n> > +                                 \"q_lo\": 0.98,\n> > +                                 \"q_hi\": 1.0,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.5,\n> > +                                     1000, 0.5\n> > +                                 ]\n> > +                             }\n> > +                         ],\n> > +                         \"highlight\": [\n> > +                             {\n> > +                                 \"bound\": \"LOWER\",\n> > +                                 \"q_lo\": 0.98,\n> > +                                 \"q_hi\": 1.0,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.5,\n> > +                                     1000, 0.5\n> > +                                 ]\n> > +                             },\n> > +                             {\n> > +                                 \"bound\": \"UPPER\",\n> > +                                 \"q_lo\": 0.98,\n> > +                                 \"q_hi\": 1.0,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.8,\n> > +                                     1000, 0.8\n> > +                                 ]\n> > +                             }\n> > +                         ],\n> > +                         \"shadows\": [\n> > +                             {\n> > +                                 \"bound\": \"LOWER\",\n> > +                                 \"q_lo\": 0.0,\n> > +                                 \"q_hi\": 0.5,\n> > +                                 \"y_target\":\n> > +                                 [\n> > +                                     0, 0.17,\n> > +                                     1000, 0.17\n> > +                                 ]\n> > +                             }\n> > +                         ]\n> > +                     },\n> > +                     \"y_target\":\n> > +                     [\n> > +                         0, 0.16,\n> > +                         1000, 0.165,\n> > +                         10000, 0.17\n> > +                     ]\n> > +                 }\n> > +             ]\n> > +         }\n> >          },\n> >          {\n> >              \"rpi.alsc\":\n> > @@ -463,6 +650,21 @@\n> >          },\n> >          {\n> >              \"rpi.sharpen\": { }\n> > -        }\n> > +        },\n> > +     {\n> > +         \"rpi.hdr\":\n> > +         {\n>\n>\n> > +             \"MultiExposure\":\n> > +             {\n> > +                 \"cadence\": [ 1, 2 ],\n> > +                 \"channel_map\": { \"short\": 1, \"long\": 2 }\n> > +             },\n> > +             \"SingleExposure\":\n> > +             {\n> > +                 \"cadence\": [ 1 ],\n> > +                 \"channel_map\": { \"short\": 1 }\n> > +             }\n>\n> Isn't the single exposure mode comparable to the non-hdr mode ? Do we\n> need to specify a channel to use in this case, can't the AEGC\n> algorithm be driven as usual ?\n\nNot necessarily. I could imagine a platform where the \"single\nexposure\" method uses under-exposed images and is then followed by\nsome magic image accumulation and tone-mapping. But obviously we can't\ndo that in hardware on a Pi, you'd have to use some kind of software\npost-processing.\n\nThanks!\nDavid\n\n>\n> [snip]\n>","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 CBD34BE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 11 Sep 2023 15:35:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 22F8E61DF4;\n\tMon, 11 Sep 2023 17:35:27 +0200 (CEST)","from mail-qk1-x732.google.com (mail-qk1-x732.google.com\n\t[IPv6:2607:f8b0:4864:20::732])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 512EA61DF0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 11 Sep 2023 17:35:25 +0200 (CEST)","by mail-qk1-x732.google.com with SMTP id\n\taf79cd13be357-76ef8b91a72so283365285a.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 11 Sep 2023 08:35:25 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1694446527;\n\tbh=lh7J/DbcQfRxQKsUaEBVNpokz+hoMU0gshoGpY3HnP8=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=ZCJ9hcYNfBmWCPuaWdBB3rTRThb8Y4yd0HZ4NxUPlvUXoC1CWARkNi3/JQ1a+nEbe\n\t9iyf+UNjcfFP4XbldiHiIWt7nSOQWzEWheE8i0VGZjLjGpGn/ojn67n1vq9c83jvr9\n\todjzZMluy5U8mCWa15+TlKf8mDOaQuIEwYN9SMPeHYiMCtvvcI6reYkWAuzoUbqKg1\n\tKIhmymC+3FmxUFF093C0pSFLcGh0Tck0phutH8JrZuKzt3j9p9twFZqGuCSIuM+L+X\n\t8zN4/zQVVEJ1ObNx9sYMy6pxnMM9bcWYdpbjiLT2XQ1CfbkG/cKl/6yZ6sVduXXdgz\n\tnQIoeULfXk0Og==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1694446524; x=1695051324;\n\tdarn=lists.libcamera.org; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=DDEU1oPQNQmS86BU6I0b6L8qV5hO63N60r5qujI/o0k=;\n\tb=YgRPp2Uz3cOEUT7r54FhawCKvr4kPJWBT89g/SxvlTGdouzuU0d7SogBXbXfpuwzc1\n\tqRsfLPfTk8bEjYLn4vwLmUk8XqA3tfo6ultrXUTa6J2zJhTNz+aCZhHf0w/+/OwNySpl\n\tzo5sishEIV24ug091bKS/wXywMNRko4fzlmKuEK7/fSUpnLzv717I4nOXJoYOjiiy55x\n\trC7k4l4f67qa6bDj9/FhKM50Bi6dFULbTE5Djqkr5jP8RRfjaZAA52R0mkh2cDw7Zt23\n\tJYrdXc2FFx7UHOMFzm5YQS5/dSWEEYua4ad2bohKpGzOjWUspFUqPy1tfHGlCTXpTW2J\n\t/BOA=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"YgRPp2Uz\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1694446524; x=1695051324;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=DDEU1oPQNQmS86BU6I0b6L8qV5hO63N60r5qujI/o0k=;\n\tb=a/rgspXszMAiL3FS35PiQesLma3X20KSDEBk9zij2nOqP46zBWFgl5nJ5fM7yiRjeR\n\tFwh7z7dzO2UqT64AF6P+kKO0C7c6PCgoe9QXnepB6rsziIfdStX+k1gkNT6pj40FWh3R\n\twXWOUKAlELwAA7gK3CCdXVwWQgj3qaDAhfcsgucuGaXgEwJ1nMEy0J33P3+dxDnsmF0g\n\tAvUuwcIYy8lXQynTrRSeHe76zD9+y9Hu57UtgcRdnR0wk5JXl0R+oDHXpeJlS62TdUDk\n\tBF1EwW0g/APJ6If0dnyAFkNS3SxYI8lNkhWA2cnOozmhaVlDaEJf1ijS3VqI2/lCBwvD\n\tEeRg==","X-Gm-Message-State":"AOJu0Yzza3jiPXs4uvRKa8bTtpBhFS/ogCFJK8LxO7+CvxfZim4TvHq/\n\txaokYxZMCpJL4BiiHV6ijly/XA4p5uxriolPQ13iWJxMmZEeEZGt","X-Google-Smtp-Source":"AGHT+IENnSUH3KrHxi1/00M+4oBMwy0vBqGpPDGPjHp0VyDLe12z5cDX1xcxYs5ZWT1f5fVZlqwVVZ9CErmWWIiPmns=","X-Received":"by 2002:ac8:7e92:0:b0:400:9390:d129 with SMTP id\n\tw18-20020ac87e92000000b004009390d129mr12929387qtj.36.1694446524183;\n\tMon, 11 Sep 2023 08:35:24 -0700 (PDT)","MIME-Version":"1.0","References":"<20230823144925.2542-1-david.plowman@raspberrypi.com>\n\t<20230823144925.2542-3-david.plowman@raspberrypi.com>\n\t<u5exqk5v6ojlnsugfda5aiayp65cobof4cyqdwdoq6waxgx4nr@gtr4dinkibxd>","In-Reply-To":"<u5exqk5v6ojlnsugfda5aiayp65cobof4cyqdwdoq6waxgx4nr@gtr4dinkibxd>","Date":"Mon, 11 Sep 2023 16:35:13 +0100","Message-ID":"<CAHW6GY+COeJH6hp0Thr0ATeRiD_OZHofxRj0mz0_CFjyy+20ow@mail.gmail.com>","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH v2 2/2] ipa: rpi: vc4: data: Update\n\ttuning files for HDR","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>","From":"David Plowman via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"David Plowman <david.plowman@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":27800,"web_url":"https://patchwork.libcamera.org/comment/27800/","msgid":"<dchecigo47hgq6kpexmiadwvzfidmb3th26h34adovpqirhmba@mvn2kwfvjn7j>","date":"2023-09-16T13:08:25","subject":"Re: [libcamera-devel] [PATCH v2 2/2] ipa: rpi: vc4: data: Update\n\ttuning files for HDR","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi David\n\nOn Mon, Sep 11, 2023 at 04:35:13PM +0100, David Plowman via libcamera-devel wrote:\n> Hi Jacopo\n>\n> On Wed, 30 Aug 2023 at 10:40, Jacopo Mondi\n> <jacopo.mondi@ideasonboard.com> wrote:\n> >\n> > Hi David\n> >\n> > On Wed, Aug 23, 2023 at 03:49:25PM +0100, David Plowman via libcamera-devel wrote:\n> > > All the Raspberry Pi official camera tuning files are updated for\n> > > HDR. As stated previously, there is no mechanism in the hardware for\n> > > combining images so all this does is enable multi-channel AGC to\n> > > produce short and long exposure frames. It will be up to the\n> > > application to deal with them.\n> > >\n> > > The changes are identical in every tuning file.\n> > >\n> > > 1. The existing AGC tuning is duplicated twice so that we have 3 AGC\n> > > channels.\n> > >\n> > > 2. The first is left alone (the default AGC channel), the second is\n> > > tweaked to under-expose significantly (ev -3) and the final one is\n> > > tweaked to over-exposure slightly (ev +0.5)\n> > >\n> > > 3. Control parameters are provided to the \"rpi.hdr\" algorithm to\n> > > associate these AGC channels correctly with the HDR modes.\n> > >\n> > > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> >\n> > Before reviewing the algorithm implementation itself let me ask a few\n> > question on the configuration file\n>\n> Of course...!\n>\n> >\n> > > ---\n> > >  src/ipa/rpi/vc4/data/imx219.json           | 384 +++++++++++++++-----\n> > >  src/ipa/rpi/vc4/data/imx219_noir.json      | 384 +++++++++++++++-----\n> > >  src/ipa/rpi/vc4/data/imx477.json           | 376 +++++++++++++++-----\n> > >  src/ipa/rpi/vc4/data/imx477_noir.json      | 384 +++++++++++++++-----\n> > >  src/ipa/rpi/vc4/data/imx708.json           | 346 +++++++++++++-----\n> > >  src/ipa/rpi/vc4/data/imx708_noir.json      | 346 +++++++++++++-----\n> > >  src/ipa/rpi/vc4/data/imx708_wide.json      | 346 +++++++++++++-----\n> > >  src/ipa/rpi/vc4/data/imx708_wide_noir.json | 346 +++++++++++++-----\n> > >  src/ipa/rpi/vc4/data/ov5647.json           | 388 ++++++++++++++++-----\n> > >  9 files changed, 2524 insertions(+), 776 deletions(-)\n> > >\n> > > diff --git a/src/ipa/rpi/vc4/data/imx219.json b/src/ipa/rpi/vc4/data/imx219.json\n> > > index e8fce164..54defc0b 100644\n> > > --- a/src/ipa/rpi/vc4/data/imx219.json\n> > > +++ b/src/ipa/rpi/vc4/data/imx219.json\n> > > @@ -131,95 +131,282 @@\n> > >          {\n> > >              \"rpi.agc\":\n> > >              {\n> >\n> > [snip]\n> >\n> > > +             \"channels\":\n> > > +             [\n> > > +                 {\n> >\n> > an index won't hurt to easly connect it to entries in the hdr section\n>\n> I wasn't quite sure what you meant here. Are you suggesting including\n> an index number here that identifies it as libcamera's \"long\" (or\n> \"short\") channel? That's certainly possible, though I've tried to keep\n> HDR and AGC channels as separate concepts, the idea being that AGC\n> channels know nothing about HDR, but are merely something HDR will\n> use. Of course, in reality they are quite closely connected... though\n> I wouldn't want to predict exactly how in all cases. (Or maybe I've\n> misunderstood the question, in which case apologies!)\n>\n\nNo no, that's what I meant..\n\nI see the HDR section using indexes to idntify channels and assign\nthem names, in example\n\n                 \"channel_map\": { \"short\": 1, \"long\": 2 }\n\nAre the channels' indexes their definition order in the config file ?\nIsn't it slightly fragile ?\n\n> >\n> > > +                     \"metering_modes\":\n> > > +                     {\n> > > +                         \"centre-weighted\":\n> > > +                         {\n> > > +                             \"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> > > +                         },\n> > > +                         \"spot\":\n> > > +                         {\n> > > +                             \"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> > > +                         },\n> > > +                         \"matrix\":\n> > > +                         {\n> > > +                             \"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> > > +                         }\n> > > +                     },\n> > > +                     \"exposure_modes\":\n> > > +                     {\n> > > +                         \"normal\":\n> > > +                         {\n> > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > +                         },\n> > > +                         \"short\":\n> > > +                         {\n> > > +                             \"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > +                         },\n> > > +                         \"long\":\n> > > +                         {\n> > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> > > +                         }\n> > > +                     },\n> > > +                     \"constraint_modes\":\n> > > +                     {\n> > > +                         \"normal\": [\n> > > +                             {\n> > > +                                 \"bound\": \"LOWER\",\n> > > +                                 \"q_lo\": 0.98,\n> > > +                                 \"q_hi\": 1.0,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.5,\n> > > +                                     1000, 0.5\n> > > +                                 ]\n> > > +                             }\n> > > +                         ],\n> > > +                         \"highlight\": [\n> > > +                             {\n> > > +                                 \"bound\": \"LOWER\",\n> > > +                                 \"q_lo\": 0.98,\n> > > +                                 \"q_hi\": 1.0,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.5,\n> > > +                                     1000, 0.5\n> > > +                                 ]\n> > > +                             },\n> > > +                             {\n> > > +                                 \"bound\": \"UPPER\",\n> > > +                                 \"q_lo\": 0.98,\n> > > +                                 \"q_hi\": 1.0,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.8,\n> > > +                                     1000, 0.8\n> > > +                                 ]\n> > > +                             }\n> > > +                         ],\n> > > +                         \"shadows\": [\n> > > +                             {\n> > > +                                 \"bound\": \"LOWER\",\n> > > +                                 \"q_lo\": 0.0,\n> > > +                                 \"q_hi\": 0.5,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.17,\n> > > +                                     1000, 0.17\n> > > +                                 ]\n> > > +                             }\n> > > +                         ]\n> > > +                     },\n> > > +                     \"y_target\":\n> > > +                     [\n> > > +                         0, 0.16,\n> > > +                         1000, 0.165,\n> > > +                         10000, 0.17\n> > > +                     ]\n> > > +                 },\n> > > +                 {\n> > > +                     \"base_ev\": 0.125,\n> >\n> > I guess this is what makes the channel \"long exposure\"\n>\n> Correct. (Actually \"short exposure\" in this case as it will be running\n> at 1/8 of normal exposure!)\n>\n\nYeah, sorry\n\n> >\n> > > +                     \"metering_modes\":\n> > > +                     {\n> > > +                         \"centre-weighted\":\n> > > +                         {\n> > > +                             \"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> > > +                         },\n> > > +                         \"spot\":\n> > > +                         {\n> > > +                             \"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> > > +                         },\n> > > +                         \"matrix\":\n> > > +                         {\n> > > +                             \"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> > > +                         }\n> > > +                     },\n> > > +                     \"exposure_modes\":\n> > > +                     {\n> > > +                         \"normal\":\n> > > +                         {\n> > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > +                         },\n> > > +                         \"short\":\n> > > +                         {\n> > > +                             \"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > +                         },\n> > > +                         \"long\":\n> > > +                         {\n> > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> > > +                         }\n> > > +                     },\n> > > +                     \"constraint_modes\":\n> > > +                     {\n> > > +                         \"normal\": [\n> > > +                             {\n> > > +                                 \"bound\": \"LOWER\",\n> > > +                                 \"q_lo\": 0.98,\n> > > +                                 \"q_hi\": 1.0,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.5,\n> > > +                                     1000, 0.5\n> > > +                                 ]\n> > > +                             }\n> > > +                         ],\n> > > +                         \"highlight\": [\n> > > +                             {\n> > > +                                 \"bound\": \"LOWER\",\n> > > +                                 \"q_lo\": 0.98,\n> > > +                                 \"q_hi\": 1.0,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.5,\n> > > +                                     1000, 0.5\n> > > +                                 ]\n> > > +                             },\n> > > +                             {\n> > > +                                 \"bound\": \"UPPER\",\n> > > +                                 \"q_lo\": 0.98,\n> > > +                                 \"q_hi\": 1.0,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.8,\n> > > +                                     1000, 0.8\n> > > +                                 ]\n> > > +                             }\n> > > +                         ],\n> > > +                         \"shadows\": [\n> > > +                             {\n> > > +                                 \"bound\": \"LOWER\",\n> > > +                                 \"q_lo\": 0.0,\n> > > +                                 \"q_hi\": 0.5,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.17,\n> > > +                                     1000, 0.17\n> > > +                                 ]\n> > > +                             }\n> > > +                         ]\n> > > +                     },\n> > > +                     \"y_target\":\n> > > +                     [\n> > > +                         0, 0.16,\n> > > +                         1000, 0.165,\n> > > +                         10000, 0.17\n> > > +                     ]\n> > > +                 },\n> > > +                 {\n> > > +                     \"base_ev\": 1.5,\n> > > +                     \"metering_modes\":\n> > > +                     {\n> > > +                         \"centre-weighted\":\n> > > +                         {\n> > > +                             \"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> > > +                         },\n> > > +                         \"spot\":\n> > > +                         {\n> > > +                             \"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> > > +                         },\n> > > +                         \"matrix\":\n> > > +                         {\n> > > +                             \"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> > > +                         }\n> > > +                     },\n> > > +                     \"exposure_modes\":\n> > > +                     {\n> > > +                         \"normal\":\n> > > +                         {\n> > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > +                         },\n> > > +                         \"short\":\n> > > +                         {\n> > > +                             \"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > +                         },\n> > > +                         \"long\":\n> > > +                         {\n> > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> > > +                         }\n> > > +                     },\n> > > +                     \"constraint_modes\":\n> > > +                     {\n> > > +                         \"normal\": [\n> > > +                             {\n> > > +                                 \"bound\": \"LOWER\",\n> > > +                                 \"q_lo\": 0.98,\n> > > +                                 \"q_hi\": 1.0,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.5,\n> > > +                                     1000, 0.5\n> > > +                                 ]\n> > > +                             }\n> > > +                         ],\n> > > +                         \"highlight\": [\n> > > +                             {\n> > > +                                 \"bound\": \"LOWER\",\n> > > +                                 \"q_lo\": 0.98,\n> > > +                                 \"q_hi\": 1.0,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.5,\n> > > +                                     1000, 0.5\n> > > +                                 ]\n> > > +                             },\n> > > +                             {\n> > > +                                 \"bound\": \"UPPER\",\n> > > +                                 \"q_lo\": 0.98,\n> > > +                                 \"q_hi\": 1.0,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.8,\n> > > +                                     1000, 0.8\n> > > +                                 ]\n> > > +                             }\n> > > +                         ],\n> > > +                         \"shadows\": [\n> > > +                             {\n> > > +                                 \"bound\": \"LOWER\",\n> > > +                                 \"q_lo\": 0.0,\n> > > +                                 \"q_hi\": 0.5,\n> > > +                                 \"y_target\":\n> > > +                                 [\n> > > +                                     0, 0.17,\n> > > +                                     1000, 0.17\n> > > +                                 ]\n> > > +                             }\n> > > +                         ]\n> > > +                     },\n> > > +                     \"y_target\":\n> > > +                     [\n> > > +                         0, 0.16,\n> > > +                         1000, 0.165,\n> > > +                         10000, 0.17\n> > > +                     ]\n> > > +                 }\n> > > +             ]\n> > > +         }\n> > >          },\n> > >          {\n> > >              \"rpi.alsc\":\n> > > @@ -463,6 +650,21 @@\n> > >          },\n> > >          {\n> > >              \"rpi.sharpen\": { }\n> > > -        }\n> > > +        },\n> > > +     {\n> > > +         \"rpi.hdr\":\n> > > +         {\n> >\n> >\n> > > +             \"MultiExposure\":\n> > > +             {\n> > > +                 \"cadence\": [ 1, 2 ],\n> > > +                 \"channel_map\": { \"short\": 1, \"long\": 2 }\n> > > +             },\n> > > +             \"SingleExposure\":\n> > > +             {\n> > > +                 \"cadence\": [ 1 ],\n> > > +                 \"channel_map\": { \"short\": 1 }\n> > > +             }\n> >\n> > Isn't the single exposure mode comparable to the non-hdr mode ? Do we\n> > need to specify a channel to use in this case, can't the AEGC\n> > algorithm be driven as usual ?\n>\n> Not necessarily. I could imagine a platform where the \"single\n> exposure\" method uses under-exposed images and is then followed by\n> some magic image accumulation and tone-mapping. But obviously we can't\n> do that in hardware on a Pi, you'd have to use some kind of software\n> post-processing.\n\nOk, so this is a \"shortcut\" for selecting one of the above AGC\nchannels and use that one only, right ?\n\n>\n> Thanks!\n> David\n>\n> >\n> > [snip]\n> >","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 C558FBD160\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 16 Sep 2023 13:08:30 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 24A9A62918;\n\tSat, 16 Sep 2023 15:08:30 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3335A628E9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 16 Sep 2023 15:08:29 +0200 (CEST)","from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 0986410A0;\n\tSat, 16 Sep 2023 15:06:54 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1694869710;\n\tbh=PRcMq912N/QmyIl1sLK7oxQnDu0neBUw5X2//F0rCDU=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=BcSvJcASGxRXp/VTAvYVihX30feZt/lAfTcAMVkg8uMSfziuIg3uKAABO42n9vpW4\n\tjdjkWA+0ZnZR++iqIrnhl2wRMiWZ+dvVr8UXjBPzfrPlzS33O1Okgx0FUb6pUCcHqz\n\t0FsudcO8vZd8Ce6SnHLQpfSfkHfyUlzLNZeIttxv8RXKxc4iDHs2CSuH09dGgITIg3\n\thQjaUhP1MIzerJB5Z1F94DqNKdxnkghUFKnG6NnWTrqQi9jQnqPJs6SdaJ9s3Nlo6i\n\tCCVg/96K7CQSHaT3Mns4zsib3bhBG4cO6ZZAhz54zmTAUl1s4yYIUHzS7wSOJE6zLJ\n\tvJl53kxQaKjXw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1694869615;\n\tbh=PRcMq912N/QmyIl1sLK7oxQnDu0neBUw5X2//F0rCDU=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Ch75BTF1kxH6v/LMtKmC4xWJvhxcBOdfwerJjGFeDn76CFk6h/1nqOd55T+I+Jp0P\n\tY2OapH7EPLN4B6N05Pfg4ZHWrKtNLhNsG2t59baGecHVKM1y7LFQqR0Y3KrqLKk8e2\n\tKy0HWtzwrZJCb5LFCTLA3HL242Ovoix6ckqTkMZo="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Ch75BTF1\"; dkim-atps=neutral","Date":"Sat, 16 Sep 2023 15:08:25 +0200","To":"David Plowman <david.plowman@raspberrypi.com>","Message-ID":"<dchecigo47hgq6kpexmiadwvzfidmb3th26h34adovpqirhmba@mvn2kwfvjn7j>","References":"<20230823144925.2542-1-david.plowman@raspberrypi.com>\n\t<20230823144925.2542-3-david.plowman@raspberrypi.com>\n\t<u5exqk5v6ojlnsugfda5aiayp65cobof4cyqdwdoq6waxgx4nr@gtr4dinkibxd>\n\t<CAHW6GY+COeJH6hp0Thr0ATeRiD_OZHofxRj0mz0_CFjyy+20ow@mail.gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<CAHW6GY+COeJH6hp0Thr0ATeRiD_OZHofxRj0mz0_CFjyy+20ow@mail.gmail.com>","Subject":"Re: [libcamera-devel] [PATCH v2 2/2] ipa: rpi: vc4: data: Update\n\ttuning files for HDR","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>","From":"Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":27810,"web_url":"https://patchwork.libcamera.org/comment/27810/","msgid":"<CAHW6GYLB4wJi-sockVB4oommmLcNoNnPP6B8KxcKDhxJaS5n5w@mail.gmail.com>","date":"2023-09-18T09:06:28","subject":"Re: [libcamera-devel] [PATCH v2 2/2] ipa: rpi: vc4: data: Update\n\ttuning files for HDR","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Jacopo\n\nThanks for the review!\n\nI think most of this relates again to the way we specify the different\nAGC configs in the tuning file, and how we refer to the correct ones.\n\nAs per my reply to the previous patch, I think I will try a slightly\ndifferent scheme where we index the AGC configs with a name (\"normal\",\n\"short\" or \"long\"). This is very similar to the way we handle this\nelsewhere (e.g. AGC exposure modes and so on).\n\nSo it's probably not worth replying again here, instead let me post a\nrevised version and then we can revisit all this then!\n\nThanks\nDavid\n\nOn Sat, 16 Sept 2023 at 14:08, Jacopo Mondi\n<jacopo.mondi@ideasonboard.com> wrote:\n>\n> Hi David\n>\n> On Mon, Sep 11, 2023 at 04:35:13PM +0100, David Plowman via libcamera-devel wrote:\n> > Hi Jacopo\n> >\n> > On Wed, 30 Aug 2023 at 10:40, Jacopo Mondi\n> > <jacopo.mondi@ideasonboard.com> wrote:\n> > >\n> > > Hi David\n> > >\n> > > On Wed, Aug 23, 2023 at 03:49:25PM +0100, David Plowman via libcamera-devel wrote:\n> > > > All the Raspberry Pi official camera tuning files are updated for\n> > > > HDR. As stated previously, there is no mechanism in the hardware for\n> > > > combining images so all this does is enable multi-channel AGC to\n> > > > produce short and long exposure frames. It will be up to the\n> > > > application to deal with them.\n> > > >\n> > > > The changes are identical in every tuning file.\n> > > >\n> > > > 1. The existing AGC tuning is duplicated twice so that we have 3 AGC\n> > > > channels.\n> > > >\n> > > > 2. The first is left alone (the default AGC channel), the second is\n> > > > tweaked to under-expose significantly (ev -3) and the final one is\n> > > > tweaked to over-exposure slightly (ev +0.5)\n> > > >\n> > > > 3. Control parameters are provided to the \"rpi.hdr\" algorithm to\n> > > > associate these AGC channels correctly with the HDR modes.\n> > > >\n> > > > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> > >\n> > > Before reviewing the algorithm implementation itself let me ask a few\n> > > question on the configuration file\n> >\n> > Of course...!\n> >\n> > >\n> > > > ---\n> > > >  src/ipa/rpi/vc4/data/imx219.json           | 384 +++++++++++++++-----\n> > > >  src/ipa/rpi/vc4/data/imx219_noir.json      | 384 +++++++++++++++-----\n> > > >  src/ipa/rpi/vc4/data/imx477.json           | 376 +++++++++++++++-----\n> > > >  src/ipa/rpi/vc4/data/imx477_noir.json      | 384 +++++++++++++++-----\n> > > >  src/ipa/rpi/vc4/data/imx708.json           | 346 +++++++++++++-----\n> > > >  src/ipa/rpi/vc4/data/imx708_noir.json      | 346 +++++++++++++-----\n> > > >  src/ipa/rpi/vc4/data/imx708_wide.json      | 346 +++++++++++++-----\n> > > >  src/ipa/rpi/vc4/data/imx708_wide_noir.json | 346 +++++++++++++-----\n> > > >  src/ipa/rpi/vc4/data/ov5647.json           | 388 ++++++++++++++++-----\n> > > >  9 files changed, 2524 insertions(+), 776 deletions(-)\n> > > >\n> > > > diff --git a/src/ipa/rpi/vc4/data/imx219.json b/src/ipa/rpi/vc4/data/imx219.json\n> > > > index e8fce164..54defc0b 100644\n> > > > --- a/src/ipa/rpi/vc4/data/imx219.json\n> > > > +++ b/src/ipa/rpi/vc4/data/imx219.json\n> > > > @@ -131,95 +131,282 @@\n> > > >          {\n> > > >              \"rpi.agc\":\n> > > >              {\n> > >\n> > > [snip]\n> > >\n> > > > +             \"channels\":\n> > > > +             [\n> > > > +                 {\n> > >\n> > > an index won't hurt to easly connect it to entries in the hdr section\n> >\n> > I wasn't quite sure what you meant here. Are you suggesting including\n> > an index number here that identifies it as libcamera's \"long\" (or\n> > \"short\") channel? That's certainly possible, though I've tried to keep\n> > HDR and AGC channels as separate concepts, the idea being that AGC\n> > channels know nothing about HDR, but are merely something HDR will\n> > use. Of course, in reality they are quite closely connected... though\n> > I wouldn't want to predict exactly how in all cases. (Or maybe I've\n> > misunderstood the question, in which case apologies!)\n> >\n>\n> No no, that's what I meant..\n>\n> I see the HDR section using indexes to idntify channels and assign\n> them names, in example\n>\n>                  \"channel_map\": { \"short\": 1, \"long\": 2 }\n>\n> Are the channels' indexes their definition order in the config file ?\n> Isn't it slightly fragile ?\n>\n> > >\n> > > > +                     \"metering_modes\":\n> > > > +                     {\n> > > > +                         \"centre-weighted\":\n> > > > +                         {\n> > > > +                             \"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> > > > +                         },\n> > > > +                         \"spot\":\n> > > > +                         {\n> > > > +                             \"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> > > > +                         },\n> > > > +                         \"matrix\":\n> > > > +                         {\n> > > > +                             \"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> > > > +                         }\n> > > > +                     },\n> > > > +                     \"exposure_modes\":\n> > > > +                     {\n> > > > +                         \"normal\":\n> > > > +                         {\n> > > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> > > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > > +                         },\n> > > > +                         \"short\":\n> > > > +                         {\n> > > > +                             \"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> > > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > > +                         },\n> > > > +                         \"long\":\n> > > > +                         {\n> > > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> > > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> > > > +                         }\n> > > > +                     },\n> > > > +                     \"constraint_modes\":\n> > > > +                     {\n> > > > +                         \"normal\": [\n> > > > +                             {\n> > > > +                                 \"bound\": \"LOWER\",\n> > > > +                                 \"q_lo\": 0.98,\n> > > > +                                 \"q_hi\": 1.0,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.5,\n> > > > +                                     1000, 0.5\n> > > > +                                 ]\n> > > > +                             }\n> > > > +                         ],\n> > > > +                         \"highlight\": [\n> > > > +                             {\n> > > > +                                 \"bound\": \"LOWER\",\n> > > > +                                 \"q_lo\": 0.98,\n> > > > +                                 \"q_hi\": 1.0,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.5,\n> > > > +                                     1000, 0.5\n> > > > +                                 ]\n> > > > +                             },\n> > > > +                             {\n> > > > +                                 \"bound\": \"UPPER\",\n> > > > +                                 \"q_lo\": 0.98,\n> > > > +                                 \"q_hi\": 1.0,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.8,\n> > > > +                                     1000, 0.8\n> > > > +                                 ]\n> > > > +                             }\n> > > > +                         ],\n> > > > +                         \"shadows\": [\n> > > > +                             {\n> > > > +                                 \"bound\": \"LOWER\",\n> > > > +                                 \"q_lo\": 0.0,\n> > > > +                                 \"q_hi\": 0.5,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.17,\n> > > > +                                     1000, 0.17\n> > > > +                                 ]\n> > > > +                             }\n> > > > +                         ]\n> > > > +                     },\n> > > > +                     \"y_target\":\n> > > > +                     [\n> > > > +                         0, 0.16,\n> > > > +                         1000, 0.165,\n> > > > +                         10000, 0.17\n> > > > +                     ]\n> > > > +                 },\n> > > > +                 {\n> > > > +                     \"base_ev\": 0.125,\n> > >\n> > > I guess this is what makes the channel \"long exposure\"\n> >\n> > Correct. (Actually \"short exposure\" in this case as it will be running\n> > at 1/8 of normal exposure!)\n> >\n>\n> Yeah, sorry\n>\n> > >\n> > > > +                     \"metering_modes\":\n> > > > +                     {\n> > > > +                         \"centre-weighted\":\n> > > > +                         {\n> > > > +                             \"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> > > > +                         },\n> > > > +                         \"spot\":\n> > > > +                         {\n> > > > +                             \"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> > > > +                         },\n> > > > +                         \"matrix\":\n> > > > +                         {\n> > > > +                             \"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> > > > +                         }\n> > > > +                     },\n> > > > +                     \"exposure_modes\":\n> > > > +                     {\n> > > > +                         \"normal\":\n> > > > +                         {\n> > > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> > > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > > +                         },\n> > > > +                         \"short\":\n> > > > +                         {\n> > > > +                             \"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> > > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > > +                         },\n> > > > +                         \"long\":\n> > > > +                         {\n> > > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> > > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> > > > +                         }\n> > > > +                     },\n> > > > +                     \"constraint_modes\":\n> > > > +                     {\n> > > > +                         \"normal\": [\n> > > > +                             {\n> > > > +                                 \"bound\": \"LOWER\",\n> > > > +                                 \"q_lo\": 0.98,\n> > > > +                                 \"q_hi\": 1.0,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.5,\n> > > > +                                     1000, 0.5\n> > > > +                                 ]\n> > > > +                             }\n> > > > +                         ],\n> > > > +                         \"highlight\": [\n> > > > +                             {\n> > > > +                                 \"bound\": \"LOWER\",\n> > > > +                                 \"q_lo\": 0.98,\n> > > > +                                 \"q_hi\": 1.0,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.5,\n> > > > +                                     1000, 0.5\n> > > > +                                 ]\n> > > > +                             },\n> > > > +                             {\n> > > > +                                 \"bound\": \"UPPER\",\n> > > > +                                 \"q_lo\": 0.98,\n> > > > +                                 \"q_hi\": 1.0,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.8,\n> > > > +                                     1000, 0.8\n> > > > +                                 ]\n> > > > +                             }\n> > > > +                         ],\n> > > > +                         \"shadows\": [\n> > > > +                             {\n> > > > +                                 \"bound\": \"LOWER\",\n> > > > +                                 \"q_lo\": 0.0,\n> > > > +                                 \"q_hi\": 0.5,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.17,\n> > > > +                                     1000, 0.17\n> > > > +                                 ]\n> > > > +                             }\n> > > > +                         ]\n> > > > +                     },\n> > > > +                     \"y_target\":\n> > > > +                     [\n> > > > +                         0, 0.16,\n> > > > +                         1000, 0.165,\n> > > > +                         10000, 0.17\n> > > > +                     ]\n> > > > +                 },\n> > > > +                 {\n> > > > +                     \"base_ev\": 1.5,\n> > > > +                     \"metering_modes\":\n> > > > +                     {\n> > > > +                         \"centre-weighted\":\n> > > > +                         {\n> > > > +                             \"weights\": [ 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 ]\n> > > > +                         },\n> > > > +                         \"spot\":\n> > > > +                         {\n> > > > +                             \"weights\": [ 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n> > > > +                         },\n> > > > +                         \"matrix\":\n> > > > +                         {\n> > > > +                             \"weights\": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]\n> > > > +                         }\n> > > > +                     },\n> > > > +                     \"exposure_modes\":\n> > > > +                     {\n> > > > +                         \"normal\":\n> > > > +                         {\n> > > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 66666 ],\n> > > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > > +                         },\n> > > > +                         \"short\":\n> > > > +                         {\n> > > > +                             \"shutter\": [ 100, 5000, 10000, 20000, 33333 ],\n> > > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 8.0 ]\n> > > > +                         },\n> > > > +                         \"long\":\n> > > > +                         {\n> > > > +                             \"shutter\": [ 100, 10000, 30000, 60000, 120000 ],\n> > > > +                             \"gain\": [ 1.0, 2.0, 4.0, 6.0, 12.0 ]\n> > > > +                         }\n> > > > +                     },\n> > > > +                     \"constraint_modes\":\n> > > > +                     {\n> > > > +                         \"normal\": [\n> > > > +                             {\n> > > > +                                 \"bound\": \"LOWER\",\n> > > > +                                 \"q_lo\": 0.98,\n> > > > +                                 \"q_hi\": 1.0,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.5,\n> > > > +                                     1000, 0.5\n> > > > +                                 ]\n> > > > +                             }\n> > > > +                         ],\n> > > > +                         \"highlight\": [\n> > > > +                             {\n> > > > +                                 \"bound\": \"LOWER\",\n> > > > +                                 \"q_lo\": 0.98,\n> > > > +                                 \"q_hi\": 1.0,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.5,\n> > > > +                                     1000, 0.5\n> > > > +                                 ]\n> > > > +                             },\n> > > > +                             {\n> > > > +                                 \"bound\": \"UPPER\",\n> > > > +                                 \"q_lo\": 0.98,\n> > > > +                                 \"q_hi\": 1.0,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.8,\n> > > > +                                     1000, 0.8\n> > > > +                                 ]\n> > > > +                             }\n> > > > +                         ],\n> > > > +                         \"shadows\": [\n> > > > +                             {\n> > > > +                                 \"bound\": \"LOWER\",\n> > > > +                                 \"q_lo\": 0.0,\n> > > > +                                 \"q_hi\": 0.5,\n> > > > +                                 \"y_target\":\n> > > > +                                 [\n> > > > +                                     0, 0.17,\n> > > > +                                     1000, 0.17\n> > > > +                                 ]\n> > > > +                             }\n> > > > +                         ]\n> > > > +                     },\n> > > > +                     \"y_target\":\n> > > > +                     [\n> > > > +                         0, 0.16,\n> > > > +                         1000, 0.165,\n> > > > +                         10000, 0.17\n> > > > +                     ]\n> > > > +                 }\n> > > > +             ]\n> > > > +         }\n> > > >          },\n> > > >          {\n> > > >              \"rpi.alsc\":\n> > > > @@ -463,6 +650,21 @@\n> > > >          },\n> > > >          {\n> > > >              \"rpi.sharpen\": { }\n> > > > -        }\n> > > > +        },\n> > > > +     {\n> > > > +         \"rpi.hdr\":\n> > > > +         {\n> > >\n> > >\n> > > > +             \"MultiExposure\":\n> > > > +             {\n> > > > +                 \"cadence\": [ 1, 2 ],\n> > > > +                 \"channel_map\": { \"short\": 1, \"long\": 2 }\n> > > > +             },\n> > > > +             \"SingleExposure\":\n> > > > +             {\n> > > > +                 \"cadence\": [ 1 ],\n> > > > +                 \"channel_map\": { \"short\": 1 }\n> > > > +             }\n> > >\n> > > Isn't the single exposure mode comparable to the non-hdr mode ? Do we\n> > > need to specify a channel to use in this case, can't the AEGC\n> > > algorithm be driven as usual ?\n> >\n> > Not necessarily. I could imagine a platform where the \"single\n> > exposure\" method uses under-exposed images and is then followed by\n> > some magic image accumulation and tone-mapping. But obviously we can't\n> > do that in hardware on a Pi, you'd have to use some kind of software\n> > post-processing.\n>\n> Ok, so this is a \"shortcut\" for selecting one of the above AGC\n> channels and use that one only, right ?\n>\n> >\n> > Thanks!\n> > David\n> >\n> > >\n> > > [snip]\n> > >","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 E323EC326B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 18 Sep 2023 09:06:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5B9886293E;\n\tMon, 18 Sep 2023 11:06:42 +0200 (CEST)","from mail-qv1-xf31.google.com (mail-qv1-xf31.google.com\n\t[IPv6:2607:f8b0:4864:20::f31])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EEA5161DEC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 18 Sep 2023 11:06:40 +0200 (CEST)","by mail-qv1-xf31.google.com with SMTP id\n\t6a1803df08f44-658220cf800so2529176d6.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 18 Sep 2023 02:06:40 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1695028002;\n\tbh=rhXybGSH1RmlwI0Q1GKVjhu+OxZRyxseb+KpVogSAu4=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=MqhrvTQfnOjApHnpVRNM0vTmuORyWNKQEZRRPEzX96y0/rFeptS0pFlouGqCE0XfU\n\tPTXwPSCPVNEsdd17wIqNOKxH05CyWcjgoV0+skDMaV5Kj2U8SIuZw83O9SnTztM9RC\n\tiqUdk4yw9nMkoAWfNUqVWiWSNbHe4YmCMyf3wJk+sSlvFDxSkW6P6jS87qaJxzjI+Z\n\tBG+jSXzUHYgyq9O1Bj0PsMmX59pDTK3HmG+OOeidHiLPBYMDC8ERbC+tmkaJiAcw2C\n\tbdRA/F4cln183mGQT62z+/1Gus/AbSACv0eeAySeyh1LvYYFuqdvdBmraa4cac/if7\n\tglZGTi79t44sQ==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1695028000; x=1695632800;\n\tdarn=lists.libcamera.org; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=MqF818e8+fxKhAF1Gsb5HMCjn6dOzJLN9ER/LmX1Hg0=;\n\tb=RDKrIY1I5dI5IGHOKH1hlZq7G+H+Wk39vpK6ulp4/hZFAFty9zDkF+rEwyrUSmA4EQ\n\tyRHd96/BYWsIQVrmbWl459WmR0tE3xkZlT/+qb6L/VSpBbAmIyaMgE+bJib0epUNnYFu\n\tebdhnjTXFHdaEpW16DNnnFBSH4JU44aBNxBN7/Z5CwKcNeaCeZGLMkHqNTPA9OgdkBOo\n\tbGZMnkd7fww2oJLjNmAY74uIe5jgdOP/mVmInj22aNgWU0P6abmdk6Rh9ETdb7YMyN33\n\t/IWJ/wbtJUt5aifvZUU5+qK8Pivgj5CDMNQJKxvwpPjFH5GGUxk+NbwtE7qvfFqW6k7Y\n\thMmA=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"RDKrIY1I\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1695028000; x=1695632800;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=MqF818e8+fxKhAF1Gsb5HMCjn6dOzJLN9ER/LmX1Hg0=;\n\tb=WwGt4+vxcRK4uW0iDM6JUhJBR0coghM+RSdcCaMGRLLfVTK57+T0eB091Aa6ep18H1\n\tx+9T4kCb1o//AFAe9fG7ARqxP8fYx86uIonVgrB9Jlt1MsVkKR4zc1KdCt27HOiTWuS5\n\tisHhpuHEeA9bzPqz4Lqwqr3orZW/nHmA9vQ07HbFZHb8l6JkeFSDsjQkXFXC/uUvp9Xe\n\t2Qk9UDpLQIQhcq5BNr8HSLfnIs9Tztk4wJJl0XoLjQsI+MjG2pkGfEj5TiaNUzYKRrIA\n\t9o0xzRrduDeSXP2yTBpUmVMFCU2Q7b1Pp6n84pvtfwPWLmmK7smbI2GMjPnLPXt6SxRS\n\tmQdQ==","X-Gm-Message-State":"AOJu0YxvT2SMbQWWMM5Aw/dZ5WWonKY6oodCQ4DAbO1dWErrvrQ+c4W4\n\tay3yL8cJomYScHbU5QO/zZCbwNragkamC44y7ejPYTqcexkY6HQL","X-Google-Smtp-Source":"AGHT+IGOogVMib+PK+QMmaDsZ8tpIy0PcCgkB8Opgsi1Ja610XfN+jPjWleN7uSfNZ4aWQbOO8vuYEgDaKSKX9foqNs=","X-Received":"by 2002:ad4:5309:0:b0:656:2d0c:d001 with SMTP id\n\ty9-20020ad45309000000b006562d0cd001mr10068919qvr.12.1695027999797;\n\tMon, 18 Sep 2023 02:06:39 -0700 (PDT)","MIME-Version":"1.0","References":"<20230823144925.2542-1-david.plowman@raspberrypi.com>\n\t<20230823144925.2542-3-david.plowman@raspberrypi.com>\n\t<u5exqk5v6ojlnsugfda5aiayp65cobof4cyqdwdoq6waxgx4nr@gtr4dinkibxd>\n\t<CAHW6GY+COeJH6hp0Thr0ATeRiD_OZHofxRj0mz0_CFjyy+20ow@mail.gmail.com>\n\t<dchecigo47hgq6kpexmiadwvzfidmb3th26h34adovpqirhmba@mvn2kwfvjn7j>","In-Reply-To":"<dchecigo47hgq6kpexmiadwvzfidmb3th26h34adovpqirhmba@mvn2kwfvjn7j>","Date":"Mon, 18 Sep 2023 10:06:28 +0100","Message-ID":"<CAHW6GYLB4wJi-sockVB4oommmLcNoNnPP6B8KxcKDhxJaS5n5w@mail.gmail.com>","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH v2 2/2] ipa: rpi: vc4: data: Update\n\ttuning files for HDR","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>","From":"David Plowman via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"David Plowman <david.plowman@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]