summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-04-17 11:11:00 +0800
committerTim Blechmann <tim@klingt.org>2024-04-18 10:31:13 +0800
commita5f812e8f088e49e37512b24cf990cb0608ac554 (patch)
treeebe71b566511afff4eb93a2366437731add158b3
parent33f2b664dee67039ecbcd3fddf44f51d713f9061 (diff)
GStreamer: fix resource not found error handling
GStreamer seems to report GST_RESOURCE_ERROR_NOT_FOUND multiple times. So we filter this to send it only once per `setMedia`. We also unset the url to make future `play()` invocations behave correctly Pick-to: 6.5 6.7 Change-Id: Ib04ee8c6b062cd9f343a9323f94678812f7e2d18 Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp34
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h7
2 files changed, 34 insertions, 7 deletions
diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp
index 11b89436d..5e36c7603 100644
--- a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp
+++ b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp
@@ -227,7 +227,8 @@ void QGstreamerMediaPlayer::play()
void QGstreamerMediaPlayer::pause()
{
- if (state() == QMediaPlayer::PausedState || m_url.isEmpty())
+ if (state() == QMediaPlayer::PausedState || m_url.isEmpty()
+ || m_resourceErrorState != ResourceErrorState::NoError)
return;
positionUpdateTimer.stop();
@@ -378,12 +379,30 @@ bool QGstreamerMediaPlayer::processBusMessage(const QGstreamerMessage &message)
QUniqueGStringHandle debug;
gst_message_parse_error(gm, &err, &debug);
qCDebug(qLcMediaPlayer) << " error" << err << debug;
- if (err.get()->domain == GST_STREAM_ERROR
- && err.get()->code == GST_STREAM_ERROR_CODEC_NOT_FOUND)
- emit error(QMediaPlayer::FormatError, tr("Cannot play stream of type: <unknown>"));
- else
- emit error(QMediaPlayer::ResourceError, QString::fromUtf8(err.get()->message));
- playerPipeline.dumpGraph("error");
+
+ GQuark errorDomain = err.get()->domain;
+ gint errorCode = err.get()->code;
+
+ if (errorDomain == GST_STREAM_ERROR) {
+ if (errorCode == GST_STREAM_ERROR_CODEC_NOT_FOUND)
+ emit error(QMediaPlayer::FormatError, tr("Cannot play stream of type: <unknown>"));
+ else {
+ emit error(QMediaPlayer::FormatError, QString::fromUtf8(err.get()->message));
+ }
+ } else if (errorDomain == GST_RESOURCE_ERROR) {
+ if (errorCode == GST_RESOURCE_ERROR_NOT_FOUND) {
+ if (m_resourceErrorState != ResourceErrorState::ErrorReported) {
+ // gstreamer seems to deliver multiple GST_RESOURCE_ERROR_NOT_FOUND events
+ emit error(QMediaPlayer::ResourceError, QString::fromUtf8(err.get()->message));
+ m_resourceErrorState = ResourceErrorState::ErrorReported;
+ m_url.clear();
+ }
+ } else {
+ emit error(QMediaPlayer::ResourceError, QString::fromUtf8(err.get()->message));
+ }
+ } else {
+ playerPipeline.dumpGraph("error");
+ }
mediaStatusChanged(QMediaPlayer::InvalidMedia);
break;
}
@@ -686,6 +705,7 @@ void QGstreamerMediaPlayer::setMedia(const QUrl &content, QIODevice *stream)
qCDebug(qLcMediaPlayer) << Q_FUNC_INFO << "setting location to" << content;
prerolling = true;
+ m_resourceErrorState = ResourceErrorState::NoError;
bool ret = playerPipeline.setStateSync(GST_STATE_NULL);
if (!ret)
diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h
index ef4deebfa..3b2129296 100644
--- a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h
+++ b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h
@@ -134,8 +134,15 @@ private:
QUrl m_url;
QIODevice *m_stream = nullptr;
+ enum class ResourceErrorState : uint8_t {
+ NoError,
+ ErrorOccurred,
+ ErrorReported,
+ };
+
bool prerolling = false;
bool m_requiresSeekOnPlay = false;
+ ResourceErrorState m_resourceErrorState = ResourceErrorState::NoError;
qint64 m_duration = 0;
QTimer positionUpdateTimer;