diff options
-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 |