summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp24
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h3
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