diff options
author | Samuel Mira <samuel.mira@qt.io> | 2022-03-29 14:53:50 +0300 |
---|---|---|
committer | Samuel Mira <samuel.mira@qt.io> | 2022-03-29 15:28:00 +0300 |
commit | 424fa7a0419e98d54cc373acf20744953845043a (patch) | |
tree | 316685e5b7596b422688a32582c0af2f00d9762b | |
parent | e1727ca1b6eddcdb96685357a768eebadfb2c625 (diff) | |
download | qtmultimedia-424fa7a0419e98d54cc373acf20744953845043a.tar.gz |
Fix Multimedia auto test videoDimension on Android
Added a seekTo in the android mediaPlayer setPosition to update position
and a function on videooutput to render one single frame.
Both changes were added for consistency between different platforms.
Fixes: QTBUG-99361
Change-Id: I2ad0d1bb71ddd7cbc31a97587506050b9969fdd0
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
(cherry picked from commit 78891c03ec3675373ef6b54559d244cda32a9402)
5 files changed, 33 insertions, 7 deletions
diff --git a/src/multimedia/platform/android/common/qandroidvideooutput.cpp b/src/multimedia/platform/android/common/qandroidvideooutput.cpp index 9f8d29430..6508cb554 100644 --- a/src/multimedia/platform/android/common/qandroidvideooutput.cpp +++ b/src/multimedia/platform/android/common/qandroidvideooutput.cpp @@ -250,6 +250,18 @@ void QAndroidTextureVideoOutput::stop() m_started = false; } +void QAndroidTextureVideoOutput::renderFrame() +{ + if (!m_started) { + m_renderFrame = true; + bool frameok = renderAndReadbackFrame(); + if (!frameok) { + m_renderFrame = true; + renderAndReadbackFrame(); + } + } +} + void QAndroidTextureVideoOutput::reset() { // flush pending frame @@ -289,9 +301,11 @@ bool QAndroidTextureVideoOutput::moveToOpenGLContextThread() void QAndroidTextureVideoOutput::onFrameAvailable() { - if (!m_nativeSize.isValid() || !m_sink || !m_started) + if (!(m_nativeSize.isValid() && m_sink) || !(m_started || m_renderFrame)) return; + m_renderFrame = false; + QRhi *rhi = m_sink ? m_sink->rhi() : nullptr; auto *buffer = new AndroidTextureVideoBuffer(rhi, this, m_nativeSize); diff --git a/src/multimedia/platform/android/common/qandroidvideooutput_p.h b/src/multimedia/platform/android/common/qandroidvideooutput_p.h index 4db1bba76..473c58552 100644 --- a/src/multimedia/platform/android/common/qandroidvideooutput_p.h +++ b/src/multimedia/platform/android/common/qandroidvideooutput_p.h @@ -121,6 +121,7 @@ public: void start() override; void stop() override; void reset() override; + void renderFrame(); void setSubtitle(const QString &subtitle); private Q_SLOTS: @@ -141,6 +142,7 @@ private: QVideoSink *m_sink = nullptr; QSize m_nativeSize; bool m_started = false; + bool m_renderFrame = false; AndroidSurfaceTexture *m_surfaceTexture = nullptr; diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer.cpp b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer.cpp index 757f9c512..01a57c298 100644 --- a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer.cpp +++ b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer.cpp @@ -146,9 +146,12 @@ void QAndroidMediaPlayer::setPosition(qint64 position) const int seekPosition = (position > INT_MAX) ? INT_MAX : position; qint64 currentPosition = mMediaPlayer->getCurrentPosition(); - if (seekPosition == currentPosition) + if (seekPosition == currentPosition) { + // update position - will send a new frame of this position + // for consistency with other platforms + mMediaPlayer->seekTo(seekPosition); return; - + } StateChangeNotifier notifier(this); if (mediaStatus() == QMediaPlayer::EndOfMedia) @@ -435,7 +438,7 @@ void QAndroidMediaPlayer::pause() return; } if (mVideoOutput) - mVideoOutput->start(); + mVideoOutput->renderFrame(); const qint64 currentPosition = mMediaPlayer->getCurrentPosition(); setPosition(currentPosition); diff --git a/tests/auto/integration/qmediaplayerbackend/testdata/BigBuckBunny.mp4 b/tests/auto/integration/qmediaplayerbackend/testdata/BigBuckBunny.mp4 Binary files differindex 8aa192503..6cf08011c 100644 --- a/tests/auto/integration/qmediaplayerbackend/testdata/BigBuckBunny.mp4 +++ b/tests/auto/integration/qmediaplayerbackend/testdata/BigBuckBunny.mp4 diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp index 0cbee4ba8..afce5052f 100644 --- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp +++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp @@ -93,6 +93,7 @@ private: QUrl localWavFile2; QUrl localVideoFile; QUrl localVideoFile2; + QUrl videoDimensionTestFile; QUrl localCompressedSoundFile; QUrl localFileWithMetadata; @@ -187,6 +188,10 @@ void tst_QMediaPlayerBackend::initTestCase() localVideoFile2 = MediaFileSelector::selectMediaFile(mediaCandidates); mediaCandidates.clear(); + mediaCandidates << "qrc:/testdata/BigBuckBunny.mp4"; + videoDimensionTestFile = MediaFileSelector::selectMediaFile(mediaCandidates); + + mediaCandidates.clear(); mediaCandidates << "qrc:/testdata/nokia-tune.mp3"; mediaCandidates << "qrc:/testdata/nokia-tune.mkv"; localCompressedSoundFile = MediaFileSelector::selectMediaFile(mediaCandidates); @@ -1224,12 +1229,14 @@ void tst_QMediaPlayerBackend::videoDimensions() QEXPECT_FAIL("", "On Android isSeekable() is always set to true due to QTBUG-96952", Continue); #endif QVERIFY(!player.isSeekable()); - player.setSource(localVideoFile); + player.setSource(videoDimensionTestFile); QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::LoadedMedia); player.pause(); QTRY_COMPARE(surface.m_totalFrames, 1); - QCOMPARE(surface.m_frameList.last().height(), 120); - QCOMPARE(surface.videoSize().height(), 120); + QCOMPARE(surface.m_frameList.last().width(), 540); + QCOMPARE(surface.videoSize().width(), 540); + QCOMPARE(surface.m_frameList.last().height(), 320); + QCOMPARE(surface.videoSize().height(), 320); } void tst_QMediaPlayerBackend::position() |