5#include <AVFoundation/AVFoundation.h>
13} mediaContainerMap[] = {
14 {
"video/x-ms-asf", QMediaFormat::WMV },
15 {
"video/avi", QMediaFormat::AVI },
16 {
"video/x-matroska", QMediaFormat::Matroska },
17 {
"video/mp4", QMediaFormat::MPEG4 },
18 {
"video/quicktime", QMediaFormat::QuickTime },
19 {
"video/ogg", QMediaFormat::Ogg },
20 {
"audio/mp3", QMediaFormat::MP3 },
21 {
"audio/flac", QMediaFormat::FLAC },
22 {
nullptr, QMediaFormat::UnspecifiedFormat }
27 QMediaFormat::VideoCodec value;
30 {
"; codecs=\"mp1v\"", QMediaFormat::VideoCodec::MPEG1 },
31 {
"; codecs=\"mp2v\"", QMediaFormat::VideoCodec::MPEG2 },
32 {
"; codecs=\"mp4v\"", QMediaFormat::VideoCodec::MPEG4 },
33 {
"; codecs=\"avc1\"", QMediaFormat::VideoCodec::H264 },
34 {
"; codecs=\"hvc1\"", QMediaFormat::VideoCodec::H265 },
35 {
"; codecs=\"vp09\"", QMediaFormat::VideoCodec::VP9 },
36 {
"; codecs=\"av01\"", QMediaFormat::VideoCodec::AV1 },
37 {
"; codecs=\"jpeg\"", QMediaFormat::VideoCodec::MotionJPEG },
38 {
nullptr, QMediaFormat::VideoCodec::Unspecified }
43 QMediaFormat::AudioCodec value;
50 {
"; codecs=\"ac-3\"", QMediaFormat::AudioCodec::AC3 },
51 {
"; codecs=\"ec-3\"", QMediaFormat::AudioCodec::EAC3 },
52 {
"; codecs=\"flac\"", QMediaFormat::AudioCodec::FLAC },
53 {
"; codecs=\"alac\"", QMediaFormat::AudioCodec::ALAC },
54 {
"; codecs=\"opus\"", QMediaFormat::AudioCodec::Opus },
55 {
nullptr, QMediaFormat::AudioCodec::Unspecified },
60 auto avtypes = [AVURLAsset audiovisualMIMETypes];
61 for (AVFileType filetype in avtypes) {
62 auto *m = mediaContainerMap;
64 if (strcmp(filetype.UTF8String, m
->name)) {
69 QList<QMediaFormat::VideoCodec> video;
70 QList<QMediaFormat::AudioCodec> audio;
72 auto *v = videoCodecMap;
74 QByteArray extendedMimetype = m
->name;
75 extendedMimetype += v->name;
76 if ([AVURLAsset isPlayableExtendedMIMEType:[NSString stringWithUTF8String:extendedMimetype.constData()]])
81 auto *a = audioCodecMap;
83 QByteArray extendedMimetype = m
->name;
84 extendedMimetype += a->name;
85 if ([AVURLAsset isPlayableExtendedMIMEType:[NSString stringWithUTF8String:extendedMimetype.constData()]])
90 if (m->value <= QMediaFormat::AAC)
91 audio << QMediaFormat::AudioCodec::AAC;
92 if (m->value < QMediaFormat::AAC || m->value == QMediaFormat::MP3)
93 audio << QMediaFormat::AudioCodec::MP3;
95 decoders << CodecMap{ m->value, audio, video };
102 { QMediaFormat::MPEG4,
103 { QMediaFormat::AudioCodec::AAC, QMediaFormat::AudioCodec::ALAC },
104 { QMediaFormat::VideoCodec::H264, QMediaFormat::VideoCodec::H265, QMediaFormat::VideoCodec::MotionJPEG } },
105 { QMediaFormat::QuickTime,
106 { QMediaFormat::AudioCodec::AAC, QMediaFormat::AudioCodec::ALAC },
107 { QMediaFormat::VideoCodec::H264, QMediaFormat::VideoCodec::H265, QMediaFormat::VideoCodec::MotionJPEG } },
108 { QMediaFormat::Mpeg4Audio,
109 { QMediaFormat::AudioCodec::AAC },
111 { QMediaFormat::Wave,
112 { QMediaFormat::AudioCodec::Wave },
117 imageFormats << QImageCapture::JPEG;
124 int codecId = kAudioFormatMPEG4AAC;
126 case QMediaFormat::AudioCodec::Unspecified:
127 case QMediaFormat::AudioCodec::DolbyTrueHD:
128 case QMediaFormat::AudioCodec::Vorbis:
129 case QMediaFormat::AudioCodec::WMA:
131 case QMediaFormat::AudioCodec::AAC:
132 codecId = kAudioFormatMPEG4AAC;
134 case QMediaFormat::AudioCodec::MP3:
135 codecId = kAudioFormatMPEGLayer3;
137 case QMediaFormat::AudioCodec::AC3:
138 codecId = kAudioFormatAC3;
140 case QMediaFormat::AudioCodec::EAC3:
141 codecId = kAudioFormatEnhancedAC3;
143 case QMediaFormat::AudioCodec::FLAC:
144 codecId = kAudioFormatFLAC;
146 case QMediaFormat::AudioCodec::ALAC:
147 codecId = kAudioFormatAppleLossless;
149 case QMediaFormat::AudioCodec::Opus:
150 codecId = kAudioFormatOpus;
152 case QMediaFormat::AudioCodec::Wave:
153 codecId = kAudioFormatLinearPCM;
160 const char *c =
"hvc1";
162 case QMediaFormat::VideoCodec::Unspecified:
163 case QMediaFormat::VideoCodec::VP8:
164 case QMediaFormat::VideoCodec::H265:
165 case QMediaFormat::VideoCodec::AV1:
166 case QMediaFormat::VideoCodec::Theora:
167 case QMediaFormat::VideoCodec::WMV:
170 case QMediaFormat::VideoCodec::MPEG1:
173 case QMediaFormat::VideoCodec::MPEG2:
176 case QMediaFormat::VideoCodec::MPEG4:
179 case QMediaFormat::VideoCodec::H264:
182 case QMediaFormat::VideoCodec::VP9:
185 case QMediaFormat::VideoCodec::MotionJPEG:
188 return [NSString stringWithUTF8String:c];
194 case QMediaFormat::MPEG4:
195 return AVFileTypeMPEG4;
196 case QMediaFormat::QuickTime:
197 return AVFileTypeQuickTimeMovie;
198 case QMediaFormat::MP3:
199 return AVFileTypeMPEGLayer3;
200 case QMediaFormat::Mpeg4Audio:
201 return AVFileTypeAppleM4A;
202 case QMediaFormat::Wave:
203 return AVFileTypeWAVE;
205 return AVFileTypeQuickTimeMovie;