summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndré de la Rocha <andre.rocha@qt.io>2022-01-31 08:12:21 +0100
committerAndré de la Rocha <andre.rocha@qt.io>2022-02-02 00:05:54 +0100
commit9a51dcd2eead103984cfea589b3e07cdd57dcd21 (patch)
tree3ac60b302bfde39754260778068a95e325d4ee5e
parent1233123d729556b20b3907cf6530c6274304776b (diff)
Windows: Fix player sending same position multiple times
Under some conditions the player would keep sending the same position update notification multiple times. Fixes: QTBUG-100283 Change-Id: I6968b5e76794cf055b5bd6c4703f5a4fc68ae544 Reviewed-by: Piotr Srebrny <piotr.srebrny@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io> (cherry picked from commit a997f2cee2c8509aa597bb89e3c00eefe31c7564) Reviewed-by: André de la Rocha <andre.rocha@qt.io>
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession.cpp24
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession_p.h1
2 files changed, 16 insertions, 9 deletions
diff --git a/src/multimedia/platform/windows/player/mfplayersession.cpp b/src/multimedia/platform/windows/player/mfplayersession.cpp
index 540c7c539..f859f2535 100644
--- a/src/multimedia/platform/windows/player/mfplayersession.cpp
+++ b/src/multimedia/platform/windows/player/mfplayersession.cpp
@@ -116,19 +116,23 @@ MFPlayerSession::MFPlayerSession(MFPlayerControl *playerControl)
void MFPlayerSession::timeout()
{
const qint64 pos = position();
- const bool updatePos = m_timeCounter++ % 10 == 0;
- if (pos >= qint64(m_duration / 10000 - 20)) {
- if (m_playerControl->doLoop()) {
- m_session->Pause();
- setPosition(0);
- positionChanged(0);
+
+ if (pos != m_lastPosition) {
+ const bool updatePos = m_timeCounter++ % 10 == 0;
+ if (pos >= qint64(m_duration / 10000 - 20)) {
+ if (m_playerControl->doLoop()) {
+ m_session->Pause();
+ setPosition(0);
+ positionChanged(0);
+ } else {
+ if (updatePos)
+ positionChanged(pos);
+ }
} else {
if (updatePos)
positionChanged(pos);
}
- } else {
- if (updatePos)
- positionChanged(pos);
+ m_lastPosition = pos;
}
}
@@ -182,6 +186,7 @@ void MFPlayerSession::close()
if (m_hCloseEvent)
CloseHandle(m_hCloseEvent);
m_hCloseEvent = 0;
+ m_lastPosition = -1;
}
MFPlayerSession::~MFPlayerSession()
@@ -1725,6 +1730,7 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent)
// Topology is resolved and successfuly set, this happens only after loading a new media.
// Make sure we always start the media from the beginning
+ m_lastPosition = -1;
m_position = 0;
positionChanged(0);
changeStatus(QMediaPlayer::LoadedMedia);
diff --git a/src/multimedia/platform/windows/player/mfplayersession_p.h b/src/multimedia/platform/windows/player/mfplayersession_p.h
index 4748c291e..e88e787a3 100644
--- a/src/multimedia/platform/windows/player/mfplayersession_p.h
+++ b/src/multimedia/platform/windows/player/mfplayersession_p.h
@@ -276,6 +276,7 @@ private:
MFTransform *m_videoProbeMFT;
QTimer m_signalPositionChangeTimer;
+ qint64 m_lastPosition = -1;
};