libcamera: camera: extend camera object to support streams
A camera consists of one or more video streams originating from the same video source. The different streams could for example have access to different hardware blocks in the video pipeline and therefore be able to process the video source in different ways. All static information describing each stream need to be recorded at camera creation. After a camera is created an application can retrieve the static information about its streams at any time. Update all pipeline handlers to register one stream per camera, this will be extended in the future for some of the pipelines. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
ff96eb2ebb
commit
75476f86d2
5 changed files with 44 additions and 7 deletions
|
@ -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_;
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue