20QList<QMediaFormat::FileFormat> QPlatformMediaFormatInfo::supportedFileFormats(
const QMediaFormat &constraints, QMediaFormat::ConversionMode m)
const
22 std::set<QMediaFormat::FileFormat> formats;
24 const auto &codecMap = (m == QMediaFormat::Encode) ? encoders : decoders;
25 for (
const auto &m : codecMap) {
26 if (constraints.audioCodec() != QMediaFormat::AudioCodec::Unspecified && !m.audio.contains(constraints.audioCodec()))
28 if (constraints.videoCodec() != QMediaFormat::VideoCodec::Unspecified && !m.video.contains(constraints.videoCodec()))
30 formats.insert(m.format);
32 return { formats.begin(), formats.end() };
35QList<QMediaFormat::AudioCodec> QPlatformMediaFormatInfo::supportedAudioCodecs(
const QMediaFormat &constraints, QMediaFormat::ConversionMode m)
const
37 std::set<QMediaFormat::AudioCodec> codecs;
39 const auto &codecMap = (m == QMediaFormat::Encode) ? encoders : decoders;
40 for (
const auto &m : codecMap) {
41 if (constraints.fileFormat() != QMediaFormat::UnspecifiedFormat && m.format != constraints.fileFormat())
43 if (constraints.videoCodec() != QMediaFormat::VideoCodec::Unspecified && !m.video.contains(constraints.videoCodec()))
45 for (
const auto &c : m.audio)
49 return { codecs.begin(), codecs.end() };
52QList<QMediaFormat::VideoCodec> QPlatformMediaFormatInfo::supportedVideoCodecs(
const QMediaFormat &constraints, QMediaFormat::ConversionMode m)
const
54 std::set<QMediaFormat::VideoCodec> codecs;
56 const auto &codecMap = (m == QMediaFormat::Encode) ? encoders : decoders;
57 for (
const auto &m : codecMap) {
58 if (constraints.fileFormat() != QMediaFormat::UnspecifiedFormat && m.format != constraints.fileFormat())
60 if (constraints.audioCodec() != QMediaFormat::AudioCodec::Unspecified && !m.audio.contains(constraints.audioCodec()))
62 for (
const auto &c : m.video)
65 return { codecs.begin(), codecs.end() };
68bool QPlatformMediaFormatInfo::isSupported(
const QMediaFormat &format, QMediaFormat::ConversionMode m)
const
70 const auto &codecMap = (m == QMediaFormat::Encode) ? encoders : decoders;
72 for (
const auto &m : codecMap) {
73 if (m.format != format.fileFormat())
75 if (format.audioCodec() != QMediaFormat::AudioCodec::Unspecified && !m.audio.contains(format.audioCodec()))
77 if (format.videoCodec() != QMediaFormat::VideoCodec::Unspecified && !m.video.contains(format.videoCodec()))
84void QPlatformMediaFormatInfo::fixupCodecMaps()
89 using FileFormat = QMediaFormat::FileFormat;
90 using AudioCodec = QMediaFormat::AudioCodec;
91 using VideoCodec = QMediaFormat::VideoCodec;
92 namespace ranges = QtMultimediaPrivate::ranges;
94 auto fixupMap = [](CodecMap &cm) {
95 auto removeInvalidAudio = [&](
auto predicate) {
96 cm.audio.removeIf([&](AudioCodec c) {
98 qCDebug(lcMediaFormatInfo)
99 <<
"Removing audio codec" << c <<
"unsupported in" << cm.format;
106 auto removeInvalidVideo = [&](
auto predicate) {
107 cm.video.removeIf([&](VideoCodec c) {
109 qCDebug(lcMediaFormatInfo)
110 <<
"Removing video codec" << c <<
"unsupported in" << cm.format;
117 auto fixupSingleCodecAudioContainer = [&](AudioCodec singleCodec) {
118 removeInvalidAudio([&](AudioCodec c) {
119 return c != singleCodec;
121 removeInvalidVideo([](VideoCodec) {
127 case FileFormat::WebM:
128 removeInvalidVideo([](VideoCodec c) {
129 return !ranges::contains(
130 std::array{ VideoCodec::VP8, VideoCodec::VP9, VideoCodec::AV1 }, c);
132 removeInvalidAudio([](AudioCodec c) {
133 return !ranges::contains(std::array{ AudioCodec::Vorbis, AudioCodec::Opus }, c);
136 case FileFormat::Ogg:
137 removeInvalidVideo([](VideoCodec c) {
138 return c != VideoCodec::Theora;
140 removeInvalidAudio([](AudioCodec c) {
141 return !ranges::contains(
142 std::array{ AudioCodec::Vorbis, AudioCodec::Opus, AudioCodec::FLAC }, c);
145 case FileFormat::MPEG4:
146 case FileFormat::QuickTime:
147 removeInvalidVideo([](VideoCodec c) {
148 return ranges::contains(std::array{ VideoCodec::VP8, VideoCodec::VP9,
149 VideoCodec::Theora, VideoCodec::WMV },
152 removeInvalidAudio([](AudioCodec c) {
153 return ranges::contains(
154 std::array{ AudioCodec::Vorbis, AudioCodec::Opus, AudioCodec::WMA }, c);
157 case FileFormat::WMV:
159 removeInvalidVideo([](VideoCodec c) {
160 return c != VideoCodec::WMV;
162 removeInvalidAudio([](AudioCodec c) {
163 return c != AudioCodec::WMA;
166 case FileFormat::Wave:
167 fixupSingleCodecAudioContainer(AudioCodec::Wave);
169 case FileFormat::MP3:
170 fixupSingleCodecAudioContainer(AudioCodec::MP3);
172 case FileFormat::WMA:
174 fixupSingleCodecAudioContainer(AudioCodec::WMA);
176 case FileFormat::AAC:
177 fixupSingleCodecAudioContainer(AudioCodec::AAC);
179 case FileFormat::FLAC:
180 fixupSingleCodecAudioContainer(AudioCodec::FLAC);
182 case FileFormat::Mpeg4Audio:
183 removeInvalidVideo([](VideoCodec) {
192 for (
auto &cm : encoders)
194 for (
auto &cm : decoders)
197 auto isEmpty = [](
const CodecMap &cm) {
198 return cm.audio.isEmpty() && cm.video.isEmpty();
200 encoders.removeIf(isEmpty);
201 decoders.removeIf(isEmpty);
204QDebug operator<<(QDebug dbg,
const QPlatformMediaFormatInfo::CodecMap &m)
206 const QDebugStateSaver saver(dbg);
207 dbg.nospace() <<
"CodecMap(" << QMediaFormat::fileFormatName(m.format);
208 if (!m.video.isEmpty()) {
210 for (
int i = 0; i < m.video.size(); ++i) {
213 dbg << QMediaFormat::videoCodecName(m.video[i]);
217 if (!m.audio.isEmpty()) {
219 for (
int i = 0; i < m.audio.size(); ++i) {
222 dbg << QMediaFormat::audioCodecName(m.audio[i]);