[{"id":35140,"web_url":"https://patchwork.libcamera.org/comment/35140/","msgid":"<yu545vqw2zffiha7lbp7qiz4qk36uo55deks4v7cmuho4stqsa@bgbdbcjartov>","date":"2025-07-25T13:35:21","subject":"Re: [RFC PATCH v2 06/22] libcamera: base: Add alignment utility\n\tfunctions","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Barnabás\n\nOn Mon, Jul 21, 2025 at 12:46:06PM +0200, Barnabás Pőcze wrote:\n> Add a couple internal functions to check alignment, and to\n> align integers, pointer up to a given alignment.\n>\n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n>  include/libcamera/base/details/align.h | 78 ++++++++++++++++++++++++++\n>  include/libcamera/base/meson.build     |  1 +\n\nJust as a reminder, we will need documentation as well :)\n\n>  2 files changed, 79 insertions(+)\n>  create mode 100644 include/libcamera/base/details/align.h\n>\n> diff --git a/include/libcamera/base/details/align.h b/include/libcamera/base/details/align.h\n> new file mode 100644\n> index 000000000..e9569613b\n> --- /dev/null\n> +++ b/include/libcamera/base/details/align.h\n> @@ -0,0 +1,78 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2025, Ideas on Board Oy\n> + *\n> + * Alignment utilities\n> + */\n> +\n> +#pragma once\n> +\n> +#include <cassert>\n> +#include <cstddef>\n> +#include <cstdint>\n> +\n> +#include <libcamera/base/details/cxx20.h>\n> +\n> +namespace libcamera::details::align {\n> +\n> +inline bool is(const void *p, std::uintptr_t alignment)\n> +{\n> +\tassert(alignment > 0);\n> +\n> +\treturn reinterpret_cast<std::uintptr_t>(p) % alignment == 0;\n> +}\n> +\n> +template<typename T>\n> +constexpr T up(T x, cxx20::type_identity_t<T> alignment)\n> +{\n> +\tstatic_assert(std::is_unsigned_v<T>);\n> +\tassert(alignment > 0);\n> +\n> +\tconst auto padding = (alignment - (x % alignment)) % alignment;\n> +\tassert(x + padding >= x);\n> +\n> +\treturn x + padding;\n> +}\n> +\n> +template<typename T>\n> +auto *up(T *p, std::uintptr_t alignment)\n> +{\n> +\tusing U = std::conditional_t<\n> +\t\tstd::is_const_v<T>,\n> +\t\tconst std::byte,\n> +\t\tstd::byte\n> +\t>;\n> +\n> +\treturn reinterpret_cast<U *>(up(reinterpret_cast<std::uintptr_t>(p), alignment));\n> +}\n> +\n> +template<typename T>\n> +T *up(std::size_t size, std::size_t alignment, T *&ptr, std::size_t *avail = nullptr)\n> +{\n> +\tassert(alignment > 0);\n> +\n> +\tauto p = reinterpret_cast<std::uintptr_t>(ptr);\n> +\tconst auto padding = (alignment - (p % alignment)) % alignment;\n> +\n> +\tif (avail) {\n> +\t\tif (size > *avail || padding > *avail - size)\n> +\t\t\treturn nullptr;\n> +\n> +\t\t*avail -= size + padding;\n> +\t}\n> +\n> +\tp += padding;\n> +\tptr = reinterpret_cast<T *>(p + size);\n> +\n> +\treturn reinterpret_cast<T *>(p);\n> +}\n> +\n> +template<typename U, typename T>\n> +U *up(T *&ptr, std::size_t *avail = nullptr)\n> +{\n> +\treturn reinterpret_cast<std::conditional_t<std::is_const_v<T>, const U, U> *>(\n> +\t\tup(sizeof(U), alignof(U), ptr, avail)\n> +\t);\n> +}\n\nI'm curious to see this how this will look like when used.\nDo you use all these overloads in the rest of the series ?\n\n> +\n> +} /* namespace libcamera::details::align */\n> diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build\n> index 9836daff9..1554b996b 100644\n> --- a/include/libcamera/base/meson.build\n> +++ b/include/libcamera/base/meson.build\n> @@ -33,6 +33,7 @@ libcamera_base_private_headers = files([\n>\n>  libcamera_base_details_headers = files([\n>      'details/cxx20.h',\n> +    'details/align.h',\n>  ])\n>\n>  libcamera_base_headers = [\n> --\n> 2.50.1\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 DD568C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 25 Jul 2025 13:35:28 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 94B41690ED;\n\tFri, 25 Jul 2025 15:35:27 +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 57122690A6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 25 Jul 2025 15:35:25 +0200 (CEST)","from ideasonboard.com (mob-5-90-139-29.net.vodafone.it\n\t[5.90.139.29])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 0F7BDC66;\n\tFri, 25 Jul 2025 15:34:44 +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=\"NFPCucKa\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1753450485;\n\tbh=mjQV/QnZ7eyHnUM+IDMFzszujlc5/HsrPdsWUOr+Y+A=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=NFPCucKapvl5AIGdAsh2D7qcDyr/u7rB0H96TriPbkEesk4IdvyQlJvjbozo2yYNv\n\tPG5xG2IZT6sCS5GFCecVgfmWBFsIwlmeSHkrPZ9/nADaAt5NzChQViqz28Rm3xQTI3\n\taljZiDRGh4kdgRD6mk4DpKNssEI0A4Pq9DUTLP3s=","Date":"Fri, 25 Jul 2025 15:35:21 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [RFC PATCH v2 06/22] libcamera: base: Add alignment utility\n\tfunctions","Message-ID":"<yu545vqw2zffiha7lbp7qiz4qk36uo55deks4v7cmuho4stqsa@bgbdbcjartov>","References":"<20250721104622.1550908-1-barnabas.pocze@ideasonboard.com>\n\t<20250721104622.1550908-7-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20250721104622.1550908-7-barnabas.pocze@ideasonboard.com>","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":35250,"web_url":"https://patchwork.libcamera.org/comment/35250/","msgid":"<fa290c55-af61-4455-8e86-0962725c165b@ideasonboard.com>","date":"2025-07-30T14:48:50","subject":"Re: [RFC PATCH v2 06/22] libcamera: base: Add alignment utility\n\tfunctions","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2025. 07. 25. 15:35 keltezéssel, Jacopo Mondi írta:\n> Hi Barnabás\n> \n> On Mon, Jul 21, 2025 at 12:46:06PM +0200, Barnabás Pőcze wrote:\n>> Add a couple internal functions to check alignment, and to\n>> align integers, pointer up to a given alignment.\n>>\n>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n>> ---\n>>   include/libcamera/base/details/align.h | 78 ++++++++++++++++++++++++++\n>>   include/libcamera/base/meson.build     |  1 +\n> \n> Just as a reminder, we will need documentation as well :)\n\nThings in a `details` namespace are ignored by doxygen;\nI could still add some documentation in the header files.\n\n\n> \n>>   2 files changed, 79 insertions(+)\n>>   create mode 100644 include/libcamera/base/details/align.h\n>>\n>> diff --git a/include/libcamera/base/details/align.h b/include/libcamera/base/details/align.h\n>> new file mode 100644\n>> index 000000000..e9569613b\n>> --- /dev/null\n>> +++ b/include/libcamera/base/details/align.h\n>> @@ -0,0 +1,78 @@\n>> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n>> +/*\n>> + * Copyright (C) 2025, Ideas on Board Oy\n>> + *\n>> + * Alignment utilities\n>> + */\n>> +\n>> +#pragma once\n>> +\n>> +#include <cassert>\n>> +#include <cstddef>\n>> +#include <cstdint>\n>> +\n>> +#include <libcamera/base/details/cxx20.h>\n>> +\n>> +namespace libcamera::details::align {\n>> +\n>> +inline bool is(const void *p, std::uintptr_t alignment)\n>> +{\n>> +\tassert(alignment > 0);\n>> +\n>> +\treturn reinterpret_cast<std::uintptr_t>(p) % alignment == 0;\n>> +}\n>> +\n>> +template<typename T>\n>> +constexpr T up(T x, cxx20::type_identity_t<T> alignment)\n>> +{\n>> +\tstatic_assert(std::is_unsigned_v<T>);\n>> +\tassert(alignment > 0);\n>> +\n>> +\tconst auto padding = (alignment - (x % alignment)) % alignment;\n>> +\tassert(x + padding >= x);\n>> +\n>> +\treturn x + padding;\n>> +}\n>> +\n>> +template<typename T>\n>> +auto *up(T *p, std::uintptr_t alignment)\n>> +{\n>> +\tusing U = std::conditional_t<\n>> +\t\tstd::is_const_v<T>,\n>> +\t\tconst std::byte,\n>> +\t\tstd::byte\n>> +\t>;\n>> +\n>> +\treturn reinterpret_cast<U *>(up(reinterpret_cast<std::uintptr_t>(p), alignment));\n>> +}\n>> +\n>> +template<typename T>\n>> +T *up(std::size_t size, std::size_t alignment, T *&ptr, std::size_t *avail = nullptr)\n>> +{\n>> +\tassert(alignment > 0);\n>> +\n>> +\tauto p = reinterpret_cast<std::uintptr_t>(ptr);\n>> +\tconst auto padding = (alignment - (p % alignment)) % alignment;\n>> +\n>> +\tif (avail) {\n>> +\t\tif (size > *avail || padding > *avail - size)\n>> +\t\t\treturn nullptr;\n>> +\n>> +\t\t*avail -= size + padding;\n>> +\t}\n>> +\n>> +\tp += padding;\n>> +\tptr = reinterpret_cast<T *>(p + size);\n>> +\n>> +\treturn reinterpret_cast<T *>(p);\n>> +}\n>> +\n>> +template<typename U, typename T>\n>> +U *up(T *&ptr, std::size_t *avail = nullptr)\n>> +{\n>> +\treturn reinterpret_cast<std::conditional_t<std::is_const_v<T>, const U, U> *>(\n>> +\t\tup(sizeof(U), alignof(U), ptr, avail)\n>> +\t);\n>> +}\n> \n> I'm curious to see this how this will look like when used.\n> Do you use all these overloads in the rest of the series ?\n\nAll of these should be used somewhere.\n\n\nstd::byte *buf = ...;\nstd::size_t avail = ...;\n\nauto *p = details::align::up<SomeType>(buf, &avail); // allocate suitable aligned and sized storage\nauto *x = new (p) SomeType { ... }; // construct object in said storage\n\n\nRegards,\nBarnabás Pőcze\n\n> \n>> +\n>> +} /* namespace libcamera::details::align */\n>> diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build\n>> index 9836daff9..1554b996b 100644\n>> --- a/include/libcamera/base/meson.build\n>> +++ b/include/libcamera/base/meson.build\n>> @@ -33,6 +33,7 @@ libcamera_base_private_headers = files([\n>>\n>>   libcamera_base_details_headers = files([\n>>       'details/cxx20.h',\n>> +    'details/align.h',\n>>   ])\n>>\n>>   libcamera_base_headers = [\n>> --\n>> 2.50.1\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 7B568BDC71\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 30 Jul 2025 14:48:55 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2F64169208;\n\tWed, 30 Jul 2025 16:48:55 +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 B2E96691F8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 30 Jul 2025 16:48:53 +0200 (CEST)","from [192.168.33.11] (185.182.214.105.nat.pool.zt.hu\n\t[185.182.214.105])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 467DAC7A;\n\tWed, 30 Jul 2025 16:48:10 +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=\"t99hxNqa\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1753886890;\n\tbh=XsjmqZNcEgRg4h5lOR8eVMRWRMKHWVRolrsBKmil+k8=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=t99hxNqahuwSBZ58elMeJZWNzb78WVZrQVxIa1VNTA6TvFL51/0STRP0ACykEFy4A\n\tGuC+CyXgG8jMM8PvyxrgWDO0IY1j4hgOGwDRpNvVnlBo788Hw8fTn6buHsKO/dXhoC\n\tbchIFY1uYK9kLqmyoP3WkMvjkf9C3JPETcX28N0E=","Message-ID":"<fa290c55-af61-4455-8e86-0962725c165b@ideasonboard.com>","Date":"Wed, 30 Jul 2025 16:48:50 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [RFC PATCH v2 06/22] libcamera: base: Add alignment utility\n\tfunctions","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250721104622.1550908-1-barnabas.pocze@ideasonboard.com>\n\t<20250721104622.1550908-7-barnabas.pocze@ideasonboard.com>\n\t<yu545vqw2zffiha7lbp7qiz4qk36uo55deks4v7cmuho4stqsa@bgbdbcjartov>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<yu545vqw2zffiha7lbp7qiz4qk36uo55deks4v7cmuho4stqsa@bgbdbcjartov>","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":35918,"web_url":"https://patchwork.libcamera.org/comment/35918/","msgid":"<175827745695.2127323.7125455648052427427@neptunite.rasen.tech>","date":"2025-09-19T10:24:16","subject":"Re: [RFC PATCH v2 06/22] libcamera: base: Add alignment utility\n\tfunctions","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Barnabás Pőcze (2025-07-21 19:46:06)\n> Add a couple internal functions to check alignment, and to\n> align integers, pointer up to a given alignment.\n> \n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\nLooks good to me.\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  include/libcamera/base/details/align.h | 78 ++++++++++++++++++++++++++\n>  include/libcamera/base/meson.build     |  1 +\n>  2 files changed, 79 insertions(+)\n>  create mode 100644 include/libcamera/base/details/align.h\n> \n> diff --git a/include/libcamera/base/details/align.h b/include/libcamera/base/details/align.h\n> new file mode 100644\n> index 000000000..e9569613b\n> --- /dev/null\n> +++ b/include/libcamera/base/details/align.h\n> @@ -0,0 +1,78 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2025, Ideas on Board Oy\n> + *\n> + * Alignment utilities\n> + */\n> +\n> +#pragma once\n> +\n> +#include <cassert>\n> +#include <cstddef>\n> +#include <cstdint>\n> +\n> +#include <libcamera/base/details/cxx20.h>\n> +\n> +namespace libcamera::details::align {\n> +\n> +inline bool is(const void *p, std::uintptr_t alignment)\n> +{\n> +       assert(alignment > 0);\n> +\n> +       return reinterpret_cast<std::uintptr_t>(p) % alignment == 0;\n> +}\n> +\n> +template<typename T>\n> +constexpr T up(T x, cxx20::type_identity_t<T> alignment)\n> +{\n> +       static_assert(std::is_unsigned_v<T>);\n> +       assert(alignment > 0);\n> +\n> +       const auto padding = (alignment - (x % alignment)) % alignment;\n> +       assert(x + padding >= x);\n> +\n> +       return x + padding;\n> +}\n> +\n> +template<typename T>\n> +auto *up(T *p, std::uintptr_t alignment)\n> +{\n> +       using U = std::conditional_t<\n> +               std::is_const_v<T>,\n> +               const std::byte,\n> +               std::byte\n> +       >;\n> +\n> +       return reinterpret_cast<U *>(up(reinterpret_cast<std::uintptr_t>(p), alignment));\n> +}\n> +\n> +template<typename T>\n> +T *up(std::size_t size, std::size_t alignment, T *&ptr, std::size_t *avail = nullptr)\n> +{\n> +       assert(alignment > 0);\n> +\n> +       auto p = reinterpret_cast<std::uintptr_t>(ptr);\n> +       const auto padding = (alignment - (p % alignment)) % alignment;\n> +\n> +       if (avail) {\n> +               if (size > *avail || padding > *avail - size)\n> +                       return nullptr;\n> +\n> +               *avail -= size + padding;\n> +       }\n> +\n> +       p += padding;\n> +       ptr = reinterpret_cast<T *>(p + size);\n> +\n> +       return reinterpret_cast<T *>(p);\n> +}\n> +\n> +template<typename U, typename T>\n> +U *up(T *&ptr, std::size_t *avail = nullptr)\n> +{\n> +       return reinterpret_cast<std::conditional_t<std::is_const_v<T>, const U, U> *>(\n> +               up(sizeof(U), alignof(U), ptr, avail)\n> +       );\n> +}\n> +\n> +} /* namespace libcamera::details::align */\n> diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build\n> index 9836daff9..1554b996b 100644\n> --- a/include/libcamera/base/meson.build\n> +++ b/include/libcamera/base/meson.build\n> @@ -33,6 +33,7 @@ libcamera_base_private_headers = files([\n>  \n>  libcamera_base_details_headers = files([\n>      'details/cxx20.h',\n> +    'details/align.h',\n>  ])\n>  \n>  libcamera_base_headers = [\n> -- \n> 2.50.1\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 3C14BBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 19 Sep 2025 10:24:28 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B3FB16B597;\n\tFri, 19 Sep 2025 12:24:26 +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 DD51162C35\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 19 Sep 2025 12:24:23 +0200 (CEST)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:ae7e:60b0:e249:fbe5])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 09B986DF;\n\tFri, 19 Sep 2025 12:23:02 +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=\"XrHK6+X9\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1758277383;\n\tbh=YdXGqfTfa7Y+TCVm8shHLvWfB+GBjUp3AXAvKDLgfeM=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=XrHK6+X9mXISDUmHY4Wc9gV4dDb/6UEWP1A/+I5BKW5yYyHzewal1Tyo2broEBH0r\n\tCNmwNzPAmD4S1QM5f5PZwkl9avuU2dsjW96qtn2zwO9ZIhiOeunWyhFgRrgdl+tKT3\n\thUiEjqbGGY8aTWSr5p0bvNlgy9ZNisBs/G/LAQQ4=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250721104622.1550908-7-barnabas.pocze@ideasonboard.com>","References":"<20250721104622.1550908-1-barnabas.pocze@ideasonboard.com>\n\t<20250721104622.1550908-7-barnabas.pocze@ideasonboard.com>","Subject":"Re: [RFC PATCH v2 06/22] libcamera: base: Add alignment utility\n\tfunctions","From":"Paul Elder <paul.elder@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Fri, 19 Sep 2025 19:24:16 +0900","Message-ID":"<175827745695.2127323.7125455648052427427@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>"}}]