Files
fml13v01-buildroot/package/libcamera/0007-add-list-controls-and-properties.patch
T
2022-10-28 22:14:41 +08:00

319 lines
9.0 KiB
Diff

From 5e558d4454fa476cc9e0670a30d631a1174b55a2 Mon Sep 17 00:00:00 2001
From: sw.multimedia <sw.multimedia@starfivetech.com>
Date: Tue, 23 Nov 2021 10:44:04 +0800
Subject: [PATCH 07/10] add list controls and properties
---
src/libcamera/pipeline/starfive/starfive.cpp | 219 ++++++++++++++-----
1 file changed, 165 insertions(+), 54 deletions(-)
diff --git a/src/libcamera/pipeline/starfive/starfive.cpp b/src/libcamera/pipeline/starfive/starfive.cpp
index 58e1f55a..b91a85a4 100644
--- a/src/libcamera/pipeline/starfive/starfive.cpp
+++ b/src/libcamera/pipeline/starfive/starfive.cpp
@@ -185,7 +185,9 @@ public:
delete ispSubDev_;
}
- int init();
+ int init(MediaDevice *media);
+ void addControl(uint32_t cid, const ControlInfo &v4l2Info,
+ ControlInfoMap::Map *ctrls);
void bufferReady(FrameBuffer *buffer);
bool haveRaw() const { return haveRaw_; }
bool rawActive() const { return rawActive_; }
@@ -298,7 +300,7 @@ private:
StarFiveCameraData *data_;
};
-int StarFiveCameraData::init()
+int StarFiveCameraData::init(MediaDevice *media)
{
int ret;
@@ -353,7 +355,38 @@ int StarFiveCameraData::init()
&StarFiveCameraData::bufferReady);
}
}
-
+
+ // properties_.set(properties::Location, properties::CameraLocationExternal);
+ properties_.set(properties::Model, utils::toAscii(media->model()));
+
+ /*
+ * Get the current format in order to initialize the sensor array
+ * properties.
+ */
+ Size resolution;
+ for (const auto &it : video_->formats()) {
+ const std::vector<SizeRange> &sizeRanges = it.second;
+ for (const SizeRange &sizeRange : sizeRanges) {
+ if (sizeRange.max > resolution)
+ resolution = sizeRange.max;
+ }
+ }
+
+ properties_.set(properties::PixelArraySize, resolution);
+ properties_.set(properties::PixelArrayActiveAreas, { Rectangle(resolution) });
+
+ /* Initialise the supported controls. */
+ ControlInfoMap::Map ctrls;
+
+ for (const auto &ctrl : sensor_->controls()) {
+ uint32_t cid = ctrl.first->id();
+ const ControlInfo &info = ctrl.second;
+
+ addControl(cid, info, &ctrls);
+ }
+
+ controlInfo_ = ControlInfoMap(std::move(ctrls), controls::controls);
+
return 0;
}
@@ -734,97 +767,89 @@ int PipelineHandlerStarFive::processControls(StarFiveCameraData *data, const Con
for (auto it : controls) {
unsigned int id = it.first;
- unsigned int offset = 0;
uint32_t cid = 0;
int32_t value = 0;
switch (id) {
case controls::BRIGHTNESS:
cid = V4L2_CID_BRIGHTNESS;
- offset = 128;
- value = lroundf(it.second.get<float>() * 128 + offset);
- LOG(STARFIVE, Debug) << "Brightness controls: " << id
- << ", value: " << value;
break;
case controls::CONTRAST:
cid = V4L2_CID_CONTRAST;
- offset = 0;
- value = lroundf(it.second.get<float>() * 128 + offset);
- LOG(STARFIVE, Debug) << "Contrast controls: " << id
- << ", value: " << value;
break;
case controls::SATURATION:
cid = V4L2_CID_SATURATION;
- offset = 0;
- value = lroundf(it.second.get<float>() * 128 + offset);
- LOG(STARFIVE, Debug) << "Saturation controls: " << id
- << ", value: " << value;
break;
case controls::SHARPNESS:
cid = V4L2_CID_SHARPNESS;
- offset = 0;
- value = lroundf(it.second.get<float>() * 128 + offset);
- LOG(STARFIVE, Debug) << "Sharpness controls: " << id
- << ", value: " << value;
break;
case controls::COLOUR_GAINS:
cid = V4L2_CID_RED_BALANCE;
- offset = 0;
- value = lroundf(it.second.get<Span<const float>>()[0]);
- LOG(STARFIVE, Debug) << "ColourGains controls: " << id
- << ", COLOUR_GAINS RED value: " << value;
- if (SensorControlsInfoMap.find(cid) != SensorControlsInfoMap.end())
- SensorControls.set(cid, value);
- else
- LOG(STARFIVE, Debug)
- << "SensorControls not supported controls: " << id;
- cid = V4L2_CID_BLUE_BALANCE;
- value = lroundf(it.second.get<Span<const float>>()[1]);
- LOG(STARFIVE, Debug) << "COLOUR_GAINS BLUE value: " << value;
break;
case controls::AWB_ENABLE:
cid = V4L2_CID_AUTO_WHITE_BALANCE;
- value = it.second.get<bool>();
- LOG(STARFIVE, Debug) << "AwbMode controls: " << id
- << ", value: " << value;
break;
case controls::EXPOSURE_VALUE:
cid = V4L2_CID_EXPOSURE;
- offset = 0;
- value = lroundf(it.second.get<float>());
- LOG(STARFIVE, Debug) << "ExposureValue controls: " << id
- << ", value: " << value;
break;
case controls::AE_ENABLE:
cid = V4L2_CID_EXPOSURE_AUTO;
- value = it.second.get<bool>();
- LOG(STARFIVE, Debug) << "AeExposureMode controls: " << id
- << ", value: " << value;
break;
case controls::ANALOGUE_GAIN:
cid = V4L2_CID_ANALOGUE_GAIN;
- offset = 0;
- value = lroundf(it.second.get<float>());
- LOG(STARFIVE, Debug) << "AnalogueGain controls: " << id
- << ", value: " << value;
break;
case controls::DIGITAL_GAIN:
- cid = V4L2_CID_GAIN;
- offset = 0;
- value = lroundf(it.second.get<float>());
- LOG(STARFIVE, Debug) << "AnalogueGain controls: " << id
- << ", value: " << value;
+ cid = V4L2_CID_DIGITAL_GAIN;
break;
default:
- LOG(STARFIVE, Debug) << "default controls: " << id;
+ continue;
+ }
+
+ if (SensorControlsInfoMap.find(cid) == SensorControlsInfoMap.end()) {
+ LOG(STARFIVE, Debug) << "SensorControls not supported controls: " << id;
+ continue;
+ }
+
+ const ControlInfo &v4l2Info = SensorControlsInfoMap.at(cid);
+ int32_t min = v4l2Info.min().get<int32_t>();
+ int32_t def = v4l2Info.def().get<int32_t>();
+ int32_t max = v4l2Info.max().get<int32_t>();
+
+ switch (id) {
+ case controls::SATURATION:
+ case controls::SHARPNESS:
+ case controls::CONTRAST:
+ case controls::EXPOSURE_VALUE:
+ case controls::ANALOGUE_GAIN:
+ case controls::DIGITAL_GAIN:
+ case controls::BRIGHTNESS: {
+ value = static_cast<int32_t>(lroundf(it.second.get<float>()));
+ break;
+ }
+ case controls::COLOUR_GAINS: {
+ value = static_cast<int32_t>(lroundf(it.second.get<float>()));
+ LOG(STARFIVE, Debug) << "ColourGains controls: " << id
+ << ", COLOUR_GAINS RED value: " << value;
+ SensorControls.set(cid, value);
+ cid = V4L2_CID_BLUE_BALANCE;
+ value = static_cast<int32_t>(lroundf(it.second.get<float>()));
+ LOG(STARFIVE, Debug) << "COLOUR_GAINS BLUE value: " << value;
+ break;
+ }
+ case controls::AWB_ENABLE:
+ case controls::AE_ENABLE:
+ value = it.second.get<bool>();
break;
+ default:
+ LOG(STARFIVE, Debug) << "default controls: " << id;
+ continue;
}
+ LOG(STARFIVE, Debug) << "controls: " << id << ", value: " << value;
if (SensorControlsInfoMap.find(cid) != SensorControlsInfoMap.end())
SensorControls.set(cid, value);
else
LOG(STARFIVE, Debug) << "SensorControls not supported controls: " << id;
-
}
for (const auto &ctrl : SensorControls)
@@ -965,7 +990,7 @@ int PipelineHandlerStarFive::registerCameras()
videoEntiryName, sensorEntityName);
/* Locate and open the capture video node. */
- if (data->init())
+ if (data->init(starFiveMediaDev_))
continue;
/*create ipa module*/
@@ -1075,6 +1100,92 @@ void StarFiveCameraData::bufferReady(FrameBuffer *buffer)
pipe->completeRequest(request);
}
+void StarFiveCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
+ ControlInfoMap::Map *ctrls)
+{
+ const ControlId *id;
+ ControlInfo info;
+
+ LOG(STARFIVE, Debug) << __func__ << " cid: " << utils::hex(cid);
+ /* Map the control ID. */
+ switch (cid) {
+ case V4L2_CID_BRIGHTNESS:
+ id = &controls::Brightness;
+ break;
+ case V4L2_CID_CONTRAST:
+ id = &controls::Contrast;
+ break;
+ case V4L2_CID_SATURATION:
+ id = &controls::Saturation;
+ break;
+ case V4L2_CID_SHARPNESS:
+ id = &controls::Sharpness;
+ break;
+ case V4L2_CID_RED_BALANCE:
+ case V4L2_CID_BLUE_BALANCE:
+ id = &controls::ColourGains;
+ break;
+ case V4L2_CID_AUTO_WHITE_BALANCE:
+ id = &controls::AwbMode;
+ break;
+ case V4L2_CID_EXPOSURE:
+ id = &controls::ExposureValue;
+ break;
+ case V4L2_CID_EXPOSURE_AUTO:
+ id = &controls::AeExposureMode;
+ break;
+ case V4L2_CID_ANALOGUE_GAIN:
+ id = &controls::AnalogueGain;
+ break;
+ case V4L2_CID_DIGITAL_GAIN:
+ id = &controls::DigitalGain;
+ break;
+ default:
+ LOG(STARFIVE, Debug) << __func__ << " unsupport cid: " << utils::hex(cid);
+ return;
+ }
+
+ /* Map the control info. */
+ int32_t min = v4l2Info.min().get<int32_t>();
+ int32_t max = v4l2Info.max().get<int32_t>();
+ int32_t def = v4l2Info.def().get<int32_t>();
+
+ switch (cid) {
+ case V4L2_CID_SATURATION:
+ case V4L2_CID_SHARPNESS:
+ case V4L2_CID_CONTRAST:
+ case V4L2_CID_EXPOSURE:
+ case V4L2_CID_ANALOGUE_GAIN:
+ case V4L2_CID_DIGITAL_GAIN:
+ case V4L2_CID_BRIGHTNESS: {
+ info = ControlInfo{
+ { static_cast<float>(min) },
+ { static_cast<float>(max) },
+ { static_cast<float>(def) },
+ };
+ break;
+ }
+
+ case V4L2_CID_EXPOSURE_AUTO:
+ info = ControlInfo{ false, true, true };
+ break;
+
+ case V4L2_CID_EXPOSURE_ABSOLUTE:
+ info = ControlInfo{
+ { min * 100 },
+ { max * 100 },
+ { def * 100 }
+ };
+ break;
+
+ default:
+ info = v4l2Info;
+ break;
+ }
+
+ ctrls->emplace(id, info);
+}
+
REGISTER_PIPELINE_HANDLER(PipelineHandlerStarFive)
} /* namespace libcamera */
--
2.25.1