summaryrefslogtreecommitdiff
path: root/test/v4l2_videodevice
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-12 05:56:13 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-13 20:37:37 +0300
commitabe2c1b55c788873ee1a24dc207cad82f931a48e (patch)
treeb43de1c1bed833d297237d0cf0c4bdbb86fac162 /test/v4l2_videodevice
parenta1c6b2b6419cdf82c623355725efd48ff169a675 (diff)
test: v4l2_videodevice: Add V4L2 control test
Add a test that exercises the control enumeration, get and set APIs on a V4L2Device. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'test/v4l2_videodevice')
-rw-r--r--test/v4l2_videodevice/controls.cpp93
-rw-r--r--test/v4l2_videodevice/meson.build1
2 files changed, 94 insertions, 0 deletions
diff --git a/test/v4l2_videodevice/controls.cpp b/test/v4l2_videodevice/controls.cpp
new file mode 100644
index 00000000..cfd47454
--- /dev/null
+++ b/test/v4l2_videodevice/controls.cpp
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * controls.cpp - V4L2 device controls handling test
+ */
+
+#include <climits>
+#include <iostream>
+
+#include "v4l2_videodevice.h"
+
+#include "v4l2_videodevice_test.h"
+
+using namespace std;
+using namespace libcamera;
+
+class V4L2ControlTest : public V4L2VideoDeviceTest
+{
+public:
+ V4L2ControlTest()
+ : V4L2VideoDeviceTest("vivid", "vivid-000-vid-cap")
+ {
+ }
+
+protected:
+ int run()
+ {
+ const V4L2ControlInfoMap &info = capture_->controls();
+
+ /* Test control enumeration. */
+ if (info.empty()) {
+ cerr << "Failed to enumerate controls" << endl;
+ return TestFail;
+ }
+
+ if (info.find(V4L2_CID_BRIGHTNESS) == info.end() ||
+ info.find(V4L2_CID_CONTRAST) == info.end() ||
+ info.find(V4L2_CID_SATURATION) == info.end()) {
+ cerr << "Missing controls" << endl;
+ return TestFail;
+ }
+
+ const V4L2ControlInfo &brightness = info.find(V4L2_CID_BRIGHTNESS)->second;
+ const V4L2ControlInfo &contrast = info.find(V4L2_CID_CONTRAST)->second;
+ const V4L2ControlInfo &saturation = info.find(V4L2_CID_SATURATION)->second;
+
+ /* Test getting controls. */
+ V4L2ControlList ctrls;
+ ctrls.add(V4L2_CID_BRIGHTNESS);
+ ctrls.add(V4L2_CID_CONTRAST);
+ ctrls.add(V4L2_CID_SATURATION);
+
+ int ret = capture_->getControls(&ctrls);
+ if (ret) {
+ cerr << "Failed to get controls" << endl;
+ return TestFail;
+ }
+
+ /* Test setting controls. */
+ ctrls[V4L2_CID_BRIGHTNESS]->value() = brightness.range().min();
+ ctrls[V4L2_CID_CONTRAST]->value() = contrast.range().max();
+ ctrls[V4L2_CID_SATURATION]->value() = saturation.range().min();
+
+ ret = capture_->setControls(&ctrls);
+ if (ret) {
+ cerr << "Failed to set controls" << endl;
+ return TestFail;
+ }
+
+ /* Test setting controls outside of range. */
+ ctrls[V4L2_CID_BRIGHTNESS]->value() = brightness.range().min().get<int32_t>() - 1;
+ ctrls[V4L2_CID_CONTRAST]->value() = contrast.range().max().get<int32_t>() + 1;
+ ctrls[V4L2_CID_SATURATION]->value() = saturation.range().min().get<int32_t>() + 1;
+
+ ret = capture_->setControls(&ctrls);
+ if (ret) {
+ cerr << "Failed to set controls (out of range)" << endl;
+ return TestFail;
+ }
+
+ if (ctrls[V4L2_CID_BRIGHTNESS]->value() != brightness.range().min() ||
+ ctrls[V4L2_CID_CONTRAST]->value() != brightness.range().max() ||
+ ctrls[V4L2_CID_SATURATION]->value() != saturation.range().min().get<int32_t>() + 1) {
+ cerr << "Controls not updated when set" << endl;
+ return TestFail;
+ }
+
+ return TestPass;
+ }
+};
+
+TEST_REGISTER(V4L2ControlTest);
diff --git a/test/v4l2_videodevice/meson.build b/test/v4l2_videodevice/meson.build
index ad41898b..5c52da72 100644
--- a/test/v4l2_videodevice/meson.build
+++ b/test/v4l2_videodevice/meson.build
@@ -2,6 +2,7 @@
# They are not alphabetically sorted.
v4l2_videodevice_tests = [
[ 'double_open', 'double_open.cpp' ],
+ [ 'controls', 'controls.cpp' ],
[ 'formats', 'formats.cpp' ],
[ 'request_buffers', 'request_buffers.cpp' ],
[ 'stream_on_off', 'stream_on_off.cpp' ],