summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline/uvcvideo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcamera/pipeline/uvcvideo.cpp')
-rw-r--r--src/libcamera/pipeline/uvcvideo.cpp51
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;
}