Qt 6.x
The Qt SDK
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
qwindowsformatinfo.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <mfapi.h>
7#include <mftransform.h>
8#include <private/qcomptr_p.h>
9#include <private/qwindowsmultimediautils_p.h>
10#include <private/qcomtaskresource_p.h>
11
12#include <QtCore/qlist.h>
13#include <QtCore/qset.h>
14#include <QtGui/qimagewriter.h>
15
17
18template<typename T>
19static T codecForFormat(GUID format) = delete;
20
21template<>
23{
25}
26
27template<>
29{
31}
32
33template<typename T>
35{
36 QSet<T> codecSet;
37 IMFActivate **activateArrayRaw = nullptr;
38 UINT32 num = 0;
39
40 HRESULT hr = MFTEnumEx(category, MFT_ENUM_FLAG_ALL, nullptr, nullptr, &activateArrayRaw, &num);
41
42 if (SUCCEEDED(hr)) {
43 QComTaskResource<IMFActivate *[], QComDeleter> activateArray(activateArrayRaw, num);
44
45 for (UINT32 i = 0; i < num; ++i) {
46 ComPtr<IMFTransform> transform;
47 UINT32 typeIndex = 0;
48
49 hr = activateArray[i]->ActivateObject(IID_PPV_ARGS(transform.GetAddressOf()));
50
51 while (SUCCEEDED(hr)) {
52 ComPtr<IMFMediaType> mediaType;
53
54 if (category == MFT_CATEGORY_AUDIO_ENCODER || category == MFT_CATEGORY_VIDEO_ENCODER)
55 hr = transform->GetOutputAvailableType(0, typeIndex++, mediaType.GetAddressOf());
56 else
57 hr = transform->GetInputAvailableType(0, typeIndex++, mediaType.GetAddressOf());
58
59 if (SUCCEEDED(hr)) {
60 GUID subtype = GUID_NULL;
61 hr = mediaType->GetGUID(MF_MT_SUBTYPE, &subtype);
62 if (SUCCEEDED(hr))
63 codecSet.insert(codecForFormat<T>(subtype));
64 }
65 }
66 }
67 }
68
69 return codecSet;
70}
71
73{
76
77 for (const auto &f : formats) {
79 if (format.compare(QLatin1String("jpg"), Qt::CaseInsensitive) == 0)
81 else if (format.compare(QLatin1String("png"), Qt::CaseInsensitive) == 0)
83 else if (format.compare(QLatin1String("webp"), Qt::CaseInsensitive) == 0)
85 else if (format.compare(QLatin1String("tiff"), Qt::CaseInsensitive) == 0)
87 }
88
89 return list;
90}
91
93{
94 const QList<CodecMap> containerTable = {
109 {} },
112 {} },
115 {} },
118 {} },
121 {} },
125 };
126
127 const QSet<QMediaFormat::FileFormat> decoderFormats = {
138 };
139
140 const QSet<QMediaFormat::FileFormat> encoderFormats = {
148 };
149
150 const auto audioDecoders = getCodecSet<QMediaFormat::AudioCodec>(MFT_CATEGORY_AUDIO_DECODER);
151 const auto audioEncoders = getCodecSet<QMediaFormat::AudioCodec>(MFT_CATEGORY_AUDIO_ENCODER);
152 const auto videoDecoders = getCodecSet<QMediaFormat::VideoCodec>(MFT_CATEGORY_VIDEO_DECODER);
153 const auto videoEncoders = getCodecSet<QMediaFormat::VideoCodec>(MFT_CATEGORY_VIDEO_ENCODER);
154
155 for (const auto &codecMap : containerTable) {
156
157 const QSet<QMediaFormat::AudioCodec> mapAudioSet(codecMap.audio.cbegin(), codecMap.audio.cend());
158 const QSet<QMediaFormat::VideoCodec> mapVideoSet(codecMap.video.cbegin(), codecMap.video.cend());
159
160 if (decoderFormats.contains(codecMap.format)) {
161 CodecMap m;
162 m.format = codecMap.format;
163 m.audio = (audioDecoders & mapAudioSet).values();
164 m.video = (videoDecoders & mapVideoSet).values();
165 if (!m.video.empty() || !m.audio.empty())
166 decoders.append(m);
167 }
168
169 if (encoderFormats.contains(codecMap.format)) {
170 CodecMap m;
171 m.format = codecMap.format;
172 m.audio = (audioEncoders & mapAudioSet).values();
173 m.video = (videoEncoders & mapVideoSet).values();
174 if (!m.video.empty() || !m.audio.empty())
175 encoders.append(m);
176 }
177 }
178
180}
181
183{
184}
185
static QList< QByteArray > supportedImageFormats()
Returns the list of image formats supported by QImageWriter.
Definition qlist.h:74
void append(parameter_type t)
Definition qlist.h:441
AudioCodec
\qmlproperty enumeration QtMultimedia::mediaFormat::fileFormat
VideoCodec
\qmlproperty enumeration QtMultimedia::mediaFormat::audioCodec
QList< QImageCapture::FileFormat > imageFormats
Definition qset.h:18
bool contains(const T &value) const
Definition qset.h:71
iterator insert(const T &value)
Definition qset.h:155
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5857
const QLoggingCategory & category()
[1]
EGLint EGLint * formats
Combined button and popup list for selecting options.
Q_MULTIMEDIA_EXPORT QMediaFormat::AudioCodec codecForAudioFormat(GUID format)
Q_MULTIMEDIA_EXPORT QMediaFormat::VideoCodec codecForVideoFormat(GUID format)
@ CaseInsensitive
static QList< QImageCapture::FileFormat > getImageFormatList()
GLenum GLsizei GLsizei GLint * values
[15]
const GLfloat * m
GLfloat GLfloat f
GLint GLsizei GLsizei GLenum format
GLuint GLenum GLenum transform
GLuint num
long HRESULT
static QList< QImageCapture::FileFormat > getImageFormatList()
static QSet< T > getCodecSet(GUID category)
static QT_BEGIN_NAMESPACE T codecForFormat(GUID format)=delete
QList< int > list
[14]