[libcamera-devel,PATCH/RFC,09/12] test: stream: Add test for StreamFormat

Message ID 20190517230621.24668-10-laurent.pinchart@ideasonboard.com
State Superseded
Headers show
Series
  • Rework camera configuration to introduce negotiation of parameters
Related show

Commit Message

Laurent Pinchart May 17, 2019, 11:06 p.m. UTC
From: Niklas Söderlund <niklas.soderlund@ragnatech.se>

Test that both discrete and range based stream format descriptions
result in good discrete frame sizes. The range based stream formats
needs to be fitted with a table of resolutions inside libcamera so if
that table is update this test might need to be updated.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 test/meson.build               |   1 +
 test/stream/meson.build        |  10 +++
 test/stream/stream_formats.cpp | 112 +++++++++++++++++++++++++++++++++
 3 files changed, 123 insertions(+)
 create mode 100644 test/stream/meson.build
 create mode 100644 test/stream/stream_formats.cpp

Patch

diff --git a/test/meson.build b/test/meson.build
index d501f2beaf96..a25e203bcfed 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -3,6 +3,7 @@  subdir('libtest')
 subdir('camera')
 subdir('media_device')
 subdir('pipeline')
+subdir('stream')
 subdir('v4l2_device')
 subdir('v4l2_subdevice')
 
diff --git a/test/stream/meson.build b/test/stream/meson.build
new file mode 100644
index 000000000000..1d5a4a97aec4
--- /dev/null
+++ b/test/stream/meson.build
@@ -0,0 +1,10 @@ 
+stream_tests = [
+  [ 'stream_formats', 'stream_formats.cpp' ],
+]
+
+foreach t : stream_tests
+  exe = executable(t[0], t[1],
+                   link_with : test_libraries,
+                   include_directories : test_includes_internal)
+  test(t[0], exe, suite: 'stream', is_parallel: false)
+endforeach
diff --git a/test/stream/stream_formats.cpp b/test/stream/stream_formats.cpp
new file mode 100644
index 000000000000..2ee02840d4d7
--- /dev/null
+++ b/test/stream/stream_formats.cpp
@@ -0,0 +1,112 @@ 
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * stream_formats.cpp - StreamFormats test
+ */
+
+#include <iostream>
+
+#include <libcamera/geometry.h>
+#include <libcamera/stream.h>
+
+#include "test.h"
+
+using namespace std;
+using namespace libcamera;
+
+class StreamFormatsTest : public Test
+{
+protected:
+	int init()
+	{
+		return 0;
+	}
+
+	int testSizes(std::string name, std::vector<Size> test, std::vector<Size> valid)
+	{
+		bool pass = false;
+
+		for (Size &size : test) {
+			pass = false;
+
+			for (Size &validSize : valid) {
+				if (size == validSize) {
+					pass = true;
+					break;
+				}
+			}
+
+			if (!pass)
+				break;
+		}
+
+		if (!pass) {
+			cout << "Failed " << name << endl;
+			cout << "Sizes to test:" << endl;
+			for (Size &size : test)
+				cout << size.toString() << endl;
+			cout << "Valid sizes:" << endl;
+			for (Size &size : valid)
+				cout << size.toString() << endl;
+
+			return TestFail;
+		}
+
+		return TestPass;
+	}
+
+	int run()
+	{
+		/* Test discrete sizes */
+		StreamFormats discrete({
+			{ 1, { { Size(100, 100), Size(200, 200) } } },
+			{ 2, { { Size(300, 300), Size(400, 400) } } },
+		});
+
+		if (testSizes("discrete 1", discrete.sizes(1),
+			      { Size(100, 100), Size(200, 200) }))
+			return TestFail;
+
+		if (testSizes("discrete 2", discrete.sizes(2),
+			      { Size(300, 300), Size(400, 400) }))
+			return TestFail;
+
+		/* Test range sizes */
+		StreamFormats range({
+			{ 1, { Size(640, 480), Size(640, 480), 1, 1 } },
+			{ 2, { Size(640, 480), Size(800, 600), 8, 8 } },
+			{ 3, { Size(640, 480), Size(800, 600), 16, 16 } },
+			{ 4, { Size(1, 1), Size(4096, 4096), 128, 128 } },
+		});
+
+		if (testSizes("range 1", range.sizes(1), { Size(640, 480) }))
+			return TestFail;
+
+		if (testSizes("range 2", range.sizes(2), {
+			      Size(640, 480), Size(720, 480),
+			      Size(720, 576), Size(768, 480),
+			      Size(800, 600) }))
+			return TestFail;
+
+
+		if (testSizes("range 3", range.sizes(3), {
+			      Size(640, 480), Size(720, 480),
+			      Size(720, 576), Size(768, 480) }))
+			return TestFail;
+
+		if (testSizes("range 4", range.sizes(4), {
+			      Size(1024, 768), Size(1280, 1024),
+			      Size(2048, 1152), Size(2048, 1536),
+			      Size(2560, 2048), Size(3200, 2048), }))
+			return TestFail;
+
+		return TestPass;
+	}
+
+	void cleanup()
+	{
+	}
+};
+
+TEST_REGISTER(StreamFormatsTest)