[{"id":36705,"web_url":"https://patchwork.libcamera.org/comment/36705/","msgid":"<176236115381.2116251.13724423961865849285@neptunite.rasen.tech>","date":"2025-11-05T16:45:53","subject":"Re: [PATCH v2 04/35] libcamera: converter: Utilise shared\n\tMediaDevice pointers","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Stefan Klug (2025-10-23 23:48:05)\n> With the upcoming addition of V4L2 requests support, the converters need\n> to keep a handle to the corresponding media device.\n> \n> Prepare for that by changing the constructor parameter from a raw\n> pointer to a shared pointer.\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  include/libcamera/internal/converter.h                   | 9 +++++----\n>  .../libcamera/internal/converter/converter_v4l2_m2m.h    | 2 +-\n>  src/libcamera/converter.cpp                              | 5 +++--\n>  src/libcamera/converter/converter_v4l2_m2m.cpp           | 4 ++--\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp                 | 2 +-\n>  src/libcamera/pipeline/simple/simple.cpp                 | 4 ++--\n>  6 files changed, 14 insertions(+), 12 deletions(-)\n> \n> diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h\n> index 644ec429bb25..4915af7ac5de 100644\n> --- a/include/libcamera/internal/converter.h\n> +++ b/include/libcamera/internal/converter.h\n> @@ -46,7 +46,7 @@ public:\n>                 Up,\n>         };\n>  \n> -       Converter(MediaDevice *media, Features features = Feature::None);\n> +       Converter(std::shared_ptr<MediaDevice> media, Features features = Feature::None);\n>         virtual ~Converter();\n>  \n>         virtual int loadConfiguration(const std::string &filename) = 0;\n> @@ -107,7 +107,7 @@ public:\n>  \n>         const std::vector<std::string> &compatibles() const { return compatibles_; }\n>  \n> -       static std::unique_ptr<Converter> create(MediaDevice *media);\n> +       static std::unique_ptr<Converter> create(std::shared_ptr<MediaDevice> media);\n>         static std::vector<ConverterFactoryBase *> &factories();\n>         static std::vector<std::string> names();\n>  \n> @@ -116,7 +116,8 @@ private:\n>  \n>         static void registerType(ConverterFactoryBase *factory);\n>  \n> -       virtual std::unique_ptr<Converter> createInstance(MediaDevice *media) const = 0;\n> +       virtual std::unique_ptr<Converter>\n> +       createInstance(std::shared_ptr<MediaDevice> media) const = 0;\n>  \n>         std::string name_;\n>         std::vector<std::string> compatibles_;\n> @@ -131,7 +132,7 @@ public:\n>         {\n>         }\n>  \n> -       std::unique_ptr<Converter> createInstance(MediaDevice *media) const override\n> +       std::unique_ptr<Converter> createInstance(std::shared_ptr<MediaDevice> media) const override\n>         {\n>                 return std::make_unique<_Converter>(media);\n>         }\n> diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> index 0ad7bf7fdbe2..d316754040dd 100644\n> --- a/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> +++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> @@ -36,7 +36,7 @@ class V4L2M2MDevice;\n>  class V4L2M2MConverter : public Converter\n>  {\n>  public:\n> -       V4L2M2MConverter(MediaDevice *media);\n> +       V4L2M2MConverter(std::shared_ptr<MediaDevice> media);\n>  \n>         int loadConfiguration([[maybe_unused]] const std::string &filename) override { return 0; }\n>         bool isValid() const override { return m2m_ != nullptr; }\n> diff --git a/src/libcamera/converter.cpp b/src/libcamera/converter.cpp\n> index d551b908d523..142fb29a1272 100644\n> --- a/src/libcamera/converter.cpp\n> +++ b/src/libcamera/converter.cpp\n> @@ -8,6 +8,7 @@\n>  #include \"libcamera/internal/converter.h\"\n>  \n>  #include <algorithm>\n> +#include <memory>\n>  \n>  #include <libcamera/base/log.h>\n>  \n> @@ -68,7 +69,7 @@ LOG_DEFINE_CATEGORY(Converter)\n>   * This searches for the entity implementing the data streaming function in the\n>   * media graph entities and use its device node as the converter device node.\n>   */\n> -Converter::Converter(MediaDevice *media, Features features)\n> +Converter::Converter(std::shared_ptr<MediaDevice> media, Features features)\n>  {\n>         const std::vector<MediaEntity *> &entities = media->entities();\n>         auto it = std::find_if(entities.begin(), entities.end(),\n> @@ -332,7 +333,7 @@ ConverterFactoryBase::ConverterFactoryBase(const std::string name, std::initiali\n>   * \\return A new instance of the converter subclass corresponding to the media\n>   * device, or null if the media device driver name doesn't match anything\n>   */\n> -std::unique_ptr<Converter> ConverterFactoryBase::create(MediaDevice *media)\n> +std::unique_ptr<Converter> ConverterFactoryBase::create(std::shared_ptr<MediaDevice> media)\n>  {\n>         const std::vector<ConverterFactoryBase *> &factories =\n>                 ConverterFactoryBase::factories();\n> diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> index 0ce7a7a67f11..b2bd54f368d8 100644\n> --- a/src/libcamera/converter/converter_v4l2_m2m.cpp\n> +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> @@ -10,6 +10,7 @@\n>  \n>  #include <algorithm>\n>  #include <limits.h>\n> +#include <memory>\n>  #include <set>\n>  \n>  #include <libcamera/base/log.h>\n> @@ -261,8 +262,7 @@ void V4L2M2MConverter::V4L2M2MStream::captureBufferReady(FrameBuffer *buffer)\n>   * \\brief Construct a V4L2M2MConverter instance\n>   * \\param[in] media The media device implementing the converter\n>   */\n> -\n> -V4L2M2MConverter::V4L2M2MConverter(MediaDevice *media)\n> +V4L2M2MConverter::V4L2M2MConverter(std::shared_ptr<MediaDevice> media)\n>         : Converter(media)\n>  {\n>         if (deviceNode().empty())\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 959cdb41fe7e..0e2a210e1e80 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -1445,7 +1445,7 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)\n>  \n>         std::shared_ptr<MediaDevice> dwpMediaDevice = enumerator->search(dwp);\n>         if (dwpMediaDevice) {\n> -               dewarper_ = std::make_unique<V4L2M2MConverter>(dwpMediaDevice.get());\n> +               dewarper_ = std::make_unique<V4L2M2MConverter>(dwpMediaDevice);\n>                 if (dewarper_->isValid()) {\n>                         dewarper_->outputBufferReady.connect(\n>                                 this, &PipelineHandlerRkISP1::dewarpBufferReady);\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 1183be9a6b07..204b29f92907 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -413,7 +413,7 @@ public:\n>  \n>         V4L2VideoDevice *video(const MediaEntity *entity);\n>         V4L2Subdevice *subdev(const MediaEntity *entity);\n> -       MediaDevice *converter() { return converter_.get(); }\n> +       std::shared_ptr<MediaDevice> converter() { return converter_; }\n>         bool swIspEnabled() const { return swIspEnabled_; }\n>  \n>  protected:\n> @@ -586,7 +586,7 @@ int SimpleCameraData::init()\n>         int ret;\n>  \n>         /* Open the converter, if any. */\n> -       MediaDevice *converter = pipe->converter();\n> +       std::shared_ptr<MediaDevice> converter = pipe->converter();\n>         if (converter) {\n>                 converter_ = ConverterFactoryBase::create(converter);\n>                 if (!converter_) {\n> -- \n> 2.48.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 95A1DBDE4C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  5 Nov 2025 16:46:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7A77560A8B;\n\tWed,  5 Nov 2025 17:46:02 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2621B60805\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  5 Nov 2025 17:46:01 +0100 (CET)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:d4d0:27ea:7a74:8a9e])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 33FE5E45;\n\tWed,  5 Nov 2025 17:44:05 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Zc2OAbXN\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1762361046;\n\tbh=N1lZC16uJUGEB/ijRNBr+7rsE/LCoZ7DW5A0EV1eug0=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=Zc2OAbXNWrCBGwXYQT68EgQw20ZTKZgcCe+c5tEUupxBDty5q4id7V6HIYQtwVgnr\n\tOII1LNMPWwTNglnZBoHl/u8B68M+3wDOW+FcaOfP/HntO8pI8soDSxZbnZt6ciNnv0\n\tE6RRnTXSBjJBCqvesVm2W95P2J/uNpeM/45+xxe0=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20251023144841.403689-5-stefan.klug@ideasonboard.com>","References":"<20251023144841.403689-1-stefan.klug@ideasonboard.com>\n\t<20251023144841.403689-5-stefan.klug@ideasonboard.com>","Subject":"Re: [PATCH v2 04/35] libcamera: converter: Utilise shared\n\tMediaDevice pointers","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Thu, 06 Nov 2025 01:45:53 +0900","Message-ID":"<176236115381.2116251.13724423961865849285@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>"}},{"id":36733,"web_url":"https://patchwork.libcamera.org/comment/36733/","msgid":"<176243689678.288410.6893386512599700848@isaac-ThinkPad-T16-Gen-2>","date":"2025-11-06T13:48:16","subject":"Re: [PATCH v2 04/35] libcamera: converter: Utilise shared\n\tMediaDevice pointers","submitter":{"id":215,"url":"https://patchwork.libcamera.org/api/people/215/","name":"Isaac Scott","email":"isaac.scott@ideasonboard.com"},"content":"Hi Stefan,\n\nThank you for the patch!\n\nQuoting Stefan Klug (2025-10-23 15:48:05)\n> With the upcoming addition of V4L2 requests support, the converters need\n> to keep a handle to the corresponding media device.\n> \n> Prepare for that by changing the constructor parameter from a raw\n> pointer to a shared pointer.\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n\nReviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>\n\n> ---\n>  include/libcamera/internal/converter.h                   | 9 +++++----\n>  .../libcamera/internal/converter/converter_v4l2_m2m.h    | 2 +-\n>  src/libcamera/converter.cpp                              | 5 +++--\n>  src/libcamera/converter/converter_v4l2_m2m.cpp           | 4 ++--\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp                 | 2 +-\n>  src/libcamera/pipeline/simple/simple.cpp                 | 4 ++--\n>  6 files changed, 14 insertions(+), 12 deletions(-)\n> \n> diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h\n> index 644ec429bb25..4915af7ac5de 100644\n> --- a/include/libcamera/internal/converter.h\n> +++ b/include/libcamera/internal/converter.h\n> @@ -46,7 +46,7 @@ public:\n>                 Up,\n>         };\n>  \n> -       Converter(MediaDevice *media, Features features = Feature::None);\n> +       Converter(std::shared_ptr<MediaDevice> media, Features features = Feature::None);\n>         virtual ~Converter();\n>  \n>         virtual int loadConfiguration(const std::string &filename) = 0;\n> @@ -107,7 +107,7 @@ public:\n>  \n>         const std::vector<std::string> &compatibles() const { return compatibles_; }\n>  \n> -       static std::unique_ptr<Converter> create(MediaDevice *media);\n> +       static std::unique_ptr<Converter> create(std::shared_ptr<MediaDevice> media);\n>         static std::vector<ConverterFactoryBase *> &factories();\n>         static std::vector<std::string> names();\n>  \n> @@ -116,7 +116,8 @@ private:\n>  \n>         static void registerType(ConverterFactoryBase *factory);\n>  \n> -       virtual std::unique_ptr<Converter> createInstance(MediaDevice *media) const = 0;\n> +       virtual std::unique_ptr<Converter>\n> +       createInstance(std::shared_ptr<MediaDevice> media) const = 0;\n>  \n>         std::string name_;\n>         std::vector<std::string> compatibles_;\n> @@ -131,7 +132,7 @@ public:\n>         {\n>         }\n>  \n> -       std::unique_ptr<Converter> createInstance(MediaDevice *media) const override\n> +       std::unique_ptr<Converter> createInstance(std::shared_ptr<MediaDevice> media) const override\n>         {\n>                 return std::make_unique<_Converter>(media);\n>         }\n> diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> index 0ad7bf7fdbe2..d316754040dd 100644\n> --- a/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> +++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> @@ -36,7 +36,7 @@ class V4L2M2MDevice;\n>  class V4L2M2MConverter : public Converter\n>  {\n>  public:\n> -       V4L2M2MConverter(MediaDevice *media);\n> +       V4L2M2MConverter(std::shared_ptr<MediaDevice> media);\n>  \n>         int loadConfiguration([[maybe_unused]] const std::string &filename) override { return 0; }\n>         bool isValid() const override { return m2m_ != nullptr; }\n> diff --git a/src/libcamera/converter.cpp b/src/libcamera/converter.cpp\n> index d551b908d523..142fb29a1272 100644\n> --- a/src/libcamera/converter.cpp\n> +++ b/src/libcamera/converter.cpp\n> @@ -8,6 +8,7 @@\n>  #include \"libcamera/internal/converter.h\"\n>  \n>  #include <algorithm>\n> +#include <memory>\n>  \n>  #include <libcamera/base/log.h>\n>  \n> @@ -68,7 +69,7 @@ LOG_DEFINE_CATEGORY(Converter)\n>   * This searches for the entity implementing the data streaming function in the\n>   * media graph entities and use its device node as the converter device node.\n>   */\n> -Converter::Converter(MediaDevice *media, Features features)\n> +Converter::Converter(std::shared_ptr<MediaDevice> media, Features features)\n>  {\n>         const std::vector<MediaEntity *> &entities = media->entities();\n>         auto it = std::find_if(entities.begin(), entities.end(),\n> @@ -332,7 +333,7 @@ ConverterFactoryBase::ConverterFactoryBase(const std::string name, std::initiali\n>   * \\return A new instance of the converter subclass corresponding to the media\n>   * device, or null if the media device driver name doesn't match anything\n>   */\n> -std::unique_ptr<Converter> ConverterFactoryBase::create(MediaDevice *media)\n> +std::unique_ptr<Converter> ConverterFactoryBase::create(std::shared_ptr<MediaDevice> media)\n>  {\n>         const std::vector<ConverterFactoryBase *> &factories =\n>                 ConverterFactoryBase::factories();\n> diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> index 0ce7a7a67f11..b2bd54f368d8 100644\n> --- a/src/libcamera/converter/converter_v4l2_m2m.cpp\n> +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> @@ -10,6 +10,7 @@\n>  \n>  #include <algorithm>\n>  #include <limits.h>\n> +#include <memory>\n>  #include <set>\n>  \n>  #include <libcamera/base/log.h>\n> @@ -261,8 +262,7 @@ void V4L2M2MConverter::V4L2M2MStream::captureBufferReady(FrameBuffer *buffer)\n>   * \\brief Construct a V4L2M2MConverter instance\n>   * \\param[in] media The media device implementing the converter\n>   */\n> -\n> -V4L2M2MConverter::V4L2M2MConverter(MediaDevice *media)\n> +V4L2M2MConverter::V4L2M2MConverter(std::shared_ptr<MediaDevice> media)\n>         : Converter(media)\n>  {\n>         if (deviceNode().empty())\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 959cdb41fe7e..0e2a210e1e80 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -1445,7 +1445,7 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)\n>  \n>         std::shared_ptr<MediaDevice> dwpMediaDevice = enumerator->search(dwp);\n>         if (dwpMediaDevice) {\n> -               dewarper_ = std::make_unique<V4L2M2MConverter>(dwpMediaDevice.get());\n> +               dewarper_ = std::make_unique<V4L2M2MConverter>(dwpMediaDevice);\n>                 if (dewarper_->isValid()) {\n>                         dewarper_->outputBufferReady.connect(\n>                                 this, &PipelineHandlerRkISP1::dewarpBufferReady);\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 1183be9a6b07..204b29f92907 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -413,7 +413,7 @@ public:\n>  \n>         V4L2VideoDevice *video(const MediaEntity *entity);\n>         V4L2Subdevice *subdev(const MediaEntity *entity);\n> -       MediaDevice *converter() { return converter_.get(); }\n> +       std::shared_ptr<MediaDevice> converter() { return converter_; }\n>         bool swIspEnabled() const { return swIspEnabled_; }\n>  \n>  protected:\n> @@ -586,7 +586,7 @@ int SimpleCameraData::init()\n>         int ret;\n>  \n>         /* Open the converter, if any. */\n> -       MediaDevice *converter = pipe->converter();\n> +       std::shared_ptr<MediaDevice> converter = pipe->converter();\n>         if (converter) {\n>                 converter_ = ConverterFactoryBase::create(converter);\n>                 if (!converter_) {\n> -- \n> 2.48.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 444D7C3241\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  6 Nov 2025 13:48:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 77965609D8;\n\tThu,  6 Nov 2025 14:48:21 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D7A38606E6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  6 Nov 2025 14:48:19 +0100 (CET)","from thinkpad.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C7CFBBB;\n\tThu,  6 Nov 2025 14:46:24 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Y5GEFFtx\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1762436784;\n\tbh=8fD/vYegeRORIHw2hDyT9pMJWmkO6/QBLah7xu9VDh4=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=Y5GEFFtx2sghc40mtIXEmTmsXBdZqi8Ikn+CGPghZk5zUzooXi5TteJ+m6unn87zn\n\tBortcOwsaalFjckhgnIb2z4+MTR9/vEJPdQlVtZKGIOmtkl7Q4cs7AVjrE3i7B9706\n\tHEzb+piu9clfdcHaIad1ElheFi7g3WwWlqmvNrgE=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20251023144841.403689-5-stefan.klug@ideasonboard.com>","References":"<20251023144841.403689-1-stefan.klug@ideasonboard.com>\n\t<20251023144841.403689-5-stefan.klug@ideasonboard.com>","Subject":"Re: [PATCH v2 04/35] libcamera: converter: Utilise shared\n\tMediaDevice pointers","From":"Isaac Scott <isaac.scott@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Thu, 06 Nov 2025 13:48:16 +0000","Message-ID":"<176243689678.288410.6893386512599700848@isaac-ThinkPad-T16-Gen-2>","User-Agent":"alot/0.10","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>"}}]