diff options
author | André de la Rocha <andre.rocha@qt.io> | 2022-01-31 08:12:21 +0100 |
---|---|---|
committer | André de la Rocha <andre.rocha@qt.io> | 2022-02-02 00:05:54 +0100 |
commit | 9a51dcd2eead103984cfea589b3e07cdd57dcd21 (patch) | |
tree | 3ac60b302bfde39754260778068a95e325d4ee5e | |
parent | 1233123d729556b20b3907cf6530c6274304776b (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.cpp | 24 | ||||
-rw-r--r-- | src/multimedia/platform/windows/player/mfplayersession_p.h | 1 |
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; }; |