[{"id":26355,"web_url":"https://patchwork.libcamera.org/comment/26355/","msgid":"<167466166454.135671.4719103325210322428@Monstersaurus>","date":"2023-01-25T15:47:44","subject":"Re: [libcamera-devel] [PATCH] libcamera: controls: Add controls for\n\tAEC/AGC flicker avoidance","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi David,\n\nQuoting David Plowman via libcamera-devel (2023-01-25 13:20:18)\n> Flicker is the term used to describe brightness banding or oscillation\n> of images caused typically by artificial lighting driven by a 50 or\n> 60Hz mains supply. We add two controls intended to be used by AEC/AGC\n> algorithms:\n> \n> AeFlickerMode to determine whether flicker avoidance is active or not.\n> \n> AeFlickerPeriod to specify a custom flicker period when the period is\n> other than 50 or 60Hz.\n\nOh excellent, this had been flickering in the back of my mind for some\ntime.\n\nI expect you're going to be providing an implementation for\npipeline/raspberrypi, but this should be easy to add to\npipeline/uvcvideo too with appropriate mapping to:\n\n#define V4L2_CID_POWER_LINE_FREQUENCY   (V4L2_CID_BASE+24)\nenum v4l2_power_line_frequency {\n        V4L2_CID_POWER_LINE_FREQUENCY_DISABLED  = 0,\n        V4L2_CID_POWER_LINE_FREQUENCY_50HZ      = 1,\n        V4L2_CID_POWER_LINE_FREQUENCY_60HZ      = 2,\n        V4L2_CID_POWER_LINE_FREQUENCY_AUTO      = 3,\n};\n\n\n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  src/libcamera/control_ids.yaml | 52 ++++++++++++++++++++++++++++++++++\n>  1 file changed, 52 insertions(+)\n> \n> diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml\n> index adea5f90..5e5428ea 100644\n> --- a/src/libcamera/control_ids.yaml\n> +++ b/src/libcamera/control_ids.yaml\n> @@ -14,6 +14,58 @@ controls:\n>  \n>          \\sa ExposureTime AnalogueGain\n>  \n> +  - AeFlickerMode:\n> +      type: int32_t\n> +      description: |\n> +        Set the flicker mode, which determines whether, and how, the AGC/AEC\n> +        algorithm attempts to hide flicker effects caused by the duty cycle of\n> +        artificial lighting.\n> +\n> +        Although implementation dependent, many algorithms for \"flicker\n> +        avoidance\" work by restricting the exposure time to integer multiples\n> +        of this cycle period, wherever possible.\n> +\n> +        Implementations may not support all of the flicker modes listed below.\n\nHrm... this makes me wonder how an application can determine what is\npossible, and what we would expect if the application tries to set a\nmode that isn't possible on that device.\n\nI don't think we have anything yet at the framework level to be able to\nexpose which subset of a mode are valid for a given camera...\n\nFor example, the UVC pipeline wouldn't support FlickerCustom.\n\n(I don't think that itself blocks the definition of these options though)\n\n> +\n> +      enum:\n> +        - name: FlickerOff\n> +          value: 0\n> +          description: No flicker avoidance is performed.\n> +        - name: Flicker50Hz\n> +          value: 1\n> +          description: 50Hz flicker avoidance.\n> +            Suppress flicker effects caused by lighting runing with a\n> +            100Hz period (such as produced by 50Hz mains electricity).\n> +        - name: Flicker60Hz\n> +          value: 2\n> +          description: 60Hz flicker avoidance.\n> +            Suppress flicker effects caused by lighting running with a\n> +            120Hz period (such as produced by 60Hz mains electricity).\n> +        - name: FlickerCustom\n> +          value: 3\n> +          description: Custom flicker avoidance.\n> +            Suppress flicker effects caused by lighting running with a\n> +            period specified by AeFlickerPeriod.\n> +\n> +            \\sa AeFlickerPeriod\n> +        - name: FlickerAuto\n> +          value: 4\n> +          description: Automatic flicker period detection and avoidance.\n> +            The system will automatically determine the most likely value\n> +            of the flicker period, and avoid flicker of this frequency.\n> +        \n> +  - AeFlickerPeriod:\n> +      type: int32_t\n> +      description: Custom flicker period in microseconds.\n> +        This value is taken as the current flicker period to avoid. It\n> +        is used when the AeFlickerMode is set to FlickerCustom.\n> +\n> +        For example, to avoid 50Hz mains flicker, you could set the period\n> +        to 10000, corresponding to 10ms (twice the mains frequency), and\n> +        AeFlickerMode to FlickerCustom.\n> +\n> +        \\sa AeFlickerMode\n\nI like that applications would be able to control this so precisely,\nrather than just the standard 50/60Hz modes.\n\n--\nKieran\n\n\n> +\n>    - AeLocked:\n>        type: bool\n>        description: |\n> -- \n> 2.30.2\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 067E4BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 25 Jan 2023 15:47:50 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7527A625D8;\n\tWed, 25 Jan 2023 16:47:49 +0100 (CET)","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 41F81603C0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 25 Jan 2023 16:47:47 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B28756E0;\n\tWed, 25 Jan 2023 16:47:46 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1674661669;\n\tbh=+aQCw4qToi3Cb54ZY37VkYI9f7JQyHbzjI1D1J/r8gw=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=hLMGh04psFEX5aDCnhk1LVBeILrJt4AFrDtFi7WlVgSh2zfBptSeKYLEvx7mq1pSo\n\tIv7ACu24rrVLCi5fn1yVB0vByOpvr2RnEB/vSPsftl4ZM6abL8jhNAQKQmKD766JK5\n\tmFPMf8W2u1le/hsaBMNLGM0l9EFaiodvgl7KeMlbKpE2IVQD/6cCT8+HuN1jjOWvxw\n\tZS1G3s/QJ0oJWIb3A16px7XYDHQbFpMrtSC6P6GnAs82hKi8MELK4pIA4SjHmzjvG1\n\tkU73Po6+oFS3JXJy+3cZzvb8aliQj5JsXChhJTDlnmgdBYZUMnGoNL06/nAufRdS7+\n\tiYoiUKWUucFHQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1674661666;\n\tbh=+aQCw4qToi3Cb54ZY37VkYI9f7JQyHbzjI1D1J/r8gw=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=QkkbLQv4rVo9hi+ROKbrSr2trgsQoUXXDLH1Ke+iAxgmA5eyZBKERk4Ldc0IOPur5\n\thePzC7YW+osjvhz/faUJ/Dzuzc99vGfR59keVdOdM6RcevQVvkeUvgg4gIYd2k9gZD\n\t/j+TK1XwNxaT16b+4VzlLqdlauk+DGjDZsFrM/X0="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"QkkbLQv4\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20230125132018.5725-1-david.plowman@raspberrypi.com>","References":"<20230125132018.5725-1-david.plowman@raspberrypi.com>","To":"David Plowman <david.plowman@raspberrypi.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Wed, 25 Jan 2023 15:47:44 +0000","Message-ID":"<167466166454.135671.4719103325210322428@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH] libcamera: controls: Add controls for\n\tAEC/AGC flicker avoidance","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":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":26356,"web_url":"https://patchwork.libcamera.org/comment/26356/","msgid":"<CAHW6GYLZ_xxjmrMoaB+cq20RwT+gtySqUzTi72SVG_j7N+nCvA@mail.gmail.com>","date":"2023-01-25T17:22:27","subject":"Re: [libcamera-devel] [PATCH] libcamera: controls: Add controls for\n\tAEC/AGC flicker avoidance","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Kieran\n\nThanks for the reply.\n\nOn Wed, 25 Jan 2023 at 15:47, Kieran Bingham\n<kieran.bingham@ideasonboard.com> wrote:\n>\n> Hi David,\n>\n> Quoting David Plowman via libcamera-devel (2023-01-25 13:20:18)\n> > Flicker is the term used to describe brightness banding or oscillation\n> > of images caused typically by artificial lighting driven by a 50 or\n> > 60Hz mains supply. We add two controls intended to be used by AEC/AGC\n> > algorithms:\n> >\n> > AeFlickerMode to determine whether flicker avoidance is active or not.\n> >\n> > AeFlickerPeriod to specify a custom flicker period when the period is\n> > other than 50 or 60Hz.\n>\n> Oh excellent, this had been flickering in the back of my mind for some\n> time.\n>\n> I expect you're going to be providing an implementation for\n> pipeline/raspberrypi, but this should be easy to add to\n> pipeline/uvcvideo too with appropriate mapping to:\n>\n> #define V4L2_CID_POWER_LINE_FREQUENCY   (V4L2_CID_BASE+24)\n> enum v4l2_power_line_frequency {\n>         V4L2_CID_POWER_LINE_FREQUENCY_DISABLED  = 0,\n>         V4L2_CID_POWER_LINE_FREQUENCY_50HZ      = 1,\n>         V4L2_CID_POWER_LINE_FREQUENCY_60HZ      = 2,\n>         V4L2_CID_POWER_LINE_FREQUENCY_AUTO      = 3,\n> };\n\nI wonder what \"AUTO\" is intended to do. Perhaps it selects based on\nlocation, perhaps it does something cleverer. I guess it's up to the\ndriver.\n\n>\n>\n> > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> > ---\n> >  src/libcamera/control_ids.yaml | 52 ++++++++++++++++++++++++++++++++++\n> >  1 file changed, 52 insertions(+)\n> >\n> > diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml\n> > index adea5f90..5e5428ea 100644\n> > --- a/src/libcamera/control_ids.yaml\n> > +++ b/src/libcamera/control_ids.yaml\n> > @@ -14,6 +14,58 @@ controls:\n> >\n> >          \\sa ExposureTime AnalogueGain\n> >\n> > +  - AeFlickerMode:\n> > +      type: int32_t\n> > +      description: |\n> > +        Set the flicker mode, which determines whether, and how, the AGC/AEC\n> > +        algorithm attempts to hide flicker effects caused by the duty cycle of\n> > +        artificial lighting.\n> > +\n> > +        Although implementation dependent, many algorithms for \"flicker\n> > +        avoidance\" work by restricting the exposure time to integer multiples\n> > +        of this cycle period, wherever possible.\n> > +\n> > +        Implementations may not support all of the flicker modes listed below.\n>\n> Hrm... this makes me wonder how an application can determine what is\n> possible, and what we would expect if the application tries to set a\n> mode that isn't possible on that device.\n>\n> I don't think we have anything yet at the framework level to be able to\n> expose which subset of a mode are valid for a given camera...\n>\n> For example, the UVC pipeline wouldn't support FlickerCustom.\n>\n> (I don't think that itself blocks the definition of these options though)\n\nYou could set a max control value that excludes the \"top\" choices, I\nthink I've seen that done before. Maybe one might swap the \"custom\"\nand \"auto\" values. But a better solution for unhandled control values\nwould be nice!\n\nDavid\n\n>\n> > +\n> > +      enum:\n> > +        - name: FlickerOff\n> > +          value: 0\n> > +          description: No flicker avoidance is performed.\n> > +        - name: Flicker50Hz\n> > +          value: 1\n> > +          description: 50Hz flicker avoidance.\n> > +            Suppress flicker effects caused by lighting runing with a\n> > +            100Hz period (such as produced by 50Hz mains electricity).\n> > +        - name: Flicker60Hz\n> > +          value: 2\n> > +          description: 60Hz flicker avoidance.\n> > +            Suppress flicker effects caused by lighting running with a\n> > +            120Hz period (such as produced by 60Hz mains electricity).\n> > +        - name: FlickerCustom\n> > +          value: 3\n> > +          description: Custom flicker avoidance.\n> > +            Suppress flicker effects caused by lighting running with a\n> > +            period specified by AeFlickerPeriod.\n> > +\n> > +            \\sa AeFlickerPeriod\n> > +        - name: FlickerAuto\n> > +          value: 4\n> > +          description: Automatic flicker period detection and avoidance.\n> > +            The system will automatically determine the most likely value\n> > +            of the flicker period, and avoid flicker of this frequency.\n> > +\n> > +  - AeFlickerPeriod:\n> > +      type: int32_t\n> > +      description: Custom flicker period in microseconds.\n> > +        This value is taken as the current flicker period to avoid. It\n> > +        is used when the AeFlickerMode is set to FlickerCustom.\n> > +\n> > +        For example, to avoid 50Hz mains flicker, you could set the period\n> > +        to 10000, corresponding to 10ms (twice the mains frequency), and\n> > +        AeFlickerMode to FlickerCustom.\n> > +\n> > +        \\sa AeFlickerMode\n>\n> I like that applications would be able to control this so precisely,\n> rather than just the standard 50/60Hz modes.\n>\n> --\n> Kieran\n>\n>\n> > +\n> >    - AeLocked:\n> >        type: bool\n> >        description: |\n> > --\n> > 2.30.2\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 83C68BDB1D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 25 Jan 2023 17:22:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9EF40625E4;\n\tWed, 25 Jan 2023 18:22:41 +0100 (CET)","from mail-oa1-x30.google.com (mail-oa1-x30.google.com\n\t[IPv6:2001:4860:4864:20::30])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E8106603C0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 25 Jan 2023 18:22:39 +0100 (CET)","by mail-oa1-x30.google.com with SMTP id\n\t586e51a60fabf-15f64f2791dso22170112fac.7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 25 Jan 2023 09:22:39 -0800 (PST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1674667361;\n\tbh=vO5GJ8WYWKbpGlpES4AvTctnlyt74bFfhbfyS0AQ1WA=;\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=HSX30j7IJ8faXz1IeoH7uwmcqQFVBpXquC60EkIWMH5R8iarucbYTeeqtYjOWTo4H\n\tnvLa4WxlJL90mD+jYzPDB9ZYbbGuE3X9fF5cMc2QXUbtJ5JPedbtKhVwVREuFhnMJE\n\tWBfWOg87pid6DnRYEAnJL845MGq0WrW3kr1wW4ajSiCaFisCCw+9EjihLMz5N8d+vK\n\tn1Z1Sw/tgkpq2wBKf8FrXDZhRi7k3/vFM084fLejeaqGGepoDLqIhXaSM9sA3hW6G5\n\tohL6KTsmZCdNerD+F7V0aSJ7P3e/5vAyJ/mAhagvWjDxashxicquZfcSZereAwt++a\n\tCVAw6JL1cO0bQ==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\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=NrCvw0KXq8NOW/lPvAJbU0+OwnYJfdZ8/7hvDpm8CYU=;\n\tb=lZ4tyIcJiQaLXd/DvjLQYKnGjse4JTVb2HsI2ISm2+r7kAJhZbbexCZ+abg22yDXb7\n\tVwKINhsOEv2pyjeeNyf3/scJE+xocGs3TNmAS5poBVYTYQdvGM8M1yjGK0xZWhcrsl4N\n\twT3etVur7g6+R2+JZWbai7p59QDK+bzaR9MT1W6apozG8PXgiLiZeZoVeOl2ojD+wJJ8\n\tLK0YyBh3qdPWhNIrEs7YshPt3FswWh5HWPETWmkqEdWMt949Fdq3ete/9WJeSxZu6XMN\n\t5WVgbO9Mm0g81Kn+wEuS5V+BjssaUVFW7/FPiYckhYpIBYjSro6zUdmuv6M9vX8m9SIC\n\tPTKw=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"lZ4tyIcJ\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\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=NrCvw0KXq8NOW/lPvAJbU0+OwnYJfdZ8/7hvDpm8CYU=;\n\tb=O6f505w2HfO3JuER25h93YAOHzFfL/DFUUOwC3TIbtkhVIlrCFH4tu80Altblk7VKZ\n\tu+AJHmZqrvzYMB4PPOHFvuF0z6TauDIvnRIG1vh0yYfmk9xS23FPrZzISFjF2E4dD7zB\n\tCCbTHQ6dIPF4HwWxj5M6xP+8uj1kUlJXg0eAMmst+XL11rjnASM66qBQSSSA6yG/9qnK\n\tmG/J5H/APHPtweH5vP8Ue83mhGsm42lTsDKdGNeO+Qjaxth6ce4fu4MToop3MYLpBpLG\n\tNCUiqXUN95LzHZXxv/TzjELFtklZEIZa4lNhXDKLgiTdztXulXiTl/ylRw3uJahd7FAE\n\tkBcA==","X-Gm-Message-State":"AFqh2koreRReoRjfhx3N9hgPBcl0un9dhJKqv8+bcQiHvzq4UmlpjWyG\n\t07F/vwK64bUHZiomhksQjDLsJJdojcwcibuNaccZgJ/2YBTptw==","X-Google-Smtp-Source":"AMrXdXvgOjTX9CTfRL0mis5k1GjviA5k8FTjEM2mODyer60QNW+rkVLu5Bi9SLaG36ClttH9DshoT+Q09NHpN/gwirg=","X-Received":"by 2002:a05:6870:2c88:b0:150:a02f:1505 with SMTP id\n\toh8-20020a0568702c8800b00150a02f1505mr1888136oab.246.1674667358453;\n\tWed, 25 Jan 2023 09:22:38 -0800 (PST)","MIME-Version":"1.0","References":"<20230125132018.5725-1-david.plowman@raspberrypi.com>\n\t<167466166454.135671.4719103325210322428@Monstersaurus>","In-Reply-To":"<167466166454.135671.4719103325210322428@Monstersaurus>","Date":"Wed, 25 Jan 2023 17:22:27 +0000","Message-ID":"<CAHW6GYLZ_xxjmrMoaB+cq20RwT+gtySqUzTi72SVG_j7N+nCvA@mail.gmail.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH] libcamera: controls: Add controls for\n\tAEC/AGC flicker avoidance","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":26357,"web_url":"https://patchwork.libcamera.org/comment/26357/","msgid":"<167466821488.135671.16278629573901222190@Monstersaurus>","date":"2023-01-25T17:36:54","subject":"Re: [libcamera-devel] [PATCH] libcamera: controls: Add controls for\n\tAEC/AGC flicker avoidance","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting David Plowman (2023-01-25 17:22:27)\n> Hi Kieran\n> \n> Thanks for the reply.\n> \n> On Wed, 25 Jan 2023 at 15:47, Kieran Bingham\n> <kieran.bingham@ideasonboard.com> wrote:\n> >\n> > Hi David,\n> >\n> > Quoting David Plowman via libcamera-devel (2023-01-25 13:20:18)\n> > > Flicker is the term used to describe brightness banding or oscillation\n> > > of images caused typically by artificial lighting driven by a 50 or\n> > > 60Hz mains supply. We add two controls intended to be used by AEC/AGC\n> > > algorithms:\n> > >\n> > > AeFlickerMode to determine whether flicker avoidance is active or not.\n> > >\n> > > AeFlickerPeriod to specify a custom flicker period when the period is\n> > > other than 50 or 60Hz.\n> >\n> > Oh excellent, this had been flickering in the back of my mind for some\n> > time.\n> >\n> > I expect you're going to be providing an implementation for\n> > pipeline/raspberrypi, but this should be easy to add to\n> > pipeline/uvcvideo too with appropriate mapping to:\n> >\n> > #define V4L2_CID_POWER_LINE_FREQUENCY   (V4L2_CID_BASE+24)\n> > enum v4l2_power_line_frequency {\n> >         V4L2_CID_POWER_LINE_FREQUENCY_DISABLED  = 0,\n> >         V4L2_CID_POWER_LINE_FREQUENCY_50HZ      = 1,\n> >         V4L2_CID_POWER_LINE_FREQUENCY_60HZ      = 2,\n> >         V4L2_CID_POWER_LINE_FREQUENCY_AUTO      = 3,\n> > };\n> \n> I wonder what \"AUTO\" is intended to do. Perhaps it selects based on\n> location, perhaps it does something cleverer. I guess it's up to the\n> driver.\n\nhttps://lore.kernel.org/all/1316519939-22540-3-git-send-email-s.nawrocki@samsung.com/\n\n\"\"\"\nV4L2_CID_POWER_LINE_FREQUENCY control allows applications to instruct\na driver what is the power line frequency so an appropriate filter\ncan be used by the device to cancel flicker by compensating the light\nintensity ripple and thus. Currently in the menu we have entries for\n50 and 60 Hz and for entirely disabling the anti-flicker filter.\n\nHowever some devices are capable of automatically detecting the\nfrequency, so add V4L2_CID_POWER_LINE_FREQUENCY_AUTO entry for them.\n\"\"\"\n\nI guess the same applies to FlickerAuto ?\n\n> >\n> >\n> > > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> > > ---\n> > >  src/libcamera/control_ids.yaml | 52 ++++++++++++++++++++++++++++++++++\n> > >  1 file changed, 52 insertions(+)\n> > >\n> > > diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml\n> > > index adea5f90..5e5428ea 100644\n> > > --- a/src/libcamera/control_ids.yaml\n> > > +++ b/src/libcamera/control_ids.yaml\n> > > @@ -14,6 +14,58 @@ controls:\n> > >\n> > >          \\sa ExposureTime AnalogueGain\n> > >\n> > > +  - AeFlickerMode:\n> > > +      type: int32_t\n> > > +      description: |\n> > > +        Set the flicker mode, which determines whether, and how, the AGC/AEC\n> > > +        algorithm attempts to hide flicker effects caused by the duty cycle of\n> > > +        artificial lighting.\n> > > +\n> > > +        Although implementation dependent, many algorithms for \"flicker\n> > > +        avoidance\" work by restricting the exposure time to integer multiples\n> > > +        of this cycle period, wherever possible.\n> > > +\n> > > +        Implementations may not support all of the flicker modes listed below.\n> >\n> > Hrm... this makes me wonder how an application can determine what is\n> > possible, and what we would expect if the application tries to set a\n> > mode that isn't possible on that device.\n> >\n> > I don't think we have anything yet at the framework level to be able to\n> > expose which subset of a mode are valid for a given camera...\n> >\n> > For example, the UVC pipeline wouldn't support FlickerCustom.\n> >\n> > (I don't think that itself blocks the definition of these options though)\n> \n> You could set a max control value that excludes the \"top\" choices, I\n> think I've seen that done before. Maybe one might swap the \"custom\"\n> and \"auto\" values. But a better solution for unhandled control values\n> would be nice!\n\nYes, I just wondered about this trying to implement this quickly in UVC.\nSwapping Custom to be last might be reasonable, and then have max at\nauto. (It would work for UVC at least, but may not be generic).\n\nThe other point that would inform the application is that the camera can\nchoose to not expose the AeFlickerPeriod control. Then it can't set the\ncustom mode!\n\n--\nKieran\n\n\n> \n> David\n> \n> >\n> > > +\n> > > +      enum:\n> > > +        - name: FlickerOff\n> > > +          value: 0\n> > > +          description: No flicker avoidance is performed.\n> > > +        - name: Flicker50Hz\n> > > +          value: 1\n> > > +          description: 50Hz flicker avoidance.\n> > > +            Suppress flicker effects caused by lighting runing with a\n> > > +            100Hz period (such as produced by 50Hz mains electricity).\n> > > +        - name: Flicker60Hz\n> > > +          value: 2\n> > > +          description: 60Hz flicker avoidance.\n> > > +            Suppress flicker effects caused by lighting running with a\n> > > +            120Hz period (such as produced by 60Hz mains electricity).\n> > > +        - name: FlickerCustom\n> > > +          value: 3\n> > > +          description: Custom flicker avoidance.\n> > > +            Suppress flicker effects caused by lighting running with a\n> > > +            period specified by AeFlickerPeriod.\n> > > +\n> > > +            \\sa AeFlickerPeriod\n> > > +        - name: FlickerAuto\n> > > +          value: 4\n> > > +          description: Automatic flicker period detection and avoidance.\n> > > +            The system will automatically determine the most likely value\n> > > +            of the flicker period, and avoid flicker of this frequency.\n> > > +\n> > > +  - AeFlickerPeriod:\n> > > +      type: int32_t\n> > > +      description: Custom flicker period in microseconds.\n> > > +        This value is taken as the current flicker period to avoid. It\n> > > +        is used when the AeFlickerMode is set to FlickerCustom.\n> > > +\n> > > +        For example, to avoid 50Hz mains flicker, you could set the period\n> > > +        to 10000, corresponding to 10ms (twice the mains frequency), and\n> > > +        AeFlickerMode to FlickerCustom.\n> > > +\n> > > +        \\sa AeFlickerMode\n> >\n> > I like that applications would be able to control this so precisely,\n> > rather than just the standard 50/60Hz modes.\n> >\n> > --\n> > Kieran\n> >\n> >\n> > > +\n> > >    - AeLocked:\n> > >        type: bool\n> > >        description: |\n> > > --\n> > > 2.30.2\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 204E0BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 25 Jan 2023 17:37:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 68B92625E4;\n\tWed, 25 Jan 2023 18:36:59 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BABAC603C0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 25 Jan 2023 18:36:57 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 384C06E0;\n\tWed, 25 Jan 2023 18:36:57 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1674668219;\n\tbh=7/J8KoGMB6DBJPyZkPCkSpxX+bbBWifSsA3qSZZjF08=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=LHQY4BJ4KU5FBh5YZZDjFVGJ2N+YhUkYnDSUpANfmFeLsp92QxLUqplxBqnp7IP1F\n\tr6FifudJ4DsJsTQAXNGRvA2Jx6d23rmYv/3n4xEWXddRwdhnoT+/zAtFuwe9mpVl53\n\tDT710pysDT/VQLYf5OIXkV6tvCClYxH249kX3ykzVwGuFOIpoUXWhuBto4ZUAgUim5\n\tP0j7xBQHvokOHnrzbCiAOntcZwBSpVv9LvLs86fF16beKR62/6w8fGOXbv8J+1aGRz\n\t6DohAvAsAvXeRj0kFTUOcAId54vKBbj8h+brtO2n3XyFH+lBGdmh84s2Z75XZmuMxy\n\tjC44pgcF60rtQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1674668217;\n\tbh=7/J8KoGMB6DBJPyZkPCkSpxX+bbBWifSsA3qSZZjF08=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=G3geWqvNuqpnKUkov0zEeQpJI4o13z2mrl46iS8FEXo3TnCqKhXIGQsmdgEX4LIWn\n\tNC/OdhvHip10RixFy1zyOi8vtLrjPccHV6XC42QO/kIyvsXD5omG2TKp7FjyyU7FHj\n\tflXTFNJ3WArd3gBZVJqxdsB6GKIdP2Pcmvt+hbAU="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"G3geWqvN\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<CAHW6GYLZ_xxjmrMoaB+cq20RwT+gtySqUzTi72SVG_j7N+nCvA@mail.gmail.com>","References":"<20230125132018.5725-1-david.plowman@raspberrypi.com>\n\t<167466166454.135671.4719103325210322428@Monstersaurus>\n\t<CAHW6GYLZ_xxjmrMoaB+cq20RwT+gtySqUzTi72SVG_j7N+nCvA@mail.gmail.com>","To":"David Plowman <david.plowman@raspberrypi.com>","Date":"Wed, 25 Jan 2023 17:36:54 +0000","Message-ID":"<167466821488.135671.16278629573901222190@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH] libcamera: controls: Add controls for\n\tAEC/AGC flicker avoidance","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":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@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":26651,"web_url":"https://patchwork.libcamera.org/comment/26651/","msgid":"<CAEmqJPq7R+Ac_3ca4KXNOHWjQRqPRd+vLJK1CA1=novc1KmF2A@mail.gmail.com>","date":"2023-03-13T09:04:16","subject":"Re: [libcamera-devel] [PATCH] libcamera: controls: Add controls for\n\tAEC/AGC flicker avoidance","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi David,\n\nThanks for this work!\n\nOn Wed, 25 Jan 2023 at 13:20, David Plowman via libcamera-devel <\nlibcamera-devel@lists.libcamera.org> wrote:\n\n> Flicker is the term used to describe brightness banding or oscillation\n> of images caused typically by artificial lighting driven by a 50 or\n> 60Hz mains supply. We add two controls intended to be used by AEC/AGC\n> algorithms:\n>\n> AeFlickerMode to determine whether flicker avoidance is active or not.\n>\n> AeFlickerPeriod to specify a custom flicker period when the period is\n> other than 50 or 60Hz.\n>\n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n>\n\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\n\n\n\n> ---\n>  src/libcamera/control_ids.yaml | 52 ++++++++++++++++++++++++++++++++++\n>  1 file changed, 52 insertions(+)\n>\n> diff --git a/src/libcamera/control_ids.yaml\n> b/src/libcamera/control_ids.yaml\n> index adea5f90..5e5428ea 100644\n> --- a/src/libcamera/control_ids.yaml\n> +++ b/src/libcamera/control_ids.yaml\n> @@ -14,6 +14,58 @@ controls:\n>\n>          \\sa ExposureTime AnalogueGain\n>\n> +  - AeFlickerMode:\n> +      type: int32_t\n> +      description: |\n> +        Set the flicker mode, which determines whether, and how, the\n> AGC/AEC\n> +        algorithm attempts to hide flicker effects caused by the duty\n> cycle of\n> +        artificial lighting.\n> +\n> +        Although implementation dependent, many algorithms for \"flicker\n> +        avoidance\" work by restricting the exposure time to integer\n> multiples\n> +        of this cycle period, wherever possible.\n> +\n> +        Implementations may not support all of the flicker modes listed\n> below.\n> +\n> +      enum:\n> +        - name: FlickerOff\n> +          value: 0\n> +          description: No flicker avoidance is performed.\n> +        - name: Flicker50Hz\n> +          value: 1\n> +          description: 50Hz flicker avoidance.\n> +            Suppress flicker effects caused by lighting runing with a\n> +            100Hz period (such as produced by 50Hz mains electricity).\n> +        - name: Flicker60Hz\n> +          value: 2\n> +          description: 60Hz flicker avoidance.\n> +            Suppress flicker effects caused by lighting running with a\n> +            120Hz period (such as produced by 60Hz mains electricity).\n> +        - name: FlickerCustom\n> +          value: 3\n> +          description: Custom flicker avoidance.\n> +            Suppress flicker effects caused by lighting running with a\n> +            period specified by AeFlickerPeriod.\n> +\n> +            \\sa AeFlickerPeriod\n> +        - name: FlickerAuto\n> +          value: 4\n> +          description: Automatic flicker period detection and avoidance.\n> +            The system will automatically determine the most likely value\n> +            of the flicker period, and avoid flicker of this frequency.\n> +\n> +  - AeFlickerPeriod:\n> +      type: int32_t\n> +      description: Custom flicker period in microseconds.\n> +        This value is taken as the current flicker period to avoid. It\n> +        is used when the AeFlickerMode is set to FlickerCustom.\n> +\n> +        For example, to avoid 50Hz mains flicker, you could set the period\n> +        to 10000, corresponding to 10ms (twice the mains frequency), and\n> +        AeFlickerMode to FlickerCustom.\n> +\n> +        \\sa AeFlickerMode\n> +\n>    - AeLocked:\n>        type: bool\n>        description: |\n> --\n> 2.30.2\n>\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 6569EBE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 13 Mar 2023 09:04:07 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A824762709;\n\tMon, 13 Mar 2023 10:04:06 +0100 (CET)","from mail-yw1-x112a.google.com (mail-yw1-x112a.google.com\n\t[IPv6:2607:f8b0:4864:20::112a])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DB019626B2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 13 Mar 2023 10:04:05 +0100 (CET)","by mail-yw1-x112a.google.com with SMTP id\n\t00721157ae682-5416698e889so107234217b3.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 13 Mar 2023 02:04:05 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1678698246;\n\tbh=s381Q7c6K3IsK5nmQ/yU62MIlqZXXN4MlAZNz81n+cc=;\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=JAkGkiHWmkorshhvo4RoppMU1HVIYiqkSUGT5NBdcnjj2bn8qDDIR970IGVaiig7f\n\tbJOkAlfykXoFRHmFWMFjQLSfNxSDwDvxnPIyMpLVaEKYh28hnCaRFD9yeWy6/W009O\n\tZnARgf9ibtHvem3r/nclU198B95nhbfJkxzhJKn8/v2NTVhM1YTlx3TRO/tnpLtuwi\n\t4X9CP2m9IuKMgjQhOEtfpQOUH9+aRa4WSej8GxBejZlawDILfSTUh6XqrBafSbH9ta\n\tO/QxNxeyVIabWs0pLW2dzasdZ06DhUp8UArlFM+lgyRjAiRDW3qdAURxRAEiFH7QWm\n\t6olOfuuETd6Hw==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1678698244;\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=6QJdpFeXeHg0FMw4RTxuGKMDuWEU033rmYaqNHVaxXs=;\n\tb=t9sGxtf/sVS2zRTrvA6e2DgDYH0VIV6+Un5TPtRAHU2cOeFXPlcXjB070Lswk2oUcH\n\tev3+qm+eepn7a5OTJHP5/p8hFaN5bxfxJXhou87Xr7xiAauCqqmIn5CrSjTUgX9+LiAo\n\t1Lll8dLL4r/8hqZt8lwxQ6bWT3dpIK3U/f20a1uZlNSdp5BKKbDYoRydtHk0y0iBHJ7C\n\tdygTWQ9pB51Q5uxBoqKllItYzN1PDsXV1cZHtvUPhWkUbZ8BNQjtRm4sUkCxsqAs3zbl\n\txvvDNYLFRHIzFRoC1ciXnzr5iIB6ChN/d2woV2xUE3K7saNaZNXM/a90fVKn7ouDITu4\n\t1Gyw=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"t9sGxtf/\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112; t=1678698244;\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=6QJdpFeXeHg0FMw4RTxuGKMDuWEU033rmYaqNHVaxXs=;\n\tb=O6j8CxWnIS+Hw5t/qRorpEO99vuWfMvbo41TJu4zjCGLoJMSwb+b9k6exevROCoKmj\n\t0anMu3YOgZWkcdy3W+fpiX8G3M04uHGm7bR0gOavjbce2wJlfTnpCBGKejYnKbQ6Mlum\n\tX2O3qQECsAVRPwDPdgmTg0MlnVzyqD1wxQWphybv4bsdVzS70Us+kYVvZimuTZIH0GZD\n\t+oeVlzNHi8Svgg7+z7Gco/ueVTpEtkP3mGEKrpBWEEeOzzQPH60n+i465eGA7Wr19IDr\n\tzQO9LXmT9RX6APA40fCNTiIQ/7ZilWIGbwA4SUmPwUi2Cum4cBDjjw/e7tsq5/n2kXtB\n\t95gA==","X-Gm-Message-State":"AO0yUKXi6cQefKe1cmO0TNm6vy9z4qfG9SQHlNhLaHRU8er75qjpEvlm\n\t8Kzp1dRO+GE8mn/+RVoY2FYTgu1RiYbtDLGov3WdvRgJ+u5MXjddPo8=","X-Google-Smtp-Source":"AK7set/bQDdke8zi0L1mDOwwk3q+aRNqpOTC1Cy9/Lc2a0Jpu5KyIooKk1t7bq5JvmTC+LBtTQ0BrtTmpckc/80kJrM=","X-Received":"by 2002:a81:b1c7:0:b0:52e:ac97:115f with SMTP id\n\tp190-20020a81b1c7000000b0052eac97115fmr7375520ywh.5.1678698244667;\n\tMon, 13 Mar 2023 02:04:04 -0700 (PDT)","MIME-Version":"1.0","References":"<20230125132018.5725-1-david.plowman@raspberrypi.com>","In-Reply-To":"<20230125132018.5725-1-david.plowman@raspberrypi.com>","Date":"Mon, 13 Mar 2023 09:04:16 +0000","Message-ID":"<CAEmqJPq7R+Ac_3ca4KXNOHWjQRqPRd+vLJK1CA1=novc1KmF2A@mail.gmail.com>","To":"David Plowman <david.plowman@raspberrypi.com>","Content-Type":"multipart/alternative; boundary=\"0000000000008f157505f6c46468\"","Subject":"Re: [libcamera-devel] [PATCH] libcamera: controls: Add controls for\n\tAEC/AGC flicker avoidance","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":"Naushir Patuck via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Naushir Patuck <naush@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>"}}]