From effc2d3342133cddad1686408e06eb0e5b539631 Mon Sep 17 00:00:00 2001 From: Gerben Jan Dijkman Date: Tue, 24 Jan 2023 21:29:24 +0100 Subject: [PATCH] added patches --- ...kisp1-add-FrameDurationLimits-control.diff | 176 ++++++++++++++++++ ...bcamera-add-support-for-ov8858-sensor.diff | 47 +++++ media-libs/libcamera/libcamera-0.0.3.ebuild | 6 + 3 files changed, 229 insertions(+) create mode 100644 media-libs/libcamera/files/libcamera-devel-v6-2-5-ipa-rkisp1-add-FrameDurationLimits-control.diff create mode 100644 media-libs/libcamera/files/libcamera-devel-v6-5-5-ipa-libcamera-add-support-for-ov8858-sensor.diff diff --git a/media-libs/libcamera/files/libcamera-devel-v6-2-5-ipa-rkisp1-add-FrameDurationLimits-control.diff b/media-libs/libcamera/files/libcamera-devel-v6-2-5-ipa-rkisp1-add-FrameDurationLimits-control.diff new file mode 100644 index 0000000..4e0c282 --- /dev/null +++ b/media-libs/libcamera/files/libcamera-devel-v6-2-5-ipa-rkisp1-add-FrameDurationLimits-control.diff @@ -0,0 +1,176 @@ +diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom +index eaf3955e..86ff6d0e 100644 +--- a/include/libcamera/ipa/rkisp1.mojom ++++ b/include/libcamera/ipa/rkisp1.mojom +@@ -10,7 +10,9 @@ import "include/libcamera/ipa/core.mojom"; + + interface IPARkISP1Interface { + init(libcamera.IPASettings settings, +- uint32 hwRevision) ++ uint32 hwRevision, ++ libcamera.IPACameraSensorInfo sensorInfo, ++ libcamera.ControlInfoMap sensorControls) + => (int32 ret, libcamera.ControlInfoMap ipaControls); + start() => (int32 ret); + stop(); +@@ -18,7 +20,7 @@ interface IPARkISP1Interface { + configure(libcamera.IPACameraSensorInfo sensorInfo, + map streamConfig, + map entityControls) +- => (int32 ret); ++ => (int32 ret, libcamera.ControlInfoMap ipaControls); + + mapBuffers(array buffers); + unmapBuffers(array ids); +diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp +index 069c901b..49239a87 100644 +--- a/src/ipa/rkisp1/rkisp1.cpp ++++ b/src/ipa/rkisp1/rkisp1.cpp +@@ -49,13 +49,16 @@ public: + IPARkISP1(); + + int init(const IPASettings &settings, unsigned int hwRevision, ++ const IPACameraSensorInfo &sensorInfo, ++ const ControlInfoMap &sensorControls, + ControlInfoMap *ipaControls) override; + int start() override; + void stop() override; + + int configure(const IPACameraSensorInfo &info, + const std::map &streamConfig, +- const std::map &entityControls) override; ++ const std::map &entityControls, ++ ControlInfoMap *ipaControls) override; + void mapBuffers(const std::vector &buffers) override; + void unmapBuffers(const std::vector &ids) override; + +@@ -68,6 +71,9 @@ protected: + std::string logPrefix() const override; + + private: ++ void updateControls(const IPACameraSensorInfo &sensorInfo, ++ const ControlInfoMap &sensorControls, ++ ControlInfoMap *ipaControls); + void setControls(unsigned int frame); + + std::map buffers_; +@@ -115,6 +121,8 @@ std::string IPARkISP1::logPrefix() const + } + + int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision, ++ const IPACameraSensorInfo &sensorInfo, ++ const ControlInfoMap &sensorControls, + ControlInfoMap *ipaControls) + { + /* \todo Add support for other revisions */ +@@ -180,9 +188,8 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision, + if (ret) + return ret; + +- /* Return the controls handled by the IPA. */ +- ControlInfoMap::Map ctrlMap = rkisp1Controls; +- *ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls); ++ /* Initialize controls. */ ++ updateControls(sensorInfo, sensorControls, ipaControls); + + return 0; + } +@@ -207,7 +214,8 @@ void IPARkISP1::stop() + */ + int IPARkISP1::configure([[maybe_unused]] const IPACameraSensorInfo &info, + [[maybe_unused]] const std::map &streamConfig, +- const std::map &entityControls) ++ const std::map &entityControls, ++ ControlInfoMap *ipaControls) + { + if (entityControls.empty()) + return -EINVAL; +@@ -249,6 +257,9 @@ int IPARkISP1::configure([[maybe_unused]] const IPACameraSensorInfo &info, + context_.configuration.sensor.size = info.outputSize; + context_.configuration.sensor.lineDuration = info.minLineLength * 1.0s / info.pixelRate; + ++ /* Update the camera controls using the new sensor settings. */ ++ updateControls(info, ctrls_, ipaControls); ++ + /* + * When the AGC computes the new exposure values for a frame, it needs + * to know the limits for shutter speed and analogue gain. +@@ -349,6 +360,42 @@ void IPARkISP1::processStatsBuffer(const uint32_t frame, const uint32_t bufferId + metadataReady.emit(frame, metadata); + } + ++void IPARkISP1::updateControls(const IPACameraSensorInfo &sensorInfo, ++ const ControlInfoMap &sensorControls, ++ ControlInfoMap *ipaControls) ++{ ++ ControlInfoMap::Map ctrlMap = rkisp1Controls; ++ ++ /* ++ * Compute the frame duration limits. ++ * ++ * The frame length is computed assuming a fixed line length combined ++ * with the vertical frame sizes. ++ */ ++ const ControlInfo &v4l2HBlank = sensorControls.find(V4L2_CID_HBLANK)->second; ++ uint32_t hblank = v4l2HBlank.def().get(); ++ uint32_t lineLength = sensorInfo.outputSize.width + hblank; ++ ++ const ControlInfo &v4l2VBlank = sensorControls.find(V4L2_CID_VBLANK)->second; ++ std::array frameHeights{ ++ v4l2VBlank.min().get() + sensorInfo.outputSize.height, ++ v4l2VBlank.max().get() + sensorInfo.outputSize.height, ++ v4l2VBlank.def().get() + sensorInfo.outputSize.height, ++ }; ++ ++ std::array frameDurations; ++ for (unsigned int i = 0; i < frameHeights.size(); ++i) { ++ uint64_t frameSize = lineLength * frameHeights[i]; ++ frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U); ++ } ++ ++ ctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0], ++ frameDurations[1], ++ frameDurations[2]); ++ ++ *ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls); ++} ++ + void IPARkISP1::setControls(unsigned int frame) + { + /* +diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp +index 455ee2a0..dae29a2c 100644 +--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp ++++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp +@@ -340,15 +340,19 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision) + /* + * If the tuning file isn't found, fall back to the + * 'uncalibrated' configuration file. +- */ ++ */ + if (ipaTuningFile.empty()) + ipaTuningFile = ipa_->configurationFile("uncalibrated.yaml"); + } else { + ipaTuningFile = std::string(configFromEnv); + } + +- int ret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision, +- &controlInfo_); ++ IPACameraSensorInfo sensorInfo{}; ++ int ret = sensor_->sensorInfo(&sensorInfo); ++ if (ret) ++ return ret; ++ ret = ipa_->init({ ipaTuningFile, sensor_->model() }, hwRevision, ++ sensorInfo, sensor_->controls(), &controlInfo_); + if (ret < 0) { + LOG(RkISP1, Error) << "IPA initialization failure"; + return ret; +@@ -725,7 +729,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c) + std::map entityControls; + entityControls.emplace(0, data->sensor_->controls()); + +- ret = data->ipa_->configure(sensorInfo, streamConfig, entityControls); ++ ret = data->ipa_->configure(sensorInfo, streamConfig, entityControls, &data->controlInfo_); + if (ret) { + LOG(RkISP1, Error) << "failed configuring IPA (" << ret << ")"; + return ret; diff --git a/media-libs/libcamera/files/libcamera-devel-v6-5-5-ipa-libcamera-add-support-for-ov8858-sensor.diff b/media-libs/libcamera/files/libcamera-devel-v6-5-5-ipa-libcamera-add-support-for-ov8858-sensor.diff new file mode 100644 index 0000000..244ae30 --- /dev/null +++ b/media-libs/libcamera/files/libcamera-devel-v6-5-5-ipa-libcamera-add-support-for-ov8858-sensor.diff @@ -0,0 +1,47 @@ +diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp +index 35056bec..f2040cbd 100644 +--- a/src/ipa/libipa/camera_sensor_helper.cpp ++++ b/src/ipa/libipa/camera_sensor_helper.cpp +@@ -476,6 +476,17 @@ public: + }; + REGISTER_CAMERA_SENSOR_HELPER("ov5693", CameraSensorHelperOv5693) + ++class CameraSensorHelperOv8858 : public CameraSensorHelper ++{ ++public: ++ CameraSensorHelperOv8858() ++ { ++ gainType_ = AnalogueGainLinear; ++ gainConstants_.linear = { 1, 0, 0, 16 }; ++ } ++}; ++REGISTER_CAMERA_SENSOR_HELPER("m00_f_ov8858", CameraSensorHelperOv8858) ++ + class CameraSensorHelperOv8865 : public CameraSensorHelper + { + public: +diff --git a/src/libcamera/camera_sensor_properties.cpp b/src/libcamera/camera_sensor_properties.cpp +index e5f27f06..d0757c15 100644 +--- a/src/libcamera/camera_sensor_properties.cpp ++++ b/src/libcamera/camera_sensor_properties.cpp +@@ -146,6 +146,20 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen + */ + }, + } }, ++ { "m00_f_ov8858", { ++ .unitCellSize = { 1200, 1200 }, ++ .testPatternModes = { ++ { controls::draft::TestPatternModeOff, 0 }, ++ { controls::draft::TestPatternModeColorBars, 1 }, ++ /* ++ * No best corresponding test pattern for: ++ * 1: "Vertical Color Bar Type 1", ++ * 2: "Vertical Color Bar Type 2", ++ * 3: "Vertical Color Bar Type 3", ++ * 4: "Vertical Color Bar Type 4" ++ */ ++ }, ++ } }, + { "ov8865", { + .unitCellSize = { 1400, 1400 }, + .testPatternModes = { diff --git a/media-libs/libcamera/libcamera-0.0.3.ebuild b/media-libs/libcamera/libcamera-0.0.3.ebuild index 8739281..0c569fe 100644 --- a/media-libs/libcamera/libcamera-0.0.3.ebuild +++ b/media-libs/libcamera/libcamera-0.0.3.ebuild @@ -27,6 +27,12 @@ DEPEND=" $(python_gen_any_dep 'dev-python/pyyaml[${PYTHON_USEDEP}]') " +PATCHES=( + "${FILESDIR}"/libcamera-devel-v6-2-5-ipa-rkisp1-add-FrameDurationLimits-control.diff + "${FILESDIR}"/libcamera-devel-v6-5-5-ipa-libcamera-add-support-for-ov8858-sensor.diff + ) + + src_configure() { local emesonargs=( $(meson_feature doc documentation)