summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-03-29 10:09:12 +0800
committerTim Blechmann <tim@klingt.org>2024-04-27 09:21:10 +0800
commita17f9937ef8efad084e783f146c4969be4819eb1 (patch)
treeefe46dce7ccd4e2d91750898946263e0744f6332
parent7a3b2ff731bae9c07833e06a0ff8553421d6b6b2 (diff)
GStreamer: unit test native pipeline access
Add initial test for the accessing the GStreamer pipeline via a platform-specific interface. Some fixes to the GStreamer plugin were necessary in order to include the headers from the `QGstreamerMediaPluginPrivate` target Pick-to: 6.5 6.6 6.7 Change-Id: Ia60e31426395f5a89b3b76d4d12aedd95f12731c Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgst.cpp8
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgst_p.h11
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstpipeline_p.h6
-rw-r--r--tests/auto/unit/multimedia/CMakeLists.txt1
-rw-r--r--tests/auto/unit/multimedia/qmediaplayer_gstreamer/CMakeLists.txt14
-rw-r--r--tests/auto/unit/multimedia/qmediaplayer_gstreamer/tst_qmediaplayer_gstreamer.cpp78
6 files changed, 110 insertions, 8 deletions
diff --git a/src/plugins/multimedia/gstreamer/common/qgst.cpp b/src/plugins/multimedia/gstreamer/common/qgst.cpp
index ebcc278d7..8a77533a6 100644
--- a/src/plugins/multimedia/gstreamer/common/qgst.cpp
+++ b/src/plugins/multimedia/gstreamer/common/qgst.cpp
@@ -1057,6 +1057,14 @@ void QGstBin::dumpGraph(const char *fileNamePrefix)
fileNamePrefix);
}
+QGstElement QGstBin::findByName(const char *name)
+{
+ return QGstElement{
+ gst_bin_get_by_name(bin(), name),
+ QGstElement::NeedsRef,
+ };
+}
+
// QGstBaseSink
QGstBaseSink::QGstBaseSink(GstBaseSink *element, RefMode mode)
diff --git a/src/plugins/multimedia/gstreamer/common/qgst_p.h b/src/plugins/multimedia/gstreamer/common/qgst_p.h
index d569a743d..394ee1777 100644
--- a/src/plugins/multimedia/gstreamer/common/qgst_p.h
+++ b/src/plugins/multimedia/gstreamer/common/qgst_p.h
@@ -15,21 +15,20 @@
// We mean it.
//
-#include <common/qgst_handle_types_p.h>
-
-#include <private/qtmultimediaglobal_p.h>
-#include <private/qmultimediautils_p.h>
-
#include <QtCore/qdebug.h>
#include <QtCore/qlist.h>
#include <QtCore/qsemaphore.h>
#include <QtMultimedia/qaudioformat.h>
#include <QtMultimedia/qvideoframe.h>
+#include <QtMultimedia/private/qtmultimediaglobal_p.h>
+#include <QtMultimedia/private/qmultimediautils_p.h>
#include <gst/gst.h>
#include <gst/video/video-info.h>
+#include "qgst_handle_types_p.h"
+
#include <type_traits>
#if QT_CONFIG(gstreamer_photography)
@@ -680,6 +679,8 @@ public:
bool syncChildrenState();
void dumpGraph(const char *fileNamePrefix);
+
+ QGstElement findByName(const char *);
};
class QGstBaseSink : public QGstElement
diff --git a/src/plugins/multimedia/gstreamer/common/qgstpipeline_p.h b/src/plugins/multimedia/gstreamer/common/qgstpipeline_p.h
index eb5c7811d..6914993de 100644
--- a/src/plugins/multimedia/gstreamer/common/qgstpipeline_p.h
+++ b/src/plugins/multimedia/gstreamer/common/qgstpipeline_p.h
@@ -15,10 +15,10 @@
// We mean it.
//
-#include <private/qtmultimediaglobal_p.h>
-#include <QObject>
+#include <QtMultimedia/private/qtmultimediaglobal_p.h>
+#include <QtCore/qobject.h>
-#include <common/qgst_p.h>
+#include "qgst_p.h"
QT_BEGIN_NAMESPACE
diff --git a/tests/auto/unit/multimedia/CMakeLists.txt b/tests/auto/unit/multimedia/CMakeLists.txt
index 2af3e0d84..20b86c251 100644
--- a/tests/auto/unit/multimedia/CMakeLists.txt
+++ b/tests/auto/unit/multimedia/CMakeLists.txt
@@ -33,4 +33,5 @@ add_subdirectory(qwavedecoder)
if(QT_FEATURE_gstreamer)
add_subdirectory(gstreamer_backend)
+ add_subdirectory(qmediaplayer_gstreamer)
endif()
diff --git a/tests/auto/unit/multimedia/qmediaplayer_gstreamer/CMakeLists.txt b/tests/auto/unit/multimedia/qmediaplayer_gstreamer/CMakeLists.txt
new file mode 100644
index 000000000..2437df00c
--- /dev/null
+++ b/tests/auto/unit/multimedia/qmediaplayer_gstreamer/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qmediaplayer_gstreamer Test:
+#####################################################################
+
+qt_internal_add_test(tst_qmediaplayer_gstreamer
+ SOURCES
+ tst_qmediaplayer_gstreamer.cpp
+ LIBRARIES
+ Qt::MultimediaPrivate
+ Qt::QGstreamerMediaPluginPrivate
+)
diff --git a/tests/auto/unit/multimedia/qmediaplayer_gstreamer/tst_qmediaplayer_gstreamer.cpp b/tests/auto/unit/multimedia/qmediaplayer_gstreamer/tst_qmediaplayer_gstreamer.cpp
new file mode 100644
index 000000000..8b0f3f073
--- /dev/null
+++ b/tests/auto/unit/multimedia/qmediaplayer_gstreamer/tst_qmediaplayer_gstreamer.cpp
@@ -0,0 +1,78 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include <QtTest/QtTest>
+#include <QtMultimedia/qmediaplayer.h>
+#include <QtMultimedia/private/qmediaplayer_p.h>
+#include <QtQGstreamerMediaPlugin/private/qgstpipeline_p.h>
+
+#include <memory>
+
+QT_USE_NAMESPACE
+
+class tst_QMediaPlayerGStreamer : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QMediaPlayerGStreamer();
+
+public slots:
+ void init();
+ void cleanup();
+
+private slots:
+ void constructor_preparesGstPipeline();
+
+private:
+ std::unique_ptr<QMediaPlayer> player;
+
+ GstPipeline *getGstPipeline()
+ {
+ return reinterpret_cast<GstPipeline *>(QPlatformMediaPlayer::nativePipeline(player.get()));
+ }
+
+ void dumpGraph(const char *fileNamePrefix)
+ {
+ GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(getGstPipeline()),
+ GstDebugGraphDetails(GST_DEBUG_GRAPH_SHOW_VERBOSE),
+ fileNamePrefix);
+ }
+};
+
+tst_QMediaPlayerGStreamer::tst_QMediaPlayerGStreamer()
+{
+ qputenv("QT_MEDIA_BACKEND", "gstreamer");
+}
+
+void tst_QMediaPlayerGStreamer::init()
+{
+ player = std::make_unique<QMediaPlayer>();
+}
+
+void tst_QMediaPlayerGStreamer::cleanup()
+{
+ player.reset();
+}
+
+void tst_QMediaPlayerGStreamer::constructor_preparesGstPipeline()
+{
+ auto *rawPipeline = getGstPipeline();
+ QVERIFY(rawPipeline);
+
+ QGstPipeline pipeline{
+ rawPipeline,
+ QGstPipeline::NeedsRef,
+ };
+ QVERIFY(pipeline);
+
+ QVERIFY(pipeline.findByName("videoInputSelector"));
+ QVERIFY(pipeline.findByName("audioInputSelector"));
+ QVERIFY(pipeline.findByName("subTitleInputSelector"));
+
+ dumpGraph("constructor_preparesGstPipeline");
+}
+
+QTEST_GUILESS_MAIN(tst_QMediaPlayerGStreamer)
+
+#include "tst_qmediaplayer_gstreamer.moc"