summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-04-30 17:20:52 +0200
committerLars Knoll <lars.knoll@qt.io>2021-05-07 11:10:15 +0000
commit6f0de93bd6e41a0a0393d07b20a6f4af90193ab0 (patch)
tree62fda1bddcf08b5e7065e5ba3eed0a5b322da62a
parent7b965a3d68423ab612e6ef9219a528b73fcaa2d9 (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>
-rw-r--r--src/multimedia/platform/gstreamer/common/qgst_p.h9
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstpipeline.cpp13
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstpipeline_p.h7
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp63
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp18
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamervideooutput_p.h5
-rw-r--r--tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp77
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"));