[{"id":39836,"web_url":"https://patchwork.libcamera.org/comment/39836/","msgid":"<008fa29c-5f19-4920-908c-200b5a4af25c@ideasonboard.com>","date":"2026-07-24T13:35:58","subject":"Re: [PATCH 1/2] libcamera: Serialize local control names in IPA\n\tformat v3","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2026. 07. 23. 19:46 keltezéssel, Magdum írta:\n> Bump IPA controls serialization format to v3 and add name_len to\n> ControlInfoMap entries.\n> \n> Serialize null-terminated control names for local (V4L2-style) id\n> maps to preserve names across IPC.\n\nDo we need it to be null terminated? If not, I think we could just omit it.\n\n\n> \n> Extend serializer tests with V4L2-like name round-trip coverage and\n> malformed payload rejection for oversized length, missing terminator,\n> and too-long serialize input.\n> \n> Signed-off-by: Magdum <magdum.foss@gmail.com>\n> ---\n>   include/libcamera/ipa/ipa_controls.h         |   6 +-\n>   src/libcamera/control_serializer.cpp         | 133 +++++++++++++------\n>   test/serialization/control_serialization.cpp | 109 +++++++++++++++\n>   3 files changed, 207 insertions(+), 41 deletions(-)\n> \n> diff --git a/include/libcamera/ipa/ipa_controls.h b/include/libcamera/ipa/ipa_controls.h\n> index 6af962ff..7a7873d9 100644\n> --- a/include/libcamera/ipa/ipa_controls.h\n> +++ b/include/libcamera/ipa/ipa_controls.h\n> @@ -15,7 +15,7 @@ namespace libcamera {\n>   extern \"C\" {\n>   #endif\n>   \n> -#define IPA_CONTROLS_FORMAT_VERSION\t2\n> +#define IPA_CONTROLS_FORMAT_VERSION 3\n>   \n>   enum ipa_controls_id_map_type {\n>   \tIPA_CONTROL_ID_MAP_CONTROLS,\n> @@ -50,7 +50,9 @@ struct ipa_control_info_entry {\n>   \tuint32_t id;\n>   \tuint32_t type;\n>   \tuint8_t direction;\n> -\tuint8_t padding[7];\n> +\tuint8_t padding[3];\n> +\t/* Length of the control name without the terminating null byte. */\n> +\tuint32_t name_len;\n\nI'm wondering if we might want an \"offset\" here for name\njust like each `ipa_control_value_entry` has it.\n\n\n>   \tstruct ipa_control_value_entry min;\n>   \tstruct ipa_control_value_entry max;\n>   \tstruct ipa_control_value_entry def;\n\nThe documentation in `ipa_controls.cpp` should also\nbe updated if I'm not mistaken.\n\n\n> [...]","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E704EBDE4C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Jul 2026 13:36:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 933C467F1A;\n\tFri, 24 Jul 2026 15:36:03 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3803967E89\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2026 15:36:02 +0200 (CEST)","from [192.168.33.42] (185.182.215.156.nat.pool.zt.hu\n\t[185.182.215.156])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A008A73B;\n\tFri, 24 Jul 2026 15:35:00 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ooc4xLUH\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1784900100;\n\tbh=RgeawaHS+T9mSjNuhL9B8s3F63q1q/wBcZx3Qm5QbLY=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=ooc4xLUHP20TSXo1Vn0Znpa3pZAqgD7OPqLmHCPenwrm8u8FygWcHIHBbeQYFfKGH\n\t81uuu+f6TjC6GINbo/H1t5bU7Ecyw0jkjmbpyBILQTMsh+AXaIUY2U+k2f5yDTb5G6\n\tRMgVqeGIF415s8AjVxUjT95FUeXP2Yuk9bGKif1U=","Message-ID":"<008fa29c-5f19-4920-908c-200b5a4af25c@ideasonboard.com>","Date":"Fri, 24 Jul 2026 15:35:58 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 1/2] libcamera: Serialize local control names in IPA\n\tformat v3","To":"Magdum <magdum.foss@gmail.com>, libcamera-devel@lists.libcamera.org","References":"<20260723174644.6580-1-magdum.foss@gmail.com>\n\t<20260723174644.6580-2-magdum.foss@gmail.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20260723174644.6580-2-magdum.foss@gmail.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":39852,"web_url":"https://patchwork.libcamera.org/comment/39852/","msgid":"<20260724210408.7983-1-magdum.foss@gmail.com>","date":"2026-07-24T21:04:03","subject":"Re: [1/2] libcamera: Serialize local control names in IPA format v3","submitter":{"id":453,"url":"https://patchwork.libcamera.org/api/people/453/","name":"Magdum","email":"magdum.foss@gmail.com"},"content":"Hi\n\n2026. 07. 23. 19:46 keltezéssel, Magdum írta:\n> Bump IPA controls serialization format to v3 and add name_len to\n> ControlInfoMap entries.\n> \n> Serialize null-terminated control names for local (V4L2-style) id\n> maps to preserve names across IPC.\n\n<<Do we need it to be null terminated? If not, I think we could just omit it.\nGood point — since name_len is already encoded in the entry, the receiver knows exactly how many bytes to \nconsume without a sentinel. Dropped the null terminator from both the serialization (size calculation + write) \nand deserialization (read + validity check).\n\n\n> \n> Extend serializer tests with V4L2-like name round-trip coverage and\n> malformed payload rejection for oversized length, missing terminator,\n> and too-long serialize input.\n> \n> Signed-off-by: Magdum <magdum.foss@gmail.com>\n> ---\n>   include/libcamera/ipa/ipa_controls.h         |   6 +-\n>   src/libcamera/control_serializer.cpp         | 133 +++++++++++++------\n>   test/serialization/control_serialization.cpp | 109 +++++++++++++++\n>   3 files changed, 207 insertions(+), 41 deletions(-)\n> \n> diff --git a/include/libcamera/ipa/ipa_controls.h b/include/libcamera/ipa/ipa_controls.h\n> index 6af962ff..7a7873d9 100644\n> --- a/include/libcamera/ipa/ipa_controls.h\n> +++ b/include/libcamera/ipa/ipa_controls.h\n> @@ -15,7 +15,7 @@ namespace libcamera {\n>   extern \"C\" {\n>   #endif\n>   \n> -#define IPA_CONTROLS_FORMAT_VERSION\t2\n> +#define IPA_CONTROLS_FORMAT_VERSION 3\n>   \n>   enum ipa_controls_id_map_type {\n>   \tIPA_CONTROL_ID_MAP_CONTROLS,\n> @@ -50,7 +50,9 @@ struct ipa_control_info_entry {\n>   \tuint32_t id;\n>   \tuint32_t type;\n>   \tuint8_t direction;\n> -\tuint8_t padding[7];\n> +\tuint8_t padding[3];\n> +\t/* Length of the control name without the terminating null byte. */\n> +\tuint32_t name_len;\n\n<<I'm wondering if we might want an \"offset\" here for name\n<<just like each `ipa_control_value_entry` has it.\nDone — added name_offset to ipa_control_info_entry and wired it up the same way as the value entries: recorded at serialize time and checked against values.offset() before reading at deserialize time.\n\n\n\n>   \tstruct ipa_control_value_entry min;\n>   \tstruct ipa_control_value_entry max;\n>   \tstruct ipa_control_value_entry def;\n\n<<The documentation in `ipa_controls.cpp` should also\n<<be updated if I'm not mistaken.\nDone\n\n> [...]","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 1B488C3264\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Jul 2026 21:04:16 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BE4D567F3D;\n\tFri, 24 Jul 2026 23:04:14 +0200 (CEST)","from mail-wm1-x331.google.com (mail-wm1-x331.google.com\n\t[IPv6:2a00:1450:4864:20::331])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3108367F22\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2026 23:04:13 +0200 (CEST)","by mail-wm1-x331.google.com with SMTP id\n\t5b1f17b1804b1-4954aff6088so7500285e9.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2026 14:04:13 -0700 (PDT)","from magdum-System-Product-Name.vodafone.ultrahub\n\t([2a02:810d:4b14:4600:4f39:30e9:8fd8:737c])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-496b4ee0e91sm11040775e9.4.2026.07.24.14.04.11\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 24 Jul 2026 14:04:11 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"ler7lgqD\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=gmail.com; s=20251104; t=1784927052; x=1785531852;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:content-type:mime-version:references\n\t:in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject\n\t:date:message-id:reply-to:content-type;\n\tbh=e+NXr2Ss5XMghNnS503oHttwqgfElY56R3QRHdHe/Rg=;\n\tb=ler7lgqDQe1GoMWnAb7D4ugj5DS9mtE6TQ22DhgKisD0wb5tg0MPZKrqZmXpYQleQK\n\tsl9zOJQccUK7voSbmOFP+WLs8O5/JTk6g2+1Ta9a/orMbEvafkhyU89DkBWhoSGrAI8/\n\tpEE4XKlIXLBVGHlegQAk6OQlQV972WWIrDYi8Mg7xhhiGJsW7Hhi+3xoB9evIbIobY1/\n\t4fb/5fzotGaqm2Fr3k0anysbiFjP5u5cBP6aCPcI+S6M/d5gmMpwH++ZRXKN8FVmpWKk\n\tN+hJKtJDFVGn4dINudFsK1Jy7Rw8yTJ2URdaegsNAfHWoehkOBSfGujeTioiFSo3sNX2\n\tFhbA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1784927052; x=1785531852;\n\th=content-transfer-encoding:content-type:mime-version:references\n\t:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to\n\t:content-type;\n\tbh=e+NXr2Ss5XMghNnS503oHttwqgfElY56R3QRHdHe/Rg=;\n\tb=hp05YVkcXGxYo/ic4uoMWMieN70aYWclo4MaZmISBBYCTHkKBr8HZ1PWIpIadCOOXU\n\t5b1xjuXeXunKfR8Ie3gdAwf41OgPLEmae+oXFYlD9e2f1SAHMqt+0qj8MyqrgjjPB/0J\n\teKn0KnLyW8K9flXiVB+22nfmximWQ/OWNaq2Xy9PIfT5K8DKXbqxWNK0L+t3QmJxH5G/\n\tLtm3j4MZUBXMTs+1YC2sH7EuwQfZRdsnKH7kixkdc/oqta61DAT3eXsB3xRIuOYk3e8t\n\tU/a7rqQqIJFlCjLYaJaU1Sen4TDPqai5PSgN8o1O4iUitYCyUI2ERPqS3wayCmcH2BNN\n\t9pQg==","X-Gm-Message-State":"AOJu0YzMhaisQytjFNps2+3CNi0/01HcO+kPC9MXm6AMfjNZs3sGlTON\n\tK6vZOYSSEBhvhTfQw/k2k9JMLYREr1d/Ph2MEU6IU80Qv27JVjJ9Ar7xfuJ4B9Yd/kI=","X-Gm-Gg":"AR+sD10BQL1Kdvem8t3OsCuk4F7zbtkODO7tHRlDxgmORaHNrdda4me9HfbkRYUui3X\n\t+2nHPK5Hut7N0GQhe5+ysNRdulhGHXTDscsOQQNfspSPFY+09t5exqaJgeImnvlajL9k2cmeHzm\n\tAfliybqlyEfUcOp2Lqs9zG5I4dE8CRdDMi6OppJr4RDyEEiV5AqSkZrjfEH5s2lHdbqcCfAQsG8\n\t4t7G+qsWLYyiPMyg8+xNo1nO5FSK0aruEEcsroEIuqIa7eaF3FTJwMMhxbDVpoh8Dyx6FPmwqiK\n\tgMjHg98Qmxi86k/eRx9C1X53aCRYgIbAGzTFFFLpKM4e41QnJn29dRiPdZxY45TvZTbZUsUHdaM\n\t9TpAG++Ox9VVknz8H3/GcPdZ8Z8p3Z3Hp9ZAi0KFTCvUawCm8ZJwbTjGahuKwWGu5aUYlOlRQsx\n\tTd9PcPka1BCpMHa/tCW1xyO3GpkDSzGD8lvkXLHI8GY/5DWan0HLsl","X-Received":"by 2002:a05:600c:291d:b0:493:c8f7:3631 with SMTP id\n\t5b1f17b1804b1-49573cd9919mr75524055e9.22.1784927052380; \n\tFri, 24 Jul 2026 14:04:12 -0700 (PDT)","From":"Magdum <magdum.foss@gmail.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Magdum <magdum.foss@gmail.com>","Subject":"Re: [1/2] libcamera: Serialize local control names in IPA format v3","Date":"Fri, 24 Jul 2026 23:04:03 +0200","Message-ID":"<20260724210408.7983-1-magdum.foss@gmail.com>","X-Mailer":"git-send-email 2.43.0","In-Reply-To":"<20260723174644.6580-2-magdum.foss@gmail.com>","References":"<20260723174644.6580-2-magdum.foss@gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":39853,"web_url":"https://patchwork.libcamera.org/comment/39853/","msgid":"<20260724210740.8036-1-magdum.foss@gmail.com>","date":"2026-07-24T21:07:34","subject":"Re: [1/2] libcamera: Serialize local control names in IPA format v3","submitter":{"id":453,"url":"https://patchwork.libcamera.org/api/people/453/","name":"Magdum","email":"magdum.foss@gmail.com"},"content":"Hi\n\n2026. 07. 23. 19:46 keltezéssel, Magdum írta:\n> Bump IPA controls serialization format to v3 and add name_len to\n> ControlInfoMap entries.\n> \n> Serialize null-terminated control names for local (V4L2-style) id\n> maps to preserve names across IPC.\n\n<<Do we need it to be null terminated? If not, I think we could just omit it.\nGood point — since name_len is already encoded in the entry, the receiver knows exactly how many bytes to \nconsume without a sentinel. Dropped the null terminator from both the serialization (size calculation + write) \nand deserialization (read + validity check).\n\n\n> \n> Extend serializer tests with V4L2-like name round-trip coverage and\n> malformed payload rejection for oversized length, missing terminator,\n> and too-long serialize input.\n> \n> Signed-off-by: Magdum <magdum.foss@gmail.com>\n> ---\n>   include/libcamera/ipa/ipa_controls.h         |   6 +-\n>   src/libcamera/control_serializer.cpp         | 133 +++++++++++++------\n>   test/serialization/control_serialization.cpp | 109 +++++++++++++++\n>   3 files changed, 207 insertions(+), 41 deletions(-)\n> \n> diff --git a/include/libcamera/ipa/ipa_controls.h b/include/libcamera/ipa/ipa_controls.h\n> index 6af962ff..7a7873d9 100644\n> --- a/include/libcamera/ipa/ipa_controls.h\n> +++ b/include/libcamera/ipa/ipa_controls.h\n> @@ -15,7 +15,7 @@ namespace libcamera {\n>   extern \"C\" {\n>   #endif\n>   \n> -#define IPA_CONTROLS_FORMAT_VERSION\t2\n> +#define IPA_CONTROLS_FORMAT_VERSION 3\n>   \n>   enum ipa_controls_id_map_type {\n>   \tIPA_CONTROL_ID_MAP_CONTROLS,\n> @@ -50,7 +50,9 @@ struct ipa_control_info_entry {\n>   \tuint32_t id;\n>   \tuint32_t type;\n>   \tuint8_t direction;\n> -\tuint8_t padding[7];\n> +\tuint8_t padding[3];\n> +\t/* Length of the control name without the terminating null byte. */\n> +\tuint32_t name_len;\n\n<<I'm wondering if we might want an \"offset\" here for name\n<<just like each `ipa_control_value_entry` has it.\nDone — added name_offset to ipa_control_info_entry and wired it up the same way as the value entries: recorded at serialize time and checked against values.offset() before reading at deserialize time.\n\n\n\n>   \tstruct ipa_control_value_entry min;\n>   \tstruct ipa_control_value_entry max;\n>   \tstruct ipa_control_value_entry def;\n\n<<The documentation in `ipa_controls.cpp` should also\n<<be updated if I'm not mistaken.\nDone\n\n> [...]","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E8434BE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Jul 2026 21:07:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 399F467F45;\n\tFri, 24 Jul 2026 23:07:46 +0200 (CEST)","from mail-wm1-x334.google.com (mail-wm1-x334.google.com\n\t[IPv6:2a00:1450:4864:20::334])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B86C267F22\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2026 23:07:44 +0200 (CEST)","by mail-wm1-x334.google.com with SMTP id\n\t5b1f17b1804b1-49557167508so8427865e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2026 14:07:44 -0700 (PDT)","from magdum-System-Product-Name.vodafone.ultrahub\n\t([2a02:810d:4b14:4600:4f39:30e9:8fd8:737c])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-496b49a8547sm16898275e9.14.2026.07.24.14.07.43\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 24 Jul 2026 14:07:43 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"YgoKseAR\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=gmail.com; s=20251104; t=1784927264; x=1785532064;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:content-type:mime-version:references\n\t:in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject\n\t:date:message-id:reply-to:content-type;\n\tbh=e+NXr2Ss5XMghNnS503oHttwqgfElY56R3QRHdHe/Rg=;\n\tb=YgoKseARm629UbzNB4Jt6nzYQMlcZo2K5kQQQA7cASL44KeN8mHtT6M6t2f3r39Zb2\n\teE2E0GC9GFyaW0dnVniyS/UstdNeOfEh0llbs8j15XywDjIvVNGQ4rvWO8KihNukIA2c\n\tNmNFxR6UuRPs6cwoS+lo4Fff9jW4JrRn0BpkX9BNqM+zNWoKzAX81MmpxqD9B4ZEoKDR\n\tQCNaXLyOacbx3dwkyOdGKjyrK4H7YdDIHo0MKMAHcUfm7N3xc5+H7KvAee3sBLgO5GiG\n\t80F636PyipaML/jg6bT9U9urAPTFGYTFVT7xp5uWcdbI3/Y36S1zue86EpE9vPFrs1P6\n\tMepA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1784927264; x=1785532064;\n\th=content-transfer-encoding:content-type:mime-version:references\n\t:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to\n\t:content-type;\n\tbh=e+NXr2Ss5XMghNnS503oHttwqgfElY56R3QRHdHe/Rg=;\n\tb=S0mEqhWQimu4boSMQlllCytkMZUlA8LnOp+wZfhXn/257TCoT9SswQerMNLKfyO2D4\n\tcK4G9kGZqnzwpm9uEUH4sNmiymdeFqmg6bZx3+9ltM5jdxGxJsRIdKHQfdcqlT0KPkZE\n\teix1bAyIXiaJrP8Shq9PJQbFh/EyjaopLPyziEqm/hKpFPG1FNrA3S0C1VZKrWiBhQNX\n\tq7tOT/eyTwtLjhm+ibZxiCoe/9ByvgT3ny3lDZvgdTLJ8bMP6SzsBLbb9mjPcwYw+N3y\n\tu4A7HPyJLRq9rMdCyrjUWfXGibQY7CRB3BirT62ni/Z4R3sHdJDl7us/4OzY7rPXZJNF\n\t3qyg==","X-Gm-Message-State":"AOJu0YyE+gM12W7ITq1E1Q2LDoXdPtlYcZe2QqmGIkCguP27++jnLygo\n\tkkgsvm3eYZjhTXNPguKY6AFp0sRG4FTjLOJpZzfSltHb59n8d0R1ZHW0WrNyATd5pnY=","X-Gm-Gg":"AR+sD11EBrYFMrES0/pF8xqkRjyl0foipEqpNd+D0/tUkoe4gJCqo6UE93Hqew6Bd77\n\tuc9vqvZthq0jUWpVVrWJiINgd/2wcsLIyX80CBWInjVZRBLu+JrUWgbgoM9KpIOIGBjw2Y9H4sr\n\tKD7+EgK4E5MG4OpTZGw/Pfi7vjHhJcCJivxyKR07E6yXDRfsDl1PDKdWo+lsbz18jm/i4FeOH+W\n\t2eAsLx9iKlcf9CJbQySC6JxTKNKddck84ithjvlCsdvAnzvPkskhHhLLAobkSZfcfxBHEzTo6G5\n\t+nNSYt3MM3GiXaYPpDlQmAazZJ4mF1LWnSeYGywEHN4IC8OSzuvk7NvudQe46fyXYYQFFFCMFMC\n\tK8Zw1knDa6V3hhnnOzZJhyLc7XmV6ROC3ulLJVynIXwQB35N2meyzA9hnEu5dhq6bG2YzwCrkxB\n\tm+Rto1EMsK1srJeT7kHr/34RtWMkQrT6EB91UH2Fovn95skbVtulwR","X-Received":"by 2002:a05:600c:3f07:b0:495:5d5b:7533 with SMTP id\n\t5b1f17b1804b1-496b56d042dmr161805e9.13.1784927263976; \n\tFri, 24 Jul 2026 14:07:43 -0700 (PDT)","From":"Magdum <magdum.foss@gmail.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Magdum <magdum.foss@gmail.com>","Subject":"Re: [1/2] libcamera: Serialize local control names in IPA format v3","Date":"Fri, 24 Jul 2026 23:07:34 +0200","Message-ID":"<20260724210740.8036-1-magdum.foss@gmail.com>","X-Mailer":"git-send-email 2.43.0","In-Reply-To":"<20260723174644.6580-2-magdum.foss@gmail.com>","References":"<20260723174644.6580-2-magdum.foss@gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":39861,"web_url":"https://patchwork.libcamera.org/comment/39861/","msgid":"<178514165918.8891.575952335006647146@neptunite.rasen.tech>","date":"2026-07-27T08:40:59","subject":"Re: [PATCH 1/2] libcamera: Serialize local control names in IPA\n\tformat v3","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Hello Magdum,\n\nQuoting Magdum (2026-07-24 02:46:43)\n> Bump IPA controls serialization format to v3 and add name_len to\n> ControlInfoMap entries.\n> \n> Serialize null-terminated control names for local (V4L2-style) id\n> maps to preserve names across IPC.\n\nYou've described \"what\" but not \"why\". Have you seen \"How to Write a Git\nCommit Message\"?  https://cbea.ms/git-commit/\n\nThe commit subject should also be prefixed with \"libcamera: controls:\" and\ns/local/v4l2/. imo the v3 isn't significant enough to be in the subject.\n\n> \n> Extend serializer tests with V4L2-like name round-trip coverage and\n> malformed payload rejection for oversized length, missing terminator,\n> and too-long serialize input.\n\nThe serialization format documentation in ipa_controls.cpp needs to be updated.\n\n> \n> Signed-off-by: Magdum <magdum.foss@gmail.com>\n> ---\n>  include/libcamera/ipa/ipa_controls.h         |   6 +-\n>  src/libcamera/control_serializer.cpp         | 133 +++++++++++++------\n>  test/serialization/control_serialization.cpp | 109 +++++++++++++++\n>  3 files changed, 207 insertions(+), 41 deletions(-)\n> \n> diff --git a/include/libcamera/ipa/ipa_controls.h b/include/libcamera/ipa/ipa_controls.h\n> index 6af962ff..7a7873d9 100644\n> --- a/include/libcamera/ipa/ipa_controls.h\n> +++ b/include/libcamera/ipa/ipa_controls.h\n> @@ -15,7 +15,7 @@ namespace libcamera {\n>  extern \"C\" {\n>  #endif\n>  \n> -#define IPA_CONTROLS_FORMAT_VERSION    2\n> +#define IPA_CONTROLS_FORMAT_VERSION 3\n>  \n>  enum ipa_controls_id_map_type {\n>         IPA_CONTROL_ID_MAP_CONTROLS,\n> @@ -50,7 +50,9 @@ struct ipa_control_info_entry {\n>         uint32_t id;\n>         uint32_t type;\n>         uint8_t direction;\n> -       uint8_t padding[7];\n> +       uint8_t padding[3];\n> +       /* Length of the control name without the terminating null byte. */\n\nThis belongs in the documentation in ipa_controls.cpp.\n\nJust curious, did you get any assistance from LLMs to write these?\n\n> +       uint32_t name_len;\n>         struct ipa_control_value_entry min;\n>         struct ipa_control_value_entry max;\n>         struct ipa_control_value_entry def;\n> diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp\n> index c0285cc6..b3c44ed0 100644\n> --- a/src/libcamera/control_serializer.cpp\n> +++ b/src/libcamera/control_serializer.cpp\n> @@ -31,6 +31,27 @@ namespace libcamera {\n>  \n>  LOG_DEFINE_CATEGORY(Serializer)\n>  \n> +namespace {\n> +\n> +constexpr uint32_t kMaxControlNameLength = 1024;\n> +\n> +enum ipa_controls_id_map_type idMapTypeFor(const ControlIdMap &idmap)\n> +{\n> +       if (&idmap == &controls::controls)\n> +               return IPA_CONTROL_ID_MAP_CONTROLS;\n> +       if (&idmap == &properties::properties)\n> +               return IPA_CONTROL_ID_MAP_PROPERTIES;\n> +\n> +       return IPA_CONTROL_ID_MAP_V4L2;\n> +}\n\nI think this helper could be a bit better. There's an instance in the\nControlList serializer that looks like it could be refactored with this but\nisn't. Why is that? Also every single callsite of this is linked to the below\nfunction. Couldn't they be merged into a more direct and succint helper?\n\n> +\n> +bool idMapRequiresLocalIds(enum ipa_controls_id_map_type idMapType)\n> +{\n> +       return idMapType == IPA_CONTROL_ID_MAP_V4L2;\n> +}\n> +\n> +} /* namespace */\n> +\n>  /**\n>   * \\class ControlSerializer\n>   * \\brief Serializer and deserializer for control-related classes\n> @@ -165,10 +186,16 @@ size_t ControlSerializer::binarySize(const ControlInfoMap &infoMap)\n>  {\n>         size_t size = sizeof(struct ipa_controls_header)\n>                     + infoMap.size() * sizeof(struct ipa_control_info_entry);\n> +       enum ipa_controls_id_map_type idMapType = idMapTypeFor(infoMap.idmap());\n>  \n> -       for (const auto &ctrl : infoMap)\n> +       for (const auto &ctrl : infoMap) {\n>                 size += binarySize(ctrl.second);\n>  \n> +               size += idMapRequiresLocalIds(idMapType)\n> +                               ? ctrl.first->name().size() + 1\n> +                               : 1;\n> +       }\n> +\n>         return size;\n>  }\n>  \n> @@ -183,8 +210,7 @@ size_t ControlSerializer::binarySize(const ControlInfoMap &infoMap)\n>   */\n>  size_t ControlSerializer::binarySize(const ControlList &list)\n>  {\n> -       size_t size = sizeof(struct ipa_controls_header)\n> -                   + list.size() * sizeof(struct ipa_control_list_entry);\n> +       size_t size = sizeof(struct ipa_controls_header) + list.size() * sizeof(struct ipa_control_list_entry);\n\nWhy is this indentation changed?\n\n>  \n>         for (const auto &ctrl : list)\n>                 size += binarySize(ctrl.second);\n> @@ -231,24 +257,21 @@ int ControlSerializer::serialize(const ControlInfoMap &infoMap,\n>                 return 0;\n>         }\n>  \n> +       enum ipa_controls_id_map_type idMapType = idMapTypeFor(infoMap.idmap());\n> +\n>         /* Compute entries and data required sizes. */\n>         size_t entriesSize = infoMap.size()\n>                            * sizeof(struct ipa_control_info_entry);\n>         size_t valuesSize = 0;\n> -       for (const auto &ctrl : infoMap)\n> +       for (const auto &ctrl : infoMap) {\n>                 valuesSize += binarySize(ctrl.second);\n> -\n> -       const ControlIdMap *idmap = &infoMap.idmap();\n> -       enum ipa_controls_id_map_type idMapType;\n> -       if (idmap == &controls::controls)\n> -               idMapType = IPA_CONTROL_ID_MAP_CONTROLS;\n> -       else if (idmap == &properties::properties)\n> -               idMapType = IPA_CONTROL_ID_MAP_PROPERTIES;\n> -       else\n> -               idMapType = IPA_CONTROL_ID_MAP_V4L2;\n> +               valuesSize += idMapRequiresLocalIds(idMapType)\n> +                                     ? ctrl.first->name().size() + 1\n> +                                     : 1;\n> +       }\n>  \n>         /* Prepare the packet header. */\n> -       struct ipa_controls_header hdr;\n> +       struct ipa_controls_header hdr = {};\n\nEvery field is populated immediately below; do we need to explicitly\nzero-initialize everything?\n\n>         hdr.version = IPA_CONTROLS_FORMAT_VERSION;\n>         hdr.handle = serial_;\n>         hdr.entries = infoMap.size();\n> @@ -267,21 +290,29 @@ int ControlSerializer::serialize(const ControlInfoMap &infoMap,\n>          */\n>         serial_ += 2;\n>  \n> -       /*\n> -        * Serialize all entries.\n> -        * \\todo Serialize the control name too\n> -        */\n> +       /* Serialize all entries. */\n>         ByteStreamBuffer entries = buffer.carveOut(entriesSize);\n>         ByteStreamBuffer values = buffer.carveOut(valuesSize);\n> +       static const std::string emptyName;\n>  \n>         for (const auto &ctrl : infoMap) {\n>                 const ControlId *id = ctrl.first;\n>                 const ControlInfo &info = ctrl.second;\n> +               const std::string &name = idMapRequiresLocalIds(idMapType)\n> +                                                 ? id->name()\n> +                                                 : emptyName;\n> +\n> +               if (name.size() > kMaxControlNameLength) {\n> +                       LOG(Serializer, Error)\n> +                               << \"Control name too long: \" << name.size();\n> +                       return -EINVAL;\n> +               }\n>  \n> -               struct ipa_control_info_entry entry;\n> +               struct ipa_control_info_entry entry = {};\n>                 entry.id = id->id();\n>                 entry.type = id->type();\n>                 entry.direction = static_cast<ControlId::DirectionFlags::Type>(id->direction());\n> +               entry.name_len = static_cast<uint32_t>(name.size());\n>  \n>                 populateControlValueEntry(entry.min, info.min(), values.offset());\n>                 store(info.min(), values);\n> @@ -292,6 +323,10 @@ int ControlSerializer::serialize(const ControlInfoMap &infoMap,\n>                 populateControlValueEntry(entry.def, info.def(), values.offset());\n>                 store(info.def(), values);\n>  \n> +               values.write(Span<const uint8_t>(\n> +                       reinterpret_cast<const uint8_t *>(name.c_str()),\n> +                       name.size() + 1));\n> +\n>                 entries.write(&entry);\n>         }\n>  \n> @@ -355,7 +390,7 @@ int ControlSerializer::serialize(const ControlList &list,\n>                 valuesSize += binarySize(ctrl.second);\n>  \n>         /* Prepare the packet header. */\n> -       struct ipa_controls_header hdr;\n> +       struct ipa_controls_header hdr = {};\n\nSame here.\n\n\nThanks,\n\nPaul\n\n>         hdr.version = IPA_CONTROLS_FORMAT_VERSION;\n>         hdr.handle = infoMapHandle;\n>         hdr.entries = list.size();\n> @@ -485,25 +520,6 @@ ControlInfoMap ControlSerializer::deserialize<ControlInfoMap>(ByteStreamBuffer &\n>  \n>                 ControlType type = static_cast<ControlType>(entry->type);\n>  \n> -               /* If we're using a local id map, populate it. */\n> -               if (localIdMap) {\n> -                       ControlId::DirectionFlags flags{\n> -                               static_cast<ControlId::Direction>(entry->direction)\n> -                       };\n> -\n> -                       /**\n> -                        * \\todo Find a way to preserve the control name for\n> -                        * debugging purpose.\n> -                        */\n> -                       controlIds_.emplace_back(std::make_unique<ControlId>(entry->id,\n> -                                                                            \"\", \"local\", type,\n> -                                                                            flags));\n> -                       (*localIdMap)[entry->id] = controlIds_.back().get();\n> -               }\n> -\n> -               const ControlId *controlId = idMap->at(entry->id);\n> -               ASSERT(controlId);\n> -\n>                 const ipa_control_value_entry &min_entry = entry->min;\n>                 const ipa_control_value_entry &max_entry = entry->max;\n>                 const ipa_control_value_entry &def_entry = entry->def;\n> @@ -538,6 +554,45 @@ ControlInfoMap ControlSerializer::deserialize<ControlInfoMap>(ByteStreamBuffer &\n>                         loadControlValue(values, static_cast<ControlType>(def_entry.type),\n>                                          def_entry.is_array, def_entry.count);\n>  \n> +               /*\n> +                * Deserialize the null-terminated control name from the values\n> +                * section. Reject unreasonably long names to guard against\n> +                * malformed packets.\n> +                */\n> +               if (entry->name_len > kMaxControlNameLength) {\n> +                       LOG(Serializer, Error)\n> +                               << \"Control name too long: \" << entry->name_len;\n> +                       return {};\n> +               }\n> +\n> +               const auto *nameData = values.read<const uint8_t>(entry->name_len + 1);\n> +               if (!nameData) {\n> +                       LOG(Serializer, Error) << \"Out of data reading control name\";\n> +                       return {};\n> +               }\n> +\n> +               if (nameData[entry->name_len] != '\\0') {\n> +                       LOG(Serializer, Error) << \"Control name is not null-terminated\";\n> +                       return {};\n> +               }\n> +\n> +               /* If we're using a local id map, populate it with the restored name. */\n> +               if (localIdMap) {\n> +                       std::string ctrlName(reinterpret_cast<const char *>(nameData),\n> +                                            entry->name_len);\n> +\n> +                       ControlId::DirectionFlags flags{\n> +                               static_cast<ControlId::Direction>(entry->direction)\n> +                       };\n> +\n> +                       controlIds_.emplace_back(std::make_unique<ControlId>(entry->id,\n> +                                                                            ctrlName, \"local\",\n> +                                                                            type, flags));\n> +                       (*localIdMap)[entry->id] = controlIds_.back().get();\n> +               }\n> +\n> +               const ControlId *controlId = idMap->at(entry->id);\n> +               ASSERT(controlId);\n>  \n>                 /* Create and store the ControlInfo. */\n>                 ctrls.emplace(controlId, ControlInfo(min, max, def));\n> diff --git a/test/serialization/control_serialization.cpp b/test/serialization/control_serialization.cpp\n> index 06c572b7..b1638db9 100644\n> --- a/test/serialization/control_serialization.cpp\n> +++ b/test/serialization/control_serialization.cpp\n> @@ -11,6 +11,8 @@\n>  #include <libcamera/control_ids.h>\n>  #include <libcamera/controls.h>\n>  \n> +#include <libcamera/ipa/ipa_controls.h>\n> +\n>  #include \"libcamera/internal/byte_stream_buffer.h\"\n>  #include \"libcamera/internal/control_serializer.h\"\n>  \n> @@ -169,6 +171,113 @@ protected:\n>                         return TestFail;\n>                 }\n>  \n> +               /* Build a local (V4L2-like) ControlInfoMap and verify name round-trip. */\n> +               vector<unique_ptr<ControlId>> v4l2ControlIds;\n> +               ControlIdMap v4l2IdMap;\n> +               constexpr uint32_t kV4L2TestControlId = 0x009a2001;\n> +               const string kV4L2ControlName = \"V4L2_CID_TEST_GAIN\";\n> +\n> +               v4l2ControlIds.emplace_back(std::make_unique<ControlId>(\n> +                       kV4L2TestControlId, kV4L2ControlName, \"v4l2\",\n> +                       ControlTypeInteger32, ControlId::Direction::In));\n> +               v4l2IdMap.emplace(kV4L2TestControlId, v4l2ControlIds.back().get());\n> +\n> +               ControlInfoMap::Map v4l2Info;\n> +               v4l2Info.emplace(v4l2ControlIds.back().get(),\n> +                                ControlInfo(ControlValue(int32_t{ 0 }),\n> +                                            ControlValue(int32_t{ 255 }),\n> +                                            ControlValue(int32_t{ 16 })));\n> +               ControlInfoMap v4l2InfoMap(std::move(v4l2Info), v4l2IdMap);\n> +\n> +               ControlSerializer v4l2Serializer(ControlSerializer::Role::Proxy);\n> +               ControlSerializer v4l2Deserializer(ControlSerializer::Role::Worker);\n> +\n> +               size = v4l2Serializer.binarySize(v4l2InfoMap);\n> +               infoData.resize(size);\n> +               buffer = ByteStreamBuffer(infoData.data(), infoData.size());\n> +\n> +               ret = v4l2Serializer.serialize(v4l2InfoMap, buffer);\n> +               if (ret < 0 || buffer.overflow()) {\n> +                       cerr << \"Failed to serialize V4L2-like ControlInfoMap\" << endl;\n> +                       return TestFail;\n> +               }\n> +\n> +               buffer = ByteStreamBuffer(const_cast<const uint8_t *>(infoData.data()),\n> +                                         infoData.size());\n> +               ControlInfoMap v4l2InfoMapDes =\n> +                       v4l2Deserializer.deserialize<ControlInfoMap>(buffer);\n> +               if (v4l2InfoMapDes.empty()) {\n> +                       cerr << \"Failed to deserialize V4L2-like ControlInfoMap\" << endl;\n> +                       return TestFail;\n> +               }\n> +\n> +               auto idIt = v4l2InfoMapDes.idmap().find(kV4L2TestControlId);\n> +               if (idIt == v4l2InfoMapDes.idmap().end()) {\n> +                       cerr << \"Deserialized V4L2-like id map misses test control\" << endl;\n> +                       return TestFail;\n> +               }\n> +\n> +               if (idIt->second->name() != kV4L2ControlName) {\n> +                       cerr << \"Deserialized V4L2-like control name doesn't match\" << endl;\n> +                       return TestFail;\n> +               }\n> +\n> +               /* Reject malformed packets with over-sized names. */\n> +               vector<uint8_t> badNameLenData = infoData;\n> +               auto *badNameLenHeader =\n> +                       reinterpret_cast<ipa_controls_header *>(badNameLenData.data());\n> +               auto *badNameLenEntry = reinterpret_cast<ipa_control_info_entry *>(\n> +                       badNameLenData.data() + sizeof(*badNameLenHeader));\n> +               badNameLenEntry->name_len = 2048;\n> +\n> +               ControlSerializer badNameLenDeserializer(ControlSerializer::Role::Worker);\n> +               buffer = ByteStreamBuffer(const_cast<const uint8_t *>(badNameLenData.data()),\n> +                                         badNameLenData.size());\n> +               if (!badNameLenDeserializer.deserialize<ControlInfoMap>(buffer).empty()) {\n> +                       cerr << \"Oversized control name should be rejected\" << endl;\n> +                       return TestFail;\n> +               }\n> +\n> +               /* Reject malformed packets with non-null-terminated names. */\n> +               vector<uint8_t> badTermData = infoData;\n> +               badTermData.back() = 'X';\n> +\n> +               ControlSerializer badTermDeserializer(ControlSerializer::Role::Worker);\n> +               buffer = ByteStreamBuffer(const_cast<const uint8_t *>(badTermData.data()),\n> +                                         badTermData.size());\n> +               if (!badTermDeserializer.deserialize<ControlInfoMap>(buffer).empty()) {\n> +                       cerr << \"Control name without null terminator should be rejected\" << endl;\n> +                       return TestFail;\n> +               }\n> +\n> +               /* Reject too-long names at serialization time. */\n> +               vector<unique_ptr<ControlId>> longNameControlIds;\n> +               ControlIdMap longNameIdMap;\n> +               string longName(1025, 'n');\n> +\n> +               longNameControlIds.emplace_back(std::make_unique<ControlId>(\n> +                       0x009a2002, longName, \"v4l2\", ControlTypeInteger32,\n> +                       ControlId::Direction::In));\n> +               longNameIdMap.emplace(0x009a2002, longNameControlIds.back().get());\n> +\n> +               ControlInfoMap::Map longNameInfo;\n> +               longNameInfo.emplace(longNameControlIds.back().get(),\n> +                                    ControlInfo(ControlValue(int32_t{ 0 }),\n> +                                                ControlValue(int32_t{ 255 }),\n> +                                                ControlValue(int32_t{ 16 })));\n> +               ControlInfoMap longNameInfoMap(std::move(longNameInfo), longNameIdMap);\n> +\n> +               ControlSerializer longNameSerializer(ControlSerializer::Role::Proxy);\n> +               size = longNameSerializer.binarySize(longNameInfoMap);\n> +               infoData.resize(size);\n> +               buffer = ByteStreamBuffer(infoData.data(), infoData.size());\n> +\n> +               ret = longNameSerializer.serialize(longNameInfoMap, buffer);\n> +               if (ret != -EINVAL) {\n> +                       cerr << \"Too-long control name should fail serialization\" << endl;\n> +                       return TestFail;\n> +               }\n> +\n>                 return TestPass;\n>         }\n>  };\n> -- \n> 2.43.0\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 7B1D1BDE4C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 27 Jul 2026 08:41:08 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2A73167F5E;\n\tMon, 27 Jul 2026 10:41:07 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 32FE067F4C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 27 Jul 2026 10:41:05 +0200 (CEST)","from neptunite.rasen.tech (unknown\n\t[IPv6:2400:2411:160:2f00:b2c4:d1c2:d1f0:43af])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id D9D0E492;\n\tMon, 27 Jul 2026 10:40:00 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ApkIqPM0\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1785141601;\n\tbh=mjJY5RAGtP7oMo6gftTotv6QeDyfxorR8hYHkUBIv6s=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=ApkIqPM0d6+XPPS9dYqSeyjh8voTIK5iPZQyufOdZ0Qvb20CpicEF3YUR0QQEKShF\n\tdBUOMdJItBvq3+N7AzQH6bPjYJNgPm2PDNDa8CP6Viun+u9qjv38s3e7NJACoVFlWT\n\tUBPrJNLXCmVj0fBRDMrQf1pg1UWbScHD/swkZXik=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20260723174644.6580-2-magdum.foss@gmail.com>","References":"<20260723174644.6580-1-magdum.foss@gmail.com>\n\t<20260723174644.6580-2-magdum.foss@gmail.com>","Subject":"Re: [PATCH 1/2] libcamera: Serialize local control names in IPA\n\tformat v3","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"Magdum <magdum.foss@gmail.com>","To":"Magdum <magdum.foss@gmail.com>, libcamera-devel@lists.libcamera.org","Date":"Mon, 27 Jul 2026 17:40:59 +0900","Message-ID":"<178514165918.8891.575952335006647146@neptunite.rasen.tech>","User-Agent":"alot/0.0.0","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]