[{"id":3029,"web_url":"https://patchwork.libcamera.org/comment/3029/","msgid":"<20191115163834.zpekgx5ea4ejniip@uno.localdomain>","date":"2019-11-15T16:38:34","subject":"Re: [libcamera-devel] [PATCH v2 13/24] ipa: Define serialized\n\tcontrols","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n\nsome spelling, just that...\n\nOn Fri, Nov 08, 2019 at 10:53:58PM +0200, Laurent Pinchart wrote:\n> From: Jacopo Mondi <jacopo@jmondi.org>\n>\n> Define data structures to be used during interaction between IPA modules\n> and pipeline handlers to serialize control lists and control info maps.\n>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  include/ipa/ipa_controls.h     |  54 ++++++++++\n>  include/ipa/meson.build        |   1 +\n>  src/libcamera/ipa_controls.cpp | 187 +++++++++++++++++++++++++++++++++\n>  src/libcamera/meson.build      |   1 +\n>  4 files changed, 243 insertions(+)\n>  create mode 100644 include/ipa/ipa_controls.h\n>  create mode 100644 src/libcamera/ipa_controls.cpp\n>\n> diff --git a/include/ipa/ipa_controls.h b/include/ipa/ipa_controls.h\n> new file mode 100644\n> index 000000000000..de3a017b0179\n> --- /dev/null\n> +++ b/include/ipa/ipa_controls.h\n> @@ -0,0 +1,54 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2019, Google Inc.\n> + *\n> + * ipa_controls.h - IPA Control handling\n> + */\n> +#ifndef __LIBCAMERA_IPA_CONTROLS_H__\n> +#define __LIBCAMERA_IPA_CONTROLS_H__\n> +\n> +#ifdef __cplusplus\n> +extern \"C\" {\n> +#endif\n> +\n> +#define IPA_CONTROLS_FORMAT_VERSION\t1\n> +\n> +struct ipa_controls_header {\n> +\tuint32_t version;\n> +\tuint32_t handle;\n> +\tuint32_t entries;\n> +\tuint32_t size;\n> +\tuint32_t data_offset;\n> +\tuint32_t reserved[3];\n> +};\n> +\n> +struct ipa_control_value_entry {\n> +\tuint32_t id;\n> +\tuint32_t type;\n> +\tuint32_t count;\n> +\tuint32_t offset;\n> +};\n> +\n> +struct ipa_control_range_entry {\n> +\tuint32_t id;\n> +\tuint32_t type;\n> +\tuint32_t offset;\n> +\tuint32_t padding[1];\n> +};\n> +\n> +union ipa_control_value_data {\n> +\tbool b;\n> +\tint32_t i32;\n> +\tint64_t i64;\n> +};\n> +\n> +struct ipa_control_range_data {\n> +\tunion ipa_control_value_data min;\n> +\tunion ipa_control_value_data max;\n> +};\n> +\n> +#ifdef __cplusplus\n> +}\n> +#endif\n> +\n> +#endif /* __LIBCAMERA_IPA_CONTROLS_H__ */\n> diff --git a/include/ipa/meson.build b/include/ipa/meson.build\n> index a0ce96ba96c3..695a4183a0e8 100644\n> --- a/include/ipa/meson.build\n> +++ b/include/ipa/meson.build\n> @@ -1,4 +1,5 @@\n>  libcamera_ipa_api = files([\n> +    'ipa_controls.h',\n>      'ipa_interface.h',\n>      'ipa_module_info.h',\n>  ])\n> diff --git a/src/libcamera/ipa_controls.cpp b/src/libcamera/ipa_controls.cpp\n> new file mode 100644\n> index 000000000000..bbcc5301cd59\n> --- /dev/null\n> +++ b/src/libcamera/ipa_controls.cpp\n> @@ -0,0 +1,187 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2019, Google Inc.\n> + *\n> + * ipa_controls.h - IPA control handling\n> + */\n> +\n> +/**\n> + * \\file ipa_controls.h\n> + * \\brief Type definitions for serialized controls\n> + *\n> + * This file defines binary formats to store ControlList and ControlInfoMap\n> + * instances in contiguous, self-contained memory areas called control packets.\n> + * It describes the layout of the packets through a set of C structures. These\n> + * formats shall be used when serializing ControlList and ControlInfoMap to\n> + * transfer them through the IPA C interface and IPA IPC transports.\n> + *\n> + * A control packet contains a list of entries, each of them describing a single\n> + * control range or control value. The packet starts with a fixed-size header\n> + * described by the ipa_controls_header structure, followed by an array of\n> + * fixed-size entries. Each entry is associated with data, stored either\n> + * directly in the entry, or in a data section after the entries array.\n> + *\n> + * The following diagram describes the layout of the ControlList packet.\n> + *\n> + * ~~~~\n> + *           +-------------------------+    .                      .\n> + *  Header / | ipa_controls_header     |    |                      |\n> + *         | |                         |    |                      |\n> + *         \\ |                         |    |                      |\n> + *           +-------------------------+    |                      |\n> + *         / | ipa_control_value_entry |    | hdr.data_offset      |\n> + *         | | #0                      |    |                      |\n> + * Control | +-------------------------+    |                      |\n> + *   value | | ...                     |    |                      |\n> + * entries | +-------------------------+    |                      |\n> + *         | | ipa_control_value_entry |    |             hdr.size |\n> + *         \\ | #hdr.entries - 1        |    |                      |\n> + *           +-------------------------+    |                      |\n> + *           | empty space (optional)  |    |                      |\n> + *           +-------------------------+ <--´  .                   |\n> + *         / | ...                     |       | entry[n].offset   |\n> + *    Data | | ...                     |       |                   |\n> + * section | | value data for entry #n | <-----´                   |\n> + *         \\ | ...                     |                           |\n> + *           +-------------------------+                           |\n> + *           | empty space (optional)  |                           |\n> + *           +-------------------------+ <-------------------------´\n> + * ~~~~\n> + *\n> + * The packet header contains the size of the packet, the number of entries, and\n> + * the offset from the beginning of the packet to the data section. The packet\n> + * entries array immediately follows the header. The data section starts at the\n> + * offset ipa_controls_header::data_offset from the beginning of the packed, and\n\ns/packed/packet\n\n> + * shall be aligned to a multiple of 8 bytes.\n> + *\n> + * Entries are described by the ipa_control_value_entry structure. They contain\n> + * the numerical ID of the control, its type, and the number of control values.\n\ns/control values/value entries/ ?\n\n> + * The control values are stored in the platform's native format.\n\nRepeted below\n\n> + *\n> + * The control values are stored in the data section in the platform's native\n> + * format. The ipa_control_value_entry::offset field stores the offset from the\n> + * beginning of the data section to the values.\n> + *\n> + * All control values in the data section shall be stored in the same order as\n> + * the controls in the entries array, shall be aligned to a multiple of 8 bytes,\n\ns/the controls in the entries array/the respective control entries/\n\n> + * and shall be contiguous in memory.\n> + *\n> + * Empty spaces may be present between the end of the entries array and the\n> + * data section, and after the data section. They shall be ignored when parsing\n> + * the packet.\n> + *\n> + * The following diagram describes the layout of the ControlInfoMap packet.\n> + *\n> + * ~~~~\n> + *           +-------------------------+    .                      .\n> + *  Header / | ipa_controls_header     |    |                      |\n> + *         | |                         |    |                      |\n> + *         \\ |                         |    |                      |\n> + *           +-------------------------+    |                      |\n> + *         / | ipa_control_range_entry |    | hdr.data_offset      |\n> + *         | | #0                      |    |                      |\n> + * Control | +-------------------------+    |                      |\n> + *   range | | ...                     |    |                      |\n> + * entries | +-------------------------+    |                      |\n> + *         | | ipa_control_range_entry |    |             hdr.size |\n> + *         \\ | #hdr.entries - 1        |    |                      |\n> + *           +-------------------------+    |                      |\n> + *           | empty space (optional)  |    |                      |\n> + *           +-------------------------+ <--´  .                   |\n> + *         / | ...                     |       | entry[n].offset   |\n> + *    Data | | ...                     |       |                   |\n> + * section | | range data for entry #n | <-----´                   |\n> + *         \\ | ...                     |                           |\n> + *           +-------------------------+                           |\n> + *           | empty space (optional)  |                           |\n> + *           +-------------------------+ <-------------------------´\n> + * ~~~~\n> + *\n> + * The packet header is identical to the ControlList packet header.\n> + *\n> + * Entries are described by the ipa_control_range_entry structure. They contain\n> + * the numerical ID and type of the control. The control range data is stored\n> + * in the data section as described by the ipa_control_range_data structure.\n> + * The ipa_control_range_entry::offset field stores the offset from the\n> + * beginning of the data section to the range data.\n> + *\n> + * Range data in the data section shall be stored in the same order as the\n> + * entries array, shall be aligned to a multiple of 8 bytes, and shall be\n> + * contiguous in memory.\n> + *\n> + * As for the ControlList packet, empty spaces may be present between the end of\n> + * the entries array and the data section, and after the data section. They\n> + * shall be ignored when parsing the packet.\n> + */\n> +\n> +/**\n> + * \\def IPA_CONTROLS_FORMAT_VERSION\n> + * \\brief The current control serialization format version\n> + */\n> +\n> +/**\n> + * \\struct ipa_controls_header\n> + * \\brief Serialized control packet header\n> + * \\var ipa_controls_header::version\n> + * Control packet format version number (shall be IPA_CONTROLS_FORMAT_VERSION)\n> + * \\var ipa_controls_header::handle\n> + * For ControlInfoMap packets, this field contains a unique non-zero handle\n> + * generated when the ControlInfoMap is serialized. For ControlList packets,\n> + * this field contains the handle of the corresponding ControlInfoMap.\n> + * \\var ipa_controls_header::entries\n> + * Number of entries in the packet\n> + * \\var ipa_controls_header::size\n> + * The total packet size in bytes\n> + * \\var ipa_controls_header::data_offset\n> + * Offset in bytes from the beginning of the packet of the data section start\n> + * \\var ipa_controls_header::reserved\n> + * Reserved for future extensions\n> + */\n> +\n> +/**\n> + * \\struct ipa_control_value_entry\n> + * \\brief Description of a serialized ControlValue entry\n> + * \\var ipa_control_value_entry::id\n> + * The numerical ID of the control\n> + * \\var ipa_control_value_entry::type\n> + * The type of the control (defined by enum ControlType)\n> + * \\var ipa_control_value_entry::count\n> + * The number of control array entries for array controls (1 otherwise)\n> + * \\var ipa_control_value_entry::offset\n> + * The offset in bytes from the beginning of the data section to the control\n> + * value data (shall be a multiple of 8 bytes).\n> + */\n> +\n> +/**\n> + * \\struct ipa_control_range_entry\n> + * \\brief Description of a serialized ControlRange entry\n> + * \\var ipa_control_range_entry::id\n> + * The numerical ID of the control\n> + * \\var ipa_control_range_entry::type\n> + * The type of the control (defined by enum ControlType)\n> + * \\var ipa_control_range_entry::offset\n> + * The offset in bytes from the beginning of the data section to the control\n> + * range data (shall be a multiple of 8 bytes)\n> + * \\var ipa_control_range_entry::padding\n> + * Padding bytes (shall be set to 0)\n> + */\n> +\n> +/**\n> + * \\union ipa_control_value_data\n> + * \\brief Serialized control value\n> + * \\var ipa_control_value_data::b\n> + * Value for ControlTypeBool controls\n> + * \\var ipa_control_value_data::i32\n> + * Value for ControlTypeInteger32 controls\n> + * \\var ipa_control_value_data::i64\n> + * Value for ControlTypeInteger64 controls\n> + */\n> +\n> +/**\n> + * \\struct ipa_control_range_data\n> + * \\brief Serialized control range\n> + * \\var ipa_control_range_data::min\n> + * The control minimum value\n> + * \\var ipa_control_range_data::max\n> + * The control maximum value\n> + */\n\nMinor aparts,\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n   j\n\n> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\n> index afbca76968f9..be0cd53f6f10 100644\n> --- a/src/libcamera/meson.build\n> +++ b/src/libcamera/meson.build\n> @@ -14,6 +14,7 @@ libcamera_sources = files([\n>      'event_notifier.cpp',\n>      'formats.cpp',\n>      'geometry.cpp',\n> +    'ipa_controls.cpp',\n>      'ipa_interface.cpp',\n>      'ipa_manager.cpp',\n>      'ipa_module.cpp',\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay12.mail.gandi.net (relay12.mail.gandi.net\n\t[217.70.178.232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 16E336136F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 15 Nov 2019 17:36:33 +0100 (CET)","from uno.localdomain (2-224-242-101.ip172.fastwebnet.it\n\t[2.224.242.101]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay12.mail.gandi.net (Postfix) with ESMTPSA id 9335A200016;\n\tFri, 15 Nov 2019 16:36:32 +0000 (UTC)"],"Date":"Fri, 15 Nov 2019 17:38:34 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20191115163834.zpekgx5ea4ejniip@uno.localdomain>","References":"<20191108205409.18845-1-laurent.pinchart@ideasonboard.com>\n\t<20191108205409.18845-14-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"icyfvv5ox7e2ygen\"","Content-Disposition":"inline","In-Reply-To":"<20191108205409.18845-14-laurent.pinchart@ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH v2 13/24] ipa: Define serialized\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>","X-List-Received-Date":"Fri, 15 Nov 2019 16:36:33 -0000"}},{"id":3044,"web_url":"https://patchwork.libcamera.org/comment/3044/","msgid":"<20191118011802.GP4853@pendragon.ideasonboard.com>","date":"2019-11-18T01:18:02","subject":"Re: [libcamera-devel] [PATCH v2 13/24] ipa: Define serialized\n\tcontrols","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Fri, Nov 15, 2019 at 05:38:34PM +0100, Jacopo Mondi wrote:\n> On Fri, Nov 08, 2019 at 10:53:58PM +0200, Laurent Pinchart wrote:\n> > From: Jacopo Mondi <jacopo@jmondi.org>\n> >\n> > Define data structures to be used during interaction between IPA modules\n> > and pipeline handlers to serialize control lists and control info maps.\n> >\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >  include/ipa/ipa_controls.h     |  54 ++++++++++\n> >  include/ipa/meson.build        |   1 +\n> >  src/libcamera/ipa_controls.cpp | 187 +++++++++++++++++++++++++++++++++\n> >  src/libcamera/meson.build      |   1 +\n> >  4 files changed, 243 insertions(+)\n> >  create mode 100644 include/ipa/ipa_controls.h\n> >  create mode 100644 src/libcamera/ipa_controls.cpp\n> >\n> > diff --git a/include/ipa/ipa_controls.h b/include/ipa/ipa_controls.h\n> > new file mode 100644\n> > index 000000000000..de3a017b0179\n> > --- /dev/null\n> > +++ b/include/ipa/ipa_controls.h\n> > @@ -0,0 +1,54 @@\n> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> > +/*\n> > + * Copyright (C) 2019, Google Inc.\n> > + *\n> > + * ipa_controls.h - IPA Control handling\n> > + */\n> > +#ifndef __LIBCAMERA_IPA_CONTROLS_H__\n> > +#define __LIBCAMERA_IPA_CONTROLS_H__\n> > +\n> > +#ifdef __cplusplus\n> > +extern \"C\" {\n> > +#endif\n> > +\n> > +#define IPA_CONTROLS_FORMAT_VERSION\t1\n> > +\n> > +struct ipa_controls_header {\n> > +\tuint32_t version;\n> > +\tuint32_t handle;\n> > +\tuint32_t entries;\n> > +\tuint32_t size;\n> > +\tuint32_t data_offset;\n> > +\tuint32_t reserved[3];\n> > +};\n> > +\n> > +struct ipa_control_value_entry {\n> > +\tuint32_t id;\n> > +\tuint32_t type;\n> > +\tuint32_t count;\n> > +\tuint32_t offset;\n> > +};\n> > +\n> > +struct ipa_control_range_entry {\n> > +\tuint32_t id;\n> > +\tuint32_t type;\n> > +\tuint32_t offset;\n> > +\tuint32_t padding[1];\n> > +};\n> > +\n> > +union ipa_control_value_data {\n> > +\tbool b;\n> > +\tint32_t i32;\n> > +\tint64_t i64;\n> > +};\n> > +\n> > +struct ipa_control_range_data {\n> > +\tunion ipa_control_value_data min;\n> > +\tunion ipa_control_value_data max;\n> > +};\n> > +\n> > +#ifdef __cplusplus\n> > +}\n> > +#endif\n> > +\n> > +#endif /* __LIBCAMERA_IPA_CONTROLS_H__ */\n> > diff --git a/include/ipa/meson.build b/include/ipa/meson.build\n> > index a0ce96ba96c3..695a4183a0e8 100644\n> > --- a/include/ipa/meson.build\n> > +++ b/include/ipa/meson.build\n> > @@ -1,4 +1,5 @@\n> >  libcamera_ipa_api = files([\n> > +    'ipa_controls.h',\n> >      'ipa_interface.h',\n> >      'ipa_module_info.h',\n> >  ])\n> > diff --git a/src/libcamera/ipa_controls.cpp b/src/libcamera/ipa_controls.cpp\n> > new file mode 100644\n> > index 000000000000..bbcc5301cd59\n> > --- /dev/null\n> > +++ b/src/libcamera/ipa_controls.cpp\n> > @@ -0,0 +1,187 @@\n> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> > +/*\n> > + * Copyright (C) 2019, Google Inc.\n> > + *\n> > + * ipa_controls.h - IPA control handling\n> > + */\n> > +\n> > +/**\n> > + * \\file ipa_controls.h\n> > + * \\brief Type definitions for serialized controls\n> > + *\n> > + * This file defines binary formats to store ControlList and ControlInfoMap\n> > + * instances in contiguous, self-contained memory areas called control packets.\n> > + * It describes the layout of the packets through a set of C structures. These\n> > + * formats shall be used when serializing ControlList and ControlInfoMap to\n> > + * transfer them through the IPA C interface and IPA IPC transports.\n> > + *\n> > + * A control packet contains a list of entries, each of them describing a single\n> > + * control range or control value. The packet starts with a fixed-size header\n> > + * described by the ipa_controls_header structure, followed by an array of\n> > + * fixed-size entries. Each entry is associated with data, stored either\n> > + * directly in the entry, or in a data section after the entries array.\n> > + *\n> > + * The following diagram describes the layout of the ControlList packet.\n> > + *\n> > + * ~~~~\n> > + *           +-------------------------+    .                      .\n> > + *  Header / | ipa_controls_header     |    |                      |\n> > + *         | |                         |    |                      |\n> > + *         \\ |                         |    |                      |\n> > + *           +-------------------------+    |                      |\n> > + *         / | ipa_control_value_entry |    | hdr.data_offset      |\n> > + *         | | #0                      |    |                      |\n> > + * Control | +-------------------------+    |                      |\n> > + *   value | | ...                     |    |                      |\n> > + * entries | +-------------------------+    |                      |\n> > + *         | | ipa_control_value_entry |    |             hdr.size |\n> > + *         \\ | #hdr.entries - 1        |    |                      |\n> > + *           +-------------------------+    |                      |\n> > + *           | empty space (optional)  |    |                      |\n> > + *           +-------------------------+ <--´  .                   |\n> > + *         / | ...                     |       | entry[n].offset   |\n> > + *    Data | | ...                     |       |                   |\n> > + * section | | value data for entry #n | <-----´                   |\n> > + *         \\ | ...                     |                           |\n> > + *           +-------------------------+                           |\n> > + *           | empty space (optional)  |                           |\n> > + *           +-------------------------+ <-------------------------´\n> > + * ~~~~\n> > + *\n> > + * The packet header contains the size of the packet, the number of entries, and\n> > + * the offset from the beginning of the packet to the data section. The packet\n> > + * entries array immediately follows the header. The data section starts at the\n> > + * offset ipa_controls_header::data_offset from the beginning of the packed, and\n> \n> s/packed/packet\n> \n> > + * shall be aligned to a multiple of 8 bytes.\n> > + *\n> > + * Entries are described by the ipa_control_value_entry structure. They contain\n> > + * the numerical ID of the control, its type, and the number of control values.\n> \n> s/control values/value entries/ ?\n\nWhile I agree that \"control values\" may be a bit confusing, I don't like\nusing \"value entries\" here as we're documenting a single\nipa_control_value_entry. What I meant was really the number of values,\nwhich is always 1 now, but will be useful later for array controls.\n\n> > + * The control values are stored in the platform's native format.\n> \n> Repeted below\n> \n> > + *\n> > + * The control values are stored in the data section in the platform's native\n> > + * format. The ipa_control_value_entry::offset field stores the offset from the\n> > + * beginning of the data section to the values.\n> > + *\n> > + * All control values in the data section shall be stored in the same order as\n> > + * the controls in the entries array, shall be aligned to a multiple of 8 bytes,\n> \n> s/the controls in the entries array/the respective control entries/\n> \n> > + * and shall be contiguous in memory.\n> > + *\n> > + * Empty spaces may be present between the end of the entries array and the\n> > + * data section, and after the data section. They shall be ignored when parsing\n> > + * the packet.\n> > + *\n> > + * The following diagram describes the layout of the ControlInfoMap packet.\n> > + *\n> > + * ~~~~\n> > + *           +-------------------------+    .                      .\n> > + *  Header / | ipa_controls_header     |    |                      |\n> > + *         | |                         |    |                      |\n> > + *         \\ |                         |    |                      |\n> > + *           +-------------------------+    |                      |\n> > + *         / | ipa_control_range_entry |    | hdr.data_offset      |\n> > + *         | | #0                      |    |                      |\n> > + * Control | +-------------------------+    |                      |\n> > + *   range | | ...                     |    |                      |\n> > + * entries | +-------------------------+    |                      |\n> > + *         | | ipa_control_range_entry |    |             hdr.size |\n> > + *         \\ | #hdr.entries - 1        |    |                      |\n> > + *           +-------------------------+    |                      |\n> > + *           | empty space (optional)  |    |                      |\n> > + *           +-------------------------+ <--´  .                   |\n> > + *         / | ...                     |       | entry[n].offset   |\n> > + *    Data | | ...                     |       |                   |\n> > + * section | | range data for entry #n | <-----´                   |\n> > + *         \\ | ...                     |                           |\n> > + *           +-------------------------+                           |\n> > + *           | empty space (optional)  |                           |\n> > + *           +-------------------------+ <-------------------------´\n> > + * ~~~~\n> > + *\n> > + * The packet header is identical to the ControlList packet header.\n> > + *\n> > + * Entries are described by the ipa_control_range_entry structure. They contain\n> > + * the numerical ID and type of the control. The control range data is stored\n> > + * in the data section as described by the ipa_control_range_data structure.\n> > + * The ipa_control_range_entry::offset field stores the offset from the\n> > + * beginning of the data section to the range data.\n> > + *\n> > + * Range data in the data section shall be stored in the same order as the\n> > + * entries array, shall be aligned to a multiple of 8 bytes, and shall be\n> > + * contiguous in memory.\n> > + *\n> > + * As for the ControlList packet, empty spaces may be present between the end of\n> > + * the entries array and the data section, and after the data section. They\n> > + * shall be ignored when parsing the packet.\n> > + */\n> > +\n> > +/**\n> > + * \\def IPA_CONTROLS_FORMAT_VERSION\n> > + * \\brief The current control serialization format version\n> > + */\n> > +\n> > +/**\n> > + * \\struct ipa_controls_header\n> > + * \\brief Serialized control packet header\n> > + * \\var ipa_controls_header::version\n> > + * Control packet format version number (shall be IPA_CONTROLS_FORMAT_VERSION)\n> > + * \\var ipa_controls_header::handle\n> > + * For ControlInfoMap packets, this field contains a unique non-zero handle\n> > + * generated when the ControlInfoMap is serialized. For ControlList packets,\n> > + * this field contains the handle of the corresponding ControlInfoMap.\n> > + * \\var ipa_controls_header::entries\n> > + * Number of entries in the packet\n> > + * \\var ipa_controls_header::size\n> > + * The total packet size in bytes\n> > + * \\var ipa_controls_header::data_offset\n> > + * Offset in bytes from the beginning of the packet of the data section start\n> > + * \\var ipa_controls_header::reserved\n> > + * Reserved for future extensions\n> > + */\n> > +\n> > +/**\n> > + * \\struct ipa_control_value_entry\n> > + * \\brief Description of a serialized ControlValue entry\n> > + * \\var ipa_control_value_entry::id\n> > + * The numerical ID of the control\n> > + * \\var ipa_control_value_entry::type\n> > + * The type of the control (defined by enum ControlType)\n> > + * \\var ipa_control_value_entry::count\n> > + * The number of control array entries for array controls (1 otherwise)\n> > + * \\var ipa_control_value_entry::offset\n> > + * The offset in bytes from the beginning of the data section to the control\n> > + * value data (shall be a multiple of 8 bytes).\n> > + */\n> > +\n> > +/**\n> > + * \\struct ipa_control_range_entry\n> > + * \\brief Description of a serialized ControlRange entry\n> > + * \\var ipa_control_range_entry::id\n> > + * The numerical ID of the control\n> > + * \\var ipa_control_range_entry::type\n> > + * The type of the control (defined by enum ControlType)\n> > + * \\var ipa_control_range_entry::offset\n> > + * The offset in bytes from the beginning of the data section to the control\n> > + * range data (shall be a multiple of 8 bytes)\n> > + * \\var ipa_control_range_entry::padding\n> > + * Padding bytes (shall be set to 0)\n> > + */\n> > +\n> > +/**\n> > + * \\union ipa_control_value_data\n> > + * \\brief Serialized control value\n> > + * \\var ipa_control_value_data::b\n> > + * Value for ControlTypeBool controls\n> > + * \\var ipa_control_value_data::i32\n> > + * Value for ControlTypeInteger32 controls\n> > + * \\var ipa_control_value_data::i64\n> > + * Value for ControlTypeInteger64 controls\n> > + */\n> > +\n> > +/**\n> > + * \\struct ipa_control_range_data\n> > + * \\brief Serialized control range\n> > + * \\var ipa_control_range_data::min\n> > + * The control minimum value\n> > + * \\var ipa_control_range_data::max\n> > + * The control maximum value\n> > + */\n> \n> Minor aparts,\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> > diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\n> > index afbca76968f9..be0cd53f6f10 100644\n> > --- a/src/libcamera/meson.build\n> > +++ b/src/libcamera/meson.build\n> > @@ -14,6 +14,7 @@ libcamera_sources = files([\n> >      'event_notifier.cpp',\n> >      'formats.cpp',\n> >      'geometry.cpp',\n> > +    'ipa_controls.cpp',\n> >      'ipa_interface.cpp',\n> >      'ipa_manager.cpp',\n> >      'ipa_module.cpp',","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1B4C860C33\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 18 Nov 2019 02:18:07 +0100 (CET)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7ACE4540;\n\tMon, 18 Nov 2019 02:18:06 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1574039886;\n\tbh=8C/RFtEyudchg+zNXZEB1AiG4fwg5vmpa9MFYpUkuJo=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=M6joKL0OovU3RXIcKev+9yyqqozBukFveCfjJvDHxnmQiSkIZzA5gbJScxeG1GRK6\n\ty2PppL8Y8iJ4X92r/3FlnjirOFYFaFNuKiYug1fgOw9QDhnqUi6d9Pu4Au64BzsjSE\n\tZ5pk6d4hljrBUrnu1nw5VFols5CDdmazTawyjbKI=","Date":"Mon, 18 Nov 2019 03:18:02 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20191118011802.GP4853@pendragon.ideasonboard.com>","References":"<20191108205409.18845-1-laurent.pinchart@ideasonboard.com>\n\t<20191108205409.18845-14-laurent.pinchart@ideasonboard.com>\n\t<20191115163834.zpekgx5ea4ejniip@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20191115163834.zpekgx5ea4ejniip@uno.localdomain>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v2 13/24] ipa: Define serialized\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>","X-List-Received-Date":"Mon, 18 Nov 2019 01:18:07 -0000"}},{"id":3064,"web_url":"https://patchwork.libcamera.org/comment/3064/","msgid":"<20191118174608.GH8072@bigcity.dyn.berto.se>","date":"2019-11-18T17:46:08","subject":"Re: [libcamera-devel] [PATCH v2 13/24] ipa: Define serialized\n\tcontrols","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Jacopo,\n\nThanks for your work.\n\nOn 2019-11-08 22:53:58 +0200, Laurent Pinchart wrote:\n> From: Jacopo Mondi <jacopo@jmondi.org>\n> \n> Define data structures to be used during interaction between IPA modules\n> and pipeline handlers to serialize control lists and control info maps.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  include/ipa/ipa_controls.h     |  54 ++++++++++\n>  include/ipa/meson.build        |   1 +\n>  src/libcamera/ipa_controls.cpp | 187 +++++++++++++++++++++++++++++++++\n>  src/libcamera/meson.build      |   1 +\n>  4 files changed, 243 insertions(+)\n>  create mode 100644 include/ipa/ipa_controls.h\n>  create mode 100644 src/libcamera/ipa_controls.cpp\n> \n> diff --git a/include/ipa/ipa_controls.h b/include/ipa/ipa_controls.h\n> new file mode 100644\n> index 000000000000..de3a017b0179\n> --- /dev/null\n> +++ b/include/ipa/ipa_controls.h\n> @@ -0,0 +1,54 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2019, Google Inc.\n> + *\n> + * ipa_controls.h - IPA Control handling\n> + */\n> +#ifndef __LIBCAMERA_IPA_CONTROLS_H__\n> +#define __LIBCAMERA_IPA_CONTROLS_H__\n> +\n> +#ifdef __cplusplus\n> +extern \"C\" {\n> +#endif\n> +\n> +#define IPA_CONTROLS_FORMAT_VERSION\t1\n> +\n> +struct ipa_controls_header {\n> +\tuint32_t version;\n> +\tuint32_t handle;\n> +\tuint32_t entries;\n> +\tuint32_t size;\n> +\tuint32_t data_offset;\n> +\tuint32_t reserved[3];\n> +};\n> +\n> +struct ipa_control_value_entry {\n> +\tuint32_t id;\n> +\tuint32_t type;\n> +\tuint32_t count;\n> +\tuint32_t offset;\n> +};\n> +\n> +struct ipa_control_range_entry {\n> +\tuint32_t id;\n> +\tuint32_t type;\n> +\tuint32_t offset;\n> +\tuint32_t padding[1];\n> +};\n> +\n> +union ipa_control_value_data {\n> +\tbool b;\n> +\tint32_t i32;\n> +\tint64_t i64;\n> +};\n> +\n> +struct ipa_control_range_data {\n> +\tunion ipa_control_value_data min;\n> +\tunion ipa_control_value_data max;\n> +};\n> +\n> +#ifdef __cplusplus\n> +}\n> +#endif\n> +\n> +#endif /* __LIBCAMERA_IPA_CONTROLS_H__ */\n> diff --git a/include/ipa/meson.build b/include/ipa/meson.build\n> index a0ce96ba96c3..695a4183a0e8 100644\n> --- a/include/ipa/meson.build\n> +++ b/include/ipa/meson.build\n> @@ -1,4 +1,5 @@\n>  libcamera_ipa_api = files([\n> +    'ipa_controls.h',\n>      'ipa_interface.h',\n>      'ipa_module_info.h',\n>  ])\n> diff --git a/src/libcamera/ipa_controls.cpp b/src/libcamera/ipa_controls.cpp\n> new file mode 100644\n> index 000000000000..bbcc5301cd59\n> --- /dev/null\n> +++ b/src/libcamera/ipa_controls.cpp\n> @@ -0,0 +1,187 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2019, Google Inc.\n> + *\n> + * ipa_controls.h - IPA control handling\n> + */\n> +\n> +/**\n> + * \\file ipa_controls.h\n> + * \\brief Type definitions for serialized controls\n> + *\n> + * This file defines binary formats to store ControlList and ControlInfoMap\n> + * instances in contiguous, self-contained memory areas called control packets.\n> + * It describes the layout of the packets through a set of C structures. These\n> + * formats shall be used when serializing ControlList and ControlInfoMap to\n> + * transfer them through the IPA C interface and IPA IPC transports.\n> + *\n> + * A control packet contains a list of entries, each of them describing a single\n> + * control range or control value. The packet starts with a fixed-size header\n> + * described by the ipa_controls_header structure, followed by an array of\n> + * fixed-size entries. Each entry is associated with data, stored either\n> + * directly in the entry, or in a data section after the entries array.\n> + *\n> + * The following diagram describes the layout of the ControlList packet.\n> + *\n> + * ~~~~\n> + *           +-------------------------+    .                      .\n> + *  Header / | ipa_controls_header     |    |                      |\n> + *         | |                         |    |                      |\n> + *         \\ |                         |    |                      |\n> + *           +-------------------------+    |                      |\n> + *         / | ipa_control_value_entry |    | hdr.data_offset      |\n> + *         | | #0                      |    |                      |\n> + * Control | +-------------------------+    |                      |\n> + *   value | | ...                     |    |                      |\n> + * entries | +-------------------------+    |                      |\n> + *         | | ipa_control_value_entry |    |             hdr.size |\n> + *         \\ | #hdr.entries - 1        |    |                      |\n> + *           +-------------------------+    |                      |\n> + *           | empty space (optional)  |    |                      |\n> + *           +-------------------------+ <--´  .                   |\n> + *         / | ...                     |       | entry[n].offset   |\n> + *    Data | | ...                     |       |                   |\n> + * section | | value data for entry #n | <-----´                   |\n> + *         \\ | ...                     |                           |\n> + *           +-------------------------+                           |\n> + *           | empty space (optional)  |                           |\n> + *           +-------------------------+ <-------------------------´\n> + * ~~~~\n> + *\n> + * The packet header contains the size of the packet, the number of entries, and\n> + * the offset from the beginning of the packet to the data section. The packet\n> + * entries array immediately follows the header. The data section starts at the\n> + * offset ipa_controls_header::data_offset from the beginning of the packed, and\n> + * shall be aligned to a multiple of 8 bytes.\n> + *\n> + * Entries are described by the ipa_control_value_entry structure. They contain\n> + * the numerical ID of the control, its type, and the number of control values.\n> + * The control values are stored in the platform's native format.\n> + *\n> + * The control values are stored in the data section in the platform's native\n> + * format. The ipa_control_value_entry::offset field stores the offset from the\n> + * beginning of the data section to the values.\n> + *\n> + * All control values in the data section shall be stored in the same order as\n> + * the controls in the entries array, shall be aligned to a multiple of 8 bytes,\n> + * and shall be contiguous in memory.\n> + *\n> + * Empty spaces may be present between the end of the entries array and the\n> + * data section, and after the data section. They shall be ignored when parsing\n> + * the packet.\n> + *\n> + * The following diagram describes the layout of the ControlInfoMap packet.\n> + *\n> + * ~~~~\n> + *           +-------------------------+    .                      .\n> + *  Header / | ipa_controls_header     |    |                      |\n> + *         | |                         |    |                      |\n> + *         \\ |                         |    |                      |\n> + *           +-------------------------+    |                      |\n> + *         / | ipa_control_range_entry |    | hdr.data_offset      |\n> + *         | | #0                      |    |                      |\n> + * Control | +-------------------------+    |                      |\n> + *   range | | ...                     |    |                      |\n> + * entries | +-------------------------+    |                      |\n> + *         | | ipa_control_range_entry |    |             hdr.size |\n> + *         \\ | #hdr.entries - 1        |    |                      |\n> + *           +-------------------------+    |                      |\n> + *           | empty space (optional)  |    |                      |\n> + *           +-------------------------+ <--´  .                   |\n> + *         / | ...                     |       | entry[n].offset   |\n> + *    Data | | ...                     |       |                   |\n> + * section | | range data for entry #n | <-----´                   |\n> + *         \\ | ...                     |                           |\n> + *           +-------------------------+                           |\n> + *           | empty space (optional)  |                           |\n> + *           +-------------------------+ <-------------------------´\n> + * ~~~~\n> + *\n> + * The packet header is identical to the ControlList packet header.\n> + *\n> + * Entries are described by the ipa_control_range_entry structure. They contain\n> + * the numerical ID and type of the control. The control range data is stored\n> + * in the data section as described by the ipa_control_range_data structure.\n> + * The ipa_control_range_entry::offset field stores the offset from the\n> + * beginning of the data section to the range data.\n> + *\n> + * Range data in the data section shall be stored in the same order as the\n> + * entries array, shall be aligned to a multiple of 8 bytes, and shall be\n> + * contiguous in memory.\n> + *\n> + * As for the ControlList packet, empty spaces may be present between the end of\n> + * the entries array and the data section, and after the data section. They\n> + * shall be ignored when parsing the packet.\n> + */\n> +\n> +/**\n> + * \\def IPA_CONTROLS_FORMAT_VERSION\n> + * \\brief The current control serialization format version\n> + */\n> +\n> +/**\n> + * \\struct ipa_controls_header\n> + * \\brief Serialized control packet header\n> + * \\var ipa_controls_header::version\n> + * Control packet format version number (shall be IPA_CONTROLS_FORMAT_VERSION)\n> + * \\var ipa_controls_header::handle\n> + * For ControlInfoMap packets, this field contains a unique non-zero handle\n> + * generated when the ControlInfoMap is serialized. For ControlList packets,\n> + * this field contains the handle of the corresponding ControlInfoMap.\n> + * \\var ipa_controls_header::entries\n> + * Number of entries in the packet\n> + * \\var ipa_controls_header::size\n> + * The total packet size in bytes\n> + * \\var ipa_controls_header::data_offset\n> + * Offset in bytes from the beginning of the packet of the data section start\n> + * \\var ipa_controls_header::reserved\n> + * Reserved for future extensions\n> + */\n> +\n> +/**\n> + * \\struct ipa_control_value_entry\n> + * \\brief Description of a serialized ControlValue entry\n> + * \\var ipa_control_value_entry::id\n> + * The numerical ID of the control\n> + * \\var ipa_control_value_entry::type\n> + * The type of the control (defined by enum ControlType)\n> + * \\var ipa_control_value_entry::count\n> + * The number of control array entries for array controls (1 otherwise)\n> + * \\var ipa_control_value_entry::offset\n> + * The offset in bytes from the beginning of the data section to the control\n> + * value data (shall be a multiple of 8 bytes).\n> + */\n> +\n> +/**\n> + * \\struct ipa_control_range_entry\n> + * \\brief Description of a serialized ControlRange entry\n> + * \\var ipa_control_range_entry::id\n> + * The numerical ID of the control\n> + * \\var ipa_control_range_entry::type\n> + * The type of the control (defined by enum ControlType)\n> + * \\var ipa_control_range_entry::offset\n> + * The offset in bytes from the beginning of the data section to the control\n> + * range data (shall be a multiple of 8 bytes)\n> + * \\var ipa_control_range_entry::padding\n> + * Padding bytes (shall be set to 0)\n> + */\n> +\n> +/**\n> + * \\union ipa_control_value_data\n> + * \\brief Serialized control value\n> + * \\var ipa_control_value_data::b\n> + * Value for ControlTypeBool controls\n> + * \\var ipa_control_value_data::i32\n> + * Value for ControlTypeInteger32 controls\n> + * \\var ipa_control_value_data::i64\n> + * Value for ControlTypeInteger64 controls\n> + */\n> +\n> +/**\n> + * \\struct ipa_control_range_data\n> + * \\brief Serialized control range\n> + * \\var ipa_control_range_data::min\n> + * The control minimum value\n> + * \\var ipa_control_range_data::max\n> + * The control maximum value\n> + */\n> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\n> index afbca76968f9..be0cd53f6f10 100644\n> --- a/src/libcamera/meson.build\n> +++ b/src/libcamera/meson.build\n> @@ -14,6 +14,7 @@ libcamera_sources = files([\n>      'event_notifier.cpp',\n>      'formats.cpp',\n>      'geometry.cpp',\n> +    'ipa_controls.cpp',\n>      'ipa_interface.cpp',\n>      'ipa_manager.cpp',\n>      'ipa_module.cpp',\n> -- \n> Regards,\n> \n> Laurent Pinchart\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lj1-x242.google.com (mail-lj1-x242.google.com\n\t[IPv6:2a00:1450:4864:20::242])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2CBA860F1C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 18 Nov 2019 18:46:10 +0100 (CET)","by mail-lj1-x242.google.com with SMTP id 139so19979623ljf.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 18 Nov 2019 09:46:10 -0800 (PST)","from localhost (h-93-159.A463.priv.bahnhof.se. [46.59.93.159])\n\tby smtp.gmail.com with ESMTPSA id\n\tc19sm8520011ljj.61.2019.11.18.09.46.08\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 18 Nov 2019 09:46:08 -0800 (PST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to\n\t:user-agent; bh=z/yOSiuiUxTnG03AcSpTI/hMoPWKMu13Jri7U/MYJIs=;\n\tb=cIau4xoD2pkEAzTfvaZzDM++wYeI5VEE5vo+9ZkZWihA1t4zr8eN1O/T/4WPbl7CqG\n\ta9QaJ4yY8YizcpItz3OM+8ylWiwwzpItcXKyfE5JFf7jBBHs21lebFduvrfRQxOQw6qb\n\t0L+25XdKnQ8zUEGoXlGy22Gdrz0UBKhfxdeVQH4Bt35fAcpfrob8VenYJOgXdxYGhLfq\n\th2xze+Jp2ZCyG5Udr9PKZcmkXvOSMJnh/eq2Wc+8xnpyXMh4karZwubK672ugNLnRIXX\n\tJJGNmS29nNmCth8dSb1wL5z8JX992IfDSTq3+MPWpszez0Tr2cPxZmiupMCe6AgpRfXN\n\tW/Cw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to:user-agent;\n\tbh=z/yOSiuiUxTnG03AcSpTI/hMoPWKMu13Jri7U/MYJIs=;\n\tb=TIQlvCjnp7wWZZ+UFKqiQ7DMB6l6wxFgQZ+QDP/89olzlK5Y0n+10xVej/jCw2fluR\n\t++nogmuH2a4M+kUf8SiD+ovv2+ergEJ9B5moe5AJVFxKHzIBxu8BKUajaM5j8vv0+9kn\n\t9aw/mQhZr2K+W2U+g7fbsIYXB0FDbhClyqveFZ0c7/qfwlH0HDEeFLPWMrFOTOmGssLx\n\t/FbI02uy+Vq2Gr89ial2zTxIWhq1DU470YIJrse3Na5PvA5yqr20U+PTOAxOvL/HYvGC\n\t067Y75eJNSw8PZfSJ/QBtSWS3P3mity6m9DdpZ9wNazKvY14DaQtc3psIEaMGUt+zgID\n\thdhA==","X-Gm-Message-State":"APjAAAWfAYupdxHMJoui2LMn71kLOE12AD8nY7g1E+GewAq2VyY02KV7\n\ts4MWmPjHv+4RjpQe4z9iwkbQ7YnB+l8=","X-Google-Smtp-Source":"APXvYqz8jBlkYZ5Qq89zHXPCBZtudnU3XuTNbonWwXSFjdPdugC9PjVzbXtClQ0qByP6v5tAInsGng==","X-Received":"by 2002:a2e:3311:: with SMTP id d17mr462543ljc.237.1574099169380;\n\tMon, 18 Nov 2019 09:46:09 -0800 (PST)","Date":"Mon, 18 Nov 2019 18:46:08 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20191118174608.GH8072@bigcity.dyn.berto.se>","References":"<20191108205409.18845-1-laurent.pinchart@ideasonboard.com>\n\t<20191108205409.18845-14-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20191108205409.18845-14-laurent.pinchart@ideasonboard.com>","User-Agent":"Mutt/1.12.1 (2019-06-15)","Subject":"Re: [libcamera-devel] [PATCH v2 13/24] ipa: Define serialized\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>","X-List-Received-Date":"Mon, 18 Nov 2019 17:46:10 -0000"}}]