[{"id":30421,"web_url":"https://patchwork.libcamera.org/comment/30421/","msgid":"<a0dfe916-d2a6-4fe9-9afa-394a61d36afa@ideasonboard.com>","date":"2024-07-17T12:40:42","subject":"Re: [RFC 2/9] fixup: Add Features at Converter registration time","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Jacopo\n\nOn 17/07/24 3:39 pm, Jacopo Mondi wrote:\n> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> ---\n>   include/libcamera/internal/converter.h | 23 +++++++++++++----------\n>   src/libcamera/converter.cpp            | 10 ++++++----\n>   2 files changed, 19 insertions(+), 14 deletions(-)\n>\n> diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h\n> index 7e4783566a44..ead465170d01 100644\n> --- a/include/libcamera/internal/converter.h\n> +++ b/include/libcamera/internal/converter.h\n> @@ -39,7 +39,7 @@ public:\n>   \n>   \tusing Features = Flags<Feature>;\n>   \n> -\tConverter(MediaDevice *media, Features features = Feature::None);\n> +\tConverter(MediaDevice *media, Features features);\n>   \tvirtual ~Converter();\n>   \n>   \tvirtual int loadConfiguration(const std::string &filename) = 0;\n> @@ -68,21 +68,22 @@ public:\n>   \n>   \tconst std::string &deviceNode() const { return deviceNode_; }\n>   \n> -\tFeatures getFeatures() const { return features_; }\n> +\tFeatures features() const { return features_; }\n>   \n>   private:\n>   \tstd::string deviceNode_;\n> -\n>   \tFeatures features_;\n>   };\n>   \n>   class ConverterFactoryBase\n>   {\n>   public:\n> -\tConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles);\n> +\tConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles,\n> +\t\t\t     Converter::Features feat);\n\nI might have trouble understanding, but I think each compatible string \nwould have a different set of features it will support no?\n\nIsn't each string in compatibles - would be a standalone converter in \nitself?\n>   \tvirtual ~ConverterFactoryBase() = default;\n>   \n>   \tconst std::vector<std::string> &compatibles() const { return compatibles_; }\n> +\tconst Converter::Features features() const { return features_; }\n>   \n>   \tstatic std::unique_ptr<Converter> create(MediaDevice *media);\n>   \tstatic std::vector<ConverterFactoryBase *> &factories();\n> @@ -93,28 +94,30 @@ private:\n>   \n>   \tstatic void registerType(ConverterFactoryBase *factory);\n>   \n> -\tvirtual std::unique_ptr<Converter> createInstance(MediaDevice *media) const = 0;\n> +\tvirtual std::unique_ptr<Converter> createInstance(MediaDevice *media, Converter::Features feat) const = 0;\n>   \n>   \tstd::string name_;\n>   \tstd::vector<std::string> compatibles_;\n> +\tConverter::Features features_;\n>   };\n>   \n>   template<typename _Converter>\n>   class ConverterFactory : public ConverterFactoryBase\n>   {\n>   public:\n> -\tConverterFactory(const char *name, std::initializer_list<std::string> compatibles)\n> -\t\t: ConverterFactoryBase(name, compatibles)\n> +\tConverterFactory(const char *name, std::initializer_list<std::string> compatibles, Converter::Features feat)\n> +\t\t: ConverterFactoryBase(name, compatibles, feat)\n>   \t{\n>   \t}\n>   \n> -\tstd::unique_ptr<Converter> createInstance(MediaDevice *media) const override\n> +\tstd::unique_ptr<Converter> createInstance(MediaDevice *media, Converter::Features feat) const override\n>   \t{\n> -\t\treturn std::make_unique<_Converter>(media);\n> +\t\treturn std::make_unique<_Converter>(media, feat);\n>   \t}\n>   };\n>   \n>   #define REGISTER_CONVERTER(name, converter, compatibles) \\\n> -\tstatic ConverterFactory<converter> global_##converter##Factory(name, compatibles);\n> +\tstatic ConverterFactory<converter> global_##converter##Factory(name, compatibles, \\\n> +\t\t\t\t\t\t\t\t       Converter::Feature::None);\n>   \n>   } /* namespace libcamera */\n> diff --git a/src/libcamera/converter.cpp b/src/libcamera/converter.cpp\n> index 2c3da6d4502b..dcbc442ccf68 100644\n> --- a/src/libcamera/converter.cpp\n> +++ b/src/libcamera/converter.cpp\n> @@ -178,7 +178,7 @@ Converter::~Converter()\n>    */\n>   \n>   /**\n> - * \\fn Converter::getFeatures()\n> + * \\fn Converter::features()\n>    * \\brief Gets the supported features by the converter\n>    * \\return The converter Features flag\n>    */\n> @@ -209,8 +209,10 @@ Converter::~Converter()\n>    * The factory \\a compatibles holds a list of driver names implementing a generic\n>    * subsystem without any personalizations.\n>    */\n> -ConverterFactoryBase::ConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles)\n> -\t: name_(name), compatibles_(compatibles)\n> +ConverterFactoryBase::ConverterFactoryBase(const std::string name,\n> +\t\t\t\t\t   std::initializer_list<std::string> compatibles,\n> +\t\t\t\t\t   Converter::Features feat)\n> +\t: name_(name), compatibles_(compatibles), features_(feat)\n>   {\n>   \tregisterType(this);\n>   }\n> @@ -247,7 +249,7 @@ std::unique_ptr<Converter> ConverterFactoryBase::create(MediaDevice *media)\n>   \t\t\t<< factory->name_ << \" factory with \"\n>   \t\t\t<< (it == compatibles.end() ? \"no\" : media->driver()) << \" alias.\";\n>   \n> -\t\tstd::unique_ptr<Converter> converter = factory->createInstance(media);\n> +\t\tstd::unique_ptr<Converter> converter = factory->createInstance(media, factory->features());\n>   \t\tif (converter->isValid())\n>   \t\t\treturn converter;\n>   \t}","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 55AD1BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 17 Jul 2024 12:40:51 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E48BF6336F;\n\tWed, 17 Jul 2024 14:40:49 +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 EDF08619AB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 17 Jul 2024 14:40:47 +0200 (CEST)","from [IPV6:2405:201:2015:f873:55d7:c02e:b2eb:ee3f] (unknown\n\t[IPv6:2405:201:2015:f873:55d7:c02e:b2eb:ee3f])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 42E48667;\n\tWed, 17 Jul 2024 14:40:09 +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=\"NV88THVm\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1721220009;\n\tbh=SPrhIi/Kx0l0doeGy0AezNlnsR2b76kgv5NkI1Ko8JQ=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=NV88THVmGyBm7AZgUkjANlGYJcGOS9wWr/C7JxxQfekZkEniO3IYZy8oPWDUBTKhw\n\tkxrjSUT1txjWqhikfLx6Yn0KcyP+DA5hRAFHi6cJyCQ8RTgmFlGT2ssn+gaqbL4hxT\n\tM70RYnw473wWI4cwz9ncrCoro4s7Q3SMMV15pHYU=","Message-ID":"<a0dfe916-d2a6-4fe9-9afa-394a61d36afa@ideasonboard.com>","Date":"Wed, 17 Jul 2024 18:10:42 +0530","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [RFC 2/9] fixup: Add Features at Converter registration time","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20240717100913.16640-1-jacopo.mondi@ideasonboard.com>\n\t<20240717100913.16640-3-jacopo.mondi@ideasonboard.com>","Content-Language":"en-US","From":"Umang Jain <umang.jain@ideasonboard.com>","In-Reply-To":"<20240717100913.16640-3-jacopo.mondi@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","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":30427,"web_url":"https://patchwork.libcamera.org/comment/30427/","msgid":"<f5iormopknrvvmg2plug3hw6egzsyvdkcqrzubpwlwa4kev523@47srxypqbvlk>","date":"2024-07-18T10:43:17","subject":"Re: [RFC 2/9] fixup: Add Features at Converter registration time","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Umang\n\nOn Wed, Jul 17, 2024 at 06:10:42PM GMT, Umang Jain wrote:\n> Hi Jacopo\n>\n> On 17/07/24 3:39 pm, Jacopo Mondi wrote:\n> > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> > ---\n> >   include/libcamera/internal/converter.h | 23 +++++++++++++----------\n> >   src/libcamera/converter.cpp            | 10 ++++++----\n> >   2 files changed, 19 insertions(+), 14 deletions(-)\n> >\n> > diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h\n> > index 7e4783566a44..ead465170d01 100644\n> > --- a/include/libcamera/internal/converter.h\n> > +++ b/include/libcamera/internal/converter.h\n> > @@ -39,7 +39,7 @@ public:\n> >   \tusing Features = Flags<Feature>;\n> > -\tConverter(MediaDevice *media, Features features = Feature::None);\n> > +\tConverter(MediaDevice *media, Features features);\n> >   \tvirtual ~Converter();\n> >   \tvirtual int loadConfiguration(const std::string &filename) = 0;\n> > @@ -68,21 +68,22 @@ public:\n> >   \tconst std::string &deviceNode() const { return deviceNode_; }\n> > -\tFeatures getFeatures() const { return features_; }\n> > +\tFeatures features() const { return features_; }\n> >   private:\n> >   \tstd::string deviceNode_;\n> > -\n> >   \tFeatures features_;\n> >   };\n> >   class ConverterFactoryBase\n> >   {\n> >   public:\n> > -\tConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles);\n> > +\tConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles,\n> > +\t\t\t     Converter::Features feat);\n>\n> I might have trouble understanding, but I think each compatible string would\n> have a different set of features it will support no?\n\nI see, so we need something like a structure that associates to a\ncompatible a set of data, which for now can only include capabilities\n(or features)..\n\n>\n> Isn't each string in compatibles - would be a standalone converter in\n> itself?\n> >   \tvirtual ~ConverterFactoryBase() = default;\n> >   \tconst std::vector<std::string> &compatibles() const { return compatibles_; }\n> > +\tconst Converter::Features features() const { return features_; }\n> >   \tstatic std::unique_ptr<Converter> create(MediaDevice *media);\n> >   \tstatic std::vector<ConverterFactoryBase *> &factories();\n> > @@ -93,28 +94,30 @@ private:\n> >   \tstatic void registerType(ConverterFactoryBase *factory);\n> > -\tvirtual std::unique_ptr<Converter> createInstance(MediaDevice *media) const = 0;\n> > +\tvirtual std::unique_ptr<Converter> createInstance(MediaDevice *media, Converter::Features feat) const = 0;\n> >   \tstd::string name_;\n> >   \tstd::vector<std::string> compatibles_;\n> > +\tConverter::Features features_;\n> >   };\n> >   template<typename _Converter>\n> >   class ConverterFactory : public ConverterFactoryBase\n> >   {\n> >   public:\n> > -\tConverterFactory(const char *name, std::initializer_list<std::string> compatibles)\n> > -\t\t: ConverterFactoryBase(name, compatibles)\n> > +\tConverterFactory(const char *name, std::initializer_list<std::string> compatibles, Converter::Features feat)\n> > +\t\t: ConverterFactoryBase(name, compatibles, feat)\n> >   \t{\n> >   \t}\n> > -\tstd::unique_ptr<Converter> createInstance(MediaDevice *media) const override\n> > +\tstd::unique_ptr<Converter> createInstance(MediaDevice *media, Converter::Features feat) const override\n> >   \t{\n> > -\t\treturn std::make_unique<_Converter>(media);\n> > +\t\treturn std::make_unique<_Converter>(media, feat);\n> >   \t}\n> >   };\n> >   #define REGISTER_CONVERTER(name, converter, compatibles) \\\n> > -\tstatic ConverterFactory<converter> global_##converter##Factory(name, compatibles);\n> > +\tstatic ConverterFactory<converter> global_##converter##Factory(name, compatibles, \\\n> > +\t\t\t\t\t\t\t\t       Converter::Feature::None);\n> >   } /* namespace libcamera */\n> > diff --git a/src/libcamera/converter.cpp b/src/libcamera/converter.cpp\n> > index 2c3da6d4502b..dcbc442ccf68 100644\n> > --- a/src/libcamera/converter.cpp\n> > +++ b/src/libcamera/converter.cpp\n> > @@ -178,7 +178,7 @@ Converter::~Converter()\n> >    */\n> >   /**\n> > - * \\fn Converter::getFeatures()\n> > + * \\fn Converter::features()\n> >    * \\brief Gets the supported features by the converter\n> >    * \\return The converter Features flag\n> >    */\n> > @@ -209,8 +209,10 @@ Converter::~Converter()\n> >    * The factory \\a compatibles holds a list of driver names implementing a generic\n> >    * subsystem without any personalizations.\n> >    */\n> > -ConverterFactoryBase::ConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles)\n> > -\t: name_(name), compatibles_(compatibles)\n> > +ConverterFactoryBase::ConverterFactoryBase(const std::string name,\n> > +\t\t\t\t\t   std::initializer_list<std::string> compatibles,\n> > +\t\t\t\t\t   Converter::Features feat)\n> > +\t: name_(name), compatibles_(compatibles), features_(feat)\n> >   {\n> >   \tregisterType(this);\n> >   }\n> > @@ -247,7 +249,7 @@ std::unique_ptr<Converter> ConverterFactoryBase::create(MediaDevice *media)\n> >   \t\t\t<< factory->name_ << \" factory with \"\n> >   \t\t\t<< (it == compatibles.end() ? \"no\" : media->driver()) << \" alias.\";\n> > -\t\tstd::unique_ptr<Converter> converter = factory->createInstance(media);\n> > +\t\tstd::unique_ptr<Converter> converter = factory->createInstance(media, factory->features());\n> >   \t\tif (converter->isValid())\n> >   \t\t\treturn converter;\n> >   \t}\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 5F1FCBDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 18 Jul 2024 10:43:23 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0C8CC6336F;\n\tThu, 18 Jul 2024 12:43:22 +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 2820F619A9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 18 Jul 2024 12:43:21 +0200 (CEST)","from ideasonboard.com (unknown [91.80.77.148])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 44441AD8;\n\tThu, 18 Jul 2024 12:42:42 +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=\"j+8yIXDT\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1721299362;\n\tbh=C69WWQAon7JogJ9y8eLC8csTx37ITz+D0Mo169y9G28=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=j+8yIXDTPzlGdWEzQWtFI0+av9xMJpg3VCRz/hfnYhHSgeEUsRFTBE94QA7FJQDBv\n\tNYfa657DpFMDMJwuG5WbDBjsx4IsGOuEFMVAUJ4B+i3PhxyN61PHGFK1cTweCp58RZ\n\tflU/G2w4tMVMSB76IxKqbPum+cvBMUFE6fLpIl7c=","Date":"Thu, 18 Jul 2024 12:43:17 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Umang Jain <umang.jain@ideasonboard.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>, \n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [RFC 2/9] fixup: Add Features at Converter registration time","Message-ID":"<f5iormopknrvvmg2plug3hw6egzsyvdkcqrzubpwlwa4kev523@47srxypqbvlk>","References":"<20240717100913.16640-1-jacopo.mondi@ideasonboard.com>\n\t<20240717100913.16640-3-jacopo.mondi@ideasonboard.com>\n\t<a0dfe916-d2a6-4fe9-9afa-394a61d36afa@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<a0dfe916-d2a6-4fe9-9afa-394a61d36afa@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":30552,"web_url":"https://patchwork.libcamera.org/comment/30552/","msgid":"<20240802215712.GA3319@pendragon.ideasonboard.com>","date":"2024-08-02T21:57:12","subject":"Re: [RFC 2/9] fixup: Add Features at Converter registration time","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Thu, Jul 18, 2024 at 12:43:17PM +0200, Jacopo Mondi wrote:\n> Hi Umang\n> \n> On Wed, Jul 17, 2024 at 06:10:42PM GMT, Umang Jain wrote:\n> > Hi Jacopo\n> >\n> > On 17/07/24 3:39 pm, Jacopo Mondi wrote:\n> > > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> > > ---\n> > >   include/libcamera/internal/converter.h | 23 +++++++++++++----------\n> > >   src/libcamera/converter.cpp            | 10 ++++++----\n> > >   2 files changed, 19 insertions(+), 14 deletions(-)\n> > >\n> > > diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h\n> > > index 7e4783566a44..ead465170d01 100644\n> > > --- a/include/libcamera/internal/converter.h\n> > > +++ b/include/libcamera/internal/converter.h\n> > > @@ -39,7 +39,7 @@ public:\n> > >   \tusing Features = Flags<Feature>;\n> > > -\tConverter(MediaDevice *media, Features features = Feature::None);\n> > > +\tConverter(MediaDevice *media, Features features);\n> > >   \tvirtual ~Converter();\n> > >   \tvirtual int loadConfiguration(const std::string &filename) = 0;\n> > > @@ -68,21 +68,22 @@ public:\n> > >   \tconst std::string &deviceNode() const { return deviceNode_; }\n> > > -\tFeatures getFeatures() const { return features_; }\n> > > +\tFeatures features() const { return features_; }\n> > >   private:\n> > >   \tstd::string deviceNode_;\n> > > -\n> > >   \tFeatures features_;\n> > >   };\n> > >   class ConverterFactoryBase\n> > >   {\n> > >   public:\n> > > -\tConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles);\n> > > +\tConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles,\n> > > +\t\t\t     Converter::Features feat);\n> >\n> > I might have trouble understanding, but I think each compatible string would\n> > have a different set of features it will support no?\n> \n> I see, so we need something like a structure that associates to a\n> compatible a set of data, which for now can only include capabilities\n> (or features)..\n\nAs I mentioned in the review of Umang's series, it would be nicer if we\ncould detect those features dynamically.\n\n> > Isn't each string in compatibles - would be a standalone converter in\n> > itself?\n> > >   \tvirtual ~ConverterFactoryBase() = default;\n> > >   \tconst std::vector<std::string> &compatibles() const { return compatibles_; }\n> > > +\tconst Converter::Features features() const { return features_; }\n> > >   \tstatic std::unique_ptr<Converter> create(MediaDevice *media);\n> > >   \tstatic std::vector<ConverterFactoryBase *> &factories();\n> > > @@ -93,28 +94,30 @@ private:\n> > >   \tstatic void registerType(ConverterFactoryBase *factory);\n> > > -\tvirtual std::unique_ptr<Converter> createInstance(MediaDevice *media) const = 0;\n> > > +\tvirtual std::unique_ptr<Converter> createInstance(MediaDevice *media, Converter::Features feat) const = 0;\n> > >   \tstd::string name_;\n> > >   \tstd::vector<std::string> compatibles_;\n> > > +\tConverter::Features features_;\n> > >   };\n> > >   template<typename _Converter>\n> > >   class ConverterFactory : public ConverterFactoryBase\n> > >   {\n> > >   public:\n> > > -\tConverterFactory(const char *name, std::initializer_list<std::string> compatibles)\n> > > -\t\t: ConverterFactoryBase(name, compatibles)\n> > > +\tConverterFactory(const char *name, std::initializer_list<std::string> compatibles, Converter::Features feat)\n> > > +\t\t: ConverterFactoryBase(name, compatibles, feat)\n> > >   \t{\n> > >   \t}\n> > > -\tstd::unique_ptr<Converter> createInstance(MediaDevice *media) const override\n> > > +\tstd::unique_ptr<Converter> createInstance(MediaDevice *media, Converter::Features feat) const override\n> > >   \t{\n> > > -\t\treturn std::make_unique<_Converter>(media);\n> > > +\t\treturn std::make_unique<_Converter>(media, feat);\n> > >   \t}\n> > >   };\n> > >   #define REGISTER_CONVERTER(name, converter, compatibles) \\\n> > > -\tstatic ConverterFactory<converter> global_##converter##Factory(name, compatibles);\n> > > +\tstatic ConverterFactory<converter> global_##converter##Factory(name, compatibles, \\\n> > > +\t\t\t\t\t\t\t\t       Converter::Feature::None);\n> > >   } /* namespace libcamera */\n> > > diff --git a/src/libcamera/converter.cpp b/src/libcamera/converter.cpp\n> > > index 2c3da6d4502b..dcbc442ccf68 100644\n> > > --- a/src/libcamera/converter.cpp\n> > > +++ b/src/libcamera/converter.cpp\n> > > @@ -178,7 +178,7 @@ Converter::~Converter()\n> > >    */\n> > >   /**\n> > > - * \\fn Converter::getFeatures()\n> > > + * \\fn Converter::features()\n> > >    * \\brief Gets the supported features by the converter\n> > >    * \\return The converter Features flag\n> > >    */\n> > > @@ -209,8 +209,10 @@ Converter::~Converter()\n> > >    * The factory \\a compatibles holds a list of driver names implementing a generic\n> > >    * subsystem without any personalizations.\n> > >    */\n> > > -ConverterFactoryBase::ConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles)\n> > > -\t: name_(name), compatibles_(compatibles)\n> > > +ConverterFactoryBase::ConverterFactoryBase(const std::string name,\n> > > +\t\t\t\t\t   std::initializer_list<std::string> compatibles,\n> > > +\t\t\t\t\t   Converter::Features feat)\n> > > +\t: name_(name), compatibles_(compatibles), features_(feat)\n> > >   {\n> > >   \tregisterType(this);\n> > >   }\n> > > @@ -247,7 +249,7 @@ std::unique_ptr<Converter> ConverterFactoryBase::create(MediaDevice *media)\n> > >   \t\t\t<< factory->name_ << \" factory with \"\n> > >   \t\t\t<< (it == compatibles.end() ? \"no\" : media->driver()) << \" alias.\";\n> > > -\t\tstd::unique_ptr<Converter> converter = factory->createInstance(media);\n> > > +\t\tstd::unique_ptr<Converter> converter = factory->createInstance(media, factory->features());\n> > >   \t\tif (converter->isValid())\n> > >   \t\t\treturn converter;\n> > >   \t}\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 BAFD0C323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  2 Aug 2024 21:57:35 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B760563370;\n\tFri,  2 Aug 2024 23:57:34 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 91A8E6336B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  2 Aug 2024 23:57:33 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id BD0312E3;\n\tFri,  2 Aug 2024 23:56:43 +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=\"ACTqLf/v\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1722635803;\n\tbh=t2H23JMYEFSbe+81MHEasgV/YCPDMy+0ZGEjC93HYT4=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=ACTqLf/vN8dfI6XN5OacjC4hDLakE6g5qrtLoBAH9i5bBi4dy+RnEWQDe6WAswClT\n\ttFjCGwrSe4dOq1Kieokpi/3IvCHUgWibWK0ZfdNZAqg1MjJ4zkJTEWL4XQdA5fkTn3\n\tzk36PnAkjVbOfk5uMCISVTHxTpwD4j0js0+bEuEk=","Date":"Sat, 3 Aug 2024 00:57:12 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"Umang Jain <umang.jain@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [RFC 2/9] fixup: Add Features at Converter registration time","Message-ID":"<20240802215712.GA3319@pendragon.ideasonboard.com>","References":"<20240717100913.16640-1-jacopo.mondi@ideasonboard.com>\n\t<20240717100913.16640-3-jacopo.mondi@ideasonboard.com>\n\t<a0dfe916-d2a6-4fe9-9afa-394a61d36afa@ideasonboard.com>\n\t<f5iormopknrvvmg2plug3hw6egzsyvdkcqrzubpwlwa4kev523@47srxypqbvlk>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<f5iormopknrvvmg2plug3hw6egzsyvdkcqrzubpwlwa4kev523@47srxypqbvlk>","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>"}}]