diff options
author | Ling Hu <ling.hu@nokia.com> | 2012-06-08 14:57:56 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-12 06:33:09 +0200 |
commit | 931c2d3ffe88086e1839ee5b8b8ddcab06fd698d (patch) | |
tree | ccedadbc44be196c35cc7d8f147be0bc7c580e20 /src/plugins/gstreamer/mediaplayer | |
parent | 28605b8f741e6c881b62440c07df76114d12c080 (diff) |
Enable auto resume of playback for gstreamer mediaplayer
The resource policy now supports implicit auto-resume,
so it is better to cooperate with that in mediaplayer
to enable auto resume playback after resource lost.
Change-Id: Iba0d28e64fa864dd6332a62e915316d48a12a533
Reviewed-by: Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com>
Diffstat (limited to 'src/plugins/gstreamer/mediaplayer')
-rw-r--r-- | src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp | 72 | ||||
-rw-r--r-- | src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h | 3 |
2 files changed, 44 insertions, 31 deletions
diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp index 7a3ba4d39..0e186259f 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp @@ -64,7 +64,8 @@ QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *sessio : QMediaPlayerControl(parent) , m_ownStream(false) , m_session(session) - , m_state(QMediaPlayer::StoppedState) + , m_userRequestedState(QMediaPlayer::StoppedState) + , m_currentState(QMediaPlayer::StoppedState) , m_mediaStatus(QMediaPlayer::NoMedia) , m_bufferProgress(-1) , m_seekToStartPending(false) @@ -112,7 +113,10 @@ QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *sessio this, SLOT(applyPendingSeek(bool))); connect(m_resources, SIGNAL(resourcesGranted()), SLOT(handleResourcesGranted())); - connect(m_resources, SIGNAL(resourcesDenied()), SLOT(handleResourcesDenied())); + //denied signal should be queued to have correct state update process, + //since in playOrPause, when acquire is call on resource set, it may trigger a resourcesDenied signal immediately, + //so handleResourcesDenied should be processed later, otherwise it will be overwritten by state update later in playOrPause. + connect(m_resources, SIGNAL(resourcesDenied()), this, SLOT(handleResourcesDenied()), Qt::QueuedConnection); connect(m_resources, SIGNAL(resourcesLost()), SLOT(handleResourcesLost())); } @@ -145,7 +149,7 @@ qint64 QGstreamerPlayerControl::duration() const QMediaPlayer::State QGstreamerPlayerControl::state() const { - return m_state; + return m_currentState; } QMediaPlayer::MediaStatus QGstreamerPlayerControl::mediaStatus() const @@ -220,7 +224,10 @@ void QGstreamerPlayerControl::play() #ifdef DEBUG_PLAYBIN qDebug() << Q_FUNC_INFO; #endif - + //m_userRequestedState is needed to know that we need to resume playback when resource-policy + //regranted the resources after lost, since m_currentState will become paused when resources are + //lost. + m_userRequestedState = QMediaPlayer::PlayingState; playOrPause(QMediaPlayer::PlayingState); } @@ -229,6 +236,7 @@ void QGstreamerPlayerControl::pause() #ifdef DEBUG_PLAYBIN qDebug() << Q_FUNC_INFO; #endif + m_userRequestedState = QMediaPlayer::PausedState; playOrPause(QMediaPlayer::PausedState); } @@ -270,7 +278,7 @@ void QGstreamerPlayerControl::playOrPause(QMediaPlayer::State newState) bool ok = false; // show prerolled frame if switching from stopped state - if (newState != QMediaPlayer::StoppedState && m_state == QMediaPlayer::StoppedState && m_pendingSeekPosition == -1) + if (newState != QMediaPlayer::StoppedState && m_currentState == QMediaPlayer::StoppedState && m_pendingSeekPosition == -1) m_session->showPrerollFrames(true); //To prevent displaying the first video frame when playback is resumed @@ -289,7 +297,7 @@ void QGstreamerPlayerControl::playOrPause(QMediaPlayer::State newState) if (m_mediaStatus == QMediaPlayer::InvalidMedia) m_mediaStatus = QMediaPlayer::LoadingMedia; - m_state = newState; + m_currentState = newState; if (m_mediaStatus == QMediaPlayer::EndOfMedia || m_mediaStatus == QMediaPlayer::LoadedMedia) { if (m_bufferProgress == -1 || m_bufferProgress == 100) @@ -308,11 +316,12 @@ void QGstreamerPlayerControl::stop() #ifdef DEBUG_PLAYBIN qDebug() << Q_FUNC_INFO; #endif + m_userRequestedState = QMediaPlayer::StoppedState; pushState(); - if (m_state != QMediaPlayer::StoppedState) { - m_state = QMediaPlayer::StoppedState; + if (m_currentState != QMediaPlayer::StoppedState) { + m_currentState = QMediaPlayer::StoppedState; m_session->showPrerollFrames(false); // stop showing prerolled frames in stop state if (m_resources->isGranted()) m_session->pause(); @@ -354,7 +363,7 @@ void QGstreamerPlayerControl::setMedia(const QMediaContent &content, QIODevice * pushState(); - m_state = QMediaPlayer::StoppedState; + m_currentState = QMediaPlayer::StoppedState; QMediaContent oldMedia = m_currentResource; m_pendingSeekPosition = -1; m_session->showPrerollFrames(false); // do not show prerolled frames until pause() or play() explicitly called @@ -399,7 +408,7 @@ void QGstreamerPlayerControl::setMedia(const QMediaContent &content, QIODevice * m_currentResource = content; emit mediaChanged(m_currentResource); emit error(QMediaPlayer::FormatError, tr("Attempting to play invalid Qt resource")); - if (m_state != QMediaPlayer::PlayingState) + if (m_currentState != QMediaPlayer::PlayingState) m_resources->release(); popAndNotifyState(); return; @@ -435,7 +444,7 @@ void QGstreamerPlayerControl::setMedia(const QMediaContent &content, QIODevice * } else { m_mediaStatus = QMediaPlayer::InvalidMedia; emit error(QMediaPlayer::FormatError, tr("Attempting to play invalid user stream")); - if (m_state != QMediaPlayer::PlayingState) + if (m_currentState != QMediaPlayer::PlayingState) m_resources->release(); popAndNotifyState(); return; @@ -495,7 +504,7 @@ void QGstreamerPlayerControl::updateSessionState(QMediaPlayer::State state) pushState(); if (state == QMediaPlayer::StoppedState) - m_state = QMediaPlayer::StoppedState; + m_currentState = QMediaPlayer::StoppedState; updateMediaStatus(); @@ -517,7 +526,7 @@ void QGstreamerPlayerControl::updateMediaStatus() case QMediaPlayer::PlayingState: case QMediaPlayer::PausedState: - if (m_state == QMediaPlayer::StoppedState) { + if (m_currentState == QMediaPlayer::StoppedState) { m_mediaStatus = QMediaPlayer::LoadedMedia; } else { if (m_bufferProgress == -1 || m_bufferProgress == 100) @@ -528,7 +537,7 @@ void QGstreamerPlayerControl::updateMediaStatus() break; } - if (m_state == QMediaPlayer::PlayingState && !m_resources->isGranted()) + if (m_currentState == QMediaPlayer::PlayingState && !m_resources->isGranted()) m_mediaStatus = QMediaPlayer::StalledMedia; //EndOfMedia status should be kept, until reset by pause, play or setMedia @@ -546,8 +555,8 @@ void QGstreamerPlayerControl::processEOS() m_session->endOfMediaReset(); m_setMediaPending = true; - if (m_state != QMediaPlayer::StoppedState) { - m_state = QMediaPlayer::StoppedState; + if (m_currentState != QMediaPlayer::StoppedState) { + m_currentState = QMediaPlayer::StoppedState; m_session->showPrerollFrames(false); // stop showing prerolled frames in stop state } @@ -565,7 +574,7 @@ void QGstreamerPlayerControl::setBufferProgress(int progress) m_bufferProgress = progress; if (m_resources->isGranted()) { - if (m_state == QMediaPlayer::PlayingState && + if (m_currentState == QMediaPlayer::PlayingState && m_bufferProgress == 100 && m_session->state() != QMediaPlayer::PlayingState) m_session->play(); @@ -683,7 +692,7 @@ void QGstreamerPlayerControl::handleInvalidMedia() { pushState(); m_mediaStatus = QMediaPlayer::InvalidMedia; - m_state = QMediaPlayer::StoppedState; + m_currentState = QMediaPlayer::StoppedState; popAndNotifyState(); } @@ -691,8 +700,12 @@ void QGstreamerPlayerControl::handleResourcesGranted() { pushState(); - if (m_state != QMediaPlayer::StoppedState) - playOrPause(m_state); + //This may be triggered when there is an auto resume + //from resource-policy, we need to take action according to m_userRequestedState + //rather than m_currentState + m_currentState = m_userRequestedState; + if (m_currentState != QMediaPlayer::StoppedState) + playOrPause(m_currentState); else updateMediaStatus(); @@ -703,14 +716,13 @@ void QGstreamerPlayerControl::handleResourcesLost() { //on resource lost the pipeline should be paused //player status is changed to paused - pushState(); - QMediaPlayer::State oldState = m_state; + QMediaPlayer::State oldState = m_currentState; m_session->pause(); if (oldState != QMediaPlayer::StoppedState ) - m_state = QMediaPlayer::PausedState; + m_currentState = QMediaPlayer::PausedState; popAndNotifyState(); } @@ -721,8 +733,8 @@ void QGstreamerPlayerControl::handleResourcesDenied() //player status is changed to paused pushState(); - if (m_state != QMediaPlayer::StoppedState ) - m_state = QMediaPlayer::PausedState; + if (m_currentState != QMediaPlayer::StoppedState ) + m_currentState = QMediaPlayer::PausedState; popAndNotifyState(); } @@ -739,7 +751,7 @@ void QGstreamerPlayerControl::setMediaDownloadEnabled(bool enabled) void QGstreamerPlayerControl::pushState() { - m_stateStack.push(m_state); + m_stateStack.push(m_currentState); m_mediaStatusStack.push(m_mediaStatus); } @@ -751,11 +763,11 @@ void QGstreamerPlayerControl::popAndNotifyState() QMediaPlayer::MediaStatus oldMediaStatus = m_mediaStatusStack.pop(); if (m_stateStack.isEmpty()) { - if (m_state != oldState) { + if (m_currentState != oldState) { #ifdef DEBUG_PLAYBIN qDebug() << "State changed:" << m_state; #endif - emit stateChanged(m_state); + emit stateChanged(m_currentState); } if (m_mediaStatus != oldMediaStatus) { @@ -777,9 +789,9 @@ void QGstreamerPlayerControl::updatePosition(qint64 pos) //seek request is complete, it's safe to resume playback //with prerolled frame displayed m_pendingSeekPosition = -1; - if (m_state != QMediaPlayer::StoppedState) + if (m_currentState != QMediaPlayer::StoppedState) m_session->showPrerollFrames(true); - if (m_state == QMediaPlayer::PlayingState) { + if (m_currentState == QMediaPlayer::PlayingState) { m_session->play(); } } diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h index 4511d7edf..c32592a1a 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h @@ -136,7 +136,8 @@ private: bool m_ownStream; QGstreamerPlayerSession *m_session; - QMediaPlayer::State m_state; + QMediaPlayer::State m_userRequestedState; + QMediaPlayer::State m_currentState; QMediaPlayer::MediaStatus m_mediaStatus; QStack<QMediaPlayer::State> m_stateStack; QStack<QMediaPlayer::MediaStatus> m_mediaStatusStack; |