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