diff options
-rw-r--r-- | src/libcamera/include/pipeline_handler.h | 7 | ||||
-rw-r--r-- | src/libcamera/pipeline/ipu3/ipu3.cpp | 36 | ||||
-rw-r--r-- | src/libcamera/pipeline/uvcvideo.cpp | 32 | ||||
-rw-r--r-- | src/libcamera/pipeline/vimc.cpp | 35 | ||||
-rw-r--r-- | src/libcamera/pipeline_handler.cpp | 34 |
5 files changed, 144 insertions, 0 deletions
diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h index 080997e2..b4321f0f 100644 --- a/src/libcamera/include/pipeline_handler.h +++ b/src/libcamera/include/pipeline_handler.h @@ -18,6 +18,8 @@ class Camera; class CameraManager; class DeviceEnumerator; class MediaDevice; +class Stream; +class StreamConfiguration; class CameraData { @@ -38,6 +40,11 @@ public: PipelineHandler(CameraManager *manager); virtual ~PipelineHandler(); + virtual std::map<Stream *, StreamConfiguration> + streamConfiguration(Camera *camera, std::vector<Stream *> &streams) = 0; + virtual int configureStreams(Camera *camera, + std::map<Stream *, StreamConfiguration> &config) = 0; + virtual bool match(DeviceEnumerator *enumerator) = 0; protected: diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 52844da7..7823bbb5 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -28,6 +28,12 @@ public: PipelineHandlerIPU3(CameraManager *manager); ~PipelineHandlerIPU3(); + std::map<Stream *, StreamConfiguration> + streamConfiguration(Camera *camera, + std::vector<Stream *> &streams) override; + int configureStreams(Camera *camera, + std::map<Stream *, StreamConfiguration> &config) override; + bool match(DeviceEnumerator *enumerator); private: @@ -68,6 +74,36 @@ PipelineHandlerIPU3::~PipelineHandlerIPU3() imgu_->release(); } +std::map<Stream *, StreamConfiguration> +PipelineHandlerIPU3::streamConfiguration(Camera *camera, + std::vector<Stream *> &streams) +{ + IPU3CameraData *data = cameraData(camera); + + std::map<Stream *, StreamConfiguration> configs; + + StreamConfiguration config{}; + + LOG(IPU3, Info) << "TODO: Return a good default format"; + + configs[&data->stream_] = config; + + return configs; +} + +int PipelineHandlerIPU3::configureStreams(Camera *camera, + std::map<Stream *, StreamConfiguration> &config) +{ + IPU3CameraData *data = cameraData(camera); + + StreamConfiguration *cfg = &config[&data->stream_]; + + LOG(IPU3, Info) << "TODO: Configure the camera for resolution " + << cfg->width << "x" << cfg->height; + + return 0; +} + bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator) { DeviceMatch cio2_dm("ipu3-cio2"); diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index d2d3a1ed..821e4c21 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -24,6 +24,12 @@ public: PipelineHandlerUVC(CameraManager *manager); ~PipelineHandlerUVC(); + std::map<Stream *, StreamConfiguration> + streamConfiguration(Camera *camera, + std::vector<Stream *> &streams) override; + int configureStreams(Camera *camera, + std::map<Stream *, StreamConfiguration> &config) override; + bool match(DeviceEnumerator *enumerator); private: @@ -46,6 +52,32 @@ PipelineHandlerUVC::~PipelineHandlerUVC() media_->release(); } +std::map<Stream *, StreamConfiguration> +PipelineHandlerUVC::streamConfiguration(Camera *camera, + std::vector<Stream *> &streams) +{ + std::map<Stream *, StreamConfiguration> configs; + + StreamConfiguration config{}; + + LOG(UVC, Info) << "TODO: Return a good default format"; + + configs[&stream_] = config; + + return configs; +} + +int PipelineHandlerUVC::configureStreams(Camera *camera, + std::map<Stream *, StreamConfiguration> &config) +{ + StreamConfiguration *cfg = &config[&stream_]; + + LOG(UVC, Info) << "TODO: Configure the camera for resolution " + << cfg->width << "x" << cfg->height; + + return 0; +} + bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) { DeviceMatch dm("uvcvideo"); diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp index 9e1cf11a..6ed069ed 100644 --- a/src/libcamera/pipeline/vimc.cpp +++ b/src/libcamera/pipeline/vimc.cpp @@ -9,17 +9,26 @@ #include <libcamera/stream.h> #include "device_enumerator.h" +#include "log.h" #include "media_device.h" #include "pipeline_handler.h" namespace libcamera { +LOG_DEFINE_CATEGORY(VIMC) + class PipeHandlerVimc : public PipelineHandler { public: PipeHandlerVimc(CameraManager *manager); ~PipeHandlerVimc(); + std::map<Stream *, StreamConfiguration> + streamConfiguration(Camera *camera, + std::vector<Stream *> &streams) override; + int configureStreams(Camera *camera, + std::map<Stream *, StreamConfiguration> &config) override; + bool match(DeviceEnumerator *enumerator); private: @@ -38,6 +47,32 @@ PipeHandlerVimc::~PipeHandlerVimc() media_->release(); } +std::map<Stream *, StreamConfiguration> +PipeHandlerVimc::streamConfiguration(Camera *camera, + std::vector<Stream *> &streams) +{ + std::map<Stream *, StreamConfiguration> configs; + + StreamConfiguration config{}; + + LOG(VIMC, Info) << "TODO: Return a good default format"; + + configs[&stream_] = config; + + return configs; +} + +int PipeHandlerVimc::configureStreams(Camera *camera, + std::map<Stream *, StreamConfiguration> &config) +{ + StreamConfiguration *cfg = &config[&stream_]; + + LOG(VIMC, Info) << "TODO: Configure the camera for resolution " + << cfg->width << "x" << cfg->height; + + return 0; +} + bool PipeHandlerVimc::match(DeviceEnumerator *enumerator) { DeviceMatch dm("vimc"); diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 1c864079..3a560e10 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -75,6 +75,40 @@ PipelineHandler::~PipelineHandler() { }; + +/** + * \fn PipelineHandler::streamConfiguration() + * \brief Retrieve a group of stream configurations for a specified camera + * \param[in] camera The camera to fetch default configuration from + * \param[in] streams An array of streams to fetch information about + * + * Retrieve the species camera's default configuration for a specified group of + * streams. The caller shall populate the \a streams array with the streams it + * wish to fetch the configuration from. The map of streams and configuration + * returned can then be examined by the caller to learn about the defualt + * parameters for the specified streams. + * + * The intended companion to this is \a configureStreams() which can be used to + * change the group of streams parameters. + * + * \return A map of successfully retrieved streams and configurations or an + * empty map on error. + */ + +/** + * \fn PipelineHandler::configureStreams() + * \brief Configure a group of streams for capture + * \param[in] camera The camera to configure + * \param[in] config A map of stream configurations to apply + * + * Configure the specified group of streams for \a camera according to the + * configuration specified in \a configs. The intended caller of this interface + * is the Camera class which will receive configuration to apply from the + * application. + * + * \return 0 on success or a negative error code on error. + */ + /** * \fn PipelineHandler::match(DeviceEnumerator *enumerator) * \brief Match media devices and create camera instances |