From a5f812e8f088e49e37512b24cf990cb0608ac554 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Wed, 17 Apr 2024 11:11:00 +0800 Subject: 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 --- .../gstreamer/common/qgstreamermediaplayer.cpp | 34 +++++++++++++++++----- .../gstreamer/common/qgstreamermediaplayer_p.h | 7 +++++ 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: ")); - 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: ")); + 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; -- cgit v1.2.3