[libcamera-devel] [PATCH 11/11] test: v4l2_videodevice: Test U8 array controls

Jacopo Mondi jacopo at jmondi.org
Mon Mar 9 17:24:14 CET 2020


Test V4L2 array control using vivid control VIVID_CID_U8_4D_ARRAY.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 test/v4l2_videodevice/controls.cpp | 31 +++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/test/v4l2_videodevice/controls.cpp b/test/v4l2_videodevice/controls.cpp
index 478de3707a3c..e2601b7594bb 100644
--- a/test/v4l2_videodevice/controls.cpp
+++ b/test/v4l2_videodevice/controls.cpp
@@ -5,6 +5,7 @@
  * controls.cpp - V4L2 device controls handling test
  */
 
+#include <array>
 #include <iostream>
 #include <limits.h>
 
@@ -12,6 +13,13 @@
 
 #include "v4l2_videodevice_test.h"
 
+/* These come from the vivid driver */
+#define VIVID_CID_CUSTOM_BASE		(V4L2_CID_USER_BASE | 0xf000)
+#define VIVID_CID_U8_4D_ARRAY		(VIVID_CID_CUSTOM_BASE + 10)
+
+/* Helper for VIVID_CID_U8_4D_ARRAY control array size: not from kernel. */
+#define VIVID_CID_U8_ARRAY_SIZE		(2 * 3 * 4 * 5)
+
 using namespace std;
 using namespace libcamera;
 
@@ -36,7 +44,8 @@ protected:
 
 		if (infoMap.find(V4L2_CID_BRIGHTNESS) == infoMap.end() ||
 		    infoMap.find(V4L2_CID_CONTRAST) == infoMap.end() ||
-		    infoMap.find(V4L2_CID_SATURATION) == infoMap.end()) {
+		    infoMap.find(V4L2_CID_SATURATION) == infoMap.end() ||
+		    infoMap.find(VIVID_CID_U8_4D_ARRAY) == infoMap.end()) {
 			cerr << "Missing controls" << endl;
 			return TestFail;
 		}
@@ -44,6 +53,7 @@ protected:
 		const ControlInfo &brightness = infoMap.find(V4L2_CID_BRIGHTNESS)->second;
 		const ControlInfo &contrast = infoMap.find(V4L2_CID_CONTRAST)->second;
 		const ControlInfo &saturation = infoMap.find(V4L2_CID_SATURATION)->second;
+		const ControlInfo &u8 = infoMap.find(VIVID_CID_U8_4D_ARRAY)->second;
 
 		/* Test getting controls. */
 		ControlList ctrls(infoMap);
@@ -51,6 +61,10 @@ protected:
 		ctrls.set(V4L2_CID_CONTRAST, -1);
 		ctrls.set(V4L2_CID_SATURATION, -1);
 
+		std::array<uint8_t, VIVID_CID_U8_ARRAY_SIZE> u8Values;
+		Span<const uint8_t> u8Span(u8Values);
+		ctrls.set(VIVID_CID_U8_4D_ARRAY, u8Span);
+
 		int ret = capture_->getControls(&ctrls);
 		if (ret) {
 			cerr << "Failed to get controls" << endl;
@@ -64,11 +78,26 @@ protected:
 			return TestFail;
 		}
 
+		u8Span = ctrls.get(VIVID_CID_U8_4D_ARRAY).get<Span<const uint8_t>>();
+		for (unsigned int i = 0; i < VIVID_CID_U8_ARRAY_SIZE; ++i) {
+			if (u8Span[i] != 0)
+				continue;
+
+			cerr << "Incorrect value for retrieved array control"
+			     << endl;
+			return TestFail;
+		}
+
 		/* Test setting controls. */
 		ctrls.set(V4L2_CID_BRIGHTNESS, brightness.min());
 		ctrls.set(V4L2_CID_CONTRAST, contrast.max());
 		ctrls.set(V4L2_CID_SATURATION, saturation.min());
 
+		for (unsigned int i = 0; i < VIVID_CID_U8_ARRAY_SIZE; ++i)
+			u8Values[i] = u8.min().get<uint8_t>();
+		u8Span = u8Values;
+		ctrls.set(VIVID_CID_U8_4D_ARRAY, u8Span);
+
 		ret = capture_->setControls(&ctrls);
 		if (ret) {
 			cerr << "Failed to set controls" << endl;
-- 
2.25.0



More information about the libcamera-devel mailing list