50 QStringList failedMedias;
51 for (
const auto &mediaToError : m_mediaToErrors)
52 if (!mediaToError.second.isEmpty())
53 failedMedias.emplace_back(mediaToError.first);
56 return dumpErrors(failedMedias);
59 template <
typename... Media>
62 return select({ std::move(nativeFileName(media))... });
68 for (
const auto &media : candidates) {
69 auto emplaceRes = m_mediaToErrors.try_emplace(media, QString());
70 if (emplaceRes.second) {
71 auto maybeUrl = selectMediaFile(media);
73 Q_ASSERT(!maybeUrl.error().isEmpty());
74 emplaceRes.first->second = maybeUrl.error();
78 if (foundUrl.isEmpty() && emplaceRes.first->second.isEmpty())
82 if (!foundUrl.isEmpty())
85 ++m_failedSelectionsCount;
86 return q23::unexpected{ dumpErrors(candidates) };
90 QString dumpErrors(
const QStringList &medias)
const
92 using namespace Qt::StringLiterals;
95 for (
const auto &media : medias) {
96 auto it = m_mediaToErrors.find(media);
97 if (it != m_mediaToErrors.end() && !it->second.isEmpty())
98 result.append(
"\t"_L1)
108 static MaybeUrl selectMediaFile(QString media)
110 if (qEnvironmentVariableIsSet(
"QTEST_SKIP_MEDIA_VALIDATION"))
113 using namespace Qt::StringLiterals;
115 QAudioOutput audioOutput;
116 QVideoSink videoOutput;
118 player.setAudioOutput(&audioOutput);
119 player.setVideoOutput(&videoOutput);
121 player.setSource(media);
124 const auto waitingFinished = QTest::qWaitFor([&]() {
125 if (player.error() != QMediaPlayer::NoError)
128 switch (player.mediaStatus()) {
129 case QMediaPlayer::BufferingMedia:
130 case QMediaPlayer::BufferedMedia:
131 case QMediaPlayer::EndOfMedia:
132 case QMediaPlayer::InvalidMedia:
140 auto enumValueToString = [](
auto enumValue) {
141 return QString(QMetaEnum::fromType<
decltype(enumValue)>().valueToKey(enumValue));
144 if (!waitingFinished)
145 return q23::unexpected{
"The media got stuck in the status "_L1
146 + enumValueToString(player.mediaStatus()) };
148 if (player.mediaStatus() == QMediaPlayer::InvalidMedia)
149 return q23::unexpected{
"Unable to load the media. Error ["_L1
150 + enumValueToString(player.error()) +
" "_L1
151 + player.errorString() +
"]"_L1 };
153 if (player.error() != QMediaPlayer::NoError)
154 return q23::unexpected{
"Unable to start playing the media, codecs issues. Error ["_L1
155 + enumValueToString(player.error()) +
" "_L1
156 + player.errorString() +
"]"_L1 };
161 QString nativeFileName(
const QString &media)
164 auto it = m_nativeFiles.find(media);
165 if (it != m_nativeFiles.end())
166 return it->second->fileName();
169 if (file.open(QIODevice::ReadOnly)) {
170 m_nativeFiles.insert({ media, std::unique_ptr<QTemporaryFile>(QTemporaryFile::createNativeFile(file))});
171 return m_nativeFiles[media]->fileName();
173 qWarning() <<
"Failed to create temporary file";
183 std::unordered_map<QString, QString> m_mediaToErrors;
184 int m_failedSelectionsCount = 0;