[libcamera-devel] [RFC PATCH 1/2] libcamera: v4l2_videodevice: Get formats even if no framesizes

Paul Elder paul.elder at ideasonboard.com
Tue Jul 19 14:10:02 CEST 2022


V4L2VideoDevice::formats() returns an empty list of formats if enumSizes
fails, including if the driver doesn't implement ENUM_FRAMESIZES.

Add an optional ignoreSizes parameter to formats() so that it can still
be used when the pipeline handler knows that its driver doesn't
implement ENUM_FRAMESIZES.

Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
---
 include/libcamera/internal/v4l2_videodevice.h |  2 +-
 src/libcamera/v4l2_videodevice.cpp            | 12 ++++++++----
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h
index 8525acbc..6cc9be85 100644
--- a/include/libcamera/internal/v4l2_videodevice.h
+++ b/include/libcamera/internal/v4l2_videodevice.h
@@ -205,7 +205,7 @@ public:
 	int getFormat(V4L2DeviceFormat *format);
 	int tryFormat(V4L2DeviceFormat *format);
 	int setFormat(V4L2DeviceFormat *format);
-	Formats formats(uint32_t code = 0);
+	Formats formats(uint32_t code = 0, bool ignoreSizes = false);
 
 	int setSelection(unsigned int target, Rectangle *rect);
 
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index 63911339..b8bd4bc4 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -1045,14 +1045,18 @@ int V4L2VideoDevice::trySetFormatSingleplane(V4L2DeviceFormat *format, bool set)
  *
  * \return A list of the supported video device formats
  */
-V4L2VideoDevice::Formats V4L2VideoDevice::formats(uint32_t code)
+V4L2VideoDevice::Formats V4L2VideoDevice::formats(uint32_t code, bool ignoreSizes)
 {
 	Formats formats;
 
 	for (V4L2PixelFormat pixelFormat : enumPixelformats(code)) {
-		std::vector<SizeRange> sizes = enumSizes(pixelFormat);
-		if (sizes.empty())
-			return {};
+		std::vector<SizeRange> sizes;
+
+		if (!ignoreSizes) {
+			sizes = enumSizes(pixelFormat);
+			if (sizes.empty())
+				return {};
+		}
 
 		if (formats.find(pixelFormat) != formats.end()) {
 			LOG(V4L2, Error)
-- 
2.30.2



More information about the libcamera-devel mailing list