diff options
-rw-r--r-- | src/libcamera/pipeline/ipu3/imgu.cpp | 41 | ||||
-rw-r--r-- | src/libcamera/pipeline/ipu3/imgu.h | 3 |
2 files changed, 41 insertions, 3 deletions
diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp index 08f0fce9..c8610220 100644 --- a/src/libcamera/pipeline/ipu3/imgu.cpp +++ b/src/libcamera/pipeline/ipu3/imgu.cpp @@ -363,6 +363,11 @@ int ImgUDevice::init(MediaDevice *media, unsigned int index) if (ret) return ret; + param_ = V4L2VideoDevice::fromEntityName(media, name_ + " parameters"); + ret = param_->open(); + if (ret) + return ret; + stat_ = V4L2VideoDevice::fromEntityName(media, name_ + " 3a stat"); ret = stat_->open(); if (ret) @@ -475,6 +480,13 @@ int ImgUDevice::configure(const PipeConfig &pipeConfig, V4L2DeviceFormat *inputF LOG(IPU3, Debug) << "ImgU GDC format = " << gdcFormat.toString(); + StreamConfiguration paramCfg = {}; + paramCfg.size = inputFormat->size; + V4L2DeviceFormat paramFormat; + ret = configureVideoDevice(param_.get(), PAD_PARAM, paramCfg, ¶mFormat); + if (ret) + return ret; + StreamConfiguration statCfg = {}; statCfg.size = inputFormat->size; V4L2DeviceFormat statFormat; @@ -505,8 +517,11 @@ int ImgUDevice::configureVideoDevice(V4L2VideoDevice *dev, unsigned int pad, if (ret) return ret; - /* No need to apply format to the stat node. */ - if (dev == stat_.get()) + /* + * No need to apply format to the param or stat video devices as the + * driver ignores the operation. + */ + if (dev == param_.get() || dev == stat_.get()) return 0; *outputFormat = {}; @@ -537,6 +552,12 @@ int ImgUDevice::allocateBuffers(unsigned int bufferCount) return ret; } + ret = param_->importBuffers(bufferCount); + if (ret < 0) { + LOG(IPU3, Error) << "Failed to allocate ImgU param buffers"; + goto error; + } + /* * The kernel fails to start if buffers are not either imported or * allocated for the statistics video device. As statistics buffers are @@ -586,6 +607,10 @@ void ImgUDevice::freeBuffers() if (ret) LOG(IPU3, Error) << "Failed to release ImgU output buffers"; + ret = param_->releaseBuffers(); + if (ret) + LOG(IPU3, Error) << "Failed to release ImgU param buffers"; + ret = stat_->releaseBuffers(); if (ret) LOG(IPU3, Error) << "Failed to release ImgU stat buffers"; @@ -616,6 +641,12 @@ int ImgUDevice::start() return ret; } + ret = param_->streamOn(); + if (ret) { + LOG(IPU3, Error) << "Failed to start ImgU param"; + return ret; + } + ret = stat_->streamOn(); if (ret) { LOG(IPU3, Error) << "Failed to start ImgU stat"; @@ -637,6 +668,7 @@ int ImgUDevice::stop() ret = output_->streamOff(); ret |= viewfinder_->streamOff(); + ret |= param_->streamOff(); ret |= stat_->streamOff(); ret |= input_->streamOff(); @@ -678,6 +710,7 @@ int ImgUDevice::linkSetup(const std::string &source, unsigned int sourcePad, int ImgUDevice::enableLinks(bool enable) { std::string viewfinderName = name_ + " viewfinder"; + std::string paramName = name_ + " parameters"; std::string outputName = name_ + " output"; std::string statName = name_ + " 3a stat"; std::string inputName = name_ + " input"; @@ -695,6 +728,10 @@ int ImgUDevice::enableLinks(bool enable) if (ret) return ret; + ret = linkSetup(paramName, 0, name_, PAD_PARAM, enable); + if (ret) + return ret; + return linkSetup(name_, PAD_STAT, statName, 0, enable); } diff --git a/src/libcamera/pipeline/ipu3/imgu.h b/src/libcamera/pipeline/ipu3/imgu.h index 37f5ae77..4a1896e2 100644 --- a/src/libcamera/pipeline/ipu3/imgu.h +++ b/src/libcamera/pipeline/ipu3/imgu.h @@ -71,13 +71,14 @@ public: std::unique_ptr<V4L2Subdevice> imgu_; std::unique_ptr<V4L2VideoDevice> input_; + std::unique_ptr<V4L2VideoDevice> param_; std::unique_ptr<V4L2VideoDevice> output_; std::unique_ptr<V4L2VideoDevice> viewfinder_; std::unique_ptr<V4L2VideoDevice> stat_; - /* \todo Add param video device for 3A tuning */ private: static constexpr unsigned int PAD_INPUT = 0; + static constexpr unsigned int PAD_PARAM = 1; static constexpr unsigned int PAD_OUTPUT = 2; static constexpr unsigned int PAD_VF = 3; static constexpr unsigned int PAD_STAT = 4; |