summaryrefslogtreecommitdiff
path: root/test/gstreamer/gstreamer_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/gstreamer/gstreamer_test.cpp')
-rw-r--r--test/gstreamer/gstreamer_test.cpp65
1 files changed, 41 insertions, 24 deletions
diff --git a/test/gstreamer/gstreamer_test.cpp b/test/gstreamer/gstreamer_test.cpp
index 227a5c37..e8119b85 100644
--- a/test/gstreamer/gstreamer_test.cpp
+++ b/test/gstreamer/gstreamer_test.cpp
@@ -5,6 +5,10 @@
* libcamera Gstreamer element API tests
*/
+#include <libcamera/libcamera.h>
+
+#include <libcamera/base/utils.h>
+
#include "gstreamer_test.h"
#include "test.h"
@@ -23,19 +27,18 @@ const char *__asan_default_options()
}
}
-GstreamerTest::GstreamerTest()
+GstreamerTest::GstreamerTest(unsigned int numStreams)
: pipeline_(nullptr), libcameraSrc_(nullptr)
{
/*
- * GStreamer by default spawns a process to run the
- * gst-plugin-scanner helper. If libcamera is compiled with ASan
- * enabled, and as GStreamer is most likely not, this causes the
- * ASan link order check to fail when gst-plugin-scanner
- * dlopen()s the plugin as many libraries will have already been
- * loaded by then. Fix this issue by disabling spawning of a
- * child helper process when scanning the build directory for
- * plugins.
- */
+ * GStreamer by default spawns a process to run the gst-plugin-scanner
+ * helper. If libcamera is compiled with ASan enabled, and as GStreamer
+ * is most likely not, this causes the ASan link order check to fail
+ * when gst-plugin-scanner dlopen()s the plugin as many libraries will
+ * have already been loaded by then. Fix this issue by disabling
+ * spawning of a child helper process when scanning the build directory
+ * for plugins.
+ */
gst_registry_fork_set_enabled(false);
/* Initialize GStreamer */
@@ -49,25 +52,38 @@ GstreamerTest::GstreamerTest()
}
/*
- * Remove the system libcamera plugin, if any, and add the
- * plugin from the build directory.
- */
- GstRegistry *registry = gst_registry_get();
- g_autoptr(GstPlugin) plugin = gst_registry_lookup(registry, "libgstlibcamera.so");
- if (plugin)
- gst_registry_remove_plugin(registry, plugin);
-
- std::string path = libcamera::utils::libcameraBuildPath() + "src/gstreamer";
- if (!gst_registry_scan_path(registry, path.c_str())) {
- g_printerr("Failed to add plugin to registry\n");
-
- status_ = TestFail;
+ * Atleast one camera should be available with numStreams streams,
+ * otherwise skip the test entirely.
+ */
+ if (!checkMinCameraStreamsAndSetCameraName(numStreams)) {
+ status_ = TestSkip;
return;
}
status_ = TestPass;
}
+bool GstreamerTest::checkMinCameraStreamsAndSetCameraName(unsigned int numStreams)
+{
+ libcamera::CameraManager cm;
+ bool cameraFound = false;
+
+ cm.start();
+
+ for (auto &camera : cm.cameras()) {
+ if (camera->streams().size() < numStreams)
+ continue;
+
+ cameraFound = true;
+ cameraName_ = camera->id();
+ break;
+ }
+
+ cm.stop();
+
+ return cameraFound;
+}
+
GstreamerTest::~GstreamerTest()
{
g_clear_object(&pipeline_);
@@ -82,12 +98,13 @@ int GstreamerTest::createPipeline()
pipeline_ = gst_pipeline_new("test-pipeline");
if (!libcameraSrc_ || !pipeline_) {
- g_printerr("Unable to create create pipeline %p.%p\n",
+ g_printerr("Unable to create pipeline %p.%p\n",
libcameraSrc_, pipeline_);
return TestFail;
}
+ g_object_set(libcameraSrc_, "camera-name", cameraName_.c_str(), NULL);
g_object_ref_sink(libcameraSrc_);
return TestPass;