[libcamera-devel] [PATCH v2] tests: gstreamer: Test cameras' enumeration from GstDeviceProvider
Nicolas Dufresne
nicolas.dufresne at collabora.com
Wed Jul 5 17:09:18 CEST 2023
Thanks for the fixes.
Le mardi 04 juillet 2023 à 23:23 +0200, Umang Jain a écrit :
> Test the enumeration of the cameras through GstDeviceProvider against
> the libcamera camera manager.
>
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
Reviewed-by: Nicolas Dufresne <nicolas.dufresne at collabora.com>
> ---
> Changes in v2:
> - Split out to dedicated device provider test
> - Use gst_device_provider_factory_get_by_name() to find
> libcameraprovider
> - Use "camera-name" to compare camera ids with camera-manager
> instead of gst_device_get_display_name()
> ---
> .../gstreamer_device_provider_test.cpp | 77 +++++++++++++++++++
> test/gstreamer/meson.build | 1 +
> 2 files changed, 78 insertions(+)
> create mode 100644 test/gstreamer/gstreamer_device_provider_test.cpp
>
> diff --git a/test/gstreamer/gstreamer_device_provider_test.cpp b/test/gstreamer/gstreamer_device_provider_test.cpp
> new file mode 100644
> index 00000000..69e110c7
> --- /dev/null
> +++ b/test/gstreamer/gstreamer_device_provider_test.cpp
> @@ -0,0 +1,77 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * Copyright 2023 Umang Jain <umang.jain at ideasonboard.com>
> + *
> + * gstreamer_single_stream_test.cpp - GStreamer single stream capture test
> + */
> +
> +#include <vector>
> +
> +#include <libcamera/libcamera.h>
> +#include <gst/gst.h>
> +
> +#include "gstreamer_test.h"
> +#include "test.h"
> +
> +using namespace std;
> +
> +class GstreamerDeviceProviderTest : public GstreamerTest, public Test
> +{
> +public:
> + GstreamerDeviceProviderTest()
> + : GstreamerTest()
> + {
> + }
> +
> +protected:
> + int init() override
> + {
> + if (status_ != TestPass)
> + return status_;
> +
> + return TestPass;
> + }
> +
> + int run() override
> + {
> + g_autoptr(GstDeviceProvider) provider;
> + GList *devices, *l;
> + std::vector<std::string> cameraNames;
> + std::unique_ptr<libcamera::CameraManager> cm
> + = std::make_unique<libcamera::CameraManager>();
> +
> + cm->start();
> + for (auto &camera : cm->cameras())
> + cameraNames.push_back(camera->id());
> + cm->stop();
> + cm.reset();
> +
> + provider = gst_device_provider_factory_get_by_name("libcameraprovider");
> + devices = gst_device_provider_get_devices(provider);
> +
> + for (l = devices; l != NULL; l = g_list_next(l)) {
> + GstDevice *device = GST_DEVICE(l->data);
> + g_autofree gchar *gst_name;
> + bool matched = false;
> +
> + g_autoptr(GstElement) element = gst_device_create_element(device, NULL);
> + g_object_get(element, "camera-name", &gst_name, NULL);
> +
> + for (auto name : cameraNames) {
> + if (strcmp(name.c_str(), gst_name) == 0) {
> + matched = true;
> + break;
> + }
> + }
> +
> + if (!matched)
> + return TestFail;
> + }
> +
> + g_list_free_full(devices, (GDestroyNotify)gst_object_unref);
> +
> + return TestPass;
> + }
> +};
> +
> +TEST_REGISTER(GstreamerDeviceProviderTest)
> diff --git a/test/gstreamer/meson.build b/test/gstreamer/meson.build
> index 74572586..0904ee0d 100644
> --- a/test/gstreamer/meson.build
> +++ b/test/gstreamer/meson.build
> @@ -7,6 +7,7 @@ endif
> gstreamer_tests = [
> {'name': 'single_stream_test', 'sources': ['gstreamer_single_stream_test.cpp']},
> {'name': 'multi_stream_test', 'sources': ['gstreamer_multi_stream_test.cpp']},
> + {'name': 'device_provider_test', 'sources': ['gstreamer_device_provider_test.cpp']},
> ]
> gstreamer_dep = dependency('gstreamer-1.0', required: true)
>
More information about the libcamera-devel
mailing list