diff options
author | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-09-03 18:33:17 +0200 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-09-15 09:10:12 +0000 |
commit | bede0a838ddafadafc400f20c00a687e753ea638 (patch) | |
tree | 1e922d7f6af9067b2f8ded7f6d0027ddd950527c /src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm | |
parent | 6a6a69b7d8343a3cdd9daff60b9288eb361148c9 (diff) |
AVFoundation: store seek requests before media is loaded.
And actually seek once the media is loaded.
Task-number: QTBUG-48057
Change-Id: I9446a1e66a48f9a94c039be9af81689ed04bc56c
Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
Diffstat (limited to 'src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm')
-rw-r--r-- | src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm index d9d705c68..1184451ad 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm @@ -391,6 +391,7 @@ AVFMediaPlayerSession::AVFMediaPlayerSession(AVFMediaPlayerService *service, QOb , m_tryingAsync(false) , m_volume(100) , m_rate(1.0) + , m_requestedPosition(-1) , m_duration(0) , m_videoAvailable(false) , m_audioAvailable(false) @@ -468,6 +469,8 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st setAudioAvailable(false); setVideoAvailable(false); + m_requestedPosition = -1; + Q_EMIT positionChanged(position()); QMediaPlayer::MediaStatus oldMediaStatus = m_mediaStatus; @@ -479,7 +482,6 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st if (m_mediaStatus != oldMediaStatus) Q_EMIT mediaStatusChanged(m_mediaStatus); - Q_EMIT positionChanged(position()); return; } else { @@ -487,6 +489,7 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st if (m_mediaStatus != oldMediaStatus) Q_EMIT mediaStatusChanged(m_mediaStatus); } + //Load AVURLAsset //initialize asset using content's URL NSString *urlString = [NSString stringWithUTF8String:content.canonicalUrl().toEncoded().constData()]; @@ -499,7 +502,7 @@ qint64 AVFMediaPlayerSession::position() const AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; if (!playerItem) - return 0; + return m_requestedPosition != -1 ? m_requestedPosition : 0; CMTime time = [playerItem currentTime]; return static_cast<quint64>(float(time.value) / float(time.timescale) * 1000.0f); @@ -619,14 +622,23 @@ void AVFMediaPlayerSession::setPosition(qint64 pos) qDebug() << Q_FUNC_INFO << pos; #endif - if ( !isSeekable() || pos == position()) + if (pos == position()) return; AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; - - if (!playerItem) + if (!playerItem) { + m_requestedPosition = pos; + Q_EMIT positionChanged(m_requestedPosition); return; + } else if (!isSeekable()) { + if (m_requestedPosition != -1) { + m_requestedPosition = -1; + Q_EMIT positionChanged(position()); + } + return; + } + pos = qMax(qint64(0), pos); if (duration() > 0) pos = qMin(pos, duration()); @@ -823,6 +835,11 @@ void AVFMediaPlayerSession::processLoadStateChange() if (m_duration != currentDuration) Q_EMIT durationChanged(m_duration = currentDuration); + if (m_requestedPosition != -1) { + setPosition(m_requestedPosition); + m_requestedPosition = -1; + } + newStatus = isPlaying ? QMediaPlayer::BufferedMedia : QMediaPlayer::LoadedMedia; if (m_state == QMediaPlayer::PlayingState && [(AVFMediaPlayerSessionObserver*)m_observer player]) { @@ -842,6 +859,10 @@ void AVFMediaPlayerSession::processPositionChange() void AVFMediaPlayerSession::processMediaLoadError() { + if (m_requestedPosition != -1) { + m_requestedPosition = -1; + Q_EMIT positionChanged(position()); + } Q_EMIT error(QMediaPlayer::FormatError, tr("Failed to load media")); Q_EMIT mediaStatusChanged(m_mediaStatus = QMediaPlayer::InvalidMedia); Q_EMIT stateChanged(m_state = QMediaPlayer::StoppedState); |