@@ -19,6 +19,7 @@
namespace libcamera {
+class CameraSensor;
class FrameBuffer;
class FrameBufferAllocator;
class PipelineHandler;
@@ -73,6 +74,10 @@ public:
const std::string &name,
const std::set<Stream *> &streams);
+ static std::shared_ptr<Camera> create(PipelineHandler *pipe,
+ const CameraSensor *sensor,
+ const std::set<Stream *> &streams);
+
Camera(const Camera &) = delete;
Camera &operator=(const Camera &) = delete;
@@ -14,6 +14,7 @@
#include <libcamera/request.h>
#include <libcamera/stream.h>
+#include "libcamera/internal/camera_sensor.h"
#include "libcamera/internal/log.h"
#include "libcamera/internal/pipeline_handler.h"
#include "libcamera/internal/utils.h"
@@ -473,6 +474,23 @@ std::shared_ptr<Camera> Camera::create(PipelineHandler *pipe,
return std::shared_ptr<Camera>(camera, Deleter());
}
+/**
+ * \brief Create a camera instance
+ * \param[in] pipe The pipeline handler responsible for the camera device
+ * \param[in] sensor The sensor of the camera device
+ * \param[in] streams Array of streams the camera provides
+ *
+ * Create a camera with name generated from \a sensor.
+ *
+ * \return A shared pointer to the newly created camera object
+ */
+std::shared_ptr<Camera> Camera::create(PipelineHandler *pipe,
+ const CameraSensor *sensor,
+ const std::set<Stream *> &streams)
+{
+ return Camera::create(pipe, sensor->id(), streams);
+}
+
/**
* \brief Retrieve the name of the camera
* \context This function is \threadsafe.
@@ -813,18 +813,16 @@ int PipelineHandlerIPU3::registerCameras()
&IPU3CameraData::imguOutputBufferReady);
/* Create and register the Camera instance. */
- std::string cameraName = cio2->sensor()->entity()->name();
- std::shared_ptr<Camera> camera = Camera::create(this,
- cameraName,
- streams);
-
- registerCamera(std::move(camera), std::move(data));
+ std::shared_ptr<Camera> camera =
+ Camera::create(this, cio2->sensor(), streams);
LOG(IPU3, Info)
<< "Registered Camera[" << numCameras << "] \""
- << cameraName << "\""
+ << camera->name() << "\""
<< " connected to CSI-2 receiver " << id;
+ registerCamera(std::move(camera), std::move(data));
+
numCameras++;
}
@@ -972,7 +972,8 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator)
streams.insert(&data->isp_[Isp::Stats]);
/* Create and register the camera. */
- std::shared_ptr<Camera> camera = Camera::create(this, data->sensor_->model(), streams);
+ std::shared_ptr<Camera> camera =
+ Camera::create(this, data->sensor_, streams);
registerCamera(std::move(camera), std::move(data));
return true;
@@ -971,7 +971,7 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)
std::set<Stream *> streams{ &data->stream_ };
std::shared_ptr<Camera> camera =
- Camera::create(this, sensor->name(), streams);
+ Camera::create(this, data->sensor_, streams);
registerCamera(std::move(camera), std::move(data));
return 0;
@@ -815,7 +815,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)
continue;
std::shared_ptr<Camera> camera =
- Camera::create(this, data->sensor_->entity()->name(),
+ Camera::create(this, data->sensor_.get(),
data->streams());
registerCamera(std::move(camera), std::move(data));
}
@@ -432,9 +432,9 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
return false;
/* Create and register the camera. */
- std::string name{ "VIMC " + data->sensor_->model() };
std::set<Stream *> streams{ &data->stream_ };
- std::shared_ptr<Camera> camera = Camera::create(this, name, streams);
+ std::shared_ptr<Camera> camera
+ = Camera::create(this, data->sensor_, streams);
registerCamera(std::move(camera), std::move(data));
return true;
Add a create() that generates a camera name from information in a CameraSensor. The intention is to help pipeline handlers that already uses CameraSensor to not have to worry about how to generate a unique and persistent name. All pipelines that use a CameraSensor (all but UVC) are updated to make use of this new function. All names of cameras created by these updated pipelines are modified. Before this change example of camera names: * OF based systems ov5695 7-0036 ov2685 7-003c * ACPI based systems ov13858 8-0010 ov5670 10-0036 After this change the same cameras are: * OF based systems base/i2c@ff160000/camera@36 base/i2c@ff160000/camera@3c * ACPI based systems \_SB_.PCI0.I2C2.CAM0 \_SB_.PCI0.I2C4.CAM1 Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> --- * Changes since v3 - Update commit message. - Do not include property_ids.h. --- include/libcamera/camera.h | 5 +++++ src/libcamera/camera.cpp | 18 ++++++++++++++++++ src/libcamera/pipeline/ipu3/ipu3.cpp | 12 +++++------- .../pipeline/raspberrypi/raspberrypi.cpp | 3 ++- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 2 +- src/libcamera/pipeline/simple/simple.cpp | 2 +- src/libcamera/pipeline/vimc/vimc.cpp | 4 ++-- 7 files changed, 34 insertions(+), 12 deletions(-)