diff options
Diffstat (limited to 'src/libcamera/pipeline/uvcvideo.cpp')
-rw-r--r-- | src/libcamera/pipeline/uvcvideo.cpp | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index 4ffe52aa..45260f34 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -39,6 +39,14 @@ public: Stream stream_; }; +class UVCCameraConfiguration : public CameraConfiguration +{ +public: + UVCCameraConfiguration(); + + Status validate() override; +}; + class PipelineHandlerUVC : public PipelineHandler { public: @@ -68,6 +76,45 @@ private: } }; +UVCCameraConfiguration::UVCCameraConfiguration() + : CameraConfiguration() +{ +} + +CameraConfiguration::Status UVCCameraConfiguration::validate() +{ + Status status = Valid; + + if (config_.empty()) + return Invalid; + + /* Cap the number of entries to the available streams. */ + if (config_.size() > 1) { + config_.resize(1); + status = Adjusted; + } + + StreamConfiguration &cfg = config_[0]; + + /* \todo: Validate the configuration against the device capabilities. */ + const unsigned int pixelFormat = cfg.pixelFormat; + const Size size = cfg.size; + + cfg.pixelFormat = V4L2_PIX_FMT_YUYV; + cfg.size = { 640, 480 }; + + if (cfg.pixelFormat != pixelFormat || cfg.size != size) { + LOG(UVC, Debug) + << "Adjusting configuration from " << cfg.toString() + << " to " << cfg.size.toString() << "-YUYV"; + status = Adjusted; + } + + cfg.bufferCount = 4; + + return status; +} + PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager) : PipelineHandler(manager) { @@ -76,7 +123,7 @@ PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager) CameraConfiguration *PipelineHandlerUVC::generateConfiguration(Camera *camera, const StreamRoles &roles) { - CameraConfiguration *config = new CameraConfiguration(); + CameraConfiguration *config = new UVCCameraConfiguration(); if (roles.empty()) return config; @@ -88,6 +135,8 @@ CameraConfiguration *PipelineHandlerUVC::generateConfiguration(Camera *camera, config->addConfiguration(cfg); + config->validate(); + return config; } |