diff options
-rw-r--r-- | include/libcamera/camera.h | 7 | ||||
-rw-r--r-- | src/libcamera/camera.cpp | 26 | ||||
-rw-r--r-- | src/libcamera/pipeline/ipu3/ipu3.cpp | 8 | ||||
-rw-r--r-- | src/libcamera/pipeline/uvcvideo.cpp | 5 | ||||
-rw-r--r-- | src/libcamera/pipeline/vimc.cpp | 5 |
5 files changed, 44 insertions, 7 deletions
diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index a2635402..cee96e9a 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -15,12 +15,14 @@ namespace libcamera { class PipelineHandler; +class Stream; class Camera final { public: static std::shared_ptr<Camera> create(PipelineHandler *pipe, - const std::string &name); + const std::string &name, + const std::vector<Stream *> &streams); Camera(const Camera &) = delete; Camera &operator=(const Camera &) = delete; @@ -32,6 +34,8 @@ public: int acquire(); void release(); + const std::vector<Stream *> &streams() const; + private: Camera(PipelineHandler *pipe, const std::string &name); ~Camera(); @@ -41,6 +45,7 @@ private: std::shared_ptr<PipelineHandler> pipe_; std::string name_; + std::vector<Stream *> streams_; bool acquired_; }; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 500976b2..49f49fb7 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -6,6 +6,7 @@ */ #include <libcamera/camera.h> +#include <libcamera/stream.h> #include "log.h" #include "pipeline_handler.h" @@ -56,13 +57,15 @@ LOG_DECLARE_CATEGORY(Camera) * \brief Create a camera instance * \param[in] name The name of the camera device * \param[in] pipe The pipeline handler responsible for the camera device + * \param[in] streams Array of streams the camera provides * * The caller is responsible for guaranteeing unicity of the camera name. * * \return A shared pointer to the newly created camera object */ std::shared_ptr<Camera> Camera::create(PipelineHandler *pipe, - const std::string &name) + const std::string &name, + const std::vector<Stream *> &streams) { struct Allocator : std::allocator<Camera> { void construct(void *p, PipelineHandler *pipe, @@ -76,7 +79,12 @@ std::shared_ptr<Camera> Camera::create(PipelineHandler *pipe, } }; - return std::allocate_shared<Camera>(Allocator(), pipe, name); + std::shared_ptr<Camera> camera = + std::allocate_shared<Camera>(Allocator(), pipe, name); + + camera->streams_ = streams; + + return camera; } /** @@ -164,4 +172,18 @@ void Camera::release() acquired_ = false; } +/** + * \brief Retrieve all the camera's stream information + * + * Retrieve all of the camera's static stream information. The static + * information describes among other things how many streams the camera + * supports and the capabilities of each stream. + * + * \return An array of all the camera's streams. + */ +const std::vector<Stream *> &Camera::streams() const +{ + return streams_; +} + } /* namespace libcamera */ diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 80f4a7bf..52844da7 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -9,6 +9,7 @@ #include <vector> #include <libcamera/camera.h> +#include <libcamera/stream.h> #include "device_enumerator.h" #include "log.h" @@ -37,6 +38,7 @@ private: : dev_(nullptr) {} ~IPU3CameraData() { delete dev_; } V4L2Device *dev_; + Stream stream_; }; std::shared_ptr<MediaDevice> cio2_; @@ -202,15 +204,17 @@ void PipelineHandlerIPU3::registerCameras() if (link->setEnabled(true)) continue; + std::unique_ptr<IPU3CameraData> data = utils::make_unique<IPU3CameraData>(); + std::string cameraName = sensor->name() + " " + std::to_string(id); - std::shared_ptr<Camera> camera = Camera::create(this, cameraName); + std::vector<Stream *> streams{ &data->stream_ }; + std::shared_ptr<Camera> camera = Camera::create(this, cameraName, streams); /* * If V4L2 device creation fails, the Camera instance won't be * registered. The 'camera' shared pointer goes out of scope * and deletes the Camera it manages. */ - std::unique_ptr<IPU3CameraData> data = utils::make_unique<IPU3CameraData>(); data->dev_ = createVideoDevice(id); if (!data->dev_) { LOG(IPU3, Error) diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index 2ebdb2b9..d2d3a1ed 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -6,6 +6,7 @@ */ #include <libcamera/camera.h> +#include <libcamera/stream.h> #include "device_enumerator.h" #include "log.h" @@ -28,6 +29,7 @@ public: private: std::shared_ptr<MediaDevice> media_; V4L2Device *video_; + Stream stream_; }; PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager) @@ -70,7 +72,8 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) return false; } - std::shared_ptr<Camera> camera = Camera::create(this, media_->model()); + std::vector<Stream *> streams{ &stream_ }; + std::shared_ptr<Camera> camera = Camera::create(this, media_->model(), streams); registerCamera(std::move(camera)); hotplugMediaDevice(media_.get()); diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp index f58a97d5..9e1cf11a 100644 --- a/src/libcamera/pipeline/vimc.cpp +++ b/src/libcamera/pipeline/vimc.cpp @@ -6,6 +6,7 @@ */ #include <libcamera/camera.h> +#include <libcamera/stream.h> #include "device_enumerator.h" #include "media_device.h" @@ -23,6 +24,7 @@ public: private: std::shared_ptr<MediaDevice> media_; + Stream stream_; }; PipeHandlerVimc::PipeHandlerVimc(CameraManager *manager) @@ -56,7 +58,8 @@ bool PipeHandlerVimc::match(DeviceEnumerator *enumerator) media_->acquire(); - std::shared_ptr<Camera> camera = Camera::create(this, "Dummy VIMC Camera"); + std::vector<Stream *> streams{ &stream_ }; + std::shared_ptr<Camera> camera = Camera::create(this, "Dummy VIMC Camera", streams); registerCamera(std::move(camera)); return true; |