From a17f9937ef8efad084e783f146c4969be4819eb1 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Fri, 29 Mar 2024 10:09:12 +0800 Subject: GStreamer: unit test native pipeline access MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/plugins/multimedia/gstreamer/common/qgst.cpp | 8 +++ src/plugins/multimedia/gstreamer/common/qgst_p.h | 11 +-- .../multimedia/gstreamer/common/qgstpipeline_p.h | 6 +- tests/auto/unit/multimedia/CMakeLists.txt | 1 + .../qmediaplayer_gstreamer/CMakeLists.txt | 14 ++++ .../tst_qmediaplayer_gstreamer.cpp | 78 ++++++++++++++++++++++ 6 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 tests/auto/unit/multimedia/qmediaplayer_gstreamer/CMakeLists.txt create mode 100644 tests/auto/unit/multimedia/qmediaplayer_gstreamer/tst_qmediaplayer_gstreamer.cpp 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 - -#include -#include - #include #include #include #include #include +#include +#include #include #include +#include "qgst_handle_types_p.h" + #include #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 -#include +#include +#include -#include +#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 +#include +#include +#include + +#include + +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 player; + + GstPipeline *getGstPipeline() + { + return reinterpret_cast(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(); +} + +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" -- cgit v1.2.3