@@ -117,6 +117,8 @@ protected:
int queueRequestDevice(Camera *camera, Request *request) override;
+ bool acquireDevice(Camera *camera) override;
+
private:
static constexpr Size kPreviewSize = { 1920, 1080 };
static constexpr Size kMinISISize = { 1, 1 };
@@ -143,6 +145,8 @@ private:
std::unique_ptr<V4L2Subdevice> crossbar_;
std::vector<Pipe> pipes_;
+
+ V4L2Subdevice::Routing routing_ = {};
};
/* -----------------------------------------------------------------------------
@@ -950,6 +954,19 @@ int PipelineHandlerISI::queueRequestDevice(Camera *camera, Request *request)
return 0;
}
+bool PipelineHandlerISI::acquireDevice([[maybe_unused]] Camera *camera)
+{
+ if (useCount() > 0)
+ return true;
+
+ /* Enable routing for all available sensors once */
+ int ret = crossbar_->setRouting(&routing_, V4L2Subdevice::ActiveFormat);
+ if (ret)
+ return false;
+
+ return true;
+}
+
bool PipelineHandlerISI::match(DeviceEnumerator *enumerator)
{
DeviceMatch dm("mxc-isi");
@@ -1034,7 +1051,6 @@ bool PipelineHandlerISI::match(DeviceEnumerator *enumerator)
unsigned int numSinks = 0;
const unsigned int xbarFirstSource = crossbar_->entity()->pads().size() - pipes_.size();
const unsigned int maxStreams = pipes_.size() / cameraCount;
- V4L2Subdevice::Routing routing = {};
for (MediaPad *pad : crossbar_->entity()->pads()) {
unsigned int sink = numSinks;
@@ -1104,7 +1120,7 @@ bool PipelineHandlerISI::match(DeviceEnumerator *enumerator)
/* Add routes to the crossbar switch routing table. */
for (unsigned i = 0; i < data->streams_.size(); i++) {
unsigned int sourcePad = xbarFirstSource + data->xbarSourceOffset_ + i;
- routing.emplace_back(V4L2Subdevice::Stream{ data->xbarSink_, 0 },
+ routing_.emplace_back(V4L2Subdevice::Stream{ data->xbarSink_, 0 },
V4L2Subdevice::Stream{ sourcePad, 0 },
V4L2_SUBDEV_ROUTE_FL_ACTIVE);
}
@@ -1116,10 +1132,6 @@ bool PipelineHandlerISI::match(DeviceEnumerator *enumerator)
numCameras++;
}
- ret = crossbar_->setRouting(&routing, V4L2Subdevice::ActiveFormat);
- if (ret)
- return false;
-
return numCameras > 0;
}