summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2024-02-28 12:17:37 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-02-28 16:46:34 +0000
commitf725d348d354efb993c95a2c4fb0c2e8a2a9b5d2 (patch)
treed815fc16263cf18a5447e2559cddcbfc0623f325
parentdeba3505fd3393aeb7557f424993b782b0a32af8 (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>
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegmediaplayer.cpp22
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegmediaplayer_p.h3
-rw-r--r--tests/auto/integration/qmediaplayerbackend/fixture.h5
-rw-r--r--tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp8
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);