e37c3bbf8f
Signed-off-by: mason.huo <mason.huo@starfivetech.com>
319 lines
9.0 KiB
Diff
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
|
|
|