[libcamera-devel] [PATCH] tests: gstreamer: Test cameras' enumeration from GstDeviceProvider

Umang Jain umang.jain at ideasonboard.com
Tue Jul 4 17:53:29 CEST 2023


Test the enumeration of the cameras through GstDeviceProvider against
the libcamera camera manager.

Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
---
 test/gstreamer/gstreamer_test.cpp | 52 +++++++++++++++++++++++++++++++
 test/gstreamer/gstreamer_test.h   |  1 +
 2 files changed, 53 insertions(+)

diff --git a/test/gstreamer/gstreamer_test.cpp b/test/gstreamer/gstreamer_test.cpp
index 6ad0c15c..f94f3fd9 100644
--- a/test/gstreamer/gstreamer_test.cpp
+++ b/test/gstreamer/gstreamer_test.cpp
@@ -27,6 +27,18 @@ const char *__asan_default_options()
 }
 }
 
+static GstDeviceMonitor *
+libcamerasrc_get_device_provider()
+{
+	GstDeviceMonitor *monitor = gst_device_monitor_new();
+
+	gst_device_monitor_add_filter(monitor, "Video/Source", NULL);
+
+	gst_device_monitor_start(monitor);
+
+	return monitor;
+}
+
 GstreamerTest::GstreamerTest(unsigned int numStreams)
 	: pipeline_(nullptr), libcameraSrc_(nullptr)
 {
@@ -78,6 +90,12 @@ GstreamerTest::GstreamerTest(unsigned int numStreams)
 		return;
 	}
 
+	if (!checkCameraEnumeration()) {
+		g_printerr("Failed to enumerate cameras on GstDeviceProvider\n");
+		status_ = TestFail;
+		return;
+	}
+
 	status_ = TestPass;
 }
 
@@ -102,6 +120,40 @@ bool GstreamerTest::checkMinCameraStreamsAndSetCameraName(unsigned int numStream
 	return cameraFound;
 }
 
+bool GstreamerTest::checkCameraEnumeration()
+{
+	GstDeviceMonitor *monitor;
+	GList *devices, *l;
+	std::vector<const char *> cameraNames;
+	std::unique_ptr<libcamera::CameraManager> cm
+		= std::make_unique<libcamera::CameraManager>();
+
+	cm->start();
+	for (auto &camera : cm->cameras())
+		cameraNames.push_back(strdup(camera->id().c_str()));
+	cm->stop();
+	cm.reset();
+
+	monitor = libcamerasrc_get_device_provider();
+	devices = gst_device_monitor_get_devices(monitor);
+
+	for (l = devices; l != NULL; l = g_list_next(l)) {
+		bool matched = false;
+		GstDevice *device = GST_DEVICE(l->data);
+		for (const gchar *name : cameraNames) {
+			if (strcmp(name, gst_device_get_display_name(device)) == 0) {
+				matched = true;
+				break;
+			}
+		}
+
+		if (!matched)
+			return false;
+	}
+
+	return true;
+}
+
 GstreamerTest::~GstreamerTest()
 {
 	g_clear_object(&pipeline_);
diff --git a/test/gstreamer/gstreamer_test.h b/test/gstreamer/gstreamer_test.h
index aa2261e2..3479c7c4 100644
--- a/test/gstreamer/gstreamer_test.h
+++ b/test/gstreamer/gstreamer_test.h
@@ -31,4 +31,5 @@ protected:
 
 private:
 	bool checkMinCameraStreamsAndSetCameraName(unsigned int numStreams);
+	bool checkCameraEnumeration();
 };
-- 
2.39.1



More information about the libcamera-devel mailing list