@@ -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;
void 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_;
};
@@ -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 */
@@ -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)
@@ -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());
@@ -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;