diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-04-30 17:20:52 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-05-07 11:10:15 +0000 |
commit | 6f0de93bd6e41a0a0393d07b20a6f4af90193ab0 (patch) | |
tree | 62fda1bddcf08b5e7065e5ba3eed0a5b322da62a | |
parent | 7b965a3d68423ab612e6ef9219a528b73fcaa2d9 (diff) |
Pass the remaining mediaplayerbackend autotests
* Add a notification mechanism to the pipeline so
the video output knows when QMediaPlayer is in
a stopped state (using QProperty), as we want the
pipeline to be in a paused state internally, but
not get preroll frames if we're in paused externally.
* Properly emit metadataChanged() signals, and ensure
we're in GST_STATE_PAUSED before trying a seek.
Change-Id: I1cad557e648f82909a63cba8d6144df8476524f5
Reviewed-by: Doris Verria <doris.verria@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
7 files changed, 131 insertions, 61 deletions
diff --git a/src/multimedia/platform/gstreamer/common/qgst_p.h b/src/multimedia/platform/gstreamer/common/qgst_p.h index 0f42bab41..14fd2bd46 100644 --- a/src/multimedia/platform/gstreamer/common/qgst_p.h +++ b/src/multimedia/platform/gstreamer/common/qgst_p.h @@ -451,6 +451,15 @@ public: #endif return change == GST_STATE_CHANGE_SUCCESS; } + bool finishStateChange() + { + auto change = gst_element_get_state(element(), nullptr, nullptr, 10000*1e6 /*nano seconds*/); +#ifndef QT_NO_DEBUG + if (change != GST_STATE_CHANGE_SUCCESS && change != GST_STATE_CHANGE_NO_PREROLL) + qWarning() << "Could finish change state of" << name(); +#endif + return change == GST_STATE_CHANGE_SUCCESS; + } void lockState(bool locked) { gst_element_set_locked_state(element(), locked); } bool isStateLocked() const { return gst_element_is_locked_state(element()); } diff --git a/src/multimedia/platform/gstreamer/common/qgstpipeline.cpp b/src/multimedia/platform/gstreamer/common/qgstpipeline.cpp index 40aab13b2..d3f75b612 100644 --- a/src/multimedia/platform/gstreamer/common/qgstpipeline.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstpipeline.cpp @@ -43,6 +43,7 @@ #include <QtCore/qlist.h> #include <QtCore/qabstracteventdispatcher.h> #include <QtCore/qcoreapplication.h> +#include <QtCore/qproperty.h> #include "qgstpipeline_p.h" #include "qgstreamermessage_p.h" @@ -52,7 +53,7 @@ QT_BEGIN_NAMESPACE class QGstPipelinePrivate : public QObject { Q_OBJECT - friend class QGstreamerBusHelperPrivate; +public: int m_ref = 0; guint m_tag = 0; @@ -61,8 +62,8 @@ class QGstPipelinePrivate : public QObject QMutex filterMutex; QList<QGstreamerSyncMessageFilter*> syncFilters; QList<QGstreamerBusMessageFilter*> busFilters; + QProperty<bool> inStoppedState; -public: QGstPipelinePrivate(GstBus* bus, QObject* parent = 0); ~QGstPipelinePrivate(); @@ -130,7 +131,8 @@ private: QGstPipelinePrivate::QGstPipelinePrivate(GstBus* bus, QObject* parent) : QObject(parent), - m_bus(bus) + m_bus(bus), + inStoppedState(true) { gst_object_ref(GST_OBJECT(bus)); @@ -227,6 +229,11 @@ QGstPipeline::~QGstPipeline() d->deref(); } +QProperty<bool> *QGstPipeline::inStoppedState() +{ + return &d->inStoppedState; +} + void QGstPipeline::installMessageFilter(QGstreamerSyncMessageFilter *filter) { d->installMessageFilter(filter); diff --git a/src/multimedia/platform/gstreamer/common/qgstpipeline_p.h b/src/multimedia/platform/gstreamer/common/qgstpipeline_p.h index f6e7a7333..e3bc4164a 100644 --- a/src/multimedia/platform/gstreamer/common/qgstpipeline_p.h +++ b/src/multimedia/platform/gstreamer/common/qgstpipeline_p.h @@ -85,6 +85,13 @@ public: QGstPipeline(GstPipeline *p); ~QGstPipeline(); + // This is needed to help us avoid sending QVideoFrames or audio buffers to the + // application while we're prerolling the pipeline. + // QMediaPlayer is still in a stopped state, while we put the gstreamer pipeline into a + // Paused state so that we can get the required metadata of the stream and also have a fast + // transition to play. + QProperty<bool> *inStoppedState(); + void installMessageFilter(QGstreamerSyncMessageFilter *filter); void removeMessageFilter(QGstreamerSyncMessageFilter *filter); void installMessageFilter(QGstreamerBusMessageFilter *filter); diff --git a/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp index b9e16359d..7f1e5d5ce 100644 --- a/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp @@ -39,7 +39,7 @@ #include <private/qgstreamermediaplayer_p.h> #include <private/qgstreamervideorenderer_p.h> -#include <private/qgstreamerbushelper_p.h> +#include <private/qgstpipeline_p.h> #include <private/qgstreamermetadata_p.h> #include <private/qgstreamerformatinfo_p.h> #include <private/qgstreameraudiooutput_p.h> @@ -156,17 +156,23 @@ void QGstreamerMediaPlayer::setPlaybackRate(qreal rate) void QGstreamerMediaPlayer::setPosition(qint64 pos) { - qCDebug(qLcMediaPlayer) << Q_FUNC_INFO << pos/1000.0; + qint64 currentPos = playerPipeline.position()/1e6; + if (pos == currentPos) + return; + playerPipeline.finishStateChange(); playerPipeline.seek(pos*1e6, m_playbackRate); + qCDebug(qLcMediaPlayer) << Q_FUNC_INFO << pos << playerPipeline.position()/1e6; if (mediaStatus() == QMediaPlayer::EndOfMedia) mediaStatusChanged(QMediaPlayer::LoadedMedia); + positionChanged(pos); } void QGstreamerMediaPlayer::play() { - if (m_url.isEmpty()) + if (state() == QMediaPlayer::PlayingState || m_url.isEmpty()) return; + *playerPipeline.inStoppedState() = false; if (mediaStatus() == QMediaPlayer::EndOfMedia) { playerPipeline.seek(0, m_playbackRate); updatePosition(); @@ -176,16 +182,22 @@ void QGstreamerMediaPlayer::play() int ret = playerPipeline.setState(GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) qCDebug(qLcMediaPlayer) << "Unable to set the pipeline to the playing state."; + if (mediaStatus() == QMediaPlayer::LoadedMedia) + mediaStatusChanged(QMediaPlayer::BufferedMedia); emit stateChanged(QMediaPlayer::PlayingState); positionUpdateTimer.start(100); } void QGstreamerMediaPlayer::pause() { - if (m_url.isEmpty()) + if (state() == QMediaPlayer::PausedState || m_url.isEmpty()) return; positionUpdateTimer.stop(); + if (*playerPipeline.inStoppedState()) { + *playerPipeline.inStoppedState() = false; + playerPipeline.seek(playerPipeline.position(), m_playbackRate); + } int ret = playerPipeline.setState(GST_STATE_PAUSED); if (ret == GST_STATE_CHANGE_FAILURE) qCDebug(qLcMediaPlayer) << "Unable to set the pipeline to the paused state."; @@ -199,12 +211,15 @@ void QGstreamerMediaPlayer::pause() void QGstreamerMediaPlayer::stop() { + if (state() == QMediaPlayer::StoppedState) + return; stopOrEOS(false); } void QGstreamerMediaPlayer::stopOrEOS(bool eos) { positionUpdateTimer.stop(); + *playerPipeline.inStoppedState() = true; bool ret = playerPipeline.setStateSync(GST_STATE_PAUSED); if (!ret) qCDebug(qLcMediaPlayer) << "Unable to set the pipeline to the stopped state."; @@ -517,8 +532,6 @@ void QGstreamerMediaPlayer::setMedia(const QUrl &content, QIODevice *stream) m_url = content; m_stream = stream; - m_metaData.clear(); - m_duration = 0; if (!src.isNull()) playerPipeline.remove(src); @@ -528,13 +541,22 @@ void QGstreamerMediaPlayer::setMedia(const QUrl &content, QIODevice *stream) decoder = QGstElement(); removeAllOutputs(); - if (content.isEmpty()) { - stateChanged(QMediaPlayer::StoppedState); + if (m_duration != 0) { + m_duration = 0; + durationChanged(0); + } + stateChanged(QMediaPlayer::StoppedState); + if (position() != 0) positionChanged(0); - mediaStatusChanged(QMediaPlayer::NoMedia); - return; + mediaStatusChanged(QMediaPlayer::NoMedia); + if (!m_metaData.isEmpty()) { + m_metaData.clear(); + metaDataChanged(); } + if (content.isEmpty()) + return; + if (m_stream) { if (!m_appSrc) m_appSrc = new QGstAppSrc(this); @@ -621,8 +643,10 @@ static QGstStructure endOfChain(const QGstStructure &s) void QGstreamerMediaPlayer::parseStreamsAndMetadata() { qCDebug(qLcMediaPlayer) << "============== parse topology ============"; - if (topology.isNull()) + if (topology.isNull()) { + qCDebug(qLcMediaPlayer) << " null topology"; return; + } auto caps = topology["caps"].toCaps(); auto structure = caps.at(0); auto fileFormat = QGstreamerFormatInfo::fileFormatForCaps(structure); @@ -641,8 +665,11 @@ void QGstreamerMediaPlayer::parseStreamsAndMetadata() auto demux = endOfChain(topology); auto next = demux["next"]; - if (!next.isList()) + if (!next.isList()) { + qCDebug(qLcMediaPlayer) << " no additional streams"; + emit metaDataChanged(); return; + } // collect stream info int size = next.listSize(); @@ -669,13 +696,13 @@ void QGstreamerMediaPlayer::parseStreamsAndMetadata() } QGstPad sinkPad = inputSelector[VideoStream].getObject("active-pad"); - if (sinkPad.isNull()) - return; - bool hasTags = g_object_class_find_property (G_OBJECT_GET_CLASS (sinkPad.object()), "tags") != NULL; + if (!sinkPad.isNull()) { + bool hasTags = g_object_class_find_property (G_OBJECT_GET_CLASS (sinkPad.object()), "tags") != NULL; - GstTagList *tl = nullptr; - g_object_get(sinkPad.object(), "tags", &tl, nullptr); - qCDebug(qLcMediaPlayer) << " tags=" << hasTags << (tl ? gst_tag_list_to_string(tl) : "(null)"); + GstTagList *tl = nullptr; + g_object_get(sinkPad.object(), "tags", &tl, nullptr); + qCDebug(qLcMediaPlayer) << " tags=" << hasTags << (tl ? gst_tag_list_to_string(tl) : "(null)"); + } qCDebug(qLcMediaPlayer) << "============== end parse topology ============"; diff --git a/src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp b/src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp index 57753f53d..f9bf9f6c2 100644 --- a/src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp @@ -83,6 +83,12 @@ void QGstreamerVideoOutput::setVideoSink(QVideoSink *sink) sinkChanged(); } +void QGstreamerVideoOutput::setPipeline(const QGstPipeline &pipeline) +{ + gstPipeline = pipeline; + stoppedStateHandler = gstPipeline.inStoppedState()->onValueChanged(std::function([this]() {updatePrerollFrame();})); +} + void QGstreamerVideoOutput::setIsPreview() { // configures the queue to be fast and lightweight for camera preview @@ -116,13 +122,24 @@ void QGstreamerVideoOutput::updateVideoSink(const QGstElement &sink) pad.addProbe<&QGstreamerVideoOutput::prepareVideoOutputChange>(this, GstPadProbeType(GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BLOCKING)); } +void QGstreamerVideoOutput::updatePrerollFrame() +{ + bool stopped = true; + if (!gstPipeline.isNull() && !*gstPipeline.inStoppedState()) + stopped = false; + if (!isFakeSink) + videoSink.set("show-preroll-frame", !stopped); +} + void QGstreamerVideoOutput::sinkChanged() { QGstElement gstSink; if (m_videoWindow) { gstSink = m_videoWindow->gstSink(); + isFakeSink = false; } else { gstSink = QGstElement("fakesink", "fakevideosink"); + isFakeSink = true; } qDebug() << "sinkChanged" << gstSink.name(); updateVideoSink(gstSink); @@ -140,6 +157,7 @@ void QGstreamerVideoOutput::changeVideoOutput() videoSink.setState(GST_STATE_NULL); gstVideoOutput.remove(videoSink); videoSink = newVideoSink; + updatePrerollFrame(); videoConvert.link(videoSink); GstEvent *event = gst_event_new_reconfigure(); gst_element_send_event(videoSink.element(), event); diff --git a/src/multimedia/platform/gstreamer/common/qgstreamervideooutput_p.h b/src/multimedia/platform/gstreamer/common/qgstreamervideooutput_p.h index a8ed8960c..16ac73b78 100644 --- a/src/multimedia/platform/gstreamer/common/qgstreamervideooutput_p.h +++ b/src/multimedia/platform/gstreamer/common/qgstreamervideooutput_p.h @@ -74,13 +74,14 @@ public: void setVideoSink(QVideoSink *sink); - void setPipeline(const QGstPipeline &pipeline) { gstPipeline = pipeline; } + void setPipeline(const QGstPipeline &pipeline); QGstElement gstElement() const { return gstVideoOutput; } void setIsPreview(); void updateVideoSink(const QGstElement &sink); + void updatePrerollFrame(); public slots: void sinkChanged(); void changeVideoOutput(); @@ -90,6 +91,8 @@ private: QVideoSink *m_videoSink = nullptr; QPointer<QGstreamerVideoSink> m_videoWindow; + std::optional<QPropertyChangeHandler<std::function<void()>>> stoppedStateHandler; + bool isFakeSink = true; // Gst elements QGstPipeline gstPipeline; diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp index 01269aaa7..af26ac2e0 100644 --- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp +++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp @@ -594,7 +594,7 @@ void tst_QMediaPlayerBackend::deleteLaterAtEOS() // DeferredDelete events during the wait, which interferes with this test. QEventLoop loop; QTimer::singleShot(0, &deleter, SLOT(play())); - QTimer::singleShot(5000, &loop, SLOT(quit())); + QTimer::singleShot(1500, &loop, SLOT(quit())); connect(player.data(), SIGNAL(destroyed()), &loop, SLOT(quit())); loop.exec(); // Verify that the player was destroyed within the event loop. @@ -741,19 +741,21 @@ void tst_QMediaPlayerBackend::seekPauseSeek() player.setSource(localVideoFile); QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState); + QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::LoadedMedia); QVERIFY(surface->m_frameList.isEmpty()); // frame must not appear until we call pause() or play() positionSpy.clear(); qint64 position = 7000; player.setPosition(position); - QTRY_VERIFY(!positionSpy.isEmpty() && qAbs(player.position() - position) < (qint64)500); + QTRY_VERIFY(!positionSpy.isEmpty()); + QTRY_COMPARE(player.position(), position); QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState); QTest::qWait(250); // wait a bit to ensure the frame is not rendered QVERIFY(surface->m_frameList.isEmpty()); // still no frame, we must call pause() or play() to see a frame player.pause(); QTRY_COMPARE(player.playbackState(), QMediaPlayer::PausedState); // it might take some time for the operation to be completed - QTRY_VERIFY_WITH_TIMEOUT(!surface->m_frameList.isEmpty(), 10000); // we must see a frame at position 7000 here + QTRY_VERIFY(!surface->m_frameList.isEmpty()); // we must see a frame at position 7000 here // Make sure that the frame has a timestamp before testing - not all backends provides this if (!surface->m_frameList.back().isValid() || surface->m_frameList.back().startTime() < 0) @@ -767,13 +769,11 @@ void tst_QMediaPlayerBackend::seekPauseSeek() QCOMPARE(frame.height(), 120); // create QImage for QVideoFrame to verify RGB pixel colors - QVERIFY(frame.map(QVideoFrame::ReadOnly)); - QImage image(frame.bits(), frame.width(), frame.height(), QVideoFrameFormat::imageFormatFromPixelFormat(frame.pixelFormat())); + QImage image = frame.toImage(); QVERIFY(!image.isNull()); QVERIFY(qRed(image.pixel(0, 0)) >= 230); // conversion from YUV => RGB, that's why it's not 255 QVERIFY(qGreen(image.pixel(0, 0)) < 20); QVERIFY(qBlue(image.pixel(0, 0)) < 20); - frame.unmap(); } surface->m_frameList.clear(); @@ -782,7 +782,7 @@ void tst_QMediaPlayerBackend::seekPauseSeek() player.setPosition(position); QTRY_VERIFY(!positionSpy.isEmpty() && qAbs(player.position() - position) < (qint64)500); QCOMPARE(player.playbackState(), QMediaPlayer::PausedState); - QVERIFY(!surface->m_frameList.isEmpty()); + QTRY_VERIFY(!surface->m_frameList.isEmpty()); { QVideoFrame frame = surface->m_frameList.back(); @@ -791,13 +791,11 @@ void tst_QMediaPlayerBackend::seekPauseSeek() QCOMPARE(frame.width(), 160); QCOMPARE(frame.height(), 120); - QVERIFY(frame.map(QVideoFrame::ReadOnly)); - QImage image(frame.bits(), frame.width(), frame.height(), QVideoFrameFormat::imageFormatFromPixelFormat(frame.pixelFormat())); + QImage image = frame.toImage(); QVERIFY(!image.isNull()); QVERIFY(qRed(image.pixel(0, 0)) < 20); QVERIFY(qGreen(image.pixel(0, 0)) >= 230); QVERIFY(qBlue(image.pixel(0, 0)) < 20); - frame.unmap(); } } @@ -808,7 +806,7 @@ void tst_QMediaPlayerBackend::seekInStoppedState() QMediaPlayer player; - QSignalSpy stateSpy(&player, SIGNAL(stateChanged(QMediaPlayer::State))); + QSignalSpy stateSpy(&player, SIGNAL(playbackStateChanged(QMediaPlayer::PlaybackState))); QSignalSpy positionSpy(&player, SIGNAL(positionChanged(qint64))); player.setSource(localVideoFile); @@ -823,9 +821,9 @@ void tst_QMediaPlayerBackend::seekInStoppedState() qint64 position = 5000; player.setPosition(position); - QTRY_VERIFY(qAbs(player.position() - position) < qint64(500)); + QTRY_VERIFY(qAbs(player.position() - position) < qint64(200)); QCOMPARE(positionSpy.count(), 1); - QVERIFY(qAbs(positionSpy.last()[0].value<qint64>() - position) < qint64(500)); + QVERIFY(qAbs(positionSpy.last()[0].value<qint64>() - position) < qint64(200)); QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 0); @@ -837,14 +835,14 @@ void tst_QMediaPlayerBackend::seekInStoppedState() player.play(); QCOMPARE(player.playbackState(), QMediaPlayer::PlayingState); - QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); - QVERIFY(qAbs(player.position() - position) < qint64(500)); + QTRY_VERIFY(player.position() > position); + QCOMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); - QTest::qWait(2000); + QTest::qWait(100); // Check that it never played from the beginning - QVERIFY(player.position() > (position - 500)); + QVERIFY(player.position() > position); for (int i = 0; i < positionSpy.count(); ++i) - QVERIFY(positionSpy.at(i)[0].value<qint64>() > (position - 500)); + QVERIFY(positionSpy.at(i)[0].value<qint64>() > (position - 200)); // ------ // Same tests but after play() --> stop() @@ -859,9 +857,9 @@ void tst_QMediaPlayerBackend::seekInStoppedState() player.setPosition(position); - QTRY_VERIFY(qAbs(player.position() - position) < qint64(500)); + QTRY_VERIFY(qAbs(player.position() - position) < qint64(200)); QCOMPARE(positionSpy.count(), 1); - QVERIFY(qAbs(positionSpy.last()[0].value<qint64>() - position) < qint64(500)); + QVERIFY(qAbs(positionSpy.last()[0].value<qint64>() - position) < qint64(200)); QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 0); @@ -874,30 +872,30 @@ void tst_QMediaPlayerBackend::seekInStoppedState() QCOMPARE(player.playbackState(), QMediaPlayer::PlayingState); QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); - QVERIFY(qAbs(player.position() - position) < qint64(500)); + QVERIFY(qAbs(player.position() - position) < qint64(200)); - QTest::qWait(2000); + QTest::qWait(500); // Check that it never played from the beginning - QVERIFY(player.position() > (position - 500)); + QVERIFY(player.position() > (position - 200)); for (int i = 0; i < positionSpy.count(); ++i) - QVERIFY(positionSpy.at(i)[0].value<qint64>() > (position - 500)); + QVERIFY(positionSpy.at(i)[0].value<qint64>() > (position - 200)); // ------ // Same tests but after reaching the end of the media - player.setPosition(player.duration() - 500); + player.setPosition(player.duration() - 100); QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::EndOfMedia); QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState); - QCOMPARE(player.position(), player.duration()); + QVERIFY(qAbs(player.position() - player.duration()) < 10); stateSpy.clear(); positionSpy.clear(); player.setPosition(position); - QTRY_VERIFY(qAbs(player.position() - position) < qint64(500)); + QTRY_VERIFY(qAbs(player.position() - position) < qint64(200)); QCOMPARE(positionSpy.count(), 1); - QVERIFY(qAbs(positionSpy.last()[0].value<qint64>() - position) < qint64(500)); + QVERIFY(qAbs(positionSpy.last()[0].value<qint64>() - position) < qint64(200)); QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState); QCOMPARE(stateSpy.count(), 0); @@ -909,14 +907,14 @@ void tst_QMediaPlayerBackend::seekInStoppedState() player.play(); QCOMPARE(player.playbackState(), QMediaPlayer::PlayingState); - QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); - QVERIFY(qAbs(player.position() - position) < qint64(500)); + QVERIFY(player.position() >= position - 200); + QCOMPARE(player.mediaStatus(), QMediaPlayer::BufferedMedia); - QTest::qWait(2000); + QTest::qWait(500); // Check that it never played from the beginning - QVERIFY(player.position() > (position - 500)); + QVERIFY(player.position() > (position - 200)); for (int i = 0; i < positionSpy.count(); ++i) - QVERIFY(positionSpy.at(i)[0].value<qint64>() > (position - 500)); + QVERIFY(positionSpy.at(i)[0].value<qint64>() > (position - 200)); } void tst_QMediaPlayerBackend::subsequentPlayback() @@ -926,11 +924,12 @@ void tst_QMediaPlayerBackend::subsequentPlayback() QMediaPlayer player; player.setSource(localCompressedSoundFile); + player.setPosition(5000); player.play(); QCOMPARE(player.error(), QMediaPlayer::NoError); QTRY_COMPARE(player.playbackState(), QMediaPlayer::PlayingState); - QTRY_COMPARE_WITH_TIMEOUT(player.mediaStatus(), QMediaPlayer::EndOfMedia, 15000); + QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::EndOfMedia); QCOMPARE(player.playbackState(), QMediaPlayer::StoppedState); // Could differ by up to 1 compressed frame length QVERIFY(qAbs(player.position() - player.duration()) < 100); @@ -938,20 +937,20 @@ void tst_QMediaPlayerBackend::subsequentPlayback() player.play(); QTRY_COMPARE(player.playbackState(), QMediaPlayer::PlayingState); - QTRY_VERIFY_WITH_TIMEOUT(player.position() > 2000 && player.position() < 5000, 10000); + QTRY_VERIFY(player.position() > 1000); player.pause(); QCOMPARE(player.playbackState(), QMediaPlayer::PausedState); // make sure position does not "jump" closer to the end of the file - QVERIFY(player.position() > 2000 && player.position() < 5000); + QVERIFY(player.position() > 1000); // try to seek back to zero player.setPosition(0); QTRY_COMPARE(player.position(), qint64(0)); player.play(); QCOMPARE(player.playbackState(), QMediaPlayer::PlayingState); - QTRY_VERIFY_WITH_TIMEOUT(player.position() > 2000 && player.position() < 5000, 10000); + QTRY_VERIFY(player.position() > 1000); player.pause(); QCOMPARE(player.playbackState(), QMediaPlayer::PausedState); - QVERIFY(player.position() > 2000 && player.position() < 5000); + QVERIFY(player.position() > 1000); } void tst_QMediaPlayerBackend::surfaceTest() @@ -998,7 +997,7 @@ void tst_QMediaPlayerBackend::metadata() player.setSource(localFileWithMetadata); - QVERIFY(metadataChangedSpy.count() > 0); + QTRY_VERIFY(metadataChangedSpy.count() > 0); QCOMPARE(player.metaData().value(QMediaMetaData::Title).toString(), QStringLiteral("Nokia Tune")); QCOMPARE(player.metaData().value(QMediaMetaData::ContributingArtist).toString(), QStringLiteral("TestArtist")); |