summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@digia.com>2013-07-12 12:30:39 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-07-19 09:42:42 +0200
commitd599f7319af86265083bae96f21d942aeff24737 (patch)
tree63275f086d34f5fa31af07e3b4643b6a6b144bef /src
parente15a2b92b6120a119cf218ab0f0630f23bc45ba5 (diff)
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.cpp16
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();
+ }
}
}
}