@@ -19,6 +19,7 @@
namespace libcamera {
+class CameraSensor;
class FrameBuffer;
class FrameBufferAllocator;
class PipelineHandler;
@@ -74,6 +75,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,7 +14,9 @@
#include <libcamera/request.h>
#include <libcamera/stream.h>
+#include "libcamera/internal/camera_sensor.h"
#include "libcamera/internal/log.h"
+#include "libcamera/internal/media_object.h"
#include "libcamera/internal/pipeline_handler.h"
#include "libcamera/internal/utils.h"
@@ -477,6 +479,24 @@ 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 and ID 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(), sensor->entity()->name(),
+ streams);
+}
+
/**
* \brief Retrieve the name of the camera
* \context This function is \threadsafe.
@@ -813,19 +813,17 @@ 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,
- cio2->sensor()->id(),
- cameraName,
+ cio2->sensor(),
streams);
- registerCamera(std::move(camera), std::move(data));
-
LOG(IPU3, Info)
<< "Registered Camera[" << numCameras << "] \""
- << cameraName << "\""
+ << camera->name() << "\""
<< " connected to CSI-2 receiver " << id;
+ registerCamera(std::move(camera), std::move(data));
+
numCameras++;
}
@@ -973,9 +973,7 @@ 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_->id(),
- data->sensor_->entity()->name(),
+ std::shared_ptr<Camera> camera = Camera::create(this, data->sensor_,
streams);
registerCamera(std::move(camera), std::move(data));
@@ -971,8 +971,7 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)
std::set<Stream *> streams{ &data->stream_ };
std::shared_ptr<Camera> camera =
- Camera::create(this, data->sensor_->id(), sensor->name(),
- streams);
+ Camera::create(this, data->sensor_, streams);
registerCamera(std::move(camera), std::move(data));
return 0;
@@ -800,9 +800,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)
continue;
std::shared_ptr<Camera> camera =
- Camera::create(this, data->sensor_->id(),
- data->sensor_->entity()->name(),
- data->streams());
+ Camera::create(this, data->sensor_.get(), data->streams());
registerCamera(std::move(camera), std::move(data));
}
@@ -433,8 +433,7 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
/* Create and register the camera. */
std::set<Stream *> streams{ &data->stream_ };
- std::shared_ptr<Camera> camera = Camera::create(this, data->sensor_->id(),
- data->sensor_->entity()->name(),
+ std::shared_ptr<Camera> camera = Camera::create(this, data->sensor_,
streams);
registerCamera(std::move(camera), std::move(data));
To make help pipeline handlers name their cameras more uniformly add a second Camera::create() method that takes a CameraSensor instead of a name and ID as arguments. The CameraSensor is used to generate the name and ID for the camera. The new create() method is optional and pipelines may still control the name and ID themself if they wish. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> --- include/libcamera/camera.h | 5 +++++ src/libcamera/camera.cpp | 20 +++++++++++++++++++ src/libcamera/pipeline/ipu3/ipu3.cpp | 10 ++++------ .../pipeline/raspberrypi/raspberrypi.cpp | 4 +--- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 3 +-- src/libcamera/pipeline/simple/simple.cpp | 4 +--- src/libcamera/pipeline/vimc/vimc.cpp | 3 +-- 7 files changed, 33 insertions(+), 16 deletions(-)