diff --git a/tests/auto/integration/qmediaplayerbackend/testdata/nokia-tune.mkv b/tests/auto/integration/qmediaplayerbackend/testdata/nokia-tune.mkv new file mode 100644 index 0000000000000000000000000000000000000000..c6a13fcfdb1b82a4dd4876aecf94ed2deb27d316 Binary files /dev/null and b/tests/auto/integration/qmediaplayerbackend/testdata/nokia-tune.mkv differ diff --git a/tests/auto/integration/qmediaplayerbackend/testdata/nokia-tune.mp3 b/tests/auto/integration/qmediaplayerbackend/testdata/nokia-tune.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..674c834057401870ad4412ea28429d106418ad63 Binary files /dev/null and b/tests/auto/integration/qmediaplayerbackend/testdata/nokia-tune.mp3 differ diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp index 3dcbed335678c033ba199c87043d49f7bf6e0138..b133900d368c5c1e48f22c60550c5b2d73702ef2 100644 --- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp +++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp @@ -79,13 +79,18 @@ private slots: void volumeAcrossFiles(); void initialVolume(); void seekPauseSeek(); + void subsequentPlayback(); void probes(); void playlist(); private: + QMediaContent selectVideoFile(const QStringList& mediaCandidates); + QMediaContent selectSoundFile(const QStringList& mediaCandidates); + //one second local wav file QMediaContent localWavFile; QMediaContent localVideoFile; + QMediaContent localCompressedSoundFile; }; /* @@ -131,17 +136,8 @@ void tst_QMediaPlayerBackend::init() { } -void tst_QMediaPlayerBackend::initTestCase() +QMediaContent tst_QMediaPlayerBackend::selectVideoFile(const QStringList& mediaCandidates) { - const QString testFileName = QFINDTESTDATA("testdata/test.wav"); - QFileInfo wavFile(testFileName); - - QVERIFY(wavFile.exists()); - - localWavFile = QMediaContent(QUrl::fromLocalFile(wavFile.absoluteFilePath())); - - qRegisterMetaType<QMediaContent>(); - // select supported video format QMediaPlayer player; TestVideoSurface *surface = new TestVideoSurface; @@ -149,13 +145,10 @@ void tst_QMediaPlayerBackend::initTestCase() QSignalSpy errorSpy(&player, SIGNAL(error(QMediaPlayer::Error))); - QStringList mediaCandidates; - mediaCandidates << QFINDTESTDATA("testdata/colors.ogv"); - mediaCandidates << QFINDTESTDATA("testdata/colors.mp4"); - foreach (QString s, mediaCandidates) { QFileInfo videoFile(s); - QVERIFY(videoFile.exists()); + if (!videoFile.exists()) + continue; QMediaContent media = QMediaContent(QUrl::fromLocalFile(videoFile.absoluteFilePath())); player.setMedia(media); player.pause(); @@ -165,11 +158,61 @@ void tst_QMediaPlayerBackend::initTestCase() } if (!surface->m_frameList.isEmpty() && errorSpy.isEmpty()) { - localVideoFile = media; - break; + return media; } errorSpy.clear(); } + + return QMediaContent(); +} + +QMediaContent tst_QMediaPlayerBackend::selectSoundFile(const QStringList& mediaCandidates) +{ + QMediaPlayer player; + + QSignalSpy errorSpy(&player, SIGNAL(error(QMediaPlayer::Error))); + + foreach (QString s, mediaCandidates) { + QFileInfo soundFile(s); + if (!soundFile.exists()) + continue; + QMediaContent media = QMediaContent(QUrl::fromLocalFile(soundFile.absoluteFilePath())); + player.setMedia(media); + player.play(); + + for (int i = 0; i < 2000 && player.mediaStatus() != QMediaPlayer::BufferedMedia && errorSpy.isEmpty(); i+=50) { + QTest::qWait(50); + } + + if (player.mediaStatus() == QMediaPlayer::BufferedMedia && errorSpy.isEmpty()) { + return media; + } + errorSpy.clear(); + } + + return QMediaContent(); +} + +void tst_QMediaPlayerBackend::initTestCase() +{ + const QString testFileName = QFINDTESTDATA("testdata/test.wav"); + QFileInfo wavFile(testFileName); + + QVERIFY(wavFile.exists()); + + localWavFile = QMediaContent(QUrl::fromLocalFile(wavFile.absoluteFilePath())); + + qRegisterMetaType<QMediaContent>(); + + QStringList mediaCandidates; + mediaCandidates << QFINDTESTDATA("testdata/colors.ogv"); + mediaCandidates << QFINDTESTDATA("testdata/colors.mp4"); + localVideoFile = selectVideoFile(mediaCandidates); + + mediaCandidates.clear(); + mediaCandidates << QFINDTESTDATA("testdata/nokia-tune.mkv"); + mediaCandidates << QFINDTESTDATA("testdata/nokia-tune.mp3"); + localCompressedSoundFile = selectSoundFile(mediaCandidates); } void tst_QMediaPlayerBackend::cleanup() @@ -350,7 +393,7 @@ void tst_QMediaPlayerBackend::processEOS() QTRY_VERIFY(player.position() < 100); QCOMPARE(player.state(), QMediaPlayer::PlayingState); - QCOMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); + QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); QCOMPARE(stateSpy.count(), 1); QCOMPARE(stateSpy.last()[0].value<QMediaPlayer::State>(), QMediaPlayer::PlayingState); @@ -623,6 +666,41 @@ void tst_QMediaPlayerBackend::seekPauseSeek() } } +void tst_QMediaPlayerBackend::subsequentPlayback() +{ + if (localCompressedSoundFile.isNull()) + QSKIP("Sound format is not supported"); + + QMediaPlayer player; + player.setMedia(localCompressedSoundFile); + player.play(); + + QCOMPARE(player.error(), QMediaPlayer::NoError); + QTRY_COMPARE(player.state(), QMediaPlayer::PlayingState); + QTRY_COMPARE_WITH_TIMEOUT(player.mediaStatus(), QMediaPlayer::EndOfMedia, 15000); + QCOMPARE(player.state(), QMediaPlayer::StoppedState); + // Could differ by up to 1 compressed frame length + QVERIFY(qAbs(player.position() - player.duration()) < 100); + QVERIFY(player.position() > 0); + + player.play(); + QTRY_COMPARE(player.state(), QMediaPlayer::PlayingState); + QTRY_VERIFY_WITH_TIMEOUT(player.position() > 2000 && player.position() < 5000, 10000); + player.pause(); + QCOMPARE(player.state(), QMediaPlayer::PausedState); + // make sure position does not "jump" closer to the end of the file + QVERIFY(player.position() > 2000 && player.position() < 5000); + // try to seek back to zero + player.setPosition(0); + QTRY_COMPARE(player.position(), qint64(0)); + player.play(); + QCOMPARE(player.state(), QMediaPlayer::PlayingState); + QTRY_VERIFY_WITH_TIMEOUT(player.position() > 2000 && player.position() < 5000, 10000); + player.pause(); + QCOMPARE(player.state(), QMediaPlayer::PausedState); + QVERIFY(player.position() > 2000 && player.position() < 5000); +} + void tst_QMediaPlayerBackend::probes() { if (localVideoFile.isNull())