summaryrefslogtreecommitdiff
path: root/include/libcamera/internal/camera_sensor.h
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2019-12-17 12:47:51 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2024-04-24 20:44:24 +0300
commitaa9a1eef2106383e965004c9ceeba9ed4746b78d (patch)
tree94cbbf1235e6fc3efa590a5ddedc1c2e209c6a69 /include/libcamera/internal/camera_sensor.h
parent0fd7d941955dee55be2104c8143b5fbe42178fd3 (diff)
libcamera: camera_sensor: Introduce CameraSensorFactory
Introduce a factory to create CameraSensor derived classes instances by inspecting the sensor media entity name and provide a convenience macro to register specialized sensor handlers. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com> --- Changes since combined RFC: - Fix indentation in REGISTER_CAMERA_SENSOR() macro
Diffstat (limited to 'include/libcamera/internal/camera_sensor.h')
-rw-r--r--include/libcamera/internal/camera_sensor.h48
1 files changed, 47 insertions, 1 deletions
diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index d05f48eb..b9b23104 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -39,7 +39,6 @@ enum class Orientation;
class CameraSensor : protected Loggable
{
public:
- explicit CameraSensor(const MediaEntity *entity);
~CameraSensor();
int init();
@@ -82,6 +81,7 @@ public:
int setTestPatternMode(controls::draft::TestPatternModeEnum mode);
protected:
+ explicit CameraSensor(const MediaEntity *entity);
std::string logPrefix() const override;
private:
@@ -123,4 +123,50 @@ private:
std::unique_ptr<CameraLens> focusLens_;
};
+class CameraSensorFactoryBase
+{
+public:
+ CameraSensorFactoryBase();
+ virtual ~CameraSensorFactoryBase() = default;
+
+ static std::unique_ptr<CameraSensor> create(MediaEntity *entity);
+
+private:
+ LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorFactoryBase)
+
+ static std::vector<CameraSensorFactoryBase *> &factories();
+
+ static void registerFactory(CameraSensorFactoryBase *factory);
+
+ virtual bool match(const MediaEntity *entity) const = 0;
+
+ virtual std::unique_ptr<CameraSensor>
+ createInstance(MediaEntity *entity) const = 0;
+};
+
+template<typename _CameraSensor>
+class CameraSensorFactory final : public CameraSensorFactoryBase
+{
+public:
+ CameraSensorFactory()
+ : CameraSensorFactoryBase()
+ {
+ }
+
+private:
+ bool match(const MediaEntity *entity) const override
+ {
+ return _CameraSensor::match(entity);
+ }
+
+ std::unique_ptr<CameraSensor>
+ createInstance(MediaEntity *entity) const override
+ {
+ return _CameraSensor::create(entity);
+ }
+};
+
+#define REGISTER_CAMERA_SENSOR(sensor) \
+static CameraSensorFactory<sensor> global_##sensor##Factory{};
+
} /* namespace libcamera */