@@ -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);
}
@@ -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;