From 43083d6c113bcc462f09f66a5eff83a43cb9c444 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Thu, 12 Sep 2024 12:36:39 +0800 Subject: [PATCH] GStreamer: introduce qiodevice:/ uri scheme Using `QGstAppSource` to inject data into GStreamer has a few problems: * it is a bit cumbersome to use, as it requires going through signal/slot connections * it is not possible to use the same stream in multiple locations (e.g. player and discoverer) * it is not thread-safe (gst_play sends on_need_data after the stream is closed by another thread) * the ownership of QGstAppSource is rather complicated, as it's owned by both So we replace the QGstAppSource by a qiodevice:/ uri scheme: * multiple threads may access the same QIODevice in a thread-safe manner * gstreamer handles the element construction under the hood Task-number: QTBUG-129467 Pick-to: 6.5 6.7 6.8 Change-Id: I041d1e42368d19fb2ee64b6f3730c204458a6e85 Reviewed-by: Artem Dyomin --- .../multimedia/gstreamer/CMakeLists.txt | 3 +- .../audio/qgstreameraudiodecoder.cpp | 20 +- .../audio/qgstreameraudiodecoder_p.h | 3 - .../gstreamer/common/qgstappsource.cpp | 233 -------- .../gstreamer/common/qgstappsource_p.h | 72 --- .../common/qgstreamermediaplayer.cpp | 24 +- .../gstreamer/qgstreamerintegration.cpp | 2 + .../qgstreamer_qiodevice_handler.cpp | 498 ++++++++++++++++++ .../qgstreamer_qiodevice_handler_p.h | 34 ++ .../tst_qmediaplayerbackend.cpp | 2 - 10 files changed, 550 insertions(+), 341 deletions(-) delete mode 100644 src/plugins/multimedia/gstreamer/common/qgstappsource.cpp delete mode 100644 src/plugins/multimedia/gstreamer/common/qgstappsource_p.h create mode 100644 src/plugins/multimedia/gstreamer/uri_handler/qgstreamer_qiodevice_handler.cpp create mode 100644 src/plugins/multimedia/gstreamer/uri_handler/qgstreamer_qiodevice_handler_p.h diff --git a/src/plugins/multimedia/gstreamer/CMakeLists.txt b/src/plugins/multimedia/gstreamer/CMakeLists.txt index 22d427a55e..11f754d675 100644 --- a/src/plugins/multimedia/gstreamer/CMakeLists.txt +++ b/src/plugins/multimedia/gstreamer/CMakeLists.txt @@ -14,7 +14,6 @@ qt_internal_add_module(QGstreamerMediaPluginImplPrivate common/qgst_bus.cpp common/qgst_bus_p.h common/qgst_debug.cpp common/qgst_debug_p.h common/qgst_handle_types_p.h - common/qgstappsource.cpp common/qgstappsource_p.h common/qgstreameraudioinput.cpp common/qgstreameraudioinput_p.h common/qgstreameraudiooutput.cpp common/qgstreameraudiooutput_p.h common/qgstreamerbufferprobe.cpp common/qgstreamerbufferprobe_p.h @@ -36,6 +35,7 @@ qt_internal_add_module(QGstreamerMediaPluginImplPrivate mediacapture/qgstreamerimagecapture.cpp mediacapture/qgstreamerimagecapture_p.h mediacapture/qgstreamermediacapturesession.cpp mediacapture/qgstreamermediacapturesession_p.h mediacapture/qgstreamermediarecorder.cpp mediacapture/qgstreamermediarecorder_p.h + uri_handler/qgstreamer_qiodevice_handler.cpp uri_handler/qgstreamer_qiodevice_handler_p.h uri_handler/qgstreamer_qrc_handler.cpp uri_handler/qgstreamer_qrc_handler_p.h NO_UNITY_BUILD_SOURCES @@ -44,6 +44,7 @@ qt_internal_add_module(QGstreamerMediaPluginImplPrivate common/qgstreamervideosink.cpp # preprocessor / internal linkage + uri_handler/qgstreamer_qiodevice_handler.cpp uri_handler/qgstreamer_qrc_handler.cpp NO_GENERATE_CPP_EXPORTS DEFINES diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp index cee226ef3c..ec292916b8 100644 --- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp +++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp @@ -5,9 +5,9 @@ #include