[{"id":23512,"web_url":"https://patchwork.libcamera.org/comment/23512/","msgid":"<6d1b4921-5e45-c968-6126-193357cc1958@yoseli.org>","date":"2022-06-21T18:20:27","subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: Introduce internal\n\tcontrols","submitter":{"id":127,"url":"https://patchwork.libcamera.org/api/people/127/","name":"Jean-Michel Hautbois","email":"jeanmichel.hautbois@yoseli.org"},"content":"Hi Jacopo,\n\nThanks for the patch !\n\nOn 21/06/2022 17:03, Jacopo Mondi via libcamera-devel wrote:\n> Introduce the enumeration of internal controls in\n> internal_control_ids.yaml.\n> \n> The list of controls currently defines 4 draft controls which mirror the\n> definition of the V4L2 control they map to.\n> \n> Plumb in the build system the command to generate the definition of\n> internal controls by re-using the same mechanism used for public\n> controls to make it easy to extend it to also handle internal properties\n> in future.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>   include/libcamera/internal/meson.build  | 18 +++++++++\n>   src/libcamera/internal_control_ids.yaml | 54 +++++++++++++++++++++++++\n>   src/libcamera/meson.build               | 16 ++++++++\n>   3 files changed, 88 insertions(+)\n>   create mode 100644 src/libcamera/internal_control_ids.yaml\n> \n> diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build\n> index 7a780d48ee57..569940b0d2e8 100644\n> --- a/include/libcamera/internal/meson.build\n> +++ b/include/libcamera/internal/meson.build\n> @@ -44,3 +44,21 @@ libcamera_internal_headers = files([\n>       'v4l2_videodevice.h',\n>       'yaml_parser.h',\n>   ])\n> +\n> +# Generate the list of internal controls identifiers\n> +internal_control_source_files = ['control_ids']\n> +\n> +internal_control_headers = []\n> +\n> +foreach header : internal_control_source_files\n> +    input_files = files('../../../src/libcamera/internal_' + header +'.yaml',\\\n> +                        '../' + header + '.h.in')\n> +    internal_control_headers += custom_target('internal_' + header + '_h',\n> +                                              input : input_files,\n> +                                              output : header + '.h',\n> +                                              command : [gen_controls, '--internal=True',\\\n> +                                                                       '-o', '@OUTPUT@',\\\n> +                                                                       '@INPUT@'],\n> +                                              install : false)\n> +endforeach\n> +libcamera_internal_headers += internal_control_headers\n> diff --git a/src/libcamera/internal_control_ids.yaml b/src/libcamera/internal_control_ids.yaml\n> new file mode 100644\n> index 000000000000..e69e0d30657c\n> --- /dev/null\n> +++ b/src/libcamera/internal_control_ids.yaml\n> @@ -0,0 +1,54 @@\n> +# SPDX-License-Identifier: LGPL-2.1-or-later\n> +#\n> +# Copyright (C) 2022, Google Inc.\n> +#\n> +%YAML 1.2\n> +---\n> +# Enumeration of internal libcamera controls\n> +# Not exposed to application, for library use only\n> +\n> +controls:\n> +\n> +  # ----------------------------------------------------------------------------\n> +  # Draft controls section\n> +\n> +  - VBlank:\n> +      type: int32_t\n> +      draft: true\n> +      description: |\n> +        Vertical blanking. The idle period after every frame during which no\n> +        image data is produced. The unit of vertical blanking is a line. Every\n> +        line has length of the image width plus horizontal blanking at the pixel\n> +        rate defined by V4L2_CID_PIXEL_RATE control in the same sub-device.\n> +\n> +        Currently identical to V4L2_CID_VBLANK.\n> +\n> +  - HBlank:\n> +      type: int32_t\n> +      draft: true\n> +      description: |\n> +        Horizontal blanking. The idle period after every line of image data\n> +        during which no image data is produced. The unit of horizontal blanking\n> +        is pixels.\n> +\n> +        Currently identical to V4L2_CID_HBLANK.\n> +\n> +  - SensorAnalogueGain:\n> +      type: int32_t\n> +      draft: true\n> +      description: |\n> +        Analogue gain is gain affecting all colour components in the pixel\n> +        matrix. The gain operation is performed in the analogue domain before\n> +        A/D conversion\n> +\n> +        Currently identical to V4L2_CID_ANALOGUE_GAIN.\n> +\n> +  - SensorExposure:\n> +      type: int32_t\n> +      draft: true\n> +      description: |\n> +        Exposure time, expressed in frame lines.\n> +\n> +        Currently identical to V4L2_CID_EXPOSURE.\n\nI have a general comment here, could probably be on top of the series. I \nthink we should convey the SensorAnalogueGain as a double value and let \nthe CameraSensor call the helper to convert it in a gain code. Thus, the \ncontrol would be Gain, and the CameraSensor class (or a V4L2 specific \nversion of it ;-)) would then convert this gain into Analogue Gain + \ndigital gain.\n\nSame would be true for the SensorExposure control, as we could convey \nthe exposure time we want, and it would be converted accordingly into\nVBLANK + exposure (and then would deal with VBLANK beeing called before \ncalculating the exposure value in lines with the updated maximum).\n\nThus, VBLANK would not be a control for IPA at all, and we would have \nGain and ExposureTime (for instance) only ?\n\nI don't think it should be done on this series though, as I said, so \nwith or without:\nReviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@yoseli.org>\n\n> +\n> +...\n> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\n> index b57bee7ef6ca..4564d3dbb835 100644\n> --- a/src/libcamera/meson.build\n> +++ b/src/libcamera/meson.build\n> @@ -99,6 +99,7 @@ if not libyaml.found()\n>       libyaml = libyaml_wrap.dependency('yaml')\n>   endif\n>   \n> +# Generate control_ids.cpp and property_ids.cpp\n>   control_sources = []\n>   \n>   foreach source : control_source_files\n> @@ -111,6 +112,21 @@ endforeach\n>   \n>   libcamera_sources += control_sources\n>   \n> +# Generate internal_control_ids.cpp\n> +internal_control_source_files = ['control_ids']\n> +internal_control_sources = []\n> +\n> +foreach source : internal_control_source_files\n> +    input_files = files('internal_' + source +'.yaml', source + '.cpp.in')\n> +    internal_control_sources += custom_target('internal_' + source + '_cpp',\n> +                                              input : input_files,\n> +                                              output : 'internal_' + source + '.cpp',\n> +                                              command : [gen_controls, '--internal=True',\\\n> +                                                                       '-o', '@OUTPUT@',\\\n> +                                                                       '@INPUT@'])\n> +endforeach\n> +libcamera_sources += internal_control_sources\n> +\n>   gen_version = meson.project_source_root() / 'utils' / 'gen-version.sh'\n>   \n>   # Use vcs_tag() and not configure_file() or run_command(), to ensure that the","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 43908BD808\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 21 Jun 2022 18:20:30 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5B0D565638;\n\tTue, 21 Jun 2022 20:20:29 +0200 (CEST)","from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net\n\t[IPv6:2001:4b98:dc4:8::222])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7248260473\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 21 Jun 2022 20:20:28 +0200 (CEST)","(Authenticated sender: jeanmichel.hautbois@yoseli.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id 1276240007;\n\tTue, 21 Jun 2022 18:20:27 +0000 (UTC)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1655835629;\n\tbh=NnN7EXZPoIsOp7aSOBzLW9QyUHTblpKkqlUp9xhQ79A=;\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:\n\tFrom;\n\tb=ePFjaLnc4Aspwj3szCsZO4csfGT7YnmG7Z3aOLbpE1y5YZUOW4KCAYuYDp85PU3pA\n\tlcpSXl1FM0Teay0bVW/A3ViAMxajXc0vTFeDJ1pK9HTVzqr46pn5eA//0A+raBT2fD\n\t8kVI6+D81LIpEX3Idw1BZoPcUqwKneB7SP3zjnpq9X+IxFW+RWckXcBBmwL5a5szZs\n\tSusoj6gk6JpYUnJVxyAMvFRkgJx1FKGB7kWuJ4YKhxTqUaevTsVI5ud6TYK1zJtzfs\n\tCsb54qmGGtVm7dnzNdPIAkiJ/DkqYMejXbu8CHKnn2pqgzcAdHAKRjBKUrEnpSIE2A\n\tznJQ7L+p5l+OA==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=yoseli.org; s=gm1;\n\tt=1655835628;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=7RKdsBtdOPY8cLmXa7UAyKT+ffM14iCOSDPG/u5sGgo=;\n\tb=pmwXbkYO+JRQUuHPhaP6aryolI5J+Y88sbL3kkrzXOjdIwSy1bZPx7SXwE8Syu01Yt4/mL\n\tj9cdscMJdyUBc+Xhhz6KiU4UOSfTrupbJA/3pYv1ILZzHeps6Z6Dwwe7XJJyf6ckJ+lI32\n\tFj68KA71AUE/mJsHkRvNTi95B5YQFKHIoSsD8aljc1DoRBwnEfGAW4Q5mvLY1iZZuVquN4\n\tWCQjGjTHtq1b6z6+DJbA7pKQAbgKhLvM+ZcQ/h2U6rmY25ECY3vEg6bm6K89BcpbDZAm4w\n\t0K867/2O3qSM6SWqSD+gozo8Nut2A5uzjLLhL0ROs7KWswmGYWihy2DVavHByg=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=yoseli.org\n\theader.i=@yoseli.org header.b=\"pmwXbkYO\"; \n\tdkim-atps=neutral","Message-ID":"<6d1b4921-5e45-c968-6126-193357cc1958@yoseli.org>","Date":"Tue, 21 Jun 2022 20:20:27 +0200","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.9.1","Content-Language":"en-US","To":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","References":"<20220621150337.47839-1-jacopo@jmondi.org>\n\t<20220621150337.47839-4-jacopo@jmondi.org>","In-Reply-To":"<20220621150337.47839-4-jacopo@jmondi.org>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: Introduce internal\n\tcontrols","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":"Jean-Michel Hautbois via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Jean-Michel Hautbois <jeanmichel.hautbois@yoseli.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23517,"web_url":"https://patchwork.libcamera.org/comment/23517/","msgid":"<20220622070600.moznnq7kbmadhy2j@uno.localdomain>","date":"2022-06-22T07:06:00","subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: Introduce internal\n\tcontrols","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Jean-Michel,\n\nOn Tue, Jun 21, 2022 at 08:20:27PM +0200, Jean-Michel Hautbois wrote:\n> Hi Jacopo,\n>\n> Thanks for the patch !\n>\n> On 21/06/2022 17:03, Jacopo Mondi via libcamera-devel wrote:\n> > Introduce the enumeration of internal controls in\n> > internal_control_ids.yaml.\n> >\n> > The list of controls currently defines 4 draft controls which mirror the\n> > definition of the V4L2 control they map to.\n> >\n> > Plumb in the build system the command to generate the definition of\n> > internal controls by re-using the same mechanism used for public\n> > controls to make it easy to extend it to also handle internal properties\n> > in future.\n> >\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >   include/libcamera/internal/meson.build  | 18 +++++++++\n> >   src/libcamera/internal_control_ids.yaml | 54 +++++++++++++++++++++++++\n> >   src/libcamera/meson.build               | 16 ++++++++\n> >   3 files changed, 88 insertions(+)\n> >   create mode 100644 src/libcamera/internal_control_ids.yaml\n> >\n> > diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build\n> > index 7a780d48ee57..569940b0d2e8 100644\n> > --- a/include/libcamera/internal/meson.build\n> > +++ b/include/libcamera/internal/meson.build\n> > @@ -44,3 +44,21 @@ libcamera_internal_headers = files([\n> >       'v4l2_videodevice.h',\n> >       'yaml_parser.h',\n> >   ])\n> > +\n> > +# Generate the list of internal controls identifiers\n> > +internal_control_source_files = ['control_ids']\n> > +\n> > +internal_control_headers = []\n> > +\n> > +foreach header : internal_control_source_files\n> > +    input_files = files('../../../src/libcamera/internal_' + header +'.yaml',\\\n> > +                        '../' + header + '.h.in')\n> > +    internal_control_headers += custom_target('internal_' + header + '_h',\n> > +                                              input : input_files,\n> > +                                              output : header + '.h',\n> > +                                              command : [gen_controls, '--internal=True',\\\n> > +                                                                       '-o', '@OUTPUT@',\\\n> > +                                                                       '@INPUT@'],\n> > +                                              install : false)\n> > +endforeach\n> > +libcamera_internal_headers += internal_control_headers\n> > diff --git a/src/libcamera/internal_control_ids.yaml b/src/libcamera/internal_control_ids.yaml\n> > new file mode 100644\n> > index 000000000000..e69e0d30657c\n> > --- /dev/null\n> > +++ b/src/libcamera/internal_control_ids.yaml\n> > @@ -0,0 +1,54 @@\n> > +# SPDX-License-Identifier: LGPL-2.1-or-later\n> > +#\n> > +# Copyright (C) 2022, Google Inc.\n> > +#\n> > +%YAML 1.2\n> > +---\n> > +# Enumeration of internal libcamera controls\n> > +# Not exposed to application, for library use only\n> > +\n> > +controls:\n> > +\n> > +  # ----------------------------------------------------------------------------\n> > +  # Draft controls section\n> > +\n> > +  - VBlank:\n> > +      type: int32_t\n> > +      draft: true\n> > +      description: |\n> > +        Vertical blanking. The idle period after every frame during which no\n> > +        image data is produced. The unit of vertical blanking is a line. Every\n> > +        line has length of the image width plus horizontal blanking at the pixel\n> > +        rate defined by V4L2_CID_PIXEL_RATE control in the same sub-device.\n> > +\n> > +        Currently identical to V4L2_CID_VBLANK.\n> > +\n> > +  - HBlank:\n> > +      type: int32_t\n> > +      draft: true\n> > +      description: |\n> > +        Horizontal blanking. The idle period after every line of image data\n> > +        during which no image data is produced. The unit of horizontal blanking\n> > +        is pixels.\n> > +\n> > +        Currently identical to V4L2_CID_HBLANK.\n> > +\n> > +  - SensorAnalogueGain:\n> > +      type: int32_t\n> > +      draft: true\n> > +      description: |\n> > +        Analogue gain is gain affecting all colour components in the pixel\n> > +        matrix. The gain operation is performed in the analogue domain before\n> > +        A/D conversion\n> > +\n> > +        Currently identical to V4L2_CID_ANALOGUE_GAIN.\n> > +\n> > +  - SensorExposure:\n> > +      type: int32_t\n> > +      draft: true\n> > +      description: |\n> > +        Exposure time, expressed in frame lines.\n> > +\n> > +        Currently identical to V4L2_CID_EXPOSURE.\n>\n> I have a general comment here, could probably be on top of the series. I\n> think we should convey the SensorAnalogueGain as a double value and let the\n> CameraSensor call the helper to convert it in a gain code. Thus, the control\n> would be Gain, and the CameraSensor class (or a V4L2 specific version of it\n> ;-)) would then convert this gain into Analogue Gain + digital gain.\n\nAh! I copied the type from the V4L2 control definition!\n\nI see your point, but doesn't IPA have access to the CameraSensorHelper class\nexactly for this purpose (convert the gain value into gain code) ?\n\nNow, I would dare sayin that the IPA could be even detached from any\nsensor-related knowledge and CameraSensorHelpers moved to the\nPH/CameraSensor side, so that IPAs only calculate the \"analogue\" value\nand the CameraSensor class computes the gain code.\n\nIs this the direction where we want to go ?\n\n>\n> Same would be true for the SensorExposure control, as we could convey the\n> exposure time we want, and it would be converted accordingly into\n> VBLANK + exposure (and then would deal with VBLANK beeing called before\n> calculating the exposure value in lines with the updated maximum).\n\nThe same reasoning applies here, see CamHelperImx477::GetVBlanking().\nThere's a camera-sensor specific part that would require moving camera\nsensor helper on the PH side. To be honest this does make sense to me\n(without too much thinking, I admit, there might be drawbacks I'm not\nseeing atm), but it's a rather big change indeed!\n\n>\n> Thus, VBLANK would not be a control for IPA at all, and we would have Gain\n> and ExposureTime (for instance) only ?\n>\n> I don't think it should be done on this series though, as I said, so with or\n> without:\n> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@yoseli.org>\n>\n> > +\n> > +...\n> > diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\n> > index b57bee7ef6ca..4564d3dbb835 100644\n> > --- a/src/libcamera/meson.build\n> > +++ b/src/libcamera/meson.build\n> > @@ -99,6 +99,7 @@ if not libyaml.found()\n> >       libyaml = libyaml_wrap.dependency('yaml')\n> >   endif\n> > +# Generate control_ids.cpp and property_ids.cpp\n> >   control_sources = []\n> >   foreach source : control_source_files\n> > @@ -111,6 +112,21 @@ endforeach\n> >   libcamera_sources += control_sources\n> > +# Generate internal_control_ids.cpp\n> > +internal_control_source_files = ['control_ids']\n> > +internal_control_sources = []\n> > +\n> > +foreach source : internal_control_source_files\n> > +    input_files = files('internal_' + source +'.yaml', source + '.cpp.in')\n> > +    internal_control_sources += custom_target('internal_' + source + '_cpp',\n> > +                                              input : input_files,\n> > +                                              output : 'internal_' + source + '.cpp',\n> > +                                              command : [gen_controls, '--internal=True',\\\n> > +                                                                       '-o', '@OUTPUT@',\\\n> > +                                                                       '@INPUT@'])\n> > +endforeach\n> > +libcamera_sources += internal_control_sources\n> > +\n> >   gen_version = meson.project_source_root() / 'utils' / 'gen-version.sh'\n> >   # Use vcs_tag() and not configure_file() or run_command(), to ensure that the","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 C3C95BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 22 Jun 2022 07:06:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D096065635;\n\tWed, 22 Jun 2022 09:06:04 +0200 (CEST)","from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net\n\t[IPv6:2001:4b98:dc4:8::223])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3715A6559A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 22 Jun 2022 09:06:03 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id 8ECEC60003;\n\tWed, 22 Jun 2022 07:06:02 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1655881564;\n\tbh=is3jqZtEilI+OfWAEshDx0ZC/xeMkNNiOOm7+vU9nqE=;\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=cj5WmFP6Fe0IXYyJk6pwTmncGxIFqRpciz3kzlXmsdS9ww3g7YdUp5noK/OP8EMm5\n\t2xUBkbmLKZ7BB1i1Z5c+v3rF3nWvBcaNbDdvNP+WAXmibCID76IEs8VKObWmAqamsN\n\tpxERwt3rIHBlUUdjWK4yGnGI7AtCP3NLf6seurMl3bI/Ed9N3ls4ObHVlAR2OAGh/z\n\tnSM4eYJZFZSJWT+nAkdWrGHpfRpY4qsywRxVZq2dYRzU9Ort1g9SjeZp5t67k03R95\n\toOfvtqio3FsQc66nT0mrrrQp/ebZjkNmrJOf1MD06W4bld/7uCxTnruN7PWbCMxNdN\n\tLwBdCj3QoKW+w==","Date":"Wed, 22 Jun 2022 09:06:00 +0200","To":"Jean-Michel Hautbois <jeanmichel.hautbois@yoseli.org>","Message-ID":"<20220622070600.moznnq7kbmadhy2j@uno.localdomain>","References":"<20220621150337.47839-1-jacopo@jmondi.org>\n\t<20220621150337.47839-4-jacopo@jmondi.org>\n\t<6d1b4921-5e45-c968-6126-193357cc1958@yoseli.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<6d1b4921-5e45-c968-6126-193357cc1958@yoseli.org>","Subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: Introduce internal\n\tcontrols","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@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23520,"web_url":"https://patchwork.libcamera.org/comment/23520/","msgid":"<50abfd34-c9b9-30a3-a1ea-a7d43122888e@yoseli.org>","date":"2022-06-22T07:41:55","subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: Introduce internal\n\tcontrols","submitter":{"id":127,"url":"https://patchwork.libcamera.org/api/people/127/","name":"Jean-Michel Hautbois","email":"jeanmichel.hautbois@yoseli.org"},"content":"Hi Jacopo,\n\nOn 22/06/2022 09:06, Jacopo Mondi wrote:\n> Hi Jean-Michel,\n> \n> On Tue, Jun 21, 2022 at 08:20:27PM +0200, Jean-Michel Hautbois wrote:\n>> Hi Jacopo,\n>>\n>> Thanks for the patch !\n>>\n>> On 21/06/2022 17:03, Jacopo Mondi via libcamera-devel wrote:\n>>> Introduce the enumeration of internal controls in\n>>> internal_control_ids.yaml.\n>>>\n>>> The list of controls currently defines 4 draft controls which mirror the\n>>> definition of the V4L2 control they map to.\n>>>\n>>> Plumb in the build system the command to generate the definition of\n>>> internal controls by re-using the same mechanism used for public\n>>> controls to make it easy to extend it to also handle internal properties\n>>> in future.\n>>>\n>>> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n>>> ---\n>>>    include/libcamera/internal/meson.build  | 18 +++++++++\n>>>    src/libcamera/internal_control_ids.yaml | 54 +++++++++++++++++++++++++\n>>>    src/libcamera/meson.build               | 16 ++++++++\n>>>    3 files changed, 88 insertions(+)\n>>>    create mode 100644 src/libcamera/internal_control_ids.yaml\n>>>\n>>> diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build\n>>> index 7a780d48ee57..569940b0d2e8 100644\n>>> --- a/include/libcamera/internal/meson.build\n>>> +++ b/include/libcamera/internal/meson.build\n>>> @@ -44,3 +44,21 @@ libcamera_internal_headers = files([\n>>>        'v4l2_videodevice.h',\n>>>        'yaml_parser.h',\n>>>    ])\n>>> +\n>>> +# Generate the list of internal controls identifiers\n>>> +internal_control_source_files = ['control_ids']\n>>> +\n>>> +internal_control_headers = []\n>>> +\n>>> +foreach header : internal_control_source_files\n>>> +    input_files = files('../../../src/libcamera/internal_' + header +'.yaml',\\\n>>> +                        '../' + header + '.h.in')\n>>> +    internal_control_headers += custom_target('internal_' + header + '_h',\n>>> +                                              input : input_files,\n>>> +                                              output : header + '.h',\n>>> +                                              command : [gen_controls, '--internal=True',\\\n>>> +                                                                       '-o', '@OUTPUT@',\\\n>>> +                                                                       '@INPUT@'],\n>>> +                                              install : false)\n>>> +endforeach\n>>> +libcamera_internal_headers += internal_control_headers\n>>> diff --git a/src/libcamera/internal_control_ids.yaml b/src/libcamera/internal_control_ids.yaml\n>>> new file mode 100644\n>>> index 000000000000..e69e0d30657c\n>>> --- /dev/null\n>>> +++ b/src/libcamera/internal_control_ids.yaml\n>>> @@ -0,0 +1,54 @@\n>>> +# SPDX-License-Identifier: LGPL-2.1-or-later\n>>> +#\n>>> +# Copyright (C) 2022, Google Inc.\n>>> +#\n>>> +%YAML 1.2\n>>> +---\n>>> +# Enumeration of internal libcamera controls\n>>> +# Not exposed to application, for library use only\n>>> +\n>>> +controls:\n>>> +\n>>> +  # ----------------------------------------------------------------------------\n>>> +  # Draft controls section\n>>> +\n>>> +  - VBlank:\n>>> +      type: int32_t\n>>> +      draft: true\n>>> +      description: |\n>>> +        Vertical blanking. The idle period after every frame during which no\n>>> +        image data is produced. The unit of vertical blanking is a line. Every\n>>> +        line has length of the image width plus horizontal blanking at the pixel\n>>> +        rate defined by V4L2_CID_PIXEL_RATE control in the same sub-device.\n>>> +\n>>> +        Currently identical to V4L2_CID_VBLANK.\n>>> +\n>>> +  - HBlank:\n>>> +      type: int32_t\n>>> +      draft: true\n>>> +      description: |\n>>> +        Horizontal blanking. The idle period after every line of image data\n>>> +        during which no image data is produced. The unit of horizontal blanking\n>>> +        is pixels.\n>>> +\n>>> +        Currently identical to V4L2_CID_HBLANK.\n>>> +\n>>> +  - SensorAnalogueGain:\n>>> +      type: int32_t\n>>> +      draft: true\n>>> +      description: |\n>>> +        Analogue gain is gain affecting all colour components in the pixel\n>>> +        matrix. The gain operation is performed in the analogue domain before\n>>> +        A/D conversion\n>>> +\n>>> +        Currently identical to V4L2_CID_ANALOGUE_GAIN.\n>>> +\n>>> +  - SensorExposure:\n>>> +      type: int32_t\n>>> +      draft: true\n>>> +      description: |\n>>> +        Exposure time, expressed in frame lines.\n>>> +\n>>> +        Currently identical to V4L2_CID_EXPOSURE.\n>>\n>> I have a general comment here, could probably be on top of the series. I\n>> think we should convey the SensorAnalogueGain as a double value and let the\n>> CameraSensor call the helper to convert it in a gain code. Thus, the control\n>> would be Gain, and the CameraSensor class (or a V4L2 specific version of it\n>> ;-)) would then convert this gain into Analogue Gain + digital gain.\n> \n> Ah! I copied the type from the V4L2 control definition!\n> \n> I see your point, but doesn't IPA have access to the CameraSensorHelper class\n> exactly for this purpose (convert the gain value into gain code) ?\n> \n> Now, I would dare sayin that the IPA could be even detached from any\n> sensor-related knowledge and CameraSensorHelpers moved to the\n> PH/CameraSensor side, so that IPAs only calculate the \"analogue\" value\n> and the CameraSensor class computes the gain code.\n> \n> Is this the direction where we want to go ?\n\nIt is the direction I would like it to go, decoupling the IPA from V4L2 \ncontrols. They can't be totally agnostic from the hardware, as they take \nstatistics and compute values based on it to send the parameters back, \nbut on the AGC side at least, it does not need to know what the driver \ncan do at all. It just need to know the min/max it can apply for the \ngain (and time) that's all, I think.\n\n> \n>>\n>> Same would be true for the SensorExposure control, as we could convey the\n>> exposure time we want, and it would be converted accordingly into\n>> VBLANK + exposure (and then would deal with VBLANK beeing called before\n>> calculating the exposure value in lines with the updated maximum).\n> \n> The same reasoning applies here, see CamHelperImx477::GetVBlanking().\n> There's a camera-sensor specific part that would require moving camera\n> sensor helper on the PH side. To be honest this does make sense to me\n> (without too much thinking, I admit, there might be drawbacks I'm not\n> seeing atm), but it's a rather big change indeed!\n\nYes, I don't expect it now :-).\nMaybe is it worth a more in-depth discussion ?\n\nJM\n\n> \n>>\n>> Thus, VBLANK would not be a control for IPA at all, and we would have Gain\n>> and ExposureTime (for instance) only ?\n>>\n>> I don't think it should be done on this series though, as I said, so with or\n>> without:\n>> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@yoseli.org>\n>>\n>>> +\n>>> +...\n>>> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\n>>> index b57bee7ef6ca..4564d3dbb835 100644\n>>> --- a/src/libcamera/meson.build\n>>> +++ b/src/libcamera/meson.build\n>>> @@ -99,6 +99,7 @@ if not libyaml.found()\n>>>        libyaml = libyaml_wrap.dependency('yaml')\n>>>    endif\n>>> +# Generate control_ids.cpp and property_ids.cpp\n>>>    control_sources = []\n>>>    foreach source : control_source_files\n>>> @@ -111,6 +112,21 @@ endforeach\n>>>    libcamera_sources += control_sources\n>>> +# Generate internal_control_ids.cpp\n>>> +internal_control_source_files = ['control_ids']\n>>> +internal_control_sources = []\n>>> +\n>>> +foreach source : internal_control_source_files\n>>> +    input_files = files('internal_' + source +'.yaml', source + '.cpp.in')\n>>> +    internal_control_sources += custom_target('internal_' + source + '_cpp',\n>>> +                                              input : input_files,\n>>> +                                              output : 'internal_' + source + '.cpp',\n>>> +                                              command : [gen_controls, '--internal=True',\\\n>>> +                                                                       '-o', '@OUTPUT@',\\\n>>> +                                                                       '@INPUT@'])\n>>> +endforeach\n>>> +libcamera_sources += internal_control_sources\n>>> +\n>>>    gen_version = meson.project_source_root() / 'utils' / 'gen-version.sh'\n>>>    # Use vcs_tag() and not configure_file() or run_command(), to ensure that the","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 44CEBBD808\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 22 Jun 2022 07:41:59 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7CCA865635;\n\tWed, 22 Jun 2022 09:41:58 +0200 (CEST)","from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net\n\t[217.70.183.200])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7C7BC6559A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 22 Jun 2022 09:41:56 +0200 (CEST)","(Authenticated sender: jeanmichel.hautbois@yoseli.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id 1314820002;\n\tWed, 22 Jun 2022 07:41:55 +0000 (UTC)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1655883718;\n\tbh=vMHAKIQYxb5hXVJpYoR3/8bARExfKpSijrretKIgoy8=;\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=qWiNg/Ch7j/YUg1dRc35A9RD79OW6JRuu/ZFchjBRofwR0CdlxLmSkKpjDLfpTD0l\n\t9GRlAvu+5LjeyJYffk5l6nks6G6wE5OhC67vjhCd0Bm16Z2L9fYgUCss/lBwJy2KQV\n\tgfGJ+Rffn6LAPfrf/r03HwKFBBmCC7y8oBzVPVMFlWHV66Kj6DOQJT5BaXvxa3bNUs\n\tn3Op053nf4v2+uuDMg4b66yWcGDUKa1GYn5UOXSb2tRQb0IOhylfFEQGH9jiBL61Xu\n\tFPyqHynhmfUHF1idGj7pSrtuXP8Gfax/yJ+qlUoKBpYci1Tob0xMnCYoZWMAymXtWY\n\tu2FGEBzqS4UEw==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=yoseli.org; s=gm1;\n\tt=1655883716;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=6eFsuogcM0U4lOtKmT+3+vX2RRHZy14KZ6TjwA+2rZU=;\n\tb=IhGr/EYtsrx9Q6NidUoIqE14sfI/hJcUYKbiKsP0iQwnUOFJ8G/QgNp8N4NajdeE1sNcgJ\n\tBloa/YY/Q4WjZmWeuVKVP1Bc/nFxj3yVbFyeDDVoFxNn2HAq+bGmF4itVI63vBqgj8Moxu\n\tiHG/pQBVzEOygaM5Z6HSDa/yVbVI+6o9jfo6nC5zPJ5ZFP6mnC5pX65B69ppLJ2ivkwUBZ\n\t2Qo1Yv2NoEdanWImr+m67z997vPSrKC+1T4faJQrC56oY/dzafaY+gDCge26oUXbkdW/Zy\n\tLPhsaDaJ1Rbs9RHUPeUuVuoppbONmosm4Ao4UQEEzYu62HwY9k5PSMupTVbhRQ=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=yoseli.org\n\theader.i=@yoseli.org header.b=\"IhGr/EYt\"; \n\tdkim-atps=neutral","Message-ID":"<50abfd34-c9b9-30a3-a1ea-a7d43122888e@yoseli.org>","Date":"Wed, 22 Jun 2022 09:41:55 +0200","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.9.1","Content-Language":"en-US","To":"Jacopo Mondi <jacopo@jmondi.org>","References":"<20220621150337.47839-1-jacopo@jmondi.org>\n\t<20220621150337.47839-4-jacopo@jmondi.org>\n\t<6d1b4921-5e45-c968-6126-193357cc1958@yoseli.org>\n\t<20220622070600.moznnq7kbmadhy2j@uno.localdomain>","In-Reply-To":"<20220622070600.moznnq7kbmadhy2j@uno.localdomain>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: Introduce internal\n\tcontrols","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":"Jean-Michel Hautbois via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Jean-Michel Hautbois <jeanmichel.hautbois@yoseli.org>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23526,"web_url":"https://patchwork.libcamera.org/comment/23526/","msgid":"<20220622124557.ueqilhnkhu6wgucw@uno.localdomain>","date":"2022-06-22T12:45:57","subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: Introduce internal\n\tcontrols","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"+Kieran +Umang\n\nOn Wed, Jun 22, 2022 at 09:41:55AM +0200, Jean-Michel Hautbois wrote:\n> Hi Jacopo,\n>\n> On 22/06/2022 09:06, Jacopo Mondi wrote:\n> > Hi Jean-Michel,\n> >\n> > On Tue, Jun 21, 2022 at 08:20:27PM +0200, Jean-Michel Hautbois wrote:\n> > > Hi Jacopo,\n> > >\n> > > Thanks for the patch !\n> > >\n> > > On 21/06/2022 17:03, Jacopo Mondi via libcamera-devel wrote:\n> > > > Introduce the enumeration of internal controls in\n> > > > internal_control_ids.yaml.\n> > > >\n> > > > The list of controls currently defines 4 draft controls which mirror the\n> > > > definition of the V4L2 control they map to.\n> > > >\n> > > > Plumb in the build system the command to generate the definition of\n> > > > internal controls by re-using the same mechanism used for public\n> > > > controls to make it easy to extend it to also handle internal properties\n> > > > in future.\n> > > >\n> > > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > > > ---\n> > > >    include/libcamera/internal/meson.build  | 18 +++++++++\n> > > >    src/libcamera/internal_control_ids.yaml | 54 +++++++++++++++++++++++++\n> > > >    src/libcamera/meson.build               | 16 ++++++++\n> > > >    3 files changed, 88 insertions(+)\n> > > >    create mode 100644 src/libcamera/internal_control_ids.yaml\n> > > >\n> > > > diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build\n> > > > index 7a780d48ee57..569940b0d2e8 100644\n> > > > --- a/include/libcamera/internal/meson.build\n> > > > +++ b/include/libcamera/internal/meson.build\n> > > > @@ -44,3 +44,21 @@ libcamera_internal_headers = files([\n> > > >        'v4l2_videodevice.h',\n> > > >        'yaml_parser.h',\n> > > >    ])\n> > > > +\n> > > > +# Generate the list of internal controls identifiers\n> > > > +internal_control_source_files = ['control_ids']\n> > > > +\n> > > > +internal_control_headers = []\n> > > > +\n> > > > +foreach header : internal_control_source_files\n> > > > +    input_files = files('../../../src/libcamera/internal_' + header +'.yaml',\\\n> > > > +                        '../' + header + '.h.in')\n> > > > +    internal_control_headers += custom_target('internal_' + header + '_h',\n> > > > +                                              input : input_files,\n> > > > +                                              output : header + '.h',\n> > > > +                                              command : [gen_controls, '--internal=True',\\\n> > > > +                                                                       '-o', '@OUTPUT@',\\\n> > > > +                                                                       '@INPUT@'],\n> > > > +                                              install : false)\n> > > > +endforeach\n> > > > +libcamera_internal_headers += internal_control_headers\n> > > > diff --git a/src/libcamera/internal_control_ids.yaml b/src/libcamera/internal_control_ids.yaml\n> > > > new file mode 100644\n> > > > index 000000000000..e69e0d30657c\n> > > > --- /dev/null\n> > > > +++ b/src/libcamera/internal_control_ids.yaml\n> > > > @@ -0,0 +1,54 @@\n> > > > +# SPDX-License-Identifier: LGPL-2.1-or-later\n> > > > +#\n> > > > +# Copyright (C) 2022, Google Inc.\n> > > > +#\n> > > > +%YAML 1.2\n> > > > +---\n> > > > +# Enumeration of internal libcamera controls\n> > > > +# Not exposed to application, for library use only\n> > > > +\n> > > > +controls:\n> > > > +\n> > > > +  # ----------------------------------------------------------------------------\n> > > > +  # Draft controls section\n> > > > +\n> > > > +  - VBlank:\n> > > > +      type: int32_t\n> > > > +      draft: true\n> > > > +      description: |\n> > > > +        Vertical blanking. The idle period after every frame during which no\n> > > > +        image data is produced. The unit of vertical blanking is a line. Every\n> > > > +        line has length of the image width plus horizontal blanking at the pixel\n> > > > +        rate defined by V4L2_CID_PIXEL_RATE control in the same sub-device.\n> > > > +\n> > > > +        Currently identical to V4L2_CID_VBLANK.\n> > > > +\n> > > > +  - HBlank:\n> > > > +      type: int32_t\n> > > > +      draft: true\n> > > > +      description: |\n> > > > +        Horizontal blanking. The idle period after every line of image data\n> > > > +        during which no image data is produced. The unit of horizontal blanking\n> > > > +        is pixels.\n> > > > +\n> > > > +        Currently identical to V4L2_CID_HBLANK.\n> > > > +\n> > > > +  - SensorAnalogueGain:\n> > > > +      type: int32_t\n> > > > +      draft: true\n> > > > +      description: |\n> > > > +        Analogue gain is gain affecting all colour components in the pixel\n> > > > +        matrix. The gain operation is performed in the analogue domain before\n> > > > +        A/D conversion\n> > > > +\n> > > > +        Currently identical to V4L2_CID_ANALOGUE_GAIN.\n> > > > +\n> > > > +  - SensorExposure:\n> > > > +      type: int32_t\n> > > > +      draft: true\n> > > > +      description: |\n> > > > +        Exposure time, expressed in frame lines.\n> > > > +\n> > > > +        Currently identical to V4L2_CID_EXPOSURE.\n> > >\n> > > I have a general comment here, could probably be on top of the series. I\n> > > think we should convey the SensorAnalogueGain as a double value and let the\n> > > CameraSensor call the helper to convert it in a gain code. Thus, the control\n> > > would be Gain, and the CameraSensor class (or a V4L2 specific version of it\n> > > ;-)) would then convert this gain into Analogue Gain + digital gain.\n> >\n> > Ah! I copied the type from the V4L2 control definition!\n> >\n> > I see your point, but doesn't IPA have access to the CameraSensorHelper class\n> > exactly for this purpose (convert the gain value into gain code) ?\n> >\n> > Now, I would dare sayin that the IPA could be even detached from any\n> > sensor-related knowledge and CameraSensorHelpers moved to the\n> > PH/CameraSensor side, so that IPAs only calculate the \"analogue\" value\n> > and the CameraSensor class computes the gain code.\n> >\n> > Is this the direction where we want to go ?\n>\n> It is the direction I would like it to go, decoupling the IPA from V4L2\n> controls. They can't be totally agnostic from the hardware, as they take\n> statistics and compute values based on it to send the parameters back, but\n> on the AGC side at least, it does not need to know what the driver can do at\n> all. It just need to know the min/max it can apply for the gain (and time)\n> that's all, I think.\n>\n\nAny consideration about the closed-source IPA modules ?","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 9DBA5BD808\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 22 Jun 2022 12:46:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D93D065635;\n\tWed, 22 Jun 2022 14:46:01 +0200 (CEST)","from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net\n\t[217.70.183.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 05A9661FB2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 22 Jun 2022 14:46:00 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id 03D7760014;\n\tWed, 22 Jun 2022 12:45:58 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1655901961;\n\tbh=WHsx47QN8YQlyQ0lI3j5rwChh7iXppPm7UhF93PHWjo=;\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=Y4xadOEv5LmYW6E4+zsjmQTzhBQrWAA3Z3E7Pqajj6g44ujPbb0/cTBWwWk1fhffy\n\tg4FoEdSMVBad+usYlh4aJvR6Tf2oDvBncUnIRfb2Ip6Bpae9H78lvGwngYsOeBl/kZ\n\tBnnU6Gmj0kDp5UKEyMgA/tlz6DCgZbSnOyip7W6Jln+E7qombtkckPvvAY8TkwLe76\n\tjnfzrRFCl2flx9U9E1N4qKSar3cgjOknPb0rNFJNBzVHSUlkhFISBQB+oDQPHj+mCY\n\tz4+gTLMKOLm3CffafW9/CqtClY6sTzAX+Al46qPS/sayVY69i4GwNGg49rputaj/4M\n\tGwZP26G93mR2g==","Date":"Wed, 22 Jun 2022 14:45:57 +0200","To":"Jean-Michel Hautbois <jeanmichel.hautbois@yoseli.org>,\n\tkieran bingham <kieran.bingham+renesas@ideasonboard.com>,\n\tUmang Jain <umang.jain@ideasonboard.com>","Message-ID":"<20220622124557.ueqilhnkhu6wgucw@uno.localdomain>","References":"<20220621150337.47839-1-jacopo@jmondi.org>\n\t<20220621150337.47839-4-jacopo@jmondi.org>\n\t<6d1b4921-5e45-c968-6126-193357cc1958@yoseli.org>\n\t<20220622070600.moznnq7kbmadhy2j@uno.localdomain>\n\t<50abfd34-c9b9-30a3-a1ea-a7d43122888e@yoseli.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<50abfd34-c9b9-30a3-a1ea-a7d43122888e@yoseli.org>","Subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: Introduce internal\n\tcontrols","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@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]