From f1e64525961e56424651b44c34355518e80af537 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Tue, 16 Apr 2024 16:53:26 +0800 Subject: GStreamer: media player - improve unknown format handling When the decodebin cannot detect the format of the stream, we should stop the player to make sure that the GstPipeline is not in an unconnected state. Pick-to: 6.5 6.7 Change-Id: Id5bd2620d86a163baf8a761c9d6388aa0adf4fa7 Reviewed-by: Artem Dyomin --- .../gstreamer/common/qgstreamermediaplayer.cpp | 24 ++++++++++++++++++---- .../gstreamer/common/qgstreamermediaplayer_p.h | 3 +++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp index 6c8d2f26f..11b89436d 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp +++ b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp @@ -77,10 +77,7 @@ QGstreamerMediaPlayer::TrackSelector &QGstreamerMediaPlayer::trackSelector(Track void QGstreamerMediaPlayer::disconnectDecoderHandlers() { auto handlers = std::initializer_list{ - &padAdded, - &padRemoved, - &sourceSetup, - &elementAdded, + &padAdded, &padRemoved, &sourceSetup, &elementAdded, &unknownType, }; for (QGObjectHandlerScopedConnection *handler : handlers) handler->disconnect(); @@ -671,6 +668,19 @@ void QGstreamerMediaPlayer::sourceSetupCallback(GstElement *uridecodebin, GstEle } } +void QGstreamerMediaPlayer::unknownTypeCallback(GstElement *decodebin, GstPad *pad, GstCaps *caps, + QGstreamerMediaPlayer *self) +{ + Q_UNUSED(decodebin) + Q_UNUSED(pad) + Q_UNUSED(self) + qCDebug(qLcMediaPlayer) << "Unknown type:" << caps; + + QMetaObject::invokeMethod(self, [self] { + self->stop(); + }); +} + void QGstreamerMediaPlayer::setMedia(const QUrl &content, QIODevice *stream) { qCDebug(qLcMediaPlayer) << Q_FUNC_INFO << "setting location to" << content; @@ -729,6 +739,9 @@ void QGstreamerMediaPlayer::setMedia(const QUrl &content, QIODevice *stream) } decoder.set("post-stream-topology", true); decoder.set("use-buffering", true); + unknownType = decoder.connect("unknown-type", + GCallback(QGstreamerMediaPlayer::unknownTypeCallback), this); + playerPipeline.add(src, decoder); qLinkGstElements(src, decoder); @@ -757,6 +770,9 @@ void QGstreamerMediaPlayer::setMedia(const QUrl &content, QIODevice *stream) sourceSetup = decoder.connect("source-setup", GCallback(QGstreamerMediaPlayer::sourceSetupCallback), this); + unknownType = decoder.connect("unknown-type", + GCallback(QGstreamerMediaPlayer::unknownTypeCallback), this); + decoder.set("uri", content.toEncoded().constData()); decoder.set("use-buffering", true); if (m_bufferProgress != 0) { diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h index b13c5d4f2..ef4deebfa 100644 --- a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h +++ b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h @@ -117,6 +117,8 @@ private: void disconnectDecoderHandlers(); static void uridecodebinElementAddedCallback(GstElement *uridecodebin, GstElement *child, QGstreamerMediaPlayer *that); static void sourceSetupCallback(GstElement *uridecodebin, GstElement *source, QGstreamerMediaPlayer *that); + static void unknownTypeCallback(GstElement *decodebin, GstPad *pad, GstCaps *caps, + QGstreamerMediaPlayer *self); void parseStreamsAndMetadata(); void connectOutput(TrackSelector &ts); void removeOutput(TrackSelector &ts); @@ -158,6 +160,7 @@ private: QGObjectHandlerScopedConnection padRemoved; QGObjectHandlerScopedConnection sourceSetup; QGObjectHandlerScopedConnection elementAdded; + QGObjectHandlerScopedConnection unknownType; }; QT_END_NAMESPACE -- cgit v1.2.3