diff options
author | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2019-04-05 02:52:59 +0200 |
---|---|---|
committer | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2019-04-09 16:59:19 +0200 |
commit | b0c730e330281f38ac51cb64d9581ed278759048 (patch) | |
tree | dd7398671330775d1ca302fe7871222a435eba6a | |
parent | 9a7dc3ce7f4253578a0f7c0d58417425c8155cb3 (diff) |
libcamera: Switch to CameraConfiguration
Implement the camera configuration thru out the library, tests, cam and
qcam tools.
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r-- | include/libcamera/camera.h | 4 | ||||
-rw-r--r-- | src/cam/main.cpp | 8 | ||||
-rw-r--r-- | src/libcamera/camera.cpp | 25 | ||||
-rw-r--r-- | src/libcamera/include/pipeline_handler.h | 6 | ||||
-rw-r--r-- | src/libcamera/pipeline/ipu3/ipu3.cpp | 10 | ||||
-rw-r--r-- | src/libcamera/pipeline/uvcvideo.cpp | 12 | ||||
-rw-r--r-- | src/libcamera/pipeline/vimc.cpp | 12 | ||||
-rw-r--r-- | src/libcamera/pipeline_handler.cpp | 6 | ||||
-rw-r--r-- | src/qcam/main_window.cpp | 2 | ||||
-rw-r--r-- | src/qcam/main_window.h | 2 | ||||
-rw-r--r-- | test/camera/camera_test.cpp | 18 | ||||
-rw-r--r-- | test/camera/camera_test.h | 2 | ||||
-rw-r--r-- | test/camera/capture.cpp | 8 | ||||
-rw-r--r-- | test/camera/configuration_default.cpp | 12 | ||||
-rw-r--r-- | test/camera/configuration_set.cpp | 6 | ||||
-rw-r--r-- | test/camera/statemachine.cpp | 2 |
16 files changed, 54 insertions, 81 deletions
diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index 6038da63..b2dafda3 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -73,9 +73,9 @@ public: int release(); const std::set<Stream *> &streams() const; - std::map<Stream *, StreamConfiguration> + CameraConfiguration streamConfiguration(const std::vector<StreamUsage> &usage); - int configureStreams(std::map<Stream *, StreamConfiguration> &config); + int configureStreams(const CameraConfiguration &config); int allocateBuffers(); int freeBuffers(); diff --git a/src/cam/main.cpp b/src/cam/main.cpp index d45ffd37..99ce564a 100644 --- a/src/cam/main.cpp +++ b/src/cam/main.cpp @@ -78,10 +78,10 @@ static int parseOptions(int argc, char *argv[]) return 0; } -static int prepareCameraConfig(std::map<Stream *, StreamConfiguration> *config) +static int prepareCameraConfig(CameraConfiguration *config) { *config = camera->streamConfiguration({ Stream::VideoRecording() }); - Stream *stream = config->begin()->first; + Stream *stream = config->front(); if (options.isSet(OptFormat)) { KeyValueParser::Options format = options[OptFormat]; @@ -135,7 +135,7 @@ static void requestComplete(Request *request, const std::map<Stream *, Buffer *> static int capture() { - std::map<Stream *, StreamConfiguration> config; + CameraConfiguration config; std::vector<Request *> requests; int ret; @@ -151,7 +151,7 @@ static int capture() return ret; } - Stream *stream = config.begin()->first; + Stream *stream = config.front(); ret = camera->allocateBuffers(); if (ret) { diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index ddf5c268..bdf14b31 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -543,21 +543,21 @@ const std::set<Stream *> &Camera::streams() const * list of stream usages and the camera returns a map of suitable streams and * their suggested default configurations. * - * \return A map of streams to configurations if the requested usages can be - * satisfied, or an empty map otherwise + * \return A valid CameraConfiguration if the requested usages can be satisfied, + * or a invalid one otherwise */ -std::map<Stream *, StreamConfiguration> +CameraConfiguration Camera::streamConfiguration(const std::vector<StreamUsage> &usages) { if (disconnected_ || !usages.size() || usages.size() > streams_.size()) - return std::map<Stream *, StreamConfiguration>{}; + return CameraConfiguration(); return pipe_->streamConfiguration(this, usages); } /** * \brief Configure the camera's streams prior to capture - * \param[in] config A map of stream IDs and configurations to setup + * \param[in] config The camera configurations to setup * * Prior to starting capture, the camera must be configured to select a * group of streams to be involved in the capture and their configuration. @@ -579,7 +579,7 @@ Camera::streamConfiguration(const std::vector<StreamUsage> &usages) * \retval -EACCES The camera is not in a state where it can be configured * \retval -EINVAL The configuration is not valid */ -int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config) +int Camera::configureStreams(const CameraConfiguration &config) { int ret; @@ -589,14 +589,14 @@ int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config) if (!stateBetween(CameraAcquired, CameraConfigured)) return -EACCES; - if (!config.size()) { + if (!config.isValid()) { LOG(Camera, Error) - << "Can't configure streams without a configuration"; + << "Can't configure camera with invalid configuration"; return -EINVAL; } - for (auto const &iter : config) { - if (streams_.find(iter.first) == streams_.end()) + for (Stream *stream : config) { + if (streams_.find(stream) == streams_.end()) return -EINVAL; } @@ -605,9 +605,8 @@ int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config) return ret; activeStreams_.clear(); - for (auto const &iter : config) { - Stream *stream = iter.first; - const StreamConfiguration &cfg = iter.second; + for (Stream *stream : config) { + const StreamConfiguration &cfg = config[stream]; stream->configuration_ = cfg; activeStreams_.insert(stream); diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h index 8a1706fa..b6cbd3ba 100644 --- a/src/libcamera/include/pipeline_handler.h +++ b/src/libcamera/include/pipeline_handler.h @@ -18,6 +18,7 @@ namespace libcamera { class Buffer; class BufferPool; class Camera; +class CameraConfiguration; class CameraManager; class DeviceEnumerator; class MediaDevice; @@ -52,10 +53,9 @@ public: virtual bool match(DeviceEnumerator *enumerator) = 0; - virtual std::map<Stream *, StreamConfiguration> + virtual CameraConfiguration streamConfiguration(Camera *camera, const std::vector<StreamUsage> &usages) = 0; - virtual int configureStreams(Camera *camera, - std::map<Stream *, StreamConfiguration> &config) = 0; + virtual int configureStreams(Camera *camera, const CameraConfiguration &config) = 0; virtual int allocateBuffers(Camera *camera, Stream *stream) = 0; virtual int freeBuffers(Camera *camera, Stream *stream) = 0; diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 5d01504e..ca09da75 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -139,11 +139,11 @@ public: PipelineHandlerIPU3(CameraManager *manager); ~PipelineHandlerIPU3(); - std::map<Stream *, StreamConfiguration> + CameraConfiguration streamConfiguration(Camera *camera, const std::vector<StreamUsage> &usages) override; int configureStreams(Camera *camera, - std::map<Stream *, StreamConfiguration> &config) override; + const CameraConfiguration &config) override; int allocateBuffers(Camera *camera, Stream *stream) override; int freeBuffers(Camera *camera, Stream *stream) override; @@ -204,11 +204,11 @@ PipelineHandlerIPU3::~PipelineHandlerIPU3() imguMediaDev_->release(); } -std::map<Stream *, StreamConfiguration> +CameraConfiguration PipelineHandlerIPU3::streamConfiguration(Camera *camera, const std::vector<StreamUsage> &usages) { - std::map<Stream *, StreamConfiguration> configs; + CameraConfiguration configs; IPU3CameraData *data = cameraData(camera); StreamConfiguration *config = &configs[&data->stream_]; @@ -234,7 +234,7 @@ PipelineHandlerIPU3::streamConfiguration(Camera *camera, } int PipelineHandlerIPU3::configureStreams(Camera *camera, - std::map<Stream *, StreamConfiguration> &config) + const CameraConfiguration &config) { IPU3CameraData *data = cameraData(camera); const StreamConfiguration &cfg = config[&data->stream_]; diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index dfff7116..cd472cfa 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -26,11 +26,11 @@ public: PipelineHandlerUVC(CameraManager *manager); ~PipelineHandlerUVC(); - std::map<Stream *, StreamConfiguration> + CameraConfiguration streamConfiguration(Camera *camera, const std::vector<StreamUsage> &usages) override; int configureStreams(Camera *camera, - std::map<Stream *, StreamConfiguration> &config) override; + const CameraConfiguration &config) override; int allocateBuffers(Camera *camera, Stream *stream) override; int freeBuffers(Camera *camera, Stream *stream) override; @@ -82,12 +82,12 @@ PipelineHandlerUVC::~PipelineHandlerUVC() media_->release(); } -std::map<Stream *, StreamConfiguration> +CameraConfiguration PipelineHandlerUVC::streamConfiguration(Camera *camera, const std::vector<StreamUsage> &usages) { UVCCameraData *data = cameraData(camera); - std::map<Stream *, StreamConfiguration> configs; + CameraConfiguration configs; StreamConfiguration config{}; config.width = 640; @@ -101,10 +101,10 @@ PipelineHandlerUVC::streamConfiguration(Camera *camera, } int PipelineHandlerUVC::configureStreams(Camera *camera, - std::map<Stream *, StreamConfiguration> &config) + const CameraConfiguration &config) { UVCCameraData *data = cameraData(camera); - StreamConfiguration *cfg = &config[&data->stream_]; + const StreamConfiguration *cfg = &config[&data->stream_]; int ret; LOG(UVC, Debug) << "Configure the camera for resolution " diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp index 4da4ca01..c8bbe2a1 100644 --- a/src/libcamera/pipeline/vimc.cpp +++ b/src/libcamera/pipeline/vimc.cpp @@ -26,11 +26,11 @@ public: PipelineHandlerVimc(CameraManager *manager); ~PipelineHandlerVimc(); - std::map<Stream *, StreamConfiguration> + CameraConfiguration streamConfiguration(Camera *camera, const std::vector<StreamUsage> &usages) override; int configureStreams(Camera *camera, - std::map<Stream *, StreamConfiguration> &config) override; + const CameraConfiguration &config) override; int allocateBuffers(Camera *camera, Stream *stream) override; int freeBuffers(Camera *camera, Stream *stream) override; @@ -82,12 +82,12 @@ PipelineHandlerVimc::~PipelineHandlerVimc() media_->release(); } -std::map<Stream *, StreamConfiguration> +CameraConfiguration PipelineHandlerVimc::streamConfiguration(Camera *camera, const std::vector<StreamUsage> &usages) { VimcCameraData *data = cameraData(camera); - std::map<Stream *, StreamConfiguration> configs; + CameraConfiguration configs; StreamConfiguration config{}; config.width = 640; @@ -101,10 +101,10 @@ PipelineHandlerVimc::streamConfiguration(Camera *camera, } int PipelineHandlerVimc::configureStreams(Camera *camera, - std::map<Stream *, StreamConfiguration> &config) + const CameraConfiguration &config) { VimcCameraData *data = cameraData(camera); - StreamConfiguration *cfg = &config[&data->stream_]; + const StreamConfiguration *cfg = &config[&data->stream_]; int ret; LOG(VIMC, Debug) << "Configure the camera for resolution " diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 0574f990..43550c0e 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -163,15 +163,15 @@ PipelineHandler::~PipelineHandler() * 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. + * \return A valid CameraConfiguration if the requested usages can be satisfied, + * or a invalid configuration otherwise */ /** * \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 + * \param[in] config The camera configurations to setup * * Configure the specified group of streams for \a camera according to the * configuration specified in \a configs. The intended caller of this interface diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index faa3bc57..4bc04403 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -98,7 +98,7 @@ int MainWindow::startCapture() int ret; config_ = camera_->streamConfiguration({ Stream::VideoRecording() }); - Stream *stream = config_.begin()->first; + Stream *stream = config_.front(); ret = camera_->configureStreams(config_); if (ret < 0) { std::cout << "Failed to configure camera" << std::endl; diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h index 5e27a8fd..9b31da2b 100644 --- a/src/qcam/main_window.h +++ b/src/qcam/main_window.h @@ -46,7 +46,7 @@ private: std::shared_ptr<Camera> camera_; bool isCapturing_; - std::map<Stream *, StreamConfiguration> config_; + CameraConfiguration config_; ViewFinder *viewfinder_; }; diff --git a/test/camera/camera_test.cpp b/test/camera/camera_test.cpp index 1609c4b0..24ff5fe0 100644 --- a/test/camera/camera_test.cpp +++ b/test/camera/camera_test.cpp @@ -45,21 +45,3 @@ void CameraTest::cleanup() cm_->stop(); }; - -bool CameraTest::configurationValid(const std::map<Stream *, StreamConfiguration> &config) const -{ - /* Test that the configuration is not empty. */ - if (config.empty()) - return false; - - /* Test that configuration is valid. */ - for (auto const &it : config) { - const StreamConfiguration &conf = it.second; - - if (conf.width == 0 || conf.height == 0 || - conf.pixelFormat == 0 || conf.bufferCount == 0) - return false; - } - - return true; -} diff --git a/test/camera/camera_test.h b/test/camera/camera_test.h index 5801fad3..ffc8a485 100644 --- a/test/camera/camera_test.h +++ b/test/camera/camera_test.h @@ -23,8 +23,6 @@ protected: int init(); void cleanup(); - bool configurationValid(const std::map<Stream *, StreamConfiguration> &config) const; - std::shared_ptr<Camera> camera_; private: diff --git a/test/camera/capture.cpp b/test/camera/capture.cpp index b8dbdb62..4e75a75c 100644 --- a/test/camera/capture.cpp +++ b/test/camera/capture.cpp @@ -42,12 +42,12 @@ protected: int run() { - std::map<Stream *, StreamConfiguration> conf = + CameraConfiguration conf = camera_->streamConfiguration({ Stream::VideoRecording() }); - Stream *stream = conf.begin()->first; - StreamConfiguration *sconf = &conf.begin()->second; + Stream *stream = conf.front(); + StreamConfiguration *sconf = &conf[stream]; - if (!configurationValid(conf)) { + if (!conf.isValid()) { cout << "Failed to read default configuration" << endl; return TestFail; } diff --git a/test/camera/configuration_default.cpp b/test/camera/configuration_default.cpp index 09861716..dd510668 100644 --- a/test/camera/configuration_default.cpp +++ b/test/camera/configuration_default.cpp @@ -18,17 +18,11 @@ class ConfigurationDefault : public CameraTest protected: int run() { - std::map<Stream *, StreamConfiguration> conf; + CameraConfiguration conf; /* Test asking for configuration for a video stream. */ conf = camera_->streamConfiguration({ Stream::VideoRecording() }); - if (conf.empty()) { - cout << "Failed to retrieve configuration for video streams" - << endl; - return TestFail; - } - - if (!configurationValid(conf)) { + if (!conf.isValid()) { cout << "Default configuration invalid" << endl; return TestFail; } @@ -38,7 +32,7 @@ protected: * stream usages returns an empty list of configurations. */ conf = camera_->streamConfiguration({}); - if (!conf.empty()) { + if (conf.isValid()) { cout << "Failed to retrieve configuration for empty usage list" << endl; return TestFail; diff --git a/test/camera/configuration_set.cpp b/test/camera/configuration_set.cpp index 1bc01e66..5ac2a7a9 100644 --- a/test/camera/configuration_set.cpp +++ b/test/camera/configuration_set.cpp @@ -18,11 +18,11 @@ class ConfigurationSet : public CameraTest protected: int run() { - std::map<Stream *, StreamConfiguration> conf = + CameraConfiguration conf = camera_->streamConfiguration({ Stream::VideoRecording() }); - StreamConfiguration *sconf = &conf.begin()->second; + StreamConfiguration *sconf = &conf[conf.front()]; - if (!configurationValid(conf)) { + if (!conf.isValid()) { cout << "Failed to read default configuration" << endl; return TestFail; } diff --git a/test/camera/statemachine.cpp b/test/camera/statemachine.cpp index ab3c6fb5..8ae93bee 100644 --- a/test/camera/statemachine.cpp +++ b/test/camera/statemachine.cpp @@ -265,7 +265,7 @@ protected: return TestPass; } - std::map<Stream *, StreamConfiguration> defconf_; + CameraConfiguration defconf_; }; } /* namespace */ |