diff options
author | Tim Blechmann <tim@klingt.org> | 2024-03-29 10:09:12 +0800 |
---|---|---|
committer | Tim Blechmann <tim@klingt.org> | 2024-04-27 09:21:10 +0800 |
commit | a17f9937ef8efad084e783f146c4969be4819eb1 (patch) | |
tree | efe46dce7ccd4e2d91750898946263e0744f6332 | |
parent | 7a3b2ff731bae9c07833e06a0ff8553421d6b6b2 (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>
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" |