diff options
author | Yoann Lopes <yoann.lopes@digia.com> | 2013-07-12 12:30:39 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-07-19 09:42:42 +0200 |
commit | d599f7319af86265083bae96f21d942aeff24737 (patch) | |
tree | 63275f086d34f5fa31af07e3b4643b6a6b144bef /src | |
parent | e15a2b92b6120a119cf218ab0f0630f23bc45ba5 (diff) | |
download | qtmultimedia-d599f7319af86265083bae96f21d942aeff24737.tar.gz |
WMF: fixed MediaPlayer buffering logic.
To have a consistent behavior with other backends, the WMF plugin now
starts the session after loading a media in order to start buffering some
data and correctly notify when the media is buffered.
It was previously reporting a BufferedMedia status only (and wrongly)
after explicitly starting the media player.
Not all source readers (usually a source reader is specific to a file
format) implement the service needed to query buffering progress. In that
case just report the media to be buffered immediately after loading.
Change-Id: I6e6332ae08e96fc789556761e5169b88c36c5e37
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/wmf/player/mfplayersession.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index c52498f63..fb150c3e9 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -1326,8 +1326,6 @@ 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; } @@ -1911,10 +1909,12 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) switch (meType) { case MEBufferingStarted: - changeStatus(QMediaPlayer::StalledMedia); + changeStatus(m_status == QMediaPlayer::LoadedMedia ? QMediaPlayer::BufferingMedia : QMediaPlayer::StalledMedia); emit bufferStatusChanged(bufferStatus()); break; case MEBufferingStopped: + if (m_status == QMediaPlayer::BufferingMedia) + stop(true); changeStatus(QMediaPlayer::BufferedMedia); emit bufferStatusChanged(bufferStatus()); break; @@ -1979,6 +1979,16 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) } } MFGetService(m_session, MFNETSOURCE_STATISTICS_SERVICE, IID_PPV_ARGS(&m_netsourceStatistics)); + + if (!m_netsourceStatistics || bufferStatus() == 100) { + // If the source reader doesn't implement the statistics service, just set the status + // to buffered, since there is no way to query the buffering progress... + changeStatus(QMediaPlayer::BufferedMedia); + } else { + // Start to trigger buffering. Once enough buffering is done, the session will + // be automatically stopped unless the user has explicitly started playback. + start(); + } } } } |