[libcamera-devel] [PATCH/RFC 11/12] libcamera: pipeline: uvcvideo: Validate format in UVCCameraConfiguration::validate()
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat May 18 01:06:20 CEST 2019
From: Niklas Söderlund <niklas.soderlund at ragnatech.se>
Validate and potentially adjust the requested format with a list of
discrete formats retrieved from the video device.
Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
src/libcamera/pipeline/uvcvideo.cpp | 44 ++++++++++++++++++++++++-----
1 file changed, 37 insertions(+), 7 deletions(-)
diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
index 286d19b0af01..e02d5b19e82a 100644
--- a/src/libcamera/pipeline/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo.cpp
@@ -37,6 +37,7 @@ public:
V4L2Device *video_;
Stream stream_;
+ StreamFormats formats_;
};
class UVCCameraConfiguration : public CameraConfiguration
@@ -45,6 +46,7 @@ public:
UVCCameraConfiguration();
Status validate() override;
+ StreamFormats formats;
};
class PipelineHandlerUVC : public PipelineHandler
@@ -96,21 +98,42 @@ CameraConfiguration::Status UVCCameraConfiguration::validate()
StreamConfiguration &cfg = config_[0];
- /* \todo: Validate the configuration against the device capabilities. */
const unsigned int pixelFormat = cfg.pixelFormat;
const Size size = cfg.size;
+ const unsigned int bufferCount = cfg.bufferCount;
cfg.pixelFormat = V4L2_PIX_FMT_YUYV;
- cfg.size = { 640, 480 };
+ if (cfg.pixelFormat != pixelFormat) {
+ LOG(UVC, Debug)
+ << "Adjusting pixel format from " << pixelFormat
+ << " to " << cfg.pixelFormat;
+ status = Adjusted;
+ }
- if (cfg.pixelFormat != pixelFormat || cfg.size != size) {
+ const std::vector<Size> &formatSizes = formats.sizes(cfg.pixelFormat);
+ cfg.size = formatSizes.front();
+ for (const Size &formatsSize : formatSizes) {
+ if (formatsSize <= size)
+ cfg.size = formatsSize;
+
+ if (formatsSize == size)
+ break;
+ }
+
+ if (cfg.size != size) {
LOG(UVC, Debug)
- << "Adjusting configuration from " << cfg.toString()
- << " to " << cfg.size.toString() << "-YUYV";
+ << "Adjusting size from " << size.toString()
+ << " to " << cfg.size.toString();
status = Adjusted;
}
- cfg.bufferCount = 4;
+ if (bufferCount < 4) {
+ cfg.bufferCount = 4;
+ LOG(UVC, Debug)
+ << "Adjusting buffer count from " << bufferCount
+ << " to " << cfg.bufferCount;
+ status = Adjusted;
+ }
return status;
}
@@ -123,7 +146,10 @@ PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager)
CameraConfiguration *PipelineHandlerUVC::generateConfiguration(Camera *camera,
const StreamRoles &roles)
{
- CameraConfiguration *config = new UVCCameraConfiguration();
+ UVCCameraData *data = cameraData(camera);
+ UVCCameraConfiguration *config = new UVCCameraConfiguration();
+
+ config->formats = data->formats_;
if (!roles.empty()) {
StreamConfiguration cfg{};
@@ -242,6 +268,10 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
if (data->video_->open())
return false;
+ data->formats_ = StreamFormats(data->video_->enumerateFrameSizes({ V4L2_PIX_FMT_YUYV }));
+ for (const Size &size : data->formats_.sizes(V4L2_PIX_FMT_YUYV))
+ LOG(UVC, Info) << size.toString();
+
data->video_->bufferReady.connect(data.get(), &UVCCameraData::bufferReady);
/* Create and register the camera. */
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list