diff options
author | Tim Blechmann <tim@klingt.org> | 2024-04-16 16:53:26 +0800 |
---|---|---|
committer | Tim Blechmann <tim@klingt.org> | 2024-04-17 16:13:09 +0800 |
commit | f1e64525961e56424651b44c34355518e80af537 (patch) | |
tree | 7c85966a4bf00afd4d5f75b99d5115911ed0b44a | |
parent | 011d37c3acca4eb2685b915396139bb0734b6a02 (diff) |
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 <artem.dyomin@qt.io>
-rw-r--r-- | src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp | 24 | ||||
-rw-r--r-- | src/plugins/multimedia/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<QGObjectHandlerScopedConnection *>{ - &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 |