libcamera: camera_sensor: Create abstract base class

With a camera sensor factory in place, the next step is to create an
abstract base class that all camera sensors implement, providing a
uniform API to pipeline handler. Turn all public functions of the
CameraSensor class into pure virtual functions, and move the
implementation to the CameraSensorLegacy class.

Part of the code is likely worth keeping as common helpers in a base
class. However, to follow the principle of not designing helpers with a
single user, this commit moves the whole implementation. Common helpers
will be introduced later, along with other CameraSensor subclasses.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2024-02-04 17:55:31 +02:00 committed by Jacopo Mondi
parent 6ba23735b9
commit aee7f8207e
5 changed files with 1112 additions and 1038 deletions

View file

@ -25,6 +25,7 @@ EXCLUDE = @TOP_SRCDIR@/include/libcamera/base/span.h \
@TOP_SRCDIR@/src/libcamera/device_enumerator_udev.cpp \ @TOP_SRCDIR@/src/libcamera/device_enumerator_udev.cpp \
@TOP_SRCDIR@/src/libcamera/ipc_pipe_unixsocket.cpp \ @TOP_SRCDIR@/src/libcamera/ipc_pipe_unixsocket.cpp \
@TOP_SRCDIR@/src/libcamera/pipeline/ \ @TOP_SRCDIR@/src/libcamera/pipeline/ \
@TOP_SRCDIR@/src/libcamera/sensor/camera_sensor_legacy.cpp \
@TOP_SRCDIR@/src/libcamera/tracepoints.cpp \ @TOP_SRCDIR@/src/libcamera/tracepoints.cpp \
@TOP_BUILDDIR@/include/libcamera/internal/tracepoints.h \ @TOP_BUILDDIR@/include/libcamera/internal/tracepoints.h \
@TOP_BUILDDIR@/include/libcamera/ipa/soft_ipa_interface.h \ @TOP_BUILDDIR@/include/libcamera/ipa/soft_ipa_interface.h \

View file

@ -9,10 +9,10 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include <variant>
#include <vector> #include <vector>
#include <libcamera/base/class.h> #include <libcamera/base/class.h>
#include <libcamera/base/log.h>
#include <libcamera/control_ids.h> #include <libcamera/control_ids.h>
#include <libcamera/controls.h> #include <libcamera/controls.h>
@ -20,8 +20,6 @@
#include <libcamera/orientation.h> #include <libcamera/orientation.h>
#include <libcamera/transform.h> #include <libcamera/transform.h>
#include <libcamera/ipa/core_ipa_interface.h>
#include "libcamera/internal/bayer_format.h" #include "libcamera/internal/bayer_format.h"
#include "libcamera/internal/v4l2_subdevice.h" #include "libcamera/internal/v4l2_subdevice.h"
@ -31,105 +29,62 @@ class CameraLens;
class MediaEntity; class MediaEntity;
class SensorConfiguration; class SensorConfiguration;
struct CameraSensorProperties;
enum class Orientation; enum class Orientation;
class CameraSensor : protected Loggable struct IPACameraSensorInfo;
class CameraSensor
{ {
public: public:
~CameraSensor(); virtual ~CameraSensor();
int init(); virtual const std::string &model() const = 0;
virtual const std::string &id() const = 0;
const std::string &model() const { return model_; } virtual const MediaEntity *entity() const = 0;
const std::string &id() const { return id_; } virtual V4L2Subdevice *device() = 0;
const MediaEntity *entity() const { return entity_; } virtual CameraLens *focusLens() = 0;
V4L2Subdevice *device() { return subdev_.get(); }
CameraLens *focusLens() { return focusLens_.get(); } virtual const std::vector<unsigned int> &mbusCodes() const = 0;
virtual std::vector<Size> sizes(unsigned int mbusCode) const = 0;
virtual Size resolution() const = 0;
const std::vector<unsigned int> &mbusCodes() const { return mbusCodes_; } virtual V4L2SubdeviceFormat
std::vector<Size> sizes(unsigned int mbusCode) const; getFormat(const std::vector<unsigned int> &mbusCodes,
Size resolution() const; const Size &size) const = 0;
virtual int setFormat(V4L2SubdeviceFormat *format,
Transform transform = Transform::Identity) = 0;
virtual int tryFormat(V4L2SubdeviceFormat *format) const = 0;
V4L2SubdeviceFormat getFormat(const std::vector<unsigned int> &mbusCodes, virtual int applyConfiguration(const SensorConfiguration &config,
const Size &size) const; Transform transform = Transform::Identity,
int setFormat(V4L2SubdeviceFormat *format, V4L2SubdeviceFormat *sensorFormat = nullptr) = 0;
Transform transform = Transform::Identity);
int tryFormat(V4L2SubdeviceFormat *format) const;
int applyConfiguration(const SensorConfiguration &config, virtual const ControlList &properties() const = 0;
Transform transform = Transform::Identity, virtual int sensorInfo(IPACameraSensorInfo *info) const = 0;
V4L2SubdeviceFormat *sensorFormat = nullptr); virtual Transform computeTransform(Orientation *orientation) const = 0;
virtual BayerFormat::Order bayerOrder(Transform t) const = 0;
const ControlList &properties() const { return properties_; } virtual const ControlInfoMap &controls() const = 0;
int sensorInfo(IPACameraSensorInfo *info) const; virtual ControlList getControls(const std::vector<uint32_t> &ids) = 0;
Transform computeTransform(Orientation *orientation) const; virtual int setControls(ControlList *ctrls) = 0;
BayerFormat::Order bayerOrder(Transform t) const;
const ControlInfoMap &controls() const; virtual const std::vector<controls::draft::TestPatternModeEnum> &
ControlList getControls(const std::vector<uint32_t> &ids); testPatternModes() const = 0;
int setControls(ControlList *ctrls); virtual int setTestPatternMode(controls::draft::TestPatternModeEnum mode) = 0;
const std::vector<controls::draft::TestPatternModeEnum> &testPatternModes() const
{
return testPatternModes_;
}
int setTestPatternMode(controls::draft::TestPatternModeEnum mode);
protected:
explicit CameraSensor(const MediaEntity *entity);
std::string logPrefix() const override;
private:
LIBCAMERA_DISABLE_COPY(CameraSensor)
int generateId();
int validateSensorDriver();
void initVimcDefaultProperties();
void initStaticProperties();
void initTestPatternModes();
int initProperties();
int discoverAncillaryDevices();
int applyTestPatternMode(controls::draft::TestPatternModeEnum mode);
const MediaEntity *entity_;
std::unique_ptr<V4L2Subdevice> subdev_;
unsigned int pad_;
const CameraSensorProperties *staticProps_;
std::string model_;
std::string id_;
V4L2Subdevice::Formats formats_;
std::vector<unsigned int> mbusCodes_;
std::vector<Size> sizes_;
std::vector<controls::draft::TestPatternModeEnum> testPatternModes_;
controls::draft::TestPatternModeEnum testPatternMode_;
Size pixelArraySize_;
Rectangle activeArea_;
const BayerFormat *bayerFormat_;
bool supportFlips_;
bool flipsAlterBayerOrder_;
Orientation mountingOrientation_;
ControlList properties_;
std::unique_ptr<CameraLens> focusLens_;
}; };
class CameraSensorFactoryBase class CameraSensorFactoryBase
{ {
public: public:
CameraSensorFactoryBase(); CameraSensorFactoryBase(const char *name);
virtual ~CameraSensorFactoryBase() = default; virtual ~CameraSensorFactoryBase() = default;
static std::unique_ptr<CameraSensor> create(MediaEntity *entity); static std::unique_ptr<CameraSensor> create(MediaEntity *entity);
const std::string &name() const { return name_; }
private: private:
LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorFactoryBase) LIBCAMERA_DISABLE_COPY_AND_MOVE(CameraSensorFactoryBase)
@ -137,35 +92,30 @@ private:
static void registerFactory(CameraSensorFactoryBase *factory); static void registerFactory(CameraSensorFactoryBase *factory);
virtual bool match(const MediaEntity *entity) const = 0; virtual std::variant<std::unique_ptr<CameraSensor>, int>
match(MediaEntity *entity) const = 0;
virtual std::unique_ptr<CameraSensor> std::string name_;
createInstance(MediaEntity *entity) const = 0;
}; };
template<typename _CameraSensor> template<typename _CameraSensor>
class CameraSensorFactory final : public CameraSensorFactoryBase class CameraSensorFactory final : public CameraSensorFactoryBase
{ {
public: public:
CameraSensorFactory() CameraSensorFactory(const char *name)
: CameraSensorFactoryBase() : CameraSensorFactoryBase(name)
{ {
} }
private: private:
bool match(const MediaEntity *entity) const override std::variant<std::unique_ptr<CameraSensor>, int>
match(MediaEntity *entity) const override
{ {
return _CameraSensor::match(entity); return _CameraSensor::match(entity);
} }
std::unique_ptr<CameraSensor>
createInstance(MediaEntity *entity) const override
{
return _CameraSensor::create(entity);
}
}; };
#define REGISTER_CAMERA_SENSOR(sensor) \ #define REGISTER_CAMERA_SENSOR(sensor) \
static CameraSensorFactory<sensor> global_##sensor##Factory{}; static CameraSensorFactory<sensor> global_##sensor##Factory{ #sensor };
} /* namespace libcamera */ } /* namespace libcamera */

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -2,5 +2,6 @@
libcamera_internal_sources += files([ libcamera_internal_sources += files([
'camera_sensor.cpp', 'camera_sensor.cpp',
'camera_sensor_legacy.cpp',
'camera_sensor_properties.cpp', 'camera_sensor_properties.cpp',
]) ])