summaryrefslogtreecommitdiff
path: root/include/libcamera/internal/camera_sensor.h
blob: b9b23104e9442a807f4ca716c018e8574abd3dba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2019, Google Inc.
 *
 * camera_sensor.h - A camera sensor
 */

#pragma once

#include <memory>
#include <string>
#include <vector>

#include <libcamera/base/class.h>
#include <libcamera/base/log.h>

#include <libcamera/control_ids.h>
#include <libcamera/controls.h>
#include <libcamera/geometry.h>
#include <libcamera/orientation.h>
#include <libcamera/transform.h>

#include <libcamera/ipa/core_ipa_interface.h>

#include "libcamera/internal/bayer_format.h"
#include "libcamera/internal/formats.h"
#include "libcamera/internal/v4l2_subdevice.h"

namespace libcamera {

class CameraLens;
class MediaEntity;
class SensorConfiguration;

struct CameraSensorProperties;

enum class Orientation;

class CameraSensor : protected Loggable
{
public:
	~CameraSensor();

	int init();

	const std::string &model() const { return model_; }
	const std::string &id() const { return id_; }

	const MediaEntity *entity() const { return entity_; }
	V4L2Subdevice *device() { return subdev_.get(); }

	CameraLens *focusLens() { return focusLens_.get(); }

	const std::vector<unsigned int> &mbusCodes() const { return mbusCodes_; }
	std::vector<Size> sizes(unsigned int mbusCode) const;
	Size resolution() const;

	V4L2SubdeviceFormat getFormat(const std::vector<unsigned int> &mbusCodes,
				      const Size &size) const;
	int setFormat(V4L2SubdeviceFormat *format,
		      Transform transform = Transform::Identity);
	int tryFormat(V4L2SubdeviceFormat *format) const;

	int applyConfiguration(const SensorConfiguration &config,
			       Transform transform = Transform::Identity,
			       V4L2SubdeviceFormat *sensorFormat = nullptr);

	const ControlList &properties() const { return properties_; }
	int sensorInfo(IPACameraSensorInfo *info) const;
	Transform computeTransform(Orientation *orientation) const;
	BayerFormat::Order bayerOrder(Transform t) const;

	const ControlInfoMap &controls() const;
	ControlList getControls(const std::vector<uint32_t> &ids);
	int setControls(ControlList *ctrls);

	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
{
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 */