From 424fa7a0419e98d54cc373acf20744953845043a Mon Sep 17 00:00:00 2001 From: Samuel Mira Date: Tue, 29 Mar 2022 14:53:50 +0300 Subject: 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 (cherry picked from commit 78891c03ec3675373ef6b54559d244cda32a9402) --- .../platform/android/common/qandroidvideooutput.cpp | 16 +++++++++++++++- .../platform/android/common/qandroidvideooutput_p.h | 2 ++ .../android/mediaplayer/qandroidmediaplayer.cpp | 9 ++++++--- .../qmediaplayerbackend/testdata/BigBuckBunny.mp4 | Bin 45969 -> 36724 bytes .../qmediaplayerbackend/tst_qmediaplayerbackend.cpp | 13 ++++++++++--- 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 index 8aa192503..6cf08011c 100644 Binary files a/tests/auto/integration/qmediaplayerbackend/testdata/BigBuckBunny.mp4 and b/tests/auto/integration/qmediaplayerbackend/testdata/BigBuckBunny.mp4 differ 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; @@ -186,6 +187,10 @@ void tst_QMediaPlayerBackend::initTestCase() mediaCandidates << "qrc:/testdata/busMpeg4.mp4"; 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"; @@ -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() -- cgit v1.2.3