diff options
author | Yoann Lopes <yoann.lopes@digia.com> | 2013-12-04 17:02:27 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-12-04 18:46:26 +0100 |
commit | 99bebdbb7dbdde259bc06e86079daebb17482c64 (patch) | |
tree | fbf7628cadd77d543b7784e9d314ad972eea852f | |
parent | cbe9fc8e4db4efcf6a6b5e104af38bdf08f21984 (diff) | |
download | qtmultimedia-99bebdbb7dbdde259bc06e86079daebb17482c64.tar.gz |
WMF: fixed various media player issues.
- Switch to BufferedMedia only once playback actually started, not when
requesting to start.
- Report the position to have changed when seeking in stopped state.
Change-Id: I930b3e6977cebe5935ed033d0a4d4e1eb899ad2c
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
-rw-r--r-- | src/plugins/wmf/player/mfplayersession.cpp | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 3c12bb046..8e0235e94 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -1323,14 +1323,8 @@ void MFPlayerSession::stop(bool immediate) void MFPlayerSession::start() { - switch (m_status) { - case QMediaPlayer::EndOfMedia: - m_varStart.hVal.QuadPart = 0; - //since it must be loaded already, just fallthrough - case QMediaPlayer::LoadedMedia: - changeStatus(QMediaPlayer::BufferedMedia); - return; - } + if (m_status == QMediaPlayer::EndOfMedia) + m_varStart.hVal.QuadPart = 0; // restart from the beginning #ifdef DEBUG_MEDIAFOUNDATION qDebug() << "start"; @@ -1464,6 +1458,9 @@ void MFPlayerSession::setPositionInternal(qint64 position, Command requestCmd) if (m_state.command == CmdStop && requestCmd != CmdSeekResume) { m_varStart.vt = VT_I8; m_varStart.hVal.QuadPart = LONGLONG(position * 10000); + // Even though the position is not actually set on the session yet, + // report it to have changed anyway for UI controls to be updated + emit positionChanged(this->position()); return; } @@ -1563,6 +1560,8 @@ void MFPlayerSession::commitRateChange(qreal rate, BOOL isThin) m_presentationClock->GetCorrelatedTime(0, &hnsClockTime, &hnsSystemTime); Q_ASSERT(hnsSystemTime != 0); + m_request.setCommand(rate < 0 || m_state.rate < 0 ? CmdSeekResume : CmdStart); + // We need to stop only when dealing with negative rates if (rate >= 0 && m_state.rate >= 0) pause(); @@ -1571,7 +1570,6 @@ void MFPlayerSession::commitRateChange(qreal rate, BOOL isThin) // If we deal with negative rates, we stopped the session and consequently // reset the position to zero. We then need to resume to the current position. - m_request.setCommand(rate < 0 || m_state.rate < 0 ? CmdSeekResume : CmdStart); m_request.start = hnsClockTime / 10000; } else if (cmdNow == CmdPause) { if (rate < 0 || m_state.rate < 0) { @@ -1606,10 +1604,11 @@ void MFPlayerSession::commitRateChange(qreal rate, BOOL isThin) // Changing rate from negative to zero requires to stop the session m_presentationClock->GetCorrelatedTime(0, &hnsClockTime, &hnsSystemTime); + m_request.setCommand(CmdSeekResume); + stop(); - // Resumte to the current position (stop() will reset the position to 0) - m_request.setCommand(CmdSeekResume); + // Resume to the current position (stop() will reset the position to 0) m_request.start = hnsClockTime / 10000; } @@ -1837,6 +1836,12 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) updatePendingCommands(CmdStart); break; case MESessionStarted: + if (m_status == QMediaPlayer::EndOfMedia + || m_status == QMediaPlayer::LoadedMedia) { + // If the session started, then enough data is buffered to play + changeStatus(QMediaPlayer::BufferedMedia); + } + updatePendingCommands(CmdStart); #ifndef Q_WS_SIMULATOR // playback started, we can now set again the procAmpValues if they have been @@ -1852,8 +1857,8 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) m_varStart.hVal.QuadPart = 0; // Reset to Loaded status unless we are loading a new media - // or if the media is buffered (to avoid restarting the video surface) - if (m_status != QMediaPlayer::LoadingMedia && m_status != QMediaPlayer::BufferedMedia) + // or changing the playback rate to negative values (stop required) + if (m_status != QMediaPlayer::LoadingMedia && m_request.command != CmdSeekResume) changeStatus(QMediaPlayer::LoadedMedia); } updatePendingCommands(CmdStop); |