[libcamera-devel] [RFC 1/7] libcamera: camera_sensor: Introduce CameraSensorFactory
Jacopo Mondi
jacopo at jmondi.org
Wed Dec 18 15:49:55 CET 2019
Introduce a factory to create CameraSensor derived classes instances by
inspecting the sensor media entity name.
For now, unconditionally create and return an instance of the only
existing CameraSensor class in CameraSensorFactory::create()
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
src/libcamera/camera_sensor.cpp | 22 +++++++++++++++++++
src/libcamera/include/camera_sensor.h | 10 ++++++++-
src/libcamera/pipeline/ipu3/ipu3.cpp | 2 +-
src/libcamera/pipeline/rkisp1/rkisp1.cpp | 2 +-
src/libcamera/pipeline/vimc.cpp | 2 +-
test/camera-sensor.cpp | 2 +-
.../v4l2_videodevice_test.cpp | 2 +-
7 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index bc8b9e78bc42..ac8878fe336e 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -28,6 +28,28 @@ namespace libcamera {
LOG_DEFINE_CATEGORY(CameraSensor);
+/**
+ * \class CameraSensorFactory
+ * \brief Factory of camera sensor
+ *
+ * The CameraSensorFactory instantiate and return the opportune CameraSensor
+ * sub-class by inspecting the name of the sensor entity to handle.
+ */
+
+/**
+ * \brief Create and return a CameraSensor
+ * \param[in] entity The media entity that represents the sensor to handle
+ *
+ * Instantiate and return the opportune CameraSensor subclass inspecting the
+ * \a entity name.
+ *
+ * \return A pointer to a CameraSensor derived class instance
+ */
+CameraSensor *CameraSensorFactory::create(const MediaEntity *entity)
+{
+ return new CameraSensor(entity);
+}
+
/**
* \class CameraSensor
* \brief A camera sensor based on V4L2 subdevices
diff --git a/src/libcamera/include/camera_sensor.h b/src/libcamera/include/camera_sensor.h
index 99cff98128dc..2c09b1bdb61b 100644
--- a/src/libcamera/include/camera_sensor.h
+++ b/src/libcamera/include/camera_sensor.h
@@ -22,10 +22,16 @@ class V4L2Subdevice;
struct V4L2SubdeviceFormat;
+class CameraSensor;
+class CameraSensorFactory final
+{
+public:
+ static CameraSensor *create(const MediaEntity *entity);
+};
+
class CameraSensor : protected Loggable
{
public:
- explicit CameraSensor(const MediaEntity *entity);
~CameraSensor();
CameraSensor(const CameraSensor &) = delete;
@@ -49,6 +55,8 @@ public:
const ControlList &properties() const { return properties_; }
protected:
+ friend class CameraSensorFactory;
+ explicit CameraSensor(const MediaEntity *entity);
std::string logPrefix() const;
private:
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 536a63a30018..6de2f548fe1c 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -1362,7 +1362,7 @@ int CIO2Device::init(const MediaDevice *media, unsigned int index)
MediaLink *link = links[0];
MediaEntity *sensorEntity = link->source()->entity();
- sensor_ = new CameraSensor(sensorEntity);
+ sensor_ = CameraSensorFactory::create(sensorEntity);
ret = sensor_->init();
if (ret)
return ret;
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index e9a70755f4c5..276a12755f59 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -883,7 +883,7 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)
data->controlInfo_ = std::move(ctrls);
- data->sensor_ = new CameraSensor(sensor);
+ data->sensor_ = CameraSensorFactory::create(sensor);
ret = data->sensor_->init();
if (ret)
return ret;
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index 2bfab35314c4..5d6baa56ba8b 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -403,7 +403,7 @@ int VimcCameraData::init(MediaDevice *media)
return ret;
/* Create and open the camera sensor, debayer, scaler and video device. */
- sensor_ = new CameraSensor(media->getEntityByName("Sensor B"));
+ sensor_ = CameraSensorFactory::create(media->getEntityByName("Sensor B"));
ret = sensor_->init();
if (ret)
return ret;
diff --git a/test/camera-sensor.cpp b/test/camera-sensor.cpp
index 27c190fe7ace..0e7e3f5585d2 100644
--- a/test/camera-sensor.cpp
+++ b/test/camera-sensor.cpp
@@ -50,7 +50,7 @@ protected:
return TestFail;
}
- sensor_ = new CameraSensor(entity);
+ sensor_ = CameraSensorFactory::create(entity);
if (sensor_->init() < 0) {
cerr << "Unable to initialise camera sensor" << endl;
return TestFail;
diff --git a/test/v4l2_videodevice/v4l2_videodevice_test.cpp b/test/v4l2_videodevice/v4l2_videodevice_test.cpp
index 577da4cb601c..3c4ca60b9076 100644
--- a/test/v4l2_videodevice/v4l2_videodevice_test.cpp
+++ b/test/v4l2_videodevice/v4l2_videodevice_test.cpp
@@ -61,7 +61,7 @@ int V4L2VideoDeviceTest::init()
return TestFail;
if (driver_ == "vimc") {
- sensor_ = new CameraSensor(media_->getEntityByName("Sensor A"));
+ sensor_ = CameraSensorFactory::create(media_->getEntityByName("Sensor A"));
if (sensor_->init())
return TestFail;
--
2.24.0
More information about the libcamera-devel
mailing list