From d6076e0963b16ec98c13ce126db1d94a8f2952ca Mon Sep 17 00:00:00 2001 From: Nick Korotysh Date: Mon, 1 Jun 2020 23:25:45 +0300 Subject: AVFoundation: fix playback of files with spaces in their names Used QUrl::toEncoded() instead of QUrl::toString(). Usage of QUrl::toString() leads to URLs which can contain spaces and as result such URLs are not accepted by AVPlayer, and it remains in unknown state because AVFMediaPlayerSession::processLoadStateChange() is not called at all. And as result, QMediaPlayer waits media loading forever. [ChangeLog][Platform Specific Changes][AVFoundation] Fixed playback of files with spaces in their names. Fixes: QTBUG-84585 Change-Id: I69e522d048d88310803a7040f114ee808c18720b Reviewed-by: VaL Doroshchuk (cherry picked from commit 9c16be3d9d956f612dda431f4883eab3b09a8b67) Reviewed-by: Qt Cherry-pick Bot --- .../avfoundation/mediaplayer/avfmediaplayersession.mm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/plugins/avfoundation/mediaplayer') diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm index 424f30008..d5554c51c 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm @@ -536,16 +536,16 @@ QIODevice *AVFMediaPlayerSession::mediaStream() const return m_mediaStream; } -static void setURL(void *observer, const QString &url, const QString &mimeType = QString()) +static void setURL(void *observer, const QByteArray &url, const QString &mimeType = QString()) { - NSString *urlString = [NSString stringWithUTF8String:url.toUtf8().constData()]; + NSString *urlString = [NSString stringWithUTF8String:url.constData()]; NSURL *nsurl = [NSURL URLWithString:urlString]; [static_cast(observer) setURL:nsurl mimeType:[NSString stringWithUTF8String:mimeType.toLatin1().constData()]]; } -static void setStreamURL(void *observer, const QString &url) +static void setStreamURL(void *observer, const QByteArray &url) { - setURL(observer, QLatin1String("iodevice://") + url, QFileInfo(url).suffix()); + setURL(observer, QByteArrayLiteral("iodevice://") + url, QFileInfo(url).suffix()); } void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *stream) @@ -588,11 +588,11 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st // If there is a data, try to load it, // otherwise wait for readyRead. if (m_mediaStream->size()) - setStreamURL(m_observer, m_resources.request().url().toString()); + setStreamURL(m_observer, m_resources.request().url().toEncoded()); } else { //Load AVURLAsset //initialize asset using content's URL - setURL(m_observer, m_resources.request().url().toString()); + setURL(m_observer, m_resources.request().url().toEncoded()); } m_state = QMediaPlayer::StoppedState; @@ -1037,7 +1037,7 @@ void AVFMediaPlayerSession::processMediaLoadError() void AVFMediaPlayerSession::streamReady() { - setStreamURL(m_observer, m_resources.request().url().toString()); + setStreamURL(m_observer, m_resources.request().url().toEncoded()); } void AVFMediaPlayerSession::streamDestroyed() -- cgit v1.2.3