6#include <QtCore/qdebug.h>
8#include <AVFoundation/AVFoundation.h>
15} mediaContainerMap[] = {
16 {
"video/x-ms-asf", QMediaFormat::WMV },
17 {
"video/avi", QMediaFormat::AVI },
18 {
"video/x-matroska", QMediaFormat::Matroska },
19 {
"video/mp4", QMediaFormat::MPEG4 },
20 {
"video/quicktime", QMediaFormat::QuickTime },
21 {
"video/ogg", QMediaFormat::Ogg },
22 {
"audio/mp3", QMediaFormat::MP3 },
23 {
"audio/flac", QMediaFormat::FLAC },
24 {
nullptr, QMediaFormat::UnspecifiedFormat }
29 QMediaFormat::VideoCodec value;
32 {
"; codecs=\"mp1v\"", QMediaFormat::VideoCodec::MPEG1 },
33 {
"; codecs=\"mp2v\"", QMediaFormat::VideoCodec::MPEG2 },
34 {
"; codecs=\"mp4v\"", QMediaFormat::VideoCodec::MPEG4 },
35 {
"; codecs=\"avc1\"", QMediaFormat::VideoCodec::H264 },
36 {
"; codecs=\"hvc1\"", QMediaFormat::VideoCodec::H265 },
37 {
"; codecs=\"vp09\"", QMediaFormat::VideoCodec::VP9 },
38 {
"; codecs=\"av01\"", QMediaFormat::VideoCodec::AV1 },
39 {
"; codecs=\"jpeg\"", QMediaFormat::VideoCodec::MotionJPEG },
40 {
nullptr, QMediaFormat::VideoCodec::Unspecified }
45 QMediaFormat::AudioCodec value;
52 {
"; codecs=\"ac-3\"", QMediaFormat::AudioCodec::AC3 },
53 {
"; codecs=\"ec-3\"", QMediaFormat::AudioCodec::EAC3 },
54 {
"; codecs=\"flac\"", QMediaFormat::AudioCodec::FLAC },
55 {
"; codecs=\"alac\"", QMediaFormat::AudioCodec::ALAC },
56 {
"; codecs=\"opus\"", QMediaFormat::AudioCodec::Opus },
57 {
nullptr, QMediaFormat::AudioCodec::Unspecified },
62 auto avtypes = [AVURLAsset audiovisualMIMETypes];
63 for (AVFileType filetype in avtypes) {
64 auto *m = mediaContainerMap;
66 if (strcmp(filetype.UTF8String, m
->name)) {
71 QList<QMediaFormat::VideoCodec> video;
72 QList<QMediaFormat::AudioCodec> audio;
74 auto *v = videoCodecMap;
76 QByteArray extendedMimetype = m
->name;
77 extendedMimetype += v->name;
78 if ([AVURLAsset isPlayableExtendedMIMEType:[NSString stringWithUTF8String:extendedMimetype.constData()]])
83 auto *a = audioCodecMap;
85 QByteArray extendedMimetype = m
->name;
86 extendedMimetype += a->name;
87 if ([AVURLAsset isPlayableExtendedMIMEType:[NSString stringWithUTF8String:extendedMimetype.constData()]])
92 if (m->value <= QMediaFormat::AAC)
93 audio << QMediaFormat::AudioCodec::AAC;
94 if (m->value < QMediaFormat::AAC || m->value == QMediaFormat::MP3)
95 audio << QMediaFormat::AudioCodec::MP3;
97 decoders << CodecMap{ m->value, audio, video };
104 { QMediaFormat::MPEG4,
105 { QMediaFormat::AudioCodec::AAC, QMediaFormat::AudioCodec::ALAC },
106 { QMediaFormat::VideoCodec::H264, QMediaFormat::VideoCodec::H265, QMediaFormat::VideoCodec::MotionJPEG } },
107 { QMediaFormat::QuickTime,
108 { QMediaFormat::AudioCodec::AAC, QMediaFormat::AudioCodec::ALAC },
109 { QMediaFormat::VideoCodec::H264, QMediaFormat::VideoCodec::H265, QMediaFormat::VideoCodec::MotionJPEG } },
110 { QMediaFormat::Mpeg4Audio,
111 { QMediaFormat::AudioCodec::AAC },
113 { QMediaFormat::Wave,
114 { QMediaFormat::AudioCodec::Wave },
119 imageFormats << QImageCapture::JPEG;
126 int codecId = kAudioFormatMPEG4AAC;
128 case QMediaFormat::AudioCodec::Unspecified:
129 case QMediaFormat::AudioCodec::DolbyTrueHD:
130 case QMediaFormat::AudioCodec::Vorbis:
131 case QMediaFormat::AudioCodec::WMA:
133 case QMediaFormat::AudioCodec::AAC:
134 codecId = kAudioFormatMPEG4AAC;
136 case QMediaFormat::AudioCodec::MP3:
137 codecId = kAudioFormatMPEGLayer3;
139 case QMediaFormat::AudioCodec::AC3:
140 codecId = kAudioFormatAC3;
142 case QMediaFormat::AudioCodec::EAC3:
143 codecId = kAudioFormatEnhancedAC3;
145 case QMediaFormat::AudioCodec::FLAC:
146 codecId = kAudioFormatFLAC;
148 case QMediaFormat::AudioCodec::ALAC:
149 codecId = kAudioFormatAppleLossless;
151 case QMediaFormat::AudioCodec::Opus:
152 codecId = kAudioFormatOpus;
154 case QMediaFormat::AudioCodec::Wave:
155 codecId = kAudioFormatLinearPCM;
162 const char *c =
"hvc1";
164 case QMediaFormat::VideoCodec::Unspecified:
165 case QMediaFormat::VideoCodec::VP8:
166 case QMediaFormat::VideoCodec::H265:
167 case QMediaFormat::VideoCodec::AV1:
168 case QMediaFormat::VideoCodec::Theora:
169 case QMediaFormat::VideoCodec::WMV:
172 case QMediaFormat::VideoCodec::MPEG1:
175 case QMediaFormat::VideoCodec::MPEG2:
178 case QMediaFormat::VideoCodec::MPEG4:
181 case QMediaFormat::VideoCodec::H264:
184 case QMediaFormat::VideoCodec::VP9:
187 case QMediaFormat::VideoCodec::MotionJPEG:
190 return [NSString stringWithUTF8String:c];
196 case QMediaFormat::MPEG4:
197 return AVFileTypeMPEG4;
198 case QMediaFormat::QuickTime:
199 return AVFileTypeQuickTimeMovie;
200 case QMediaFormat::MP3:
201 return AVFileTypeMPEGLayer3;
202 case QMediaFormat::Mpeg4Audio:
203 return AVFileTypeAppleM4A;
204 case QMediaFormat::Wave:
205 return AVFileTypeWAVE;
207 return AVFileTypeQuickTimeMovie;
Combined button and popup list for selecting options.