summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndré de la Rocha <andre.rocha@qt.io>2021-10-14 00:58:12 +0200
committerLars Knoll <lars.knoll@qt.io>2021-10-15 10:03:11 +0000
commit4ecf5c36a29c416321fbc040471085494dd17987 (patch)
treeefda5f619ccc75b7954971c20d6a715e797b375d
parent69e2b261036eae77c4f0cfad320d2cecb7a87728 (diff)
Windows: fix and enable media player backend auto-tests
Pick-to: 6.2 Task-number: QTBUG-96677 Change-Id: Ib9063eba2541f719d8b66cac5ead56624d620b06 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/multimedia/platform/qplatformvideosink_p.h3
-rw-r--r--src/multimedia/platform/windows/evr/evrvideowindowcontrol.cpp11
-rw-r--r--src/multimedia/platform/windows/evr/evrvideowindowcontrol_p.h2
-rw-r--r--src/multimedia/platform/windows/player/mfplayercontrol.cpp6
-rw-r--r--src/multimedia/platform/windows/player/mfplayercontrol_p.h2
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession.cpp29
-rw-r--r--tests/auto/integration/qmediaplayerbackend/BLACKLIST22
-rw-r--r--tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp47
-rw-r--r--tests/auto/integration/shared/mediafileselector.h6
-rw-r--r--tests/auto/unit/mockbackend/qmockvideosink.h6
-rw-r--r--tests/auto/unit/multimediawidgets/qvideowidget/tst_qvideowidget.cpp2
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<qint64>() > 0);
+ QTRY_VERIFY(positionSpy.count() > 0);
+ QTRY_VERIFY(positionSpy.last()[0].value<qint64>() > 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::PlaybackState>(), 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<qint64>(), player.duration());
+ QTRY_VERIFY(positionSpy.count() > 0);
+ QTRY_COMPARE(positionSpy.last()[0].value<qint64>(), 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<qint64>(), player.duration());
+ QTRY_VERIFY(positionSpy.count() > 0);
+ QTRY_COMPARE(positionSpy.last()[0].value<qint64>(), 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<qint64>(), 0);
+ QTRY_COMPARE(positionSpy.first()[0].value<qint64>(), 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<qint64>() - 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<qint64>() - 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<qint64>() - 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);
}