36 const QSignalSpy mediaStatusChanged{ &player, &QMediaPlayer::mediaStatusChanged };
38 QAudioBufferOutput audioOutput;
39 player.setAudioBufferOutput(&audioOutput);
42 player.setVideoSink(&sink);
44 std::vector<std::array<QColor, 4>> colors;
45 std::vector<QVideoFrame> frames;
46 QObject::connect(&sink, &TestVideoSink::videoFrameChangedSync, &sink,
47 [&](
const QVideoFrame &frame) {
49 frames.push_back(frame);
51 colors.push_back(sampleQuadrants(frame.toImage()));
55 QAudioFormat audioFormat;
56 QObject::connect(&audioOutput, &QAudioBufferOutput::audioBufferReceived, &audioOutput,
57 [&](
const QAudioBuffer &buffer) {
58 if (!buffer.isValid())
60 if (!audioFormat.isValid())
61 audioFormat = buffer.format();
63 QTEST_ASSERT(audioFormat == buffer.format());
65 audioData.append(buffer.data<
const char>(), buffer.byteCount());
68 player.setSource(fileLocation);
71 player.setPlaybackRate(50);
74 const bool endReached = QTest::qWaitFor(
76 return mediaStatusChanged.contains(QList<QVariant>{ QMediaPlayer::EndOfMedia })
77 || mediaStatusChanged.contains(
78 QList<QVariant>{ QMediaPlayer::InvalidMedia });
86 info.m_url = fileLocation.toString();
87 info.m_frameRate = player.metaData().value(QMediaMetaData::VideoFrameRate).toReal();
88 info.m_size = player.metaData().value(QMediaMetaData::Resolution).toSize();
90 info.m_duration = milliseconds{ player.duration() };
92 info.m_frameTimes = sink.m_frameTimes;
95 info.m_colors = std::move(colors);
96 info.m_frames = std::move(frames);
97 info.m_audioBuffer = QAudioBuffer(audioData, audioFormat);
105 const int width = image.width();
106 const int height = image.height();
108 image.pixel(width / 4, height / 4),
109 image.pixel(3 * width / 4, height / 4),
110 image.pixel(width / 4, 3 * height / 4),
111 image.pixel(3 * width / 4, 3 * height / 4),