[libcamera-devel] [PATCH v3 07/22] v4l2: v4l2_camera: Add validateConfiguration

Paul Elder paul.elder at ideasonboard.com
Sat Jul 4 15:31:25 CEST 2020


In V4L2CameraProxy, we need a way to validate formats and sizes, to
implement try_fmt. Instead of manually checking it against the cached
list of formats and sizes, add V4L2Camera::validateConfiguration that we
can use to implement try_fmt.

Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>

---
New in v3
---
 src/v4l2/v4l2_camera.cpp | 29 +++++++++++++++++++++++++++++
 src/v4l2/v4l2_camera.h   |  3 +++
 2 files changed, 32 insertions(+)

diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp
index ffc1230..326e1c2 100644
--- a/src/v4l2/v4l2_camera.cpp
+++ b/src/v4l2/v4l2_camera.cpp
@@ -138,6 +138,35 @@ int V4L2Camera::configure(StreamConfiguration *streamConfigOut,
 	return 0;
 }
 
+int V4L2Camera::validateConfiguration(StreamConfiguration *streamConfigOut,
+				      const Size &size,
+				      const PixelFormat &pixelFormat)
+{
+	if (!streamConfigOut)
+		return -EINVAL;
+
+	std::unique_ptr<CameraConfiguration> config =
+		camera_->generateConfiguration({ StreamRole::Viewfinder });
+	StreamConfiguration &cfg = config->at(0);
+	cfg.size.width = size.width;
+	cfg.size.height = size.height;
+	cfg.pixelFormat = pixelFormat;
+	cfg.bufferCount = 1;
+
+	CameraConfiguration::Status validation = config->validate();
+	if (validation == CameraConfiguration::Invalid)
+		return -EINVAL;
+
+	streamConfigOut->pixelFormat = cfg.pixelFormat;
+	streamConfigOut->size.width  = cfg.size.width;
+	streamConfigOut->size.height = cfg.size.height;
+	streamConfigOut->bufferCount = cfg.bufferCount;
+	streamConfigOut->stride      = cfg.stride;
+	streamConfigOut->frameSize   = cfg.frameSize;
+
+	return 0;
+}
+
 int V4L2Camera::allocBuffers(unsigned int count)
 {
 	Stream *stream = *camera_->streams().begin();
diff --git a/src/v4l2/v4l2_camera.h b/src/v4l2/v4l2_camera.h
index 515e906..15a9363 100644
--- a/src/v4l2/v4l2_camera.h
+++ b/src/v4l2/v4l2_camera.h
@@ -47,6 +47,9 @@ public:
 	int configure(StreamConfiguration *streamConfigOut,
 		      const Size &size, const PixelFormat &pixelformat,
 		      unsigned int bufferCount);
+	int validateConfiguration(StreamConfiguration *streamConfigOut,
+				  const Size &size,
+				  const PixelFormat &pixelformat);
 
 	int allocBuffers(unsigned int count);
 	void freeBuffers();
-- 
2.27.0



More information about the libcamera-devel mailing list