Skip to content

Commit

Permalink
Tests: test subsequent playback
Browse files Browse the repository at this point in the history
Task-number: QTBUG-127346
Pick-to: 6.5 6.7 6.8
Change-Id: Iacb3589cdd7eb763539f94422a3fd050c1796d2d
Reviewed-by: Tim Blechmann <tim.blechmann@qt.io>
  • Loading branch information
timblechmann committed Jul 21, 2024
1 parent 9034b7c commit 74fee84
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@ void QGstreamerMediaPlayer::play()
if (mediaStatus() == QMediaPlayer::EndOfMedia) {
playerPipeline.setPosition({});
positionChanged(0);
mediaStatusChanged(QMediaPlayer::LoadedMedia);
}

qCDebug(qLcMediaPlayer) << "play()";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ private slots:
void seekPauseSeek();
void seekInStoppedState();
void subsequentPlayback();
void subsequentPlayback_playsForExpectedDuration();
void surfaceTest();
void metadata();
void metadata_returnsMetadataWithThumbnail_whenMediaHasThumbnail_data();
Expand Down Expand Up @@ -2581,6 +2582,34 @@ void tst_QMediaPlayerBackend::subsequentPlayback()
QCOMPARE_GT(player.position(), 1000);
}

void tst_QMediaPlayerBackend::subsequentPlayback_playsForExpectedDuration()
{
QSKIP_GSTREAMER("QTBUG-127346: subsequent playback finishes almost immediately");

CHECK_SELECTED_URL(m_localCompressedSoundFile);

QMediaPlayer &player = m_fixture->player;
player.setSource(*m_localCompressedSoundFile);
QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::LoadedMedia);
player.setPosition(5000);
player.play();

QVERIFY(player.position() >= 5000);

QTRY_COMPARE_WITH_TIMEOUT(player.mediaStatus(), QMediaPlayer::EndOfMedia, 10s);

QElapsedTimer timer;
timer.start();

// playback should take 7 seconds
player.play();
QCOMPARE_NE(player.mediaStatus(), QMediaPlayer::EndOfMedia);
QTRY_COMPARE_WITH_TIMEOUT(player.mediaStatus(), QMediaPlayer::EndOfMedia, 15s);
std::chrono::nanoseconds duration = timer.durationElapsed();
QCOMPARE_GE(duration, std::chrono::milliseconds(player.duration()));
QCOMPARE_LT(duration, std::chrono::seconds(12));
}

void tst_QMediaPlayerBackend::multipleMediaPlayback()
{
CHECK_SELECTED_URL(m_localVideoFile);
Expand Down
37 changes: 35 additions & 2 deletions tests/manual/minimal-player/minimal-player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ int mainToggleWidgets(QString filename)
return QApplication::exec();
}

int mainSimple(QString filename, bool loop)
int mainSimple(const QString &filename, bool loop)
{
QMediaPlayer player;
QVideoWidget widget1;
Expand All @@ -60,6 +60,28 @@ int mainSimple(QString filename, bool loop)
return QApplication::exec();
}

int mainPlayAfterEndOfMedia(const QString &filename)
{
QMediaPlayer player;
QVideoWidget widget1;
QAudioOutput audioOutput;
player.setVideoOutput(&widget1);
player.setAudioOutput(&audioOutput);
player.setSource(filename);

widget1.show();

player.play();

QObject::connect(&player, &QMediaPlayer::mediaStatusChanged, &player,
[&](QMediaPlayer::MediaStatus status) {
if (status == QMediaPlayer::MediaStatus::EndOfMedia)
player.play();
});

return QApplication::exec();
}

int main(int argc, char **argv)
{
QApplication app(argc, argv);
Expand All @@ -70,8 +92,16 @@ int main(int argc, char **argv)
parser.addVersionOption();
parser.addPositionalArgument("media", "File to play");

QCommandLineOption toggleWidgetsOption{ "toggle-widgets", "Toggle between widgets." };
QCommandLineOption toggleWidgetsOption{
"toggle-widgets",
"Toggle between widgets.",
};
parser.addOption(toggleWidgetsOption);
QCommandLineOption playAfterEndOfMediaOption{
"play-after-end-of-media",
"Play after end of media.",
};
parser.addOption(playAfterEndOfMediaOption);

QCommandLineOption loopOption{ "loop", "Loop." };
parser.addOption(loopOption);
Expand All @@ -88,6 +118,9 @@ int main(int argc, char **argv)
if (parser.isSet(toggleWidgetsOption))
return mainToggleWidgets(filename);

if (parser.isSet(playAfterEndOfMediaOption))
return mainPlayAfterEndOfMedia(filename);

bool loop = parser.isSet(loopOption);

return mainSimple(filename, loop);
Expand Down

0 comments on commit 74fee84

Please sign in to comment.