[libcamera-devel] [PATCH] libcamera: pipeline: vimc: Support format enumeration

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Oct 25 05:20:16 CEST 2019


Fill the StreamConfiguration with all supported formats. The list of
supported formats is currently hardcoded based on the limits of the vimc
driver.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/libcamera/pipeline/vimc.cpp | 33 ++++++++++++++++++++++++---------
 1 file changed, 24 insertions(+), 9 deletions(-)

diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index dcdaef120ad1..c16ae4cb76b5 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -103,6 +103,16 @@ private:
 	}
 };
 
+namespace {
+
+constexpr std::array<unsigned int, 3> pixelformats{
+	V4L2_PIX_FMT_BGR24,
+	V4L2_PIX_FMT_RGB24,
+	V4L2_PIX_FMT_ARGB32,
+};
+
+} /* namespace */
+
 VimcCameraConfiguration::VimcCameraConfiguration()
 	: CameraConfiguration()
 {
@@ -110,12 +120,6 @@ VimcCameraConfiguration::VimcCameraConfiguration()
 
 CameraConfiguration::Status VimcCameraConfiguration::validate()
 {
-	static const std::array<unsigned int, 3> formats{
-		V4L2_PIX_FMT_BGR24,
-		V4L2_PIX_FMT_RGB24,
-		V4L2_PIX_FMT_ARGB32,
-	};
-
 	Status status = Valid;
 
 	if (config_.empty())
@@ -130,8 +134,8 @@ CameraConfiguration::Status VimcCameraConfiguration::validate()
 	StreamConfiguration &cfg = config_[0];
 
 	/* Adjust the pixel format. */
-	if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) ==
-	    formats.end()) {
+	if (std::find(pixelformats.begin(), pixelformats.end(), cfg.pixelFormat) ==
+	    pixelformats.end()) {
 		LOG(VIMC, Debug) << "Adjusting format to RGB24";
 		cfg.pixelFormat = V4L2_PIX_FMT_RGB24;
 		status = Adjusted;
@@ -170,7 +174,18 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,
 	if (roles.empty())
 		return config;
 
-	StreamConfiguration cfg{};
+	ImageFormats formats;
+
+	for (unsigned int pixelformat : pixelformats) {
+		/* The scaler hardcodes a x3 scale-up ratio. */
+		std::vector<SizeRange> sizes{
+			SizeRange{ 48, 48, 4096, 2160 }
+		};
+		formats.addFormat(pixelformat, sizes);
+	}
+
+	StreamConfiguration cfg(formats.data());
+
 	cfg.pixelFormat = V4L2_PIX_FMT_RGB24;
 	cfg.size = { 1920, 1080 };
 	cfg.bufferCount = 4;
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list