37 const QSignalSpy mediaStatusChanged{ &player, &QMediaPlayer::mediaStatusChanged };
39 QAudioBufferOutput audioOutput;
40 player.setAudioBufferOutput(&audioOutput);
43 player.setVideoSink(&sink);
45 std::vector<std::array<QColor, 4>> colors;
46 std::vector<QVideoFrame> frames;
47 QObject::connect(&sink, &TestVideoSink::videoFrameChangedSync, &sink,
48 [&](
const QVideoFrame &frame) {
50 frames.push_back(frame);
52 colors.push_back(sampleQuadrants(frame.toImage()));
56 QAudioFormat audioFormat;
57 QObject::connect(&audioOutput, &QAudioBufferOutput::audioBufferReceived, &audioOutput,
58 [&](
const QAudioBuffer &buffer) {
59 if (!buffer.isValid())
61 if (!audioFormat.isValid())
62 audioFormat = buffer.format();
64 QTEST_ASSERT(audioFormat == buffer.format());
66 audioData.append(buffer.data<
const char>(), buffer.byteCount());
69 player.setSource(fileLocation);
72 player.setPlaybackRate(50);
75 const bool endReached = QTest::qWaitFor(
77 return mediaStatusChanged.contains(QList<QVariant>{ QMediaPlayer::EndOfMedia })
78 || mediaStatusChanged.contains(
79 QList<QVariant>{ QMediaPlayer::InvalidMedia });
87 info.m_url = fileLocation.toString();
88 info.m_frameRate = player.metaData().value(QMediaMetaData::VideoFrameRate).toReal();
89 info.m_size = player.metaData().value(QMediaMetaData::Resolution).toSize();
91 info.m_duration = milliseconds{ player.duration() };
93 info.m_frameTimes = sink.m_frameTimes;
96 info.m_colors = std::move(colors);
97 info.m_frames = std::move(frames);
98 info.m_audioBuffer = QAudioBuffer(audioData, audioFormat);
106 const int width = image.width();
107 const int height = image.height();
109 image.pixel(width / 4, height / 4),
110 image.pixel(3 * width / 4, height / 4),
111 image.pixel(width / 4, 3 * height / 4),
112 image.pixel(3 * width / 4, 3 * height / 4),