summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-04-16 16:53:26 +0800
committerTim Blechmann <tim@klingt.org>2024-04-17 16:13:09 +0800
commitf1e64525961e56424651b44c34355518e80af537 (patch)
tree7c85966a4bf00afd4d5f75b99d5115911ed0b44a
parent011d37c3acca4eb2685b915396139bb0734b6a02 (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.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