pipeline: raspberrypi: Move sensor entity detection out of registerCamera()

Enumerate the sensor device entities in PipelineHandlerRPi::match() and loop
over PipelineHandlerRPi::registerCamera() for each sensor found. This will
allow the pipeline handler to register multiple cameras attached to a single
Unicam instance with a Video Mux device.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Naushir Patuck
2022-01-04 12:57:08 +00:00
committed by Kieran Bingham
parent cd7863503a
commit 8400cb0711
@@ -312,7 +312,7 @@ private:
return static_cast<RPiCameraData *>(camera->_d());
}
int registerCamera(MediaDevice *unicam, MediaDevice *isp);
int registerCamera(MediaDevice *unicam, MediaDevice *isp, MediaEntity *sensorEntity);
int queueAllBuffers(Camera *camera);
int prepareBuffers(Camera *camera);
void freeBuffers(Camera *camera);
@@ -1069,16 +1069,28 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator)
return false;
}
int ret = registerCamera(unicamDevice, ispDevice);
if (ret) {
LOG(RPI, Error) << "Failed to register camera: " << ret;
return false;
/*
* The loop below is used to register multiple cameras behind one or more
* video mux devices that are attached to a particular Unicam instance.
* Obviously these cameras cannot be used simultaneously.
*/
unsigned int numCameras = 0;
for (MediaEntity *entity : unicamDevice->entities()) {
if (entity->function() != MEDIA_ENT_F_CAM_SENSOR)
continue;
int ret = registerCamera(unicamDevice, ispDevice, entity);
if (ret)
LOG(RPI, Error) << "Failed to register camera "
<< entity->name() << ": " << ret;
else
numCameras++;
}
return true;
return !!numCameras;
}
int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp)
int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp, MediaEntity *sensorEntity)
{
std::unique_ptr<RPiCameraData> data = std::make_unique<RPiCameraData>(this);
@@ -1119,14 +1131,7 @@ int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp)
data->isp_[Isp::Output1].dev()->bufferReady.connect(data.get(), &RPiCameraData::ispOutputDequeue);
data->isp_[Isp::Stats].dev()->bufferReady.connect(data.get(), &RPiCameraData::ispOutputDequeue);
/* Identify the sensor. */
for (MediaEntity *entity : unicam->entities()) {
if (entity->function() == MEDIA_ENT_F_CAM_SENSOR) {
data->sensor_ = std::make_unique<CameraSensor>(entity);
break;
}
}
data->sensor_ = std::make_unique<CameraSensor>(sensorEntity);
if (!data->sensor_)
return -EINVAL;