@@ -489,10 +489,11 @@ handler.
Once the camera data has been initialized, the Camera device instances and the
associated streams have to be registered. Create a set of streams for the
-camera, which for this device is only one. You create a camera using the static
-:doxy-int:`Camera::create` function, passing the Camera::Private instance, the
-id of the camera, and the streams available. Then register the camera with the
-pipeline handler and camera manager using :doxy-int:`PipelineHandler::registerCamera`.
+camera, which for this device is only one. You create a camera using the
+protected :doxy-int:`PipelineHandler::createCamera` helper, passing the
+Camera::Private instance, the id of the camera, and the streams available.
+Then register the camera with the pipeline handler and camera manager using
+:doxy-int:`PipelineHandler::registerCamera`.
Finally with a successful construction, we return 'true' indicating that the
PipelineHandler successfully matched and constructed a device.
@@ -501,7 +502,7 @@ PipelineHandler successfully matched and constructed a device.
std::set<Stream *> streams{ &data->stream_ };
const char *id = data->video_->deviceName();
- std::shared_ptr<Camera> camera = Camera::create(std::move(data), id, streams);
+ std::shared_ptr<Camera> camera = createCamera(std::move(data), id, streams);
registerCamera(std::move(camera));
return true;
@@ -529,7 +530,7 @@ Our match function should now look like the following:
/* Create and register the camera. */
std::set<Stream *> streams{ &data->stream_ };
const char *id = data->video_->deviceName();
- std::shared_ptr<Camera> camera = Camera::create(std::move(data), id, streams);
+ std::shared_ptr<Camera> camera = createCamera(std::move(data), id, streams);
registerCamera(std::move(camera));
return true;
@@ -116,10 +116,6 @@ class Camera final : public Object, public std::enable_shared_from_this<Camera>,
LIBCAMERA_DECLARE_PRIVATE()
public:
- static std::shared_ptr<Camera> create(std::unique_ptr<Private> d,
- const std::string &id,
- const std::set<Stream *> &streams);
-
const std::string &id() const;
Signal<Request *, FrameBuffer *> bufferCompleted;
@@ -154,6 +150,10 @@ public:
private:
LIBCAMERA_DISABLE_COPY(Camera)
+ static std::shared_ptr<Camera> create(std::unique_ptr<Private> d,
+ const std::string &id,
+ const std::set<Stream *> &streams);
+
Camera(std::unique_ptr<Private> d, const std::string &id,
const std::set<Stream *> &streams);
~Camera();
@@ -14,6 +14,7 @@
#include <libcamera/base/object.h>
+#include <libcamera/camera.h>
#include <libcamera/controls.h>
#include <libcamera/stream.h>
@@ -80,6 +81,10 @@ public:
}
protected:
+ std::shared_ptr<Camera> createCamera(std::unique_ptr<Camera::Private> d,
+ const std::string &id,
+ const std::set<Stream *> &streams);
+
void registerCamera(std::shared_ptr<Camera> camera);
void hotplugMediaDevice(std::shared_ptr<MediaDevice> media);
unsigned int useCount() const { return useCount_; }
@@ -1101,7 +1101,7 @@ bool PipelineHandlerISI::match(DeviceEnumerator *enumerator)
}
std::shared_ptr<Camera> camera =
- Camera::create(std::move(data), id, streams);
+ createCamera(std::move(data), id, streams);
registerCamera(std::move(camera));
numCameras++;
@@ -1133,7 +1133,7 @@ int PipelineHandlerIPU3::registerCameras()
/* Create and register the Camera instance. */
const std::string &cameraId = cio2->sensor()->id();
std::shared_ptr<Camera> camera =
- Camera::create(std::move(data), cameraId, streams);
+ createCamera(std::move(data), cameraId, streams);
registerCamera(std::move(camera));
@@ -1778,8 +1778,7 @@ bool PipelineHandlerMaliC55::registerMaliCamera(std::unique_ptr<MaliC55CameraDat
if (dsFitted_)
streams.insert(&data->dsStream_);
- std::shared_ptr<Camera> camera = Camera::create(std::move(data),
- name, streams);
+ std::shared_ptr<Camera> camera = createCamera(std::move(data), name, streams);
registerCamera(std::move(camera));
return true;
@@ -1504,7 +1504,7 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)
};
const std::string &id = data->sensor_->id();
std::shared_ptr<Camera> camera =
- Camera::create(std::move(data), id, streams);
+ createCamera(std::move(data), id, streams);
registerCamera(std::move(camera));
@@ -1175,7 +1175,7 @@ int PipelineHandlerPiSP::platformRegister(std::unique_ptr<RPi::CameraData> &came
/* Create and register the camera. */
const std::string &id = data->sensor_->id();
std::shared_ptr<Camera> camera =
- Camera::create(std::move(cameraData), id, streams);
+ createCamera(std::move(cameraData), id, streams);
PipelineHandler::registerCamera(std::move(camera));
LOG(RPI, Info) << "Registered camera " << id
@@ -400,7 +400,7 @@ int PipelineHandlerVc4::platformRegister(std::unique_ptr<RPi::CameraData> &camer
/* Create and register the camera. */
const std::string &id = data->sensor_->id();
std::shared_ptr<Camera> camera =
- Camera::create(std::move(cameraData), id, streams);
+ createCamera(std::move(cameraData), id, streams);
PipelineHandler::registerCamera(std::move(camera));
LOG(RPI, Info) << "Registered camera " << id
@@ -2002,7 +2002,7 @@ bool SimplePipelineHandler::matchDevice(std::shared_ptr<MediaDevice> media,
const std::string &id = data->sensor_->id();
std::shared_ptr<Camera> camera =
- Camera::create(std::move(data), id, streams);
+ createCamera(std::move(data), id, streams);
registerCamera(std::move(camera));
registered = true;
}
@@ -485,7 +485,7 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
std::string id = data->id();
std::set<Stream *> streams{ &data->stream_ };
std::shared_ptr<Camera> camera =
- Camera::create(std::move(data), id, streams);
+ createCamera(std::move(data), id, streams);
registerCamera(std::move(camera));
/* Enable hot-unplug notifications. */
@@ -510,7 +510,7 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
std::set<Stream *> streams{ &data->stream_ };
const std::string &id = data->sensor_->id();
std::shared_ptr<Camera> camera =
- Camera::create(std::move(data), id, streams);
+ createCamera(std::move(data), id, streams);
registerCamera(std::move(camera));
return true;
@@ -402,7 +402,7 @@ bool PipelineHandlerVirtual::match([[maybe_unused]] DeviceEnumerator *enumerator
for (auto &streamConfig : data->streamConfigs_)
streams.insert(&streamConfig.stream);
std::string id = data->config_.id;
- std::shared_ptr<Camera> camera = Camera::create(std::move(data), id, streams);
+ std::shared_ptr<Camera> camera = createCamera(std::move(data), id, streams);
if (!initFrameGenerator(camera.get())) {
LOG(Virtual, Error) << "Failed to initialize frame "
@@ -76,6 +76,13 @@ PipelineHandler::PipelineHandler(CameraManager *manager,
{
}
+std::shared_ptr<Camera> PipelineHandler::createCamera(std::unique_ptr<Camera::Private> d,
+ const std::string &id,
+ const std::set<Stream *> &streams)
+{
+ return Camera::create(std::move(d), id, streams);
+}
+
PipelineHandler::~PipelineHandler()
{
for (std::shared_ptr<MediaDevice> &media : mediaDevices_)
From: zcy <tju_cooyun@163.com> Make Camera::create a private implementation detail since it is only used by pipeline handler subclasses. This prevents app users from misunderstanding or misusing the function. Add a protected PipelineHandler::createCamera helper so pipeline implementations can create Camera instances internally. --- Documentation/guides/pipeline-handler.rst | 13 +++++++------ include/libcamera/camera.h | 8 ++++---- include/libcamera/internal/pipeline_handler.h | 5 +++++ src/libcamera/pipeline/imx8-isi/imx8-isi.cpp | 2 +- src/libcamera/pipeline/ipu3/ipu3.cpp | 2 +- src/libcamera/pipeline/mali-c55/mali-c55.cpp | 3 +-- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 2 +- src/libcamera/pipeline/rpi/pisp/pisp.cpp | 2 +- src/libcamera/pipeline/rpi/vc4/vc4.cpp | 2 +- src/libcamera/pipeline/simple/simple.cpp | 2 +- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 2 +- src/libcamera/pipeline/vimc/vimc.cpp | 2 +- src/libcamera/pipeline/virtual/virtual.cpp | 2 +- src/libcamera/pipeline_handler.cpp | 7 +++++++ 14 files changed, 33 insertions(+), 21 deletions(-)