From 4ecf5c36a29c416321fbc040471085494dd17987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20de=20la=20Rocha?= Date: Thu, 14 Oct 2021 00:58:12 +0200 Subject: Windows: fix and enable media player backend auto-tests Pick-to: 6.2 Task-number: QTBUG-96677 Change-Id: Ib9063eba2541f719d8b66cac5ead56624d620b06 Reviewed-by: Lars Knoll --- src/multimedia/platform/qplatformvideosink_p.h | 3 +- .../platform/windows/evr/evrvideowindowcontrol.cpp | 11 ----- .../platform/windows/evr/evrvideowindowcontrol_p.h | 2 - .../platform/windows/player/mfplayercontrol.cpp | 6 ++- .../platform/windows/player/mfplayercontrol_p.h | 2 - .../platform/windows/player/mfplayersession.cpp | 29 ++++++++----- .../auto/integration/qmediaplayerbackend/BLACKLIST | 22 ---------- .../tst_qmediaplayerbackend.cpp | 47 +++++++++++++--------- tests/auto/integration/shared/mediafileselector.h | 6 ++- tests/auto/unit/mockbackend/qmockvideosink.h | 6 --- .../qvideowidget/tst_qvideowidget.cpp | 2 +- 11 files changed, 57 insertions(+), 79 deletions(-) diff --git a/src/multimedia/platform/qplatformvideosink_p.h b/src/multimedia/platform/qplatformvideosink_p.h index 6b5769067..859b5afef 100644 --- a/src/multimedia/platform/qplatformvideosink_p.h +++ b/src/multimedia/platform/qplatformvideosink_p.h @@ -78,8 +78,7 @@ public: virtual void setFullScreen(bool) {} virtual void setAspectRatioMode(Qt::AspectRatioMode) {} - // ### make non virtual, once Windows is ported - virtual QSize nativeSize() const + QSize nativeSize() const { QMutexLocker locker(&mutex); return m_nativeSize; diff --git a/src/multimedia/platform/windows/evr/evrvideowindowcontrol.cpp b/src/multimedia/platform/windows/evr/evrvideowindowcontrol.cpp index 013a5dc4d..4ea9fd716 100644 --- a/src/multimedia/platform/windows/evr/evrvideowindowcontrol.cpp +++ b/src/multimedia/platform/windows/evr/evrvideowindowcontrol.cpp @@ -145,17 +145,6 @@ void EvrVideoWindowControl::setFullScreen(bool fullScreen) return; } -QSize EvrVideoWindowControl::nativeSize() const -{ - QSize size; - if (m_displayControl) { - SIZE sourceSize; - if (SUCCEEDED(m_displayControl->GetNativeVideoSize(&sourceSize, 0))) - size = QSize(sourceSize.cx, sourceSize.cy); - } - return size; -} - void EvrVideoWindowControl::setAspectRatioMode(Qt::AspectRatioMode mode) { m_aspectRatioMode = mode; diff --git a/src/multimedia/platform/windows/evr/evrvideowindowcontrol_p.h b/src/multimedia/platform/windows/evr/evrvideowindowcontrol_p.h index 19b67df34..dc29e1af7 100644 --- a/src/multimedia/platform/windows/evr/evrvideowindowcontrol_p.h +++ b/src/multimedia/platform/windows/evr/evrvideowindowcontrol_p.h @@ -75,8 +75,6 @@ public: void setFullScreen(bool fullScreen) override; - QSize nativeSize() const override; - void setAspectRatioMode(Qt::AspectRatioMode mode) override; void setBrightness(float brightness) override; diff --git a/src/multimedia/platform/windows/player/mfplayercontrol.cpp b/src/multimedia/platform/windows/player/mfplayercontrol.cpp index c9c75b4a6..1f7669833 100644 --- a/src/multimedia/platform/windows/player/mfplayercontrol.cpp +++ b/src/multimedia/platform/windows/player/mfplayercontrol.cpp @@ -107,8 +107,12 @@ void MFPlayerControl::play() void MFPlayerControl::pause() { - if (m_state != QMediaPlayer::PlayingState) + if (m_state == QMediaPlayer::PausedState) return; + + if (m_session->status() == QMediaPlayer::NoMedia) + return; + changeState(QMediaPlayer::PausedState); m_session->pause(); refreshState(); diff --git a/src/multimedia/platform/windows/player/mfplayercontrol_p.h b/src/multimedia/platform/windows/player/mfplayercontrol_p.h index e8467ab8d..8238fe7a6 100644 --- a/src/multimedia/platform/windows/player/mfplayercontrol_p.h +++ b/src/multimedia/platform/windows/player/mfplayercontrol_p.h @@ -123,8 +123,6 @@ private: QMediaPlayer::PlaybackState m_state; bool m_stateDirty; - QMediaPlayer::MediaStatus m_status; - QMediaPlayer::Error m_error; bool m_videoAvailable; bool m_audioAvailable; diff --git a/src/multimedia/platform/windows/player/mfplayersession.cpp b/src/multimedia/platform/windows/player/mfplayersession.cpp index a43a7df64..28192b77b 100644 --- a/src/multimedia/platform/windows/player/mfplayersession.cpp +++ b/src/multimedia/platform/windows/player/mfplayersession.cpp @@ -194,7 +194,7 @@ void MFPlayerSession::load(const QUrl &url, QIODevice *stream) changeStatus(QMediaPlayer::LoadingMedia); m_sourceResolver->load(url, stream); } - emit positionChanged(position()); + positionChanged(position()); } void MFPlayerSession::handleSourceError(long hr) @@ -1035,6 +1035,7 @@ void MFPlayerSession::stop(bool immediate) m_pendingState = CmdPending; if (m_status != QMediaPlayer::EndOfMedia) { m_position = 0; + positionChanged(0); } } else { emit error(QMediaPlayer::ResourceError, tr("Failed to stop."), true); @@ -1044,8 +1045,10 @@ void MFPlayerSession::stop(bool immediate) void MFPlayerSession::start() { - if (m_status == QMediaPlayer::EndOfMedia) + if (m_status == QMediaPlayer::EndOfMedia) { m_position = 0; // restart from the beginning + positionChanged(0); + } #ifdef DEBUG_MEDIAFOUNDATION qDebug() << "start"; @@ -1098,6 +1101,10 @@ void MFPlayerSession::pause() } else { emit error(QMediaPlayer::ResourceError, tr("Failed to pause."), false); } + if (m_status == QMediaPlayer::EndOfMedia) { + setPosition(0); + positionChanged(0); + } } } @@ -1156,17 +1163,16 @@ qint64 MFPlayerSession::position() if (m_pendingState == SeekPending) return m_state.start; - if (m_state.command == CmdStop) { + if (m_state.command == CmdStop) return m_position / 10000; - } if (m_presentationClock) { MFTIME time, sysTime; if (FAILED(m_presentationClock->GetCorrelatedTime(0, &time, &sysTime))) - return 0; + return m_position / 10000; return qint64(time / 10000); } - return 0; + return m_position / 10000; } void MFPlayerSession::setPosition(qint64 position) @@ -1190,7 +1196,7 @@ void MFPlayerSession::setPositionInternal(qint64 position, Command requestCmd) m_position = position * 10000; // Even though the position is not actually set on the session yet, // report it to have changed anyway for UI controls to be updated - emit positionChanged(this->position()); + positionChanged(this->position()); return; } @@ -1575,7 +1581,6 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) MediaEventType meType = MEUnknown; hr = sessionEvent->GetType(&meType); - #ifdef DEBUG_MEDIAFOUNDATION if (FAILED(hrStatus)) qDebug() << "handleSessionEvent: MediaEventType = " << meType << "Failed"; @@ -1648,6 +1653,8 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) m_position = position() * 10000; updatePendingCommands(CmdPause); m_signalPositionChangeTimer.stop(); + if (m_status == QMediaPlayer::LoadedMedia) + setPosition(position()); break; case MEReconnectStart: #ifdef DEBUG_MEDIAFOUNDATION @@ -1687,7 +1694,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_position = 0; - + positionChanged(0); changeStatus(QMediaPlayer::LoadedMedia); } break; @@ -1716,7 +1723,7 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) //keep reporting the final position after end of media m_position = qint64(m_duration); - emit positionChanged(position()); + positionChanged(position()); changeStatus(QMediaPlayer::EndOfMedia); break; @@ -1767,7 +1774,7 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) void MFPlayerSession::updatePendingCommands(Command command) { - emit positionChanged(position()); + positionChanged(position()); if (m_state.command != command || m_pendingState == NoPending) return; diff --git a/tests/auto/integration/qmediaplayerbackend/BLACKLIST b/tests/auto/integration/qmediaplayerbackend/BLACKLIST index e91f47755..b2316e3ad 100644 --- a/tests/auto/integration/qmediaplayerbackend/BLACKLIST +++ b/tests/auto/integration/qmediaplayerbackend/BLACKLIST @@ -1,31 +1,9 @@ # QTBUG-46368 osx -windows-7 -windows-7sp1 -windows-10 msvc-2015 -windows-10 msvc-2017 -windows-10 msvc-2019 # Media player plugin not built at the moment on this platform opensuse-13.1 64bit -[loadMedia] -windows 64bit developer-build - -[unloadMedia] -windows 64bit developer-build - -[playPauseStop] -windows 64bit developer-build - -[processEOS] -windows 64bit developer-build - -[deleteLaterAtEOS] -windows 64bit developer-build - -[initialVolume] -windows 64bit developer-build [playlist] redhatenterpriselinuxworkstation-6.6 diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp index fd6c89a33..6e284afaa 100644 --- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp +++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp @@ -360,8 +360,8 @@ void tst_QMediaPlayerBackend::playPauseStop() QTRY_VERIFY(player.position() > 100); QVERIFY(player.duration() > 0); - QVERIFY(positionSpy.count() > 0); - QVERIFY(positionSpy.last()[0].value() > 0); + QTRY_VERIFY(positionSpy.count() > 0); + QTRY_VERIFY(positionSpy.last()[0].value() > 0); stateSpy.clear(); statusSpy.clear(); @@ -371,15 +371,15 @@ void tst_QMediaPlayerBackend::playPauseStop() player.pause(); QCOMPARE(player.playbackState(), QMediaPlayer::PausedState); - QCOMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); + QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.last()[0].value(), QMediaPlayer::PausedState); QTest::qWait(500); - QVERIFY(qAbs(player.position() - positionBeforePause) < 150); - QCOMPARE(positionSpy.count(), 1); + QTRY_VERIFY(qAbs(player.position() - positionBeforePause) < 150); + QTRY_VERIFY(positionSpy.count() > 0); stateSpy.clear(); statusSpy.clear(); @@ -488,8 +488,8 @@ void tst_QMediaPlayerBackend::processEOS() //at EOS the position stays at the end of file QCOMPARE(player.position(), player.duration()); - QVERIFY(positionSpy.count() > 0); - QCOMPARE(positionSpy.last()[0].value(), player.duration()); + QTRY_VERIFY(positionSpy.count() > 0); + QTRY_COMPARE(positionSpy.last()[0].value(), player.duration()); stateSpy.clear(); statusSpy.clear(); @@ -521,8 +521,8 @@ void tst_QMediaPlayerBackend::processEOS() //position stays at the end of file QCOMPARE(player.position(), player.duration()); - QVERIFY(positionSpy.count() > 0); - QCOMPARE(positionSpy.last()[0].value(), player.duration()); + QTRY_VERIFY(positionSpy.count() > 0); + QTRY_COMPARE(positionSpy.last()[0].value(), player.duration()); //after setPosition EndOfMedia status should be reset to Loaded stateSpy.clear(); @@ -552,7 +552,7 @@ void tst_QMediaPlayerBackend::processEOS() QTRY_COMPARE(player.position(), 0); QTRY_VERIFY(positionSpy.count() > 0); - QCOMPARE(positionSpy.first()[0].value(), 0); + QTRY_COMPARE(positionSpy.first()[0].value(), 0); QCOMPARE(player.playbackState(), QMediaPlayer::PausedState); QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); @@ -835,6 +835,8 @@ void tst_QMediaPlayerBackend::seekInStoppedState() QMediaPlayer player; QAudioOutput output; player.setAudioOutput(&output); + TestVideoSink surface(false); + player.setVideoOutput(&surface); QSignalSpy stateSpy(&player, SIGNAL(playbackStateChanged(QMediaPlayer::PlaybackState))); QSignalSpy positionSpy(&player, SIGNAL(positionChanged(qint64))); @@ -852,7 +854,7 @@ void tst_QMediaPlayerBackend::seekInStoppedState() player.setPosition(position); QTRY_VERIFY(qAbs(player.position() - position) < qint64(200)); - QCOMPARE(positionSpy.count(), 1); + QTRY_VERIFY(positionSpy.count() > 0); QVERIFY(qAbs(positionSpy.last()[0].value() - position) < qint64(200)); QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState); @@ -888,7 +890,7 @@ void tst_QMediaPlayerBackend::seekInStoppedState() player.setPosition(position); QTRY_VERIFY(qAbs(player.position() - position) < qint64(200)); - QCOMPARE(positionSpy.count(), 1); + QTRY_VERIFY(positionSpy.count() > 0); QVERIFY(qAbs(positionSpy.last()[0].value() - position) < qint64(200)); QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState); @@ -924,21 +926,19 @@ void tst_QMediaPlayerBackend::seekInStoppedState() player.setPosition(position); QTRY_VERIFY(qAbs(player.position() - position) < qint64(200)); - QCOMPARE(positionSpy.count(), 1); + QTRY_VERIFY(positionSpy.count() > 0); QVERIFY(qAbs(positionSpy.last()[0].value() - position) < qint64(200)); QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 0); - QCOMPARE(player.mediaStatus(), QMediaPlayer::LoadedMedia); - positionSpy.clear(); - player.play(); + QTRY_COMPARE(player.playbackState(), QMediaPlayer::PlayingState); + QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); - QCOMPARE(player.playbackState(), QMediaPlayer::PlayingState); - QVERIFY(player.position() >= position - 200); - QCOMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); + positionSpy.clear(); + QTRY_VERIFY(player.position() > (position - 200)); QTest::qWait(500); // Check that it never played from the beginning @@ -956,6 +956,8 @@ void tst_QMediaPlayerBackend::subsequentPlayback() QAudioOutput output; player.setAudioOutput(&output); player.setSource(localCompressedSoundFile); + QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::LoadedMedia); + QTRY_VERIFY(player.isSeekable()); player.setPosition(5000); player.play(); @@ -1096,10 +1098,12 @@ void tst_QMediaPlayerBackend::audioVideoAvailable() QSKIP("No supported video file"); TestVideoSink surface(false); + QAudioOutput output; QMediaPlayer player; QSignalSpy hasVideoSpy(&player, SIGNAL(hasVideoChanged(bool))); QSignalSpy hasAudioSpy(&player, SIGNAL(hasAudioChanged(bool))); player.setVideoOutput(&surface); + player.setAudioOutput(&output); player.setSource(localVideoFile); QTRY_VERIFY(player.hasVideo()); QTRY_VERIFY(player.hasAudio()); @@ -1135,6 +1139,7 @@ void tst_QMediaPlayerBackend::positionAfterSeek() player.setVideoOutput(&surface); QVERIFY(!player.isSeekable()); player.setSource(localVideoFile); + QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::LoadedMedia); player.pause(); player.setPosition(500); QTRY_VERIFY(player.position() == 500); @@ -1158,6 +1163,7 @@ void tst_QMediaPlayerBackend::videoDimensions() player.setVideoOutput(&surface); QVERIFY(!player.isSeekable()); player.setSource(localVideoFile); + QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::LoadedMedia); player.pause(); QTRY_COMPARE(surface.m_totalFrames, 1); QCOMPARE(surface.m_frameList.last().height(), 120); @@ -1166,6 +1172,9 @@ void tst_QMediaPlayerBackend::videoDimensions() void tst_QMediaPlayerBackend::position() { + if (localVideoFile.isEmpty()) + QSKIP("No supported video file"); + TestVideoSink surface(true); QMediaPlayer player; player.setVideoOutput(&surface); diff --git a/tests/auto/integration/shared/mediafileselector.h b/tests/auto/integration/shared/mediafileselector.h index a9699fc0a..19eded56a 100644 --- a/tests/auto/integration/shared/mediafileselector.h +++ b/tests/auto/integration/shared/mediafileselector.h @@ -43,8 +43,10 @@ namespace MediaFileSelector { static QUrl selectMediaFile(const QStringList& mediaCandidates) { QMediaPlayer player; - QAudioOutput output; - player.setAudioOutput(&output); + QAudioOutput audioOutput; + QVideoSink videoOutput; + player.setAudioOutput(&audioOutput); + player.setVideoOutput(&videoOutput); QSignalSpy errorSpy(&player, SIGNAL(errorOccurred(QMediaPlayer::Error, const QString&))); diff --git a/tests/auto/unit/mockbackend/qmockvideosink.h b/tests/auto/unit/mockbackend/qmockvideosink.h index 187160f3c..0a8baeef0 100644 --- a/tests/auto/unit/mockbackend/qmockvideosink.h +++ b/tests/auto/unit/mockbackend/qmockvideosink.h @@ -64,12 +64,6 @@ public: : QPlatformVideoSink(parent) {} void setRhi(QRhi * /*rhi*/) override {} - - QSize nativeSize() const override { return videoSize; } - - void setVideoSize(QSize s) { videoSize = s; } -protected: - QSize videoSize = QSize(640, 480); }; QT_END_NAMESPACE diff --git a/tests/auto/unit/multimediawidgets/qvideowidget/tst_qvideowidget.cpp b/tests/auto/unit/multimediawidgets/qvideowidget/tst_qvideowidget.cpp index ec8119481..1f43a2be4 100644 --- a/tests/auto/unit/multimediawidgets/qvideowidget/tst_qvideowidget.cpp +++ b/tests/auto/unit/multimediawidgets/qvideowidget/tst_qvideowidget.cpp @@ -180,7 +180,7 @@ void tst_QVideoWidget::sizeHint() widget.show(); QVERIFY(QTest::qWaitForWindowExposed(&widget)); - mockSink->setVideoSize(frameSize); + mockSink->setNativeSize(frameSize); QCOMPARE(widget.sizeHint(), expectedSize); } -- cgit v1.2.3