diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2024-02-28 12:17:37 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-02-28 16:46:34 +0000 |
commit | f725d348d354efb993c95a2c4fb0c2e8a2a9b5d2 (patch) | |
tree | d815fc16263cf18a5447e2559cddcbfc0623f325 | |
parent | deba3505fd3393aeb7557f424993b782b0a32af8 (diff) |
Emit signal bufferProgressChanged
The signal was not emitted upon changing.
Note, currently emitting intermediate progress values is not
accurate (only 0.25). To be fixed in the future.
Fixes: QTBUG-122706
Pick-to: 6.6 6.5
Change-Id: Iae948ef6d0b27d7ece10112b91d240d0a5d71938
Reviewed-by: Lars Sutterud <lars.sutterud@qt.io>
Reviewed-by: Pavel Dubsky <pavel.dubsky@qt.io>
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
(cherry picked from commit 5b3345d3750f3812ad7fafde39d60a9123c890eb)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
4 files changed, 33 insertions, 5 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp b/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp index fe8e83a97..6a950a6ad 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp +++ b/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp @@ -104,10 +104,24 @@ void QFFmpegMediaPlayer::onBuffered() float QFFmpegMediaPlayer::bufferProgress() const { - const auto status = mediaStatus(); - return status == QMediaPlayer::BufferingMedia ? 0.25f // to be improved - : status == QMediaPlayer::BufferedMedia ? 1.f - : 0.f; + return m_bufferProgress; +} + +void QFFmpegMediaPlayer::mediaStatusChanged(QMediaPlayer::MediaStatus status) +{ + if (mediaStatus() == status) + return; + + const auto newBufferProgress = status == QMediaPlayer::BufferingMedia ? 0.25f // to be improved + : status == QMediaPlayer::BufferedMedia ? 1.f + : 0.f; + + if (!qFuzzyCompare(newBufferProgress, m_bufferProgress)) { + m_bufferProgress = newBufferProgress; + bufferProgressChanged(newBufferProgress); + } + + QPlatformMediaPlayer::mediaStatusChanged(status); } QMediaTimeRange QFFmpegMediaPlayer::availablePlaybackRanges() const diff --git a/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer_p.h b/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer_p.h index 26287a07d..4e700787e 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer_p.h +++ b/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer_p.h @@ -78,6 +78,8 @@ private: void setMediaAsync(QFFmpeg::MediaDataHolder::Maybe mediaDataHolder, const std::shared_ptr<QFFmpeg::CancelToken> &cancelToken); + void mediaStatusChanged(QMediaPlayer::MediaStatus); + private slots: void updatePosition(); void endOfStream(); @@ -101,6 +103,7 @@ private: QUrl m_url; QPointer<QIODevice> m_device; float m_playbackRate = 1.; + float m_bufferProgress = 0.f; QFuture<void> m_loadMedia; std::shared_ptr<QFFmpeg::CancelToken> m_cancelToken; // For interrupting ongoing // network connection attempt diff --git a/tests/auto/integration/qmediaplayerbackend/fixture.h b/tests/auto/integration/qmediaplayerbackend/fixture.h index 6d6d38418..f78c6a8e6 100644 --- a/tests/auto/integration/qmediaplayerbackend/fixture.h +++ b/tests/auto/integration/qmediaplayerbackend/fixture.h @@ -24,7 +24,8 @@ public: playbackRateChanged(&player, &QMediaPlayer::playbackRateChanged), metadataChanged(&player, &QMediaPlayer::metaDataChanged), volumeChanged(&output, &QAudioOutput::volumeChanged), - mutedChanged(&output, &QAudioOutput::mutedChanged) + mutedChanged(&output, &QAudioOutput::mutedChanged), + bufferProgressChanged(&player, &QMediaPlayer::bufferProgressChanged) { setVideoSinkAsyncFramesCounter(surface, framesCount); @@ -44,6 +45,7 @@ public: metadataChanged.clear(); volumeChanged.clear(); mutedChanged.clear(); + bufferProgressChanged.clear(); } QMediaPlayer player; @@ -61,6 +63,7 @@ public: QSignalSpy metadataChanged; QSignalSpy volumeChanged; QSignalSpy mutedChanged; + QSignalSpy bufferProgressChanged; }; // Helper to create an object that is comparable to a QSignalSpy diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp index c9d039a52..eb379b2e6 100644 --- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp +++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp @@ -942,6 +942,10 @@ void tst_QMediaPlayerBackend::play_setsPlaybackStateAndMediaStatus_whenValidFile { QMediaPlayer::LoadedMedia }, { QMediaPlayer::BufferingMedia }, { QMediaPlayer::BufferedMedia } })); + + QTRY_COMPARE_GT(m_fixture->bufferProgressChanged.size(), 0); + QTRY_COMPARE_NE(m_fixture->bufferProgressChanged.front().front(), 0.f); + QTRY_COMPARE(m_fixture->bufferProgressChanged.back().front(), 1.f); } void tst_QMediaPlayerBackend::play_startsPlaybackAndChangesPosition_whenValidFileIsLoaded() @@ -1127,6 +1131,7 @@ void tst_QMediaPlayerBackend::stop_entersStoppedState_whenPlayerWasPaused() QCOMPARE(m_fixture->playbackStateChanged, SignalList({ { QMediaPlayer::StoppedState } })); // it's allowed to emit statusChanged() signal async QTRY_COMPARE(m_fixture->mediaStatusChanged, SignalList({ { QMediaPlayer::LoadedMedia } })); + QCOMPARE(m_fixture->bufferProgressChanged, SignalList({ { 0.f } })); QTRY_COMPARE(m_fixture->player.position(), qint64(0)); QTRY_VERIFY(!m_fixture->positionChanged.empty()); @@ -1319,6 +1324,9 @@ void tst_QMediaPlayerBackend::processEOS() QCOMPARE(m_fixture->playbackStateChanged.size(), 2); QCOMPARE(m_fixture->playbackStateChanged.last()[0].value<QMediaPlayer::PlaybackState>(), QMediaPlayer::StoppedState); + QCOMPARE_GT(m_fixture->bufferProgressChanged.size(), 1); + QCOMPARE(m_fixture->bufferProgressChanged.back().front(), 0.f); + //position stays at the end of file QCOMPARE(m_fixture->player.position(), m_fixture->player.duration()); QTRY_VERIFY(m_fixture->positionChanged.size() > 0); |