123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- 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
|