[libcamera-devel] [PATCH 4/8] ipa: camera_sensor_helper: Implement factories through class templates
Xavier Roumegue (OSS)
xavier.roumegue at oss.nxp.com
Wed Oct 5 13:07:36 CEST 2022
Hi Laurent,
Thanks for the patch.
On 10/3/22 23:21, Laurent Pinchart via libcamera-devel wrote:
> The REGISTER_CAMERA_SENSOR_HELPER() macro defines a class type that
> inherits from the CameraSensorHelperFactory class, and implements a
> constructor and createInstance() function. Replace the code generation
> through macro with the C++ equivalent, a class template, as done by the
> Algorithm factory.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/ipa/ipu3/ipu3.cpp | 2 +-
> src/ipa/libipa/camera_sensor_helper.cpp | 79 +++++++++++++++----------
> src/ipa/libipa/camera_sensor_helper.h | 43 ++++++++------
> src/ipa/rkisp1/rkisp1.cpp | 2 +-
> 4 files changed, 75 insertions(+), 51 deletions(-)
>
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index b93a09d40c39..852deb710956 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -326,7 +326,7 @@ int IPAIPU3::init(const IPASettings &settings,
> const ControlInfoMap &sensorControls,
> ControlInfoMap *ipaControls)
> {
> - camHelper_ = CameraSensorHelperFactory::create(settings.sensorModel);
> + camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);
> if (camHelper_ == nullptr) {
> LOG(IPAIPU3, Error)
> << "Failed to create camera sensor helper for "
> diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp
> index 3a7d701d8616..e655be255f2b 100644
> --- a/src/ipa/libipa/camera_sensor_helper.cpp
> +++ b/src/ipa/libipa/camera_sensor_helper.cpp
> @@ -43,7 +43,8 @@ namespace ipa {
> * \brief Construct a CameraSensorHelper instance
> *
> * CameraSensorHelper derived class instances shall never be constructed
> - * manually but always through the CameraSensorHelperFactory::create() function.
> + * manually but always through the CameraSensorHelperFactoryBase::create()
> + * function.
> */
>
> /**
> @@ -217,27 +218,25 @@ double CameraSensorHelper::gain(uint32_t gainCode) const
> */
>
> /**
> - * \class CameraSensorHelperFactory
> - * \brief Registration of CameraSensorHelperFactory classes and creation of instances
> + * \class CameraSensorHelperFactoryBase
> + * \brief Base class for camera sensor helper factories
> *
> - * To facilitate discovery and instantiation of CameraSensorHelper classes, the
> - * CameraSensorHelperFactory class maintains a registry of camera sensor helper
> - * sub-classes. Each CameraSensorHelper subclass shall register itself using the
> - * REGISTER_CAMERA_SENSOR_HELPER() macro, which will create a corresponding
> - * instance of a CameraSensorHelperFactory subclass and register it with the
> - * static list of factories.
> + * The CameraSensorHelperFactoryBase class is the base of all specializations of
> + * the CameraSensorHelperFactory class template. It implements the factory
> + * registration, maintains a registry of factories, and provides access to the
> + * registered factories.
> */
>
> /**
> - * \brief Construct a camera sensor helper factory
> + * \brief Construct a camera sensor helper factory base
> * \param[in] name Name of the camera sensor helper class
> *
> - * Creating an instance of the factory registers it with the global list of
> + * Creating an instance of the factory base registers it with the global list of
> * factories, accessible through the factories() function.
> *
> * The factory \a name is used for debug purpose and shall be unique.
> */
> -CameraSensorHelperFactory::CameraSensorHelperFactory(const std::string name)
> +CameraSensorHelperFactoryBase::CameraSensorHelperFactoryBase(const std::string name)
> : name_(name)
> {
> registerType(this);
> @@ -252,12 +251,12 @@ CameraSensorHelperFactory::CameraSensorHelperFactory(const std::string name)
> * corresponding to the named factory or a null pointer if no such factory
> * exists
> */
> -std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactory::create(const std::string &name)
> +std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactoryBase::create(const std::string &name)
> {
> - const std::vector<CameraSensorHelperFactory *> &factories =
> - CameraSensorHelperFactory::factories();
> + const std::vector<CameraSensorHelperFactoryBase *> &factories =
> + CameraSensorHelperFactoryBase::factories();
>
> - for (const CameraSensorHelperFactory *factory : factories) {
> + for (const CameraSensorHelperFactoryBase *factory : factories) {
> if (name != factory->name_)
> continue;
>
> @@ -274,10 +273,10 @@ std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactory::create(const std:
> * The caller is responsible to guarantee the uniqueness of the camera sensor
> * helper name.
> */
> -void CameraSensorHelperFactory::registerType(CameraSensorHelperFactory *factory)
> +void CameraSensorHelperFactoryBase::registerType(CameraSensorHelperFactoryBase *factory)
> {
> - std::vector<CameraSensorHelperFactory *> &factories =
> - CameraSensorHelperFactory::factories();
> + std::vector<CameraSensorHelperFactoryBase *> &factories =
> + CameraSensorHelperFactoryBase::factories();
>
> factories.push_back(factory);
> }
> @@ -286,35 +285,55 @@ void CameraSensorHelperFactory::registerType(CameraSensorHelperFactory *factory)
> * \brief Retrieve the list of all camera sensor helper factories
> * \return The list of camera sensor helper factories
> */
> -std::vector<CameraSensorHelperFactory *> &CameraSensorHelperFactory::factories()
> +std::vector<CameraSensorHelperFactoryBase *> &CameraSensorHelperFactoryBase::factories()
> {
> /*
> * The static factories map is defined inside the function to ensure
> * it gets initialized on first use, without any dependency on link
> * order.
> */
> - static std::vector<CameraSensorHelperFactory *> factories;
> + static std::vector<CameraSensorHelperFactoryBase *> factories;
> return factories;
> }
>
> +/**
> + * \var CameraSensorHelperFactoryBase::name_
> + * \brief The name of the factory
> + */
> +
> +/**
> + * \class CameraSensorHelperFactory
> + * \brief Registration of CameraSensorHelperFactory classes and creation of instances
> + * \tparam _Helper The camera sensor helepr class type for this factory
s/helepr/helper/
> + *
> + * To facilitate discovery and instantiation of CameraSensorHelper classes, the
> + * CameraSensorHelperFactory class implements auto-registration of camera sensor
> + * helpers. Each CameraSensorHelper subclass shall register itself using the
> + * REGISTER_CAMERA_SENSOR_HELPER() macro, which will create a corresponding
> + * instance of a CameraSensorHelperFactory subclass and register it with the
> + * static list of factories.
> + */
> +
> +/**
> + * \fn CameraSensorHelperFactory::CameraSensorHelperFactory(const char *name)
> + * \brief Construct a camera sensor helper factory
> + * \param[in] name Name of the camera sensor helper class
> + *
> + * Creating an instance of the factory registers it with the global list of
> + * factories, accessible through the factories() function.
> + *
> + * The factory \a name is used for debug purpose and shall be unique.
> + */
> +
> /**
> * \fn CameraSensorHelperFactory::createInstance() const
> * \brief Create an instance of the CameraSensorHelper corresponding to the
> * factory
> *
> - * This virtual function is implemented by the REGISTER_CAMERA_SENSOR_HELPER()
> - * macro. It creates a camera sensor helper instance associated with the camera
> - * sensor model.
> - *
> * \return A unique pointer to a newly constructed instance of the
> * CameraSensorHelper subclass corresponding to the factory
> */
>
> -/**
> - * \var CameraSensorHelperFactory::name_
> - * \brief The name of the factory
> - */
> -
> /**
> * \def REGISTER_CAMERA_SENSOR_HELPER
> * \brief Register a camera sensor helper with the camera sensor helper factory
> diff --git a/src/ipa/libipa/camera_sensor_helper.h b/src/ipa/libipa/camera_sensor_helper.h
> index 21ee43cc9f9f..3ea1806cb1fd 100644
> --- a/src/ipa/libipa/camera_sensor_helper.h
> +++ b/src/ipa/libipa/camera_sensor_helper.h
> @@ -58,39 +58,44 @@ private:
> LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorHelper)
> };
>
> -class CameraSensorHelperFactory
> +class CameraSensorHelperFactoryBase
> {
> public:
> - CameraSensorHelperFactory(const std::string name);
> - virtual ~CameraSensorHelperFactory() = default;
> + CameraSensorHelperFactoryBase(const std::string name);
> + virtual ~CameraSensorHelperFactoryBase() = default;
>
> static std::unique_ptr<CameraSensorHelper> create(const std::string &name);
>
> - static std::vector<CameraSensorHelperFactory *> &factories();
> + static std::vector<CameraSensorHelperFactoryBase *> &factories();
>
> private:
> - LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorHelperFactory)
> + LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorHelperFactoryBase)
>
> - static void registerType(CameraSensorHelperFactory *factory);
> + static void registerType(CameraSensorHelperFactoryBase *factory);
>
> virtual std::unique_ptr<CameraSensorHelper> createInstance() const = 0;
>
> std::string name_;
> };
>
> -#define REGISTER_CAMERA_SENSOR_HELPER(name, helper) \
> -class helper##Factory final : public CameraSensorHelperFactory \
> -{ \
> -public: \
> - helper##Factory() : CameraSensorHelperFactory(name) {} \
> - \
> -private: \
> - std::unique_ptr<CameraSensorHelper> createInstance() const \
> - { \
> - return std::make_unique<helper>(); \
> - } \
> -}; \
> -static helper##Factory global_##helper##Factory;
> +template<typename _Helper>
> +class CameraSensorHelperFactory final : public CameraSensorHelperFactoryBase
> +{
> +public:
> + CameraSensorHelperFactory(const char *name)
> + : CameraSensorHelperFactoryBase(name)
> + {
> + }
> +
> +private:
> + std::unique_ptr<CameraSensorHelper> createInstance() const
> + {
> + return std::make_unique<_Helper>();
> + }
> +};
> +
> +#define REGISTER_CAMERA_SENSOR_HELPER(name, helper) \
> +static CameraSensorHelperFactory<helper> global_##helper##Factory(name);
>
> } /* namespace ipa */
>
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index 1335e3d14df2..9451cb03a285 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -143,7 +143,7 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision,
> /* Cache the value to set it in configure. */
> hwRevision_ = static_cast<rkisp1_cif_isp_version>(hwRevision);
>
> - camHelper_ = CameraSensorHelperFactory::create(settings.sensorModel);
> + camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);
> if (!camHelper_) {
> LOG(IPARkISP1, Error)
> << "Failed to create camera sensor helper for "
With the typo fixed,
Reviewed-by: Xavier Roumegue <xavier.roumegue at oss.nxp.com>
More information about the libcamera-devel
mailing list