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())
79 foundUrl.setUrl(media);
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 if (media.endsWith(
".wav"))
116 using namespace Qt::StringLiterals;
118 QAudioOutput audioOutput;
119 QVideoSink videoOutput;
121 player.setAudioOutput(&audioOutput);
122 player.setVideoOutput(&videoOutput);
124 player.setSource(QUrl{media});
127 const auto waitingFinished = QTest::qWaitFor([&]() {
128 if (player.error() != QMediaPlayer::NoError)
131 switch (player.mediaStatus()) {
132 case QMediaPlayer::BufferingMedia:
133 case QMediaPlayer::BufferedMedia:
134 case QMediaPlayer::EndOfMedia:
135 case QMediaPlayer::InvalidMedia:
143 auto enumValueToString = [](
auto enumValue) {
144 return QString(QMetaEnum::fromType<
decltype(enumValue)>().valueToKey(enumValue));
147 if (!waitingFinished)
148 return q23::unexpected{
"The media got stuck in the status "_L1
149 + enumValueToString(player.mediaStatus()) };
151 if (player.mediaStatus() == QMediaPlayer::InvalidMedia)
152 return q23::unexpected{
"Unable to load the media. Error ["_L1
153 + enumValueToString(player.error()) +
" "_L1
154 + player.errorString() +
"]"_L1 };
156 if (player.error() != QMediaPlayer::NoError)
157 return q23::unexpected{
"Unable to start playing the media, codecs issues. Error ["_L1
158 + enumValueToString(player.error()) +
" "_L1
159 + player.errorString() +
"]"_L1 };
164 QString nativeFileName(
const QString &media)
167 auto it = m_nativeFiles.find(media);
168 if (it != m_nativeFiles.end())
169 return it->second->fileName();
172 if (file.open(QIODevice::ReadOnly)) {
173 m_nativeFiles.insert({ media, std::unique_ptr<QTemporaryFile>(QTemporaryFile::createNativeFile(file))});
174 return m_nativeFiles[media]->fileName();
176 qWarning() <<
"Failed to create temporary file";
186 std::unordered_map<QString, QString> m_mediaToErrors;
187 int m_failedSelectionsCount = 0;