summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-01-31 17:01:22 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-09 14:34:23 +0000
commitd9fcf2ab6ac24cdba9a9ff3f0e32a39938216cee (patch)
treecdf45c74632539fcdafbd99384e99c213d12e78b
parentab4dc309ef0ab36c0dcf18b2e96614e1e10d311c (diff)
New API for handling media formats and codecs
Implement a new API for handling media formats and codecs. The API gives better control to discover supported file formats and codecs for encoding and decoding. QMediaRecorder will be moved over to use the new API in a subsequent commit. Android only has stubs implemented currently, as I can't test anything beyond simple compilation. Change-Id: Iff5f044f87c97f83d9151b10d7a78709822e077a Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--examples/multimediawidgets/camera/camera.cpp16
-rw-r--r--src/imports/multimedia/qmldir1
-rw-r--r--src/multimedia/CMakeLists.txt5
-rw-r--r--src/multimedia/multimedia.pro8
-rw-r--r--src/multimedia/platform/android/android.pri6
-rw-r--r--src/multimedia/platform/android/qandroidformatsinfo.cpp90
-rw-r--r--src/multimedia/platform/android/qandroidformatsinfo_p.h84
-rw-r--r--src/multimedia/platform/android/qandroidintegration.cpp10
-rw-r--r--src/multimedia/platform/android/qandroidintegration_p.h2
-rw-r--r--src/multimedia/platform/darwin/darwin.pri6
-rw-r--r--src/multimedia/platform/darwin/qdarwinformatsinfo.mm163
-rw-r--r--src/multimedia/platform/darwin/qdarwinformatsinfo_p.h87
-rw-r--r--src/multimedia/platform/darwin/qdarwinintegration.cpp9
-rw-r--r--src/multimedia/platform/darwin/qdarwinintegration_p.h2
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstcodecsinfo.cpp10
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstcodecsinfo_p.h2
-rw-r--r--src/multimedia/platform/gstreamer/gstreamer.pri2
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp175
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerformatsinfo_p.h85
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerintegration.cpp9
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerintegration_p.h2
-rw-r--r--src/multimedia/platform/platform.pri2
-rw-r--r--src/multimedia/platform/qmediaplatformformatinfo.cpp48
-rw-r--r--src/multimedia/platform/qmediaplatformformatinfo_p.h77
-rw-r--r--src/multimedia/platform/qmediaplatformintegration_p.h3
-rw-r--r--src/multimedia/qmediaformat.cpp479
-rw-r--r--src/multimedia/qmediaformat.h155
-rw-r--r--src/multimedia/recording/qmediaencodersettings.cpp5
-rw-r--r--src/multimedia/recording/qmediaencodersettings.h32
-rw-r--r--tests/auto/unit/mockbackend/qmockintegration_p.h1
30 files changed, 1567 insertions, 9 deletions
diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp
index 385608bbc..533a2d4db 100644
--- a/examples/multimediawidgets/camera/camera.cpp
+++ b/examples/multimediawidgets/camera/camera.cpp
@@ -64,6 +64,7 @@
#include <QtWidgets>
#include <QMediaDeviceManager>
+#include <QMediaFormat>
Q_DECLARE_METATYPE(QCameraInfo)
@@ -82,6 +83,21 @@ Camera::Camera() : ui(new Ui::Camera)
connect(ui->captureWidget, &QTabWidget::currentChanged, this, &Camera::updateCaptureMode);
setCamera(QMediaDeviceManager::defaultVideoInput());
+
+ qDebug() << "Supported Containers:";
+ auto containers = QMediaEncoderInfo::supportedFileFormats();
+ for (const auto c : containers)
+ qDebug() << " " << QMediaFormat::fileFormatName(c);
+
+ qDebug() << "Supported Audio Codecs:";
+ auto audio = QMediaEncoderInfo::supportedAudioCodecs();
+ for (const auto c : audio)
+ qDebug() << " " << QMediaFormat::audioCodecName(c);
+
+ qDebug() << "Supported Video Codecs:";
+ auto video = QMediaEncoderInfo::supportedVideoCodecs();
+ for (const auto c : video)
+ qDebug() << " " << QMediaFormat::videoCodecName(c);
}
void Camera::setCamera(const QCameraInfo &cameraInfo)
diff --git a/src/imports/multimedia/qmldir b/src/imports/multimedia/qmldir
index e7dcc3dd6..d68049f63 100644
--- a/src/imports/multimedia/qmldir
+++ b/src/imports/multimedia/qmldir
@@ -4,4 +4,3 @@ classname QMultimediaDeclarativeModule
typeinfo plugins.qmltypes
typeinfo plugins.qmltypes
Video 5.0 Video.qml
-
diff --git a/src/multimedia/CMakeLists.txt b/src/multimedia/CMakeLists.txt
index 78685717f..2e408425c 100644
--- a/src/multimedia/CMakeLists.txt
+++ b/src/multimedia/CMakeLists.txt
@@ -51,11 +51,13 @@ qt_internal_add_module(Multimedia
platform/qmediaplatformdevicemanager.cpp platform/qmediaplatformdevicemanager_p.h
platform/qmediaplatformintegration.cpp platform/qmediaplatformintegration_p.h
platform/qmediaplatformplayerinterface.cpp platform/qmediaplatformplayerinterface_p.h
+ platform/qmediaplatformformatinfo.cpp platform/qmediaplatformformatinfo_p.h
playback/qmediaplayer.cpp playback/qmediaplayer.h
playback/qmediaplaylist.cpp playback/qmediaplaylist.h playback/qmediaplaylist_p.h
playback/qplaylistfileparser.cpp playback/qplaylistfileparser_p.h
qmediadevicemanager.cpp qmediadevicemanager.h
qmediaenumdebug.h
+ qmediaformat.cpp qmediaformat.h
qmediametadata.cpp qmediametadata.h
qmediapluginloader.cpp qmediapluginloader_p.h
qmediaservice.cpp qmediaservice.h qmediaservice_p.h
@@ -222,6 +224,7 @@ qt_internal_extend_target(Multimedia CONDITION QT_FEATURE_gstreamer
platform/gstreamer/mediaplayer/qgstreamerplayerservice.cpp platform/gstreamer/mediaplayer/qgstreamerplayerservice_p.h
platform/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp platform/gstreamer/mediaplayer/qgstreamerstreamscontrol_p.h
platform/gstreamer/qgstreamerdevicemanager.cpp platform/gstreamer/qgstreamerdevicemanager_p.h
+ platform/gstreamer/qgstreamerformatsinfo.cpp platform/gstreamer/qgstreamerformatsinfo_p.h
platform/gstreamer/qgstreamerintegration.cpp platform/gstreamer/qgstreamerintegration_p.h
DEFINES
GLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_26
@@ -367,6 +370,7 @@ qt_internal_extend_target(Multimedia CONDITION ANDROID
platform/android/mediaplayer/qandroidmediaservice.cpp platform/android/mediaplayer/qandroidmediaservice_p.h
platform/android/mediaplayer/qandroidmetadatareadercontrol.cpp platform/android/mediaplayer/qandroidmetadatareadercontrol_p.h
platform/android/qandroiddevicemanager.cpp platform/android/qandroiddevicemanager_p.h
+ platform/android/qandroidformatsinfo.cpp platform/android/qandroidformatsinfo_p.h
platform/android/qandroidintegration.cpp platform/android/qandroidintegration_p.h
platform/android/wrappers/jni/androidcamera.cpp platform/android/wrappers/jni/androidcamera_p.h
platform/android/wrappers/jni/androidmediametadataretriever.cpp platform/android/wrappers/jni/androidmediametadataretriever_p.h
@@ -415,6 +419,7 @@ qt_internal_extend_target(Multimedia CONDITION APPLE AND NOT WATCHOS
platform/darwin/mediaplayer/avfvideooutput.mm platform/darwin/mediaplayer/avfvideooutput_p.h
platform/darwin/mediaplayer/avfvideowindowcontrol.mm platform/darwin/mediaplayer/avfvideowindowcontrol_p.h
platform/darwin/qdarwindevicemanager.mm platform/darwin/qdarwindevicemanager_p.h
+ platform/darwin/qdarwinformatsinfo.mm platform/darwin/qdarwinformatsinfo_p.h
platform/darwin/qdarwinintegration.cpp platform/darwin/qdarwinintegration_p.h
PUBLIC_LIBRARIES
${FWAudioToolbox}
diff --git a/src/multimedia/multimedia.pro b/src/multimedia/multimedia.pro
index 16872c739..7657fec00 100644
--- a/src/multimedia/multimedia.pro
+++ b/src/multimedia/multimedia.pro
@@ -15,7 +15,7 @@ PRIVATE_HEADERS += \
qmediapluginloader_p.h \
qmediaservice_p.h \
qmediastoragelocation_p.h \
- qmultimediautils_p.h
+ qmultimediautils_p.h \
PUBLIC_HEADERS += \
qtmultimediaglobal.h \
@@ -26,7 +26,8 @@ PUBLIC_HEADERS += \
qmediasource.h \
qmediaservice.h \
qmediatimerange.h \
- qmultimedia.h
+ qmultimedia.h \
+ qmediaformat.h
SOURCES += \
qmediasink.cpp \
@@ -38,7 +39,8 @@ SOURCES += \
qmediatimerange.cpp \
qmediastoragelocation.cpp \
qmultimedia.cpp \
- qmultimediautils.cpp
+ qmultimediautils.cpp \
+ qmediaformat.cpp
CONFIG += simd optimize_full
diff --git a/src/multimedia/platform/android/android.pri b/src/multimedia/platform/android/android.pri
index 555d8bec0..4369a1864 100644
--- a/src/multimedia/platform/android/android.pri
+++ b/src/multimedia/platform/android/android.pri
@@ -2,11 +2,13 @@ QT += opengl core-private network
HEADERS += \
$$PWD/qandroidintegration_p.h \
- $$PWD/qandroiddevicemanager_p.h
+ $$PWD/qandroiddevicemanager_p.h \
+ $$PWD/qandroidformatsinfo_p.h
SOURCES += \
$$PWD/qandroidintegration.cpp \
- $$PWD/qandroiddevicemanager.cpp
+ $$PWD/qandroiddevicemanager.cpp \
+ $$PWD/qandroidformatsinfo.cpp
include(audio/audio.pri)
include(wrappers/jni/jni.pri)
diff --git a/src/multimedia/platform/android/qandroidformatsinfo.cpp b/src/multimedia/platform/android/qandroidformatsinfo.cpp
new file mode 100644
index 000000000..c6860e3c9
--- /dev/null
+++ b/src/multimedia/platform/android/qandroidformatsinfo.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qandroidformatsinfo_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QAndroidFormatInfo::QAndroidFormatInfo()
+{
+ // ### Properly determine the set of supported codecs, this is a minimal set gathered from the old code base
+ m_decodableAudioCodecs << Qt::AudioCodec::AAC << Qt::AudioCodec::MP3;
+ m_encodableAudioCodecs << Qt::AudioCodec::AAC << Qt::AudioCodec::MP3;
+ m_decodableVideoCodecs << Qt::VideoCodec::MPEG4 << Qt::VideoCodec::H264;
+ m_encodableVideoCodecs << Qt::VideoCodec::MPEG4 << Qt::VideoCodec::H264;
+ m_decodableMediaContainers << Qt::MediaContainer::MPEG4 << Qt::MediaContainer::MP3;
+ m_encodableMediaContainers << Qt::MediaContainer::MPEG4 << Qt::MediaContainer::MP3;
+}
+
+QAndroidFormatInfo::~QAndroidFormatInfo
+{
+
+}
+
+QList<Qt::MediaContainer> QAndroidFormatInfo::decodableMediaContainers() const
+{
+ return m_decodableMediaContainers;
+}
+
+QList<Qt::AudioCodec> QAndroidFormatInfo::decodableAudioCodecs() const
+{
+ return m_decodableAudioCodecs;
+}
+
+QList<Qt::VideoCodec> QAndroidFormatInfo::decodableVideoCodecs() const
+{
+ return m_decodableVideoCodecs;
+}
+
+QList<Qt::MediaContainer> QAndroidFormatInfo::encodableMediaContainers() const
+{
+ return m_encodableMediaContainers;
+}
+
+QList<Qt::AudioCodec> QAndroidFormatInfo::encodableAudioCodecs() const
+{
+ return m_encodableAudioCodecs;
+}
+
+QList<Qt::VideoCodec> QAndroidFormatInfo::encodableVideoCodecs() const
+{
+ return m_encodableVideoCodecs;
+}
+
+QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/qandroidformatsinfo_p.h b/src/multimedia/platform/android/qandroidformatsinfo_p.h
new file mode 100644
index 000000000..54ce80072
--- /dev/null
+++ b/src/multimedia/platform/android/qandroidformatsinfo_p.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QANDROIDFORMATINFO_H
+#define QANDROIDFORMATINFO_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qmediaplatformformatinfo_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAndroidFormatInfo : public QMediaPlatformFormatInfo
+{
+public:
+ QAndroidFormatInfo();
+ ~QAndroidFormatInfo();
+
+ QList<QMediaFormat::FileFormat> decodableMediaContainers() const override;
+ QList<QMediaFormat::AudioCodec> decodableAudioCodecs() const override;
+ QList<QMediaFormat::VideoCodec> decodableVideoCodecs() const override;
+
+ QList<QMediaFormat::FileFormat> encodableMediaContainers() const override;
+ QList<QMediaFormat::AudioCodec> encodableAudioCodecs() const override;
+ QList<QMediaFormat::VideoCodec> encodableVideoCodecs() const override;
+
+private:
+ QList<QMediaFormat::FileFormat> m_decodableMediaContainers;
+ QList<QMediaFormat::AudioCodec> m_decodableAudioCodecs;
+ QList<QMediaFormat::VideoCodec> m_decodableVideoCodecs;
+
+ QList<QMediaFormat::FileFormat> m_encodableMediaContainers;
+ QList<QMediaFormat::AudioCodec> m_encodableAudioCodecs;
+ QList<QMediaFormat::VideoCodec> m_encodableVideoCodecs;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/multimedia/platform/android/qandroidintegration.cpp b/src/multimedia/platform/android/qandroidintegration.cpp
index 76102a476..7ee99b74e 100644
--- a/src/multimedia/platform/android/qandroidintegration.cpp
+++ b/src/multimedia/platform/android/qandroidintegration.cpp
@@ -48,6 +48,7 @@
#include "private/androidsurfaceview_p.h"
#include "private/androidcamera_p.h"
#include "private/androidmediarecorder_p.h"
+#include "private/qandroidformatsinfo_p.h"
QT_BEGIN_NAMESPACE
@@ -61,6 +62,7 @@ QAndroidIntegration::QAndroidIntegration()
QAndroidIntegration::~QAndroidIntegration()
{
delete m_manager;
+ delete m_formatInfo;
}
QMediaPlatformDeviceManager *QAndroidIntegration::deviceManager()
@@ -70,6 +72,14 @@ QMediaPlatformDeviceManager *QAndroidIntegration::deviceManager()
return m_manager;
}
+QMediaPlatformFormatInfo *QAndroidIntegration::formatInfo()
+{
+ if (!m_formatInfo)
+ m_formatInfo = new QAndroidFormatInfo();
+ return m_formatInfo;
+
+}
+
QMediaPlatformCaptureInterface *QAndroidIntegration::createCaptureInterface(QMediaRecorder::CaptureMode mode)
{
return new QAndroidCaptureService(mode);
diff --git a/src/multimedia/platform/android/qandroidintegration_p.h b/src/multimedia/platform/android/qandroidintegration_p.h
index d4cf5bb6a..ca8f384af 100644
--- a/src/multimedia/platform/android/qandroidintegration_p.h
+++ b/src/multimedia/platform/android/qandroidintegration_p.h
@@ -65,11 +65,13 @@ public:
~QAndroidIntegration();
QMediaPlatformDeviceManager *deviceManager() override;
+ QMediaPlatformFormatInfo *formatInfo() override;
QMediaPlatformCaptureInterface *createCaptureInterface(QMediaRecorder::CaptureMode mode) override;
QMediaPlatformPlayerInterface *createPlayerInterface() override;
QAndroidDeviceManager *m_manager = nullptr;
+ QMediaPlatformFormatInfo *m_formatInfo = nullptr;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/darwin/darwin.pri b/src/multimedia/platform/darwin/darwin.pri
index 0daa36f8c..935a8451b 100644
--- a/src/multimedia/platform/darwin/darwin.pri
+++ b/src/multimedia/platform/darwin/darwin.pri
@@ -21,8 +21,10 @@ include(mediaplayer/mediaplayer.pri)
SOURCES += \
$$PWD/qdarwinintegration.cpp \
- $$PWD/qdarwindevicemanager.mm
+ $$PWD/qdarwindevicemanager.mm \
+ $$PWD/qdarwinformatsinfo.mm
HEADERS += \
$$PWD/qdarwinintegration_p.h \
- $$PWD/qdarwindevicemanager_p.h
+ $$PWD/qdarwindevicemanager_p.h \
+ $$PWD/qdarwinformatsinfo_p.h
diff --git a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
new file mode 100644
index 000000000..5b953e4a7
--- /dev/null
+++ b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
@@ -0,0 +1,163 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdarwinformatsinfo_p.h"
+#include <AVFoundation/AVFoundation.h>
+#include <qdebug.h>
+QT_BEGIN_NAMESPACE
+
+static struct {
+ const char *name;
+ QMediaFormat::FileFormat value;
+} mediaContainerMap[] = {
+ { "video/x-ms-asf", QMediaFormat::ASF },
+ { "video/avi", QMediaFormat::AVI },
+ { "video/x-matroska", QMediaFormat::Matroska },
+ { "video/mp4", QMediaFormat::MPEG4 },
+ { "video/quicktime", QMediaFormat::QuickTime },
+ { "video/ogg", QMediaFormat::Ogg },
+ { "audio/mp3", QMediaFormat::MP3 },
+ { nullptr, QMediaFormat::MPEG4 }
+};
+
+static struct {
+ const char *name;
+ QMediaFormat::VideoCodec value;
+} videoCodecMap[] = {
+ // See CMVideoCodecType for the four character code names of codecs
+ { "video/mp4; codecs=\"mp1v\"", QMediaFormat::VideoCodec::MPEG1 },
+ { "video/mp4; codecs=\"mp2v\"", QMediaFormat::VideoCodec::MPEG2 },
+ { "video/mp4; codecs=\"mp4v\"", QMediaFormat::VideoCodec::MPEG4 },
+ { "video/mp4; codecs=\"avc1\"", QMediaFormat::VideoCodec::H264 },
+ { "video/mp4; codecs=\"hvc1\"", QMediaFormat::VideoCodec::H265 },
+ { "video/mp4; codecs=\"vp09\"", QMediaFormat::VideoCodec::VP9 },
+ { "video/mp4; codecs=\"av01\"", QMediaFormat::VideoCodec::AV1 }, // ### ????
+ { "video/mp4; codecs=\"jpeg\"", QMediaFormat::VideoCodec::MotionJPEG },
+ { nullptr, QMediaFormat::VideoCodec::Invalid }
+};
+
+static struct {
+ const char *name;
+ QMediaFormat::AudioCodec value;
+} audioCodecMap[] = {
+ // AudioFile.h
+ { "audio/mp3", QMediaFormat::AudioCodec::MP3 },
+ { "audio/aac", QMediaFormat::AudioCodec::AAC },
+ { "video/mp4; codecs=\"ac-3\"", QMediaFormat::AudioCodec::AC3 },
+ { "video/mp4; codecs=\"ec-3\"", QMediaFormat::AudioCodec::EAC3 },
+ { "audio/flac", QMediaFormat::AudioCodec::FLAC },
+ { nullptr, QMediaFormat::AudioCodec::Invalid },
+};
+
+QDarwinFormatInfo::QDarwinFormatInfo()
+{
+ auto avtypes = [AVURLAsset audiovisualMIMETypes];
+ for (AVFileType filetype in avtypes) {
+ auto *m = mediaContainerMap;
+ while (m->name) {
+ if (!strcmp(filetype.UTF8String, m->name)) {
+ m_decodableMediaContainers.append(m->value);
+ break;
+ }
+ ++m;
+ }
+ }
+
+ {
+ auto *m = videoCodecMap;
+ while (m->name) {
+ if ([AVURLAsset isPlayableExtendedMIMEType:[NSString stringWithUTF8String:m->name]])
+ m_decodableVideoCodecs << m->value;
+ ++m;
+ }
+ }
+ {
+ auto *m = audioCodecMap;
+ while (m->name) {
+ qDebug() << "audio" << m->name << [AVURLAsset isPlayableExtendedMIMEType:[NSString stringWithUTF8String:m->name]];
+ if ([AVURLAsset isPlayableExtendedMIMEType:[NSString stringWithUTF8String:m->name]])
+ m_decodableAudioCodecs << m->value;
+ ++m;
+ }
+ }
+ // Audio format seems to be symmetric
+ m_encodableAudioCodecs = m_decodableAudioCodecs;
+
+ // ### Haven't seen a good way to figure this out.
+ // seems AVFoundation only supports those for encoding
+ m_encodableMediaContainers << QMediaFormat::MPEG4 << QMediaFormat::QuickTime;
+ // AVCaptureVideoDataOutput.availableVideoCodecTypes does not mention H265 even though it is supported
+ m_encodableVideoCodecs << QMediaFormat::VideoCodec::H264 << QMediaFormat::VideoCodec::H265 << QMediaFormat::VideoCodec::MotionJPEG;
+}
+
+QDarwinFormatInfo::~QDarwinFormatInfo()
+{
+
+}
+
+QList<QMediaFormat::FileFormat> QDarwinFormatInfo::decodableMediaContainers() const
+{
+ return m_decodableMediaContainers;
+}
+
+QList<QMediaFormat::AudioCodec> QDarwinFormatInfo::decodableAudioCodecs() const
+{
+ return m_decodableAudioCodecs;
+}
+
+QList<QMediaFormat::VideoCodec> QDarwinFormatInfo::decodableVideoCodecs() const
+{
+ return m_decodableVideoCodecs;
+}
+
+QList<QMediaFormat::FileFormat> QDarwinFormatInfo::encodableMediaContainers() const
+{
+ return m_encodableMediaContainers;
+}
+
+QList<QMediaFormat::AudioCodec> QDarwinFormatInfo::encodableAudioCodecs() const
+{
+ return m_encodableAudioCodecs;
+}
+
+QList<QMediaFormat::VideoCodec> QDarwinFormatInfo::encodableVideoCodecs() const
+{
+ return m_encodableVideoCodecs;
+}
+QT_END_NAMESPACE
diff --git a/src/multimedia/platform/darwin/qdarwinformatsinfo_p.h b/src/multimedia/platform/darwin/qdarwinformatsinfo_p.h
new file mode 100644
index 000000000..fc6ee1743
--- /dev/null
+++ b/src/multimedia/platform/darwin/qdarwinformatsinfo_p.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDARWINFORMATINFO_H
+#define QDARWINFORMATINFO_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qmediaplatformformatinfo_p.h>
+#include <qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+class QDarwinDeviceManager;
+
+class QDarwinFormatInfo : public QMediaPlatformFormatInfo
+{
+public:
+ QDarwinFormatInfo();
+ ~QDarwinFormatInfo();
+
+ QList<QMediaFormat::FileFormat> decodableMediaContainers() const override;
+ QList<QMediaFormat::AudioCodec> decodableAudioCodecs() const override;
+ QList<QMediaFormat::VideoCodec> decodableVideoCodecs() const override;
+
+ QList<QMediaFormat::FileFormat> encodableMediaContainers() const override;
+ QList<QMediaFormat::AudioCodec> encodableAudioCodecs() const override;
+ QList<QMediaFormat::VideoCodec> encodableVideoCodecs() const override;
+
+private:
+ QList<QMediaFormat::FileFormat> m_decodableMediaContainers;
+ QList<QMediaFormat::AudioCodec> m_decodableAudioCodecs;
+ QList<QMediaFormat::VideoCodec> m_decodableVideoCodecs;
+
+ QList<QMediaFormat::FileFormat> m_encodableMediaContainers;
+ QList<QMediaFormat::AudioCodec> m_encodableAudioCodecs;
+ QList<QMediaFormat::VideoCodec> m_encodableVideoCodecs;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/multimedia/platform/darwin/qdarwinintegration.cpp b/src/multimedia/platform/darwin/qdarwinintegration.cpp
index 3f969a43a..0d53feb29 100644
--- a/src/multimedia/platform/darwin/qdarwinintegration.cpp
+++ b/src/multimedia/platform/darwin/qdarwinintegration.cpp
@@ -41,6 +41,7 @@
#include "qdarwindevicemanager_p.h"
#include <private/avfmediaplayerservice_p.h>
#include <private/avfcameraservice_p.h>
+#include <private/qdarwinformatsinfo_p.h>
QT_BEGIN_NAMESPACE
@@ -52,6 +53,7 @@ QDarwinIntegration::QDarwinIntegration()
QDarwinIntegration::~QDarwinIntegration()
{
delete m_manager;
+ delete m_formatInfo;
}
QMediaPlatformDeviceManager *QDarwinIntegration::deviceManager()
@@ -61,6 +63,13 @@ QMediaPlatformDeviceManager *QDarwinIntegration::deviceManager()
return m_manager;
}
+QMediaPlatformFormatInfo *QDarwinIntegration::formatInfo()
+{
+ if (!m_formatInfo)
+ m_formatInfo = new QDarwinFormatInfo();
+ return m_formatInfo;
+}
+
QMediaPlatformCaptureInterface *QDarwinIntegration::createCaptureInterface(QMediaRecorder::CaptureMode)
{
return new AVFCameraService;
diff --git a/src/multimedia/platform/darwin/qdarwinintegration_p.h b/src/multimedia/platform/darwin/qdarwinintegration_p.h
index ec9e33b78..2a82448a7 100644
--- a/src/multimedia/platform/darwin/qdarwinintegration_p.h
+++ b/src/multimedia/platform/darwin/qdarwinintegration_p.h
@@ -64,11 +64,13 @@ public:
~QDarwinIntegration();
QMediaPlatformDeviceManager *deviceManager() override;
+ QMediaPlatformFormatInfo *formatInfo() override;
QMediaPlatformCaptureInterface *createCaptureInterface(QMediaRecorder::CaptureMode /*mode*/) override;
QMediaPlatformPlayerInterface *createPlayerInterface() override;
QDarwinDeviceManager *m_manager = nullptr;
+ QMediaPlatformFormatInfo *m_formatInfo = nullptr;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/common/qgstcodecsinfo.cpp b/src/multimedia/platform/gstreamer/common/qgstcodecsinfo.cpp
index 359c0deba..2f1dc4391 100644
--- a/src/multimedia/platform/gstreamer/common/qgstcodecsinfo.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstcodecsinfo.cpp
@@ -228,6 +228,16 @@ GList *QGstCodecsInfo::elementFactories(ElementType elementType) const
case Muxer:
gstElementType = GST_ELEMENT_FACTORY_TYPE_MUXER;
break;
+ case AudioDecoder:
+ gstElementType = (GstElementFactoryListType)(GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO);
+ break;
+ case VideoDecoder:
+ // GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER also lists image encoders. We don't want these here.
+ gstElementType = (GstElementFactoryListType)(GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO);
+ break;
+ case Demuxer:
+ gstElementType = GST_ELEMENT_FACTORY_TYPE_DEMUXER;
+ break;
}
GList *list = gst_element_factory_list_get_elements(gstElementType, GST_RANK_MARGINAL);
diff --git a/src/multimedia/platform/gstreamer/common/qgstcodecsinfo_p.h b/src/multimedia/platform/gstreamer/common/qgstcodecsinfo_p.h
index b043aa5d7..fb2fb71d9 100644
--- a/src/multimedia/platform/gstreamer/common/qgstcodecsinfo_p.h
+++ b/src/multimedia/platform/gstreamer/common/qgstcodecsinfo_p.h
@@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE
class Q_MULTIMEDIA_EXPORT QGstCodecsInfo
{
public:
- enum ElementType { AudioEncoder, VideoEncoder, Muxer };
+ enum ElementType { AudioEncoder, VideoEncoder, Muxer, AudioDecoder, VideoDecoder, Demuxer };
struct CodecInfo {
QString description;
diff --git a/src/multimedia/platform/gstreamer/gstreamer.pri b/src/multimedia/platform/gstreamer/gstreamer.pri
index 8d986aef6..6bc041254 100644
--- a/src/multimedia/platform/gstreamer/gstreamer.pri
+++ b/src/multimedia/platform/gstreamer/gstreamer.pri
@@ -5,10 +5,12 @@ QMAKE_USE_PRIVATE += gstreamer gstreamer_app
SOURCES += \
$$PWD/qgstreamerintegration.cpp \
$$PWD/qgstreamerdevicemanager.cpp \
+ $$PWD/qgstreamerformatsinfo.cpp
HEADERS += \
$$PWD/qgstreamerintegration_p.h \
$$PWD/qgstreamerdevicemanager_p.h \
+ $$PWD/qgstreamerformatsinfo_p.h
include(audio/audio.pri)
include(common/common.pri)
diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp b/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp
new file mode 100644
index 000000000..6f6b6913c
--- /dev/null
+++ b/src/multimedia/platform/gstreamer/qgstreamerformatsinfo.cpp
@@ -0,0 +1,175 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgstreamerformatsinfo_p.h"
+
+#include "private/qgstutils_p.h"
+#include "private/qgstcodecsinfo_p.h"
+
+QT_BEGIN_NAMESPACE
+
+static struct {
+ const char *name;
+ QMediaFormat::FileFormat value;
+} videoFormatsMap[] = {
+ { "video/x-ms-asf", QMediaFormat::FileFormat::ASF },
+ { "video/x-msvideo", QMediaFormat::FileFormat::AVI },
+ { "video/x-matroska", QMediaFormat::FileFormat::Matroska },
+ { "video/quicktime, variant=(string)iso", QMediaFormat::FileFormat::MPEG4 },
+ { "video/quicktime", QMediaFormat::FileFormat::QuickTime },
+ { "video/ogg", QMediaFormat::FileFormat::Ogg },
+ { "video/webm", QMediaFormat::FileFormat::WebM },
+ { nullptr, QMediaFormat::FileFormat::MPEG4 }
+};
+
+static struct {
+ const char *name;
+ QMediaFormat::FileFormat value;
+} audioFormatsMap[] = {
+ { "audio/mpeg, mpegversion=(int)1, layer=(int)3", QMediaFormat::FileFormat::MP3 },
+ { "audio/mpeg, mpegversion=(int)4", QMediaFormat::FileFormat::AAC },
+ { "audio/x-flac", QMediaFormat::FileFormat::FLAC },
+ { "audio/x-wma, wmaversion=(int)1", QMediaFormat::FileFormat::WindowsMediaAudio },
+ { "audio/x-wma, wmaversion=(int)2", QMediaFormat::FileFormat::WindowsMediaAudio },
+ { nullptr, QMediaFormat::FileFormat::MPEG4 },
+};
+
+static struct {
+ const char *name;
+ QMediaFormat::VideoCodec value;
+} videoCodecMap[] = {
+ { "video/mpeg, mpegversion=(int)1, systemstream=(boolean)false", QMediaFormat::VideoCodec::MPEG1 },
+ { "video/mpeg, mpegversion=(int)2, systemstream=(boolean)false", QMediaFormat::VideoCodec::MPEG2 },
+ { "video/mpeg, mpegversion=(int)4, systemstream=(boolean)false", QMediaFormat::VideoCodec::MPEG4 },
+ { "video/x-h264", QMediaFormat::VideoCodec::H264 },
+ { "video/x-h265", QMediaFormat::VideoCodec::H265 },
+ { "video/x-vp8", QMediaFormat::VideoCodec::VP8 },
+ { "video/x-vp9", QMediaFormat::VideoCodec::VP9 },
+ { "video/x-av1", QMediaFormat::VideoCodec::AV1 },
+ { "video/x-theora", QMediaFormat::VideoCodec::Theora },
+ { "video/", QMediaFormat::VideoCodec::MotionJPEG },
+ { nullptr, QMediaFormat::VideoCodec::Invalid }
+};
+
+static struct {
+ const char *name;
+ QMediaFormat::AudioCodec value;
+} audioCodecMap[] = {
+ { "audio/mpeg, mpegversion=(int)1, layer=(int)3", QMediaFormat::AudioCodec::MP3 },
+ { "audio/mpeg, mpegversion=(int)4", QMediaFormat::AudioCodec::AAC },
+ { "audio/x-ac3", QMediaFormat::AudioCodec::AC3 },
+ { "audio/x-eac3", QMediaFormat::AudioCodec::EAC3 },
+ { "audio/x-flac", QMediaFormat::AudioCodec::FLAC },
+ { "audio/x-wma, wmaversion=(int)1", QMediaFormat::AudioCodec::WindowsMediaAudio },
+ { "audio/x-wma, wmaversion=(int)2", QMediaFormat::AudioCodec::WindowsMediaAudio },
+ { "audio/x-true-hd", QMediaFormat::AudioCodec::DolbyTrueHD },
+ { "audio/x-vorbis", QMediaFormat::AudioCodec::Vorbis },
+ { nullptr, QMediaFormat::AudioCodec::Invalid },
+};
+
+template<typename Map>
+static auto getList(QGstCodecsInfo::ElementType type, Map *map)
+{
+ using T = decltype(map->value);
+ QList<T> list;
+ QGstCodecsInfo info(type);
+ auto codecs = info.supportedCodecs();
+ for (const auto &c : codecs) {
+ Map *m = map;
+ while (m->name) {
+ if (m->name == c.toLatin1()) {
+ list.append(m->value);
+ break;
+ }
+ ++m;
+ }
+ }
+ return list;
+}
+
+QGstreamerFormatsInfo::QGstreamerFormatsInfo()
+{
+ m_decodableMediaContainers = getList(QGstCodecsInfo::Demuxer, videoFormatsMap);
+ m_decodableMediaContainers.append(getList(QGstCodecsInfo::AudioDecoder, audioFormatsMap));
+ m_decodableAudioCodecs = getList(QGstCodecsInfo::AudioDecoder, audioCodecMap);
+ m_decodableVideoCodecs = getList(QGstCodecsInfo::VideoDecoder, videoCodecMap);
+
+ m_encodableMediaContainers = getList(QGstCodecsInfo::Muxer, videoFormatsMap);
+ m_encodableMediaContainers.append(getList(QGstCodecsInfo::AudioEncoder, audioFormatsMap));
+ m_encodableAudioCodecs = getList(QGstCodecsInfo::AudioEncoder, audioCodecMap);
+ m_encodableVideoCodecs = getList(QGstCodecsInfo::VideoEncoder, videoCodecMap);
+}
+
+QGstreamerFormatsInfo::~QGstreamerFormatsInfo()
+{
+
+}
+
+
+QList<QMediaFormat::FileFormat> QGstreamerFormatsInfo::decodableMediaContainers() const
+{
+ return m_decodableMediaContainers;
+}
+
+QList<QMediaFormat::AudioCodec> QGstreamerFormatsInfo::decodableAudioCodecs() const
+{
+ return m_decodableAudioCodecs;
+}
+
+QList<QMediaFormat::VideoCodec> QGstreamerFormatsInfo::decodableVideoCodecs() const
+{
+ return m_decodableVideoCodecs;
+}
+
+QList<QMediaFormat::FileFormat> QGstreamerFormatsInfo::encodableMediaContainers() const
+{
+ return m_encodableMediaContainers;
+}
+
+QList<QMediaFormat::AudioCodec> QGstreamerFormatsInfo::encodableAudioCodecs() const
+{
+ return m_encodableAudioCodecs;
+}
+
+QList<QMediaFormat::VideoCodec> QGstreamerFormatsInfo::encodableVideoCodecs() const
+{
+ return m_encodableVideoCodecs;
+}
+
+QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatsinfo_p.h b/src/multimedia/platform/gstreamer/qgstreamerformatsinfo_p.h
new file mode 100644
index 000000000..dff690fd6
--- /dev/null
+++ b/src/multimedia/platform/gstreamer/qgstreamerformatsinfo_p.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGSTREAMERFORMATSINFO_H
+#define QGSTREAMERFORMATSINFO_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qmediaplatformformatinfo_p.h>
+#include <qlist.h>
+
+QT_BEGIN_NAMESPACE
+
+class QGstreamerFormatsInfo : public QMediaPlatformFormatInfo
+{
+public:
+ QGstreamerFormatsInfo();
+ ~QGstreamerFormatsInfo();
+
+ QList<QMediaFormat::FileFormat> decodableMediaContainers() const override;
+ QList<QMediaFormat::AudioCodec> decodableAudioCodecs() const override;
+ QList<QMediaFormat::VideoCodec> decodableVideoCodecs() const override;
+
+ QList<QMediaFormat::FileFormat> encodableMediaContainers() const override;
+ QList<QMediaFormat::AudioCodec> encodableAudioCodecs() const override;
+ QList<QMediaFormat::VideoCodec> encodableVideoCodecs() const override;
+
+private:
+ QList<QMediaFormat::FileFormat> m_decodableMediaContainers;
+ QList<QMediaFormat::AudioCodec> m_decodableAudioCodecs;
+ QList<QMediaFormat::VideoCodec> m_decodableVideoCodecs;
+
+ QList<QMediaFormat::FileFormat> m_encodableMediaContainers;
+ QList<QMediaFormat::AudioCodec> m_encodableAudioCodecs;
+ QList<QMediaFormat::VideoCodec> m_encodableVideoCodecs;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp b/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp
index f31133f21..1140f12e8 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp
+++ b/src/multimedia/platform/gstreamer/qgstreamerintegration.cpp
@@ -43,6 +43,7 @@
#include "private/qgstreamerplayerservice_p.h"
#include "private/qgstreamercaptureservice_p.h"
#include "private/qgstreameraudiodecodercontrol_p.h"
+#include "private/qgstreamerformatsinfo_p.h"
QT_BEGIN_NAMESPACE
@@ -54,6 +55,7 @@ QGstreamerIntegration::QGstreamerIntegration()
QGstreamerIntegration::~QGstreamerIntegration()
{
delete m_manager;
+ delete m_formatsInfo;
}
QMediaPlatformDeviceManager *QGstreamerIntegration::deviceManager()
@@ -63,6 +65,13 @@ QMediaPlatformDeviceManager *QGstreamerIntegration::deviceManager()
return m_manager;
}
+QMediaPlatformFormatInfo *QGstreamerIntegration::formatInfo()
+{
+ if (!m_formatsInfo)
+ m_formatsInfo = new QGstreamerFormatsInfo();
+ return m_formatsInfo;
+}
+
QAudioDecoderControl *QGstreamerIntegration::createAudioDecoder()
{
return new QGstreamerAudioDecoderControl(nullptr);
diff --git a/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h b/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h
index 54c51748f..8a0106627 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h
+++ b/src/multimedia/platform/gstreamer/qgstreamerintegration_p.h
@@ -65,12 +65,14 @@ public:
~QGstreamerIntegration();
QMediaPlatformDeviceManager *deviceManager() override;
+ QMediaPlatformFormatInfo *formatInfo() override;
QAudioDecoderControl *createAudioDecoder() override;
QMediaPlatformCaptureInterface *createCaptureInterface(QMediaRecorder::CaptureMode mode) override;
QMediaPlatformPlayerInterface *createPlayerInterface() override;
QGstreamerDeviceManager *m_manager = nullptr;
+ QMediaPlatformFormatInfo *m_formatsInfo = nullptr;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/platform.pri b/src/multimedia/platform/platform.pri
index c296963b7..1d3481583 100644
--- a/src/multimedia/platform/platform.pri
+++ b/src/multimedia/platform/platform.pri
@@ -3,12 +3,14 @@ HEADERS += \
$$PWD/qmediaplatformintegration_p.h \
$$PWD/qmediaplatformdevicemanager_p.h \
$$PWD/qmediaplatformplayerinterface_p.h \
+ $$PWD/qmediaplatformformatinfo_p.h
SOURCES += \
$$PWD/qmediaplatformcaptureinterface.cpp \
$$PWD/qmediaplatformintegration.cpp \
$$PWD/qmediaplatformdevicemanager.cpp \
$$PWD/qmediaplatformplayerinterface.cpp \
+ $$PWD/qmediaplatformformatinfo.cpp
qtConfig(gstreamer):include(gstreamer/gstreamer.pri)
qtConfig(pulseaudio): include(pulseaudio/pulseaudio.pri)
diff --git a/src/multimedia/platform/qmediaplatformformatinfo.cpp b/src/multimedia/platform/qmediaplatformformatinfo.cpp
new file mode 100644
index 000000000..e157a2455
--- /dev/null
+++ b/src/multimedia/platform/qmediaplatformformatinfo.cpp
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmediaplatformformatinfo_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QMediaPlatformFormatInfo::QMediaPlatformFormatInfo() = default;
+
+QMediaPlatformFormatInfo::~QMediaPlatformFormatInfo() = default;
+
+QT_END_NAMESPACE
diff --git a/src/multimedia/platform/qmediaplatformformatinfo_p.h b/src/multimedia/platform/qmediaplatformformatinfo_p.h
new file mode 100644
index 000000000..0a3d06cb3
--- /dev/null
+++ b/src/multimedia/platform/qmediaplatformformatinfo_p.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMEDIAPLATFORMFORMATINFO_H
+#define QMEDIAPLATFORMFORMATINFO_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qtmultimediaglobal_p.h>
+#include <qmediaformat.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q_AUTOTEST_EXPORT QMediaPlatformFormatInfo
+{
+public:
+ QMediaPlatformFormatInfo();
+ virtual ~QMediaPlatformFormatInfo();
+
+ virtual QList<QMediaFormat::FileFormat> decodableMediaContainers() const = 0;
+ virtual QList<QMediaFormat::AudioCodec> decodableAudioCodecs() const = 0;
+ virtual QList<QMediaFormat::VideoCodec> decodableVideoCodecs() const = 0;
+
+ virtual QList<QMediaFormat::FileFormat> encodableMediaContainers() const = 0;
+ virtual QList<QMediaFormat::AudioCodec> encodableAudioCodecs() const = 0;
+ virtual QList<QMediaFormat::VideoCodec> encodableVideoCodecs() const = 0;
+};
+
+QT_END_NAMESPACE
+
+
+#endif // QMEDIAPLATFORMDEVICEMANAGER_H
diff --git a/src/multimedia/platform/qmediaplatformintegration_p.h b/src/multimedia/platform/qmediaplatformintegration_p.h
index a049c704b..4d46ac39b 100644
--- a/src/multimedia/platform/qmediaplatformintegration_p.h
+++ b/src/multimedia/platform/qmediaplatformintegration_p.h
@@ -60,6 +60,7 @@ class QMediaPlatformDeviceManager;
class QMediaPlatformCaptureInterface;
class QMediaPlatformPlayerInterface;
class QAudioDecoderControl;
+class QMediaPlatformFormatInfo;
class Q_MULTIMEDIA_EXPORT QMediaPlatformIntegration
{
@@ -71,10 +72,12 @@ public:
virtual ~QMediaPlatformIntegration();
virtual QMediaPlatformDeviceManager *deviceManager() = 0;
+ virtual QMediaPlatformFormatInfo *formatInfo() = 0;
virtual QAudioDecoderControl *createAudioDecoder() { return nullptr; }
virtual QMediaPlatformCaptureInterface *createCaptureInterface(QMediaRecorder::CaptureMode /*mode*/) { return nullptr; }
virtual QMediaPlatformPlayerInterface *createPlayerInterface() { return nullptr; }
+
};
QT_END_NAMESPACE
diff --git a/src/multimedia/qmediaformat.cpp b/src/multimedia/qmediaformat.cpp
new file mode 100644
index 000000000..43bd38d4b
--- /dev/null
+++ b/src/multimedia/qmediaformat.cpp
@@ -0,0 +1,479 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmediaformat.h"
+#include "private/qmediaplatformintegration_p.h"
+#include "private/qmediaplatformformatinfo_p.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace {
+
+// info from https://en.wikipedia.org/wiki/Comparison_of_video_container_formats
+constexpr bool audioSupportMatrix[QMediaFormat::FileFormat::LastFileFormat + 1][(int)QMediaFormat::AudioCodec::LastAudioCodec + 1] =
+{
+ // MP3, AAC, AC3, EAC3, FLAC, DTHD, Opus,Vorbis, Wave, WMA
+ // Container formats (Audio and Video)
+ { true, true, true, true, true, false, true, false, false, true }, // ASF
+ { true, true, true, false, true, false, true, false, false, true }, // AVI,
+ { true, true, true, true, true, true, true, true, false, true }, // Matroska,
+ { true, true, true, true, true, true, true, false, false, true }, // MPEG4,
+ { false, false, false, false, true, false, true, true, false, false }, // Ogg,
+ { true, true, true, true, false, false, false, false, false, false }, // QuickTime,
+ { false, false, false, false, true, false, true, true, false, false }, // WebM,
+ // Audio Formats
+ { false, true, false, false, false, false, false, false, false, false }, // AAC,
+ { false, false, false, false, true, false, false, false, false, false }, // FLAC,
+ { true, false, false, false, false, false, false, false, false, false }, // Mpeg3,
+ { true, true, true, true, true, true, true, false, false, true }, // Mpeg4Audio,
+ { false, false, false, false, false, false, true, false, false, false }, // Opus,
+ { false, false, false, false, false, false, false, false, true, false }, // Wave,
+ { false, false, false, false, false, false, false, false, false, true }, // WindowsMediaAudio
+};
+
+// info from https://en.wikipedia.org/wiki/Comparison_of_video_container_formats
+constexpr bool videoSupportMatrix[QMediaFormat::FileFormat::LastFileFormat + 1][(int)QMediaFormat::VideoCodec::LastVideoCodec + 1] =
+{
+ //MPEG1, MPEG2, MPEG4, H264, H265, VP8, VP9, AV1,Theora, MotionJPEG,
+ // Container formats (Audio and Video)
+ { true, true, true, true, true, false, false, false, false,false }, // ASF
+ { true, true, true, true, true, true, true, false, true, true }, // AVI,
+ { true, true, true, true, true, true, true, true, true, false }, // Matroska,
+ { true, true, true, true, true, true, true, true, true, true }, // MPEG4,
+ { false, true, true, true, true, false, false, false, false, true }, // Ogg,
+ { false, false, false, false, false, false, false, false, true, false }, // QuickTime,
+ { false, false, false, false, false, true, true, true, false, false }, // WebM,
+ // Audio Formats
+ { false, false, false, false, false, false, false, false, false, false }, // AAC,
+ { false, false, false, false, false, false, false, false, false, false }, // FLAC,
+ { false, false, false, false, false, false, false, false, false, false }, // Mpeg3,
+ { false, false, false, false, false, false, false, false, false, false }, // Mpeg4Audio,
+ { false, false, false, false, false, false, false, false, false, false }, // Opus,
+ { false, false, false, false, false, false, false, false, false, false }, // Wave,
+ { false, false, false, false, false, false, false, false, false, false }, // WindowsMediaAudio
+};
+
+constexpr QMediaFormat::AudioCodec audioPriorityList[] =
+{
+ QMediaFormat::AudioCodec::AAC,
+ QMediaFormat::AudioCodec::MP3,
+ QMediaFormat::AudioCodec::AC3,
+ QMediaFormat::AudioCodec::Opus,
+ QMediaFormat::AudioCodec::EAC3,
+ QMediaFormat::AudioCodec::DolbyTrueHD,
+ QMediaFormat::AudioCodec::WindowsMediaAudio,
+ QMediaFormat::AudioCodec::FLAC,
+ QMediaFormat::AudioCodec::Vorbis,
+ QMediaFormat::AudioCodec::Wave,
+ QMediaFormat::AudioCodec::Invalid
+};
+
+constexpr QMediaFormat::VideoCodec videoPriorityList[] =
+{
+ QMediaFormat::VideoCodec::H265,
+ QMediaFormat::VideoCodec::VP9,
+ QMediaFormat::VideoCodec::H264,
+ QMediaFormat::VideoCodec::AV1,
+ QMediaFormat::VideoCodec::VP8,
+ QMediaFormat::VideoCodec::Theora,
+ QMediaFormat::VideoCodec::MPEG4,
+ QMediaFormat::VideoCodec::MPEG2,
+ QMediaFormat::VideoCodec::MPEG1,
+ QMediaFormat::VideoCodec::MotionJPEG,
+};
+
+}
+
+/*! \enum QMediaFormat::FileFormat
+
+ Describes the container format used in a multimedia file or stream.
+*/
+
+/*! \enum QMediaFormat::AudioCodec
+
+ Describes the audio coded used in multimedia file or stream.
+*/
+
+/*! \enum QMediaFormat::AudioCodec
+
+ Describes the video coded used in multimedia file or stream.
+*/
+
+/*! \class QMediaFormat
+
+ Describes an encoding format for a multimedia file or stream.
+
+ You can check whether a certain QMediaFormat can be used for encoding
+ or decoding using QMediaDecoderInfo or QMediaEncoderInfo.
+*/
+
+// these are non inline to make a possible future addition of a d pointer binary compatible
+QMediaFormat::QMediaFormat(FileFormat format)
+ : fmt(format)
+{
+ Q_UNUSED(d);
+ const QMediaFormat::VideoCodec *v = videoPriorityList;
+ while (*v != QMediaFormat::VideoCodec::Invalid) {
+ if (videoSupportMatrix[fmt][(int)*v])
+ break;
+ ++v;
+ }
+ video = *v;
+
+ const QMediaFormat::AudioCodec *a = audioPriorityList;
+ while (*a != QMediaFormat::AudioCodec::Invalid) {
+ if (videoSupportMatrix[fmt][(int)*a])
+ break;
+ ++a;
+ }
+ audio = *a;
+}
+
+QMediaFormat::~QMediaFormat() = default;
+QMediaFormat::QMediaFormat(const QMediaFormat &other) = default;
+QMediaFormat &QMediaFormat::operator=(const QMediaFormat &other) = default;
+
+
+/*! \fn void QMediaFormat::setMediaContainer(QMediaFormat::FileFormat container)
+
+ Sets the container to \a container.
+
+ \sa mediaContainer(), QMediaFormat::FileFormat
+*/
+
+/*! \fn QMediaFormat::FileFormat QMediaFormat::mediaContainer() const
+
+ Returns the container used in this format.
+
+ \sa setMediaContainer(), QMediaFormat::FileFormat
+*/
+
+/*! \fn void QMediaFormat::setVideoCodec(VideoCodec codec)
+
+ Sets the video codec to \a codec.
+
+ \sa videoCodec(), QMediaFormat::VideoCodec
+*/
+bool QMediaFormat::setVideoCodec(VideoCodec codec)
+{
+ if (!videoSupportMatrix[fmt][(int)codec])
+ return false;
+ video = codec;
+ return true;
+}
+
+/*! \fn QMediaFormat::VideoCodec QMediaFormat::videoCodec() const
+
+ Returns the video codec used in this format.
+
+ \sa setVideoCodec(), QMediaFormat::VideoCodec
+*/
+
+/*! \fn void QMediaFormat::setAudioCodec(AudioCodec codec)
+
+ Sets the audio codec to \a codec.
+
+ \sa audioCodec(), QMediaFormat::AudioCodec
+*/
+bool QMediaFormat::setAudioCodec(QMediaFormat::AudioCodec codec)
+{
+ if (!audioSupportMatrix[fmt][(int)codec])
+ return false;
+ audio = codec;
+ return true;
+}
+
+/*! \fn QMediaFormat::AudioCodec QMediaFormat::audioCodec() const
+
+ Returns the audio codec used in this format.
+
+ \sa setAudioCodec(), QMediaFormat::AudioCodec
+*/
+
+/*! \fn bool QMediaFormat::isValid() const
+
+ Returns true if the format is valid.
+*/
+
+/*!
+ Returns true if Qt Multimedia can decode this format.
+
+ \sa QMediaDecoderInfo
+ */
+bool QMediaFormat::canDecode() const
+{
+ if (!QMediaDecoderInfo::supportedFileFormats().contains(fmt))
+ return false;
+ if (audio == QMediaFormat::AudioCodec::Invalid && video == QMediaFormat::VideoCodec::Invalid)
+ return false;
+ if (audio != QMediaFormat::AudioCodec::Invalid) {
+ if (!QMediaDecoderInfo::supportedAudioCodecs().contains(audio))
+ return false;
+ }
+ if (video != QMediaFormat::VideoCodec::Invalid) {
+ if (!QMediaDecoderInfo::supportedVideoCodecs().contains(video))
+ return false;
+ }
+ return true;
+}
+
+/*!
+ Returns true if Qt Multimedia can encode this format.
+
+ \sa QMediaEncoderInfo
+*/
+bool QMediaFormat::canEncode() const
+{
+ if (!QMediaEncoderInfo::supportedFileFormats().contains(fmt))
+ return false;
+ if (audio == QMediaFormat::AudioCodec::Invalid && video == QMediaFormat::VideoCodec::Invalid)
+ return false;
+ if (audio != QMediaFormat::AudioCodec::Invalid) {
+ if (!QMediaEncoderInfo::supportedAudioCodecs().contains(audio))
+ return false;
+ }
+ if (video != QMediaFormat::VideoCodec::Invalid) {
+ if (!QMediaEncoderInfo::supportedVideoCodecs().contains(video))
+ return false;
+ }
+ return true;
+}
+
+/*!
+ Returns true if is is an audio-only file format.
+ */
+bool QMediaFormat::isAudioFormat() const
+{
+ return fmt >= AAC;
+}
+
+QString QMediaFormat::fileFormatName(QMediaFormat::FileFormat c)
+{
+ constexpr const char *descriptions[] = {
+ "ASF",
+ "AVI",
+ "Matroska",
+ "MPEG-4",
+ "Ogg",
+ "QuickTime",
+ "WebM",
+ // Audio Formats
+ "AAC",
+ "FLAC",
+ "MP3",
+ "MPEG-4 Audio",
+ "Opus",
+ "Wave",
+ "Windows Media Audio",
+ };
+ return QString::fromUtf8(descriptions[int(c)]);
+}
+
+QString QMediaFormat::audioCodecName(QMediaFormat::AudioCodec c)
+{
+ constexpr const char *descriptions[] = {
+ "Invalid",
+ "MP3",
+ "AAC",
+ "AC3",
+ "EAC3",
+ "FLAC",
+ "DolbyTrueHD",
+ "Opus",
+ "Vorbis",
+ "Wave",
+ "WindowsMediaAudio",
+ };
+ return QString::fromUtf8(descriptions[int(c) + 1]);
+}
+
+QString QMediaFormat::videoCodecName(QMediaFormat::VideoCodec c)
+{
+ constexpr const char *descriptions[] = {
+ "Invalid",
+ "MPEG1",
+ "MPEG2",
+ "MPEG4",
+ "H264",
+ "H265",
+ "VP8",
+ "VP9",
+ "AV1",
+ "Theora",
+ "MotionJPEG"
+ };
+ return QString::fromUtf8(descriptions[int(c) + 1]);
+}
+
+QString QMediaFormat::fileFormatDescription(QMediaFormat::FileFormat c)
+{
+ constexpr const char *descriptions[] = {
+ "Windows Media Format (ASF)",
+ "Audio Video Interleave (AVI)",
+ "Matroska Multimedia Container",
+ "MPEG-4 Video Container",
+ "Ogg",
+ "QuickTime Container",
+ "WebM",
+ // Audio Formats
+ "Advanced Audio Codec (AAC)",
+ "Free Lossless Audio Codec (FLAC)",
+ "MP3",
+ "MPEG-4 Audio Container",
+ "Opus Audio Encoding",
+ "Wave File",
+ "Windows Media Audio",
+ };
+ return QString::fromUtf8(descriptions[int(c)]);
+}
+
+QString QMediaFormat::audioCodecDescription(QMediaFormat::AudioCodec c)
+{
+ constexpr const char *descriptions[] = {
+ "Invalid Audio Codec",
+ "MP3",
+ "Advanced Audio Codec (AAC)",
+ "Dolby Digital (AC3)",
+ "Dolby Digital Plus (E-AC3)",
+ "Free Lossless Audio Codec (FLAC)",
+ "Dolby True HD",
+ "Opus",
+ "Vorbis",
+ "Wave",
+ "Windows Media Audio",
+ };
+ return QString::fromUtf8(descriptions[int(c) + 1]);
+}
+
+QString QMediaFormat::videoCodecDescription(QMediaFormat::VideoCodec c)
+{
+ constexpr const char *descriptions[] = {
+ "Invalid",
+ "MPEG-1 Video",
+ "MPEG-2 Video",
+ "MPEG-4 Video",
+ "H.264",
+ "H.265",
+ "VP8",
+ "VP9",
+ "AV1",
+ "Theora",
+ "MotionJPEG"
+ };
+ return QString::fromUtf8(descriptions[int(c) + 1]);
+}
+
+/*! \class QMediaDecoderInfo
+
+ QMediaDecoderInfo describes the media formats supported for decoding
+ on the current platform.
+
+ Qt Multimedia might be able to decode formats that are not listed
+ in the QMediaFormat::FileFormat, QMediaFormat::AudioCodec and QMediaFormat::VideoCodec enums.
+
+ \sa QMediaFormat::canDecode()
+*/
+
+/*!
+ Returns a list of container formats that are supported for decoding by
+ Qt Multimedia.
+
+ This does not imply that Qt can successfully decode the media file or
+ stream, as the audio or video codec used within the container might not
+ be supported.
+ */
+QList<QMediaFormat::FileFormat> QMediaDecoderInfo::supportedFileFormats()
+{
+ return QMediaPlatformIntegration::instance()->formatInfo()->decodableMediaContainers();
+}
+
+/*!
+ Returns a list of video codecs that are supported for decoding by
+ Qt Multimedia.
+ */
+QList<QMediaFormat::VideoCodec> QMediaDecoderInfo::supportedVideoCodecs()
+{
+ return QMediaPlatformIntegration::instance()->formatInfo()->decodableVideoCodecs();
+}
+
+/*!
+ Returns a list of audio codecs that are supported for decoding by
+ Qt Multimedia.
+ */
+QList<QMediaFormat::AudioCodec> QMediaDecoderInfo::supportedAudioCodecs()
+{
+ return QMediaPlatformIntegration::instance()->formatInfo()->decodableAudioCodecs();
+}
+
+/*! \class QMediaEncodecInfo
+
+ QMediaEncoderInfo describes the media formats supported for
+ encoding on the current platform.
+
+ \sa QMediaFormat::canEncode()
+*/
+
+/*!
+ Returns a list of container formats that are supported for encoding by
+ Qt Multimedia.
+ */
+QList<QMediaFormat::FileFormat> QMediaEncoderInfo::supportedFileFormats()
+{
+ return QMediaPlatformIntegration::instance()->formatInfo()->encodableMediaContainers();
+}
+
+/*!
+ Returns a list of video codecs that are supported for encoding by
+ Qt Multimedia.
+ */
+QList<QMediaFormat::VideoCodec> QMediaEncoderInfo::supportedVideoCodecs()
+{
+ return QMediaPlatformIntegration::instance()->formatInfo()->encodableVideoCodecs();
+}
+
+/*!
+ Returns a list of audio codecs that are supported for encoding by
+ Qt Multimedia.
+ */
+QList<QMediaFormat::AudioCodec> QMediaEncoderInfo::supportedAudioCodecs()
+{
+ return QMediaPlatformIntegration::instance()->formatInfo()->encodableAudioCodecs();
+}
+
+QT_END_NAMESPACE
diff --git a/src/multimedia/qmediaformat.h b/src/multimedia/qmediaformat.h
new file mode 100644
index 000000000..baf4d90eb
--- /dev/null
+++ b/src/multimedia/qmediaformat.h
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMEDIAFORMAT_H
+#define QMEDIAFORMAT_H
+
+#include <QtCore/qsharedpointer.h>
+#include <QtMultimedia/qtmultimediaglobal.h>
+#include <QtMultimedia/qmultimedia.h>
+
+QT_BEGIN_NAMESPACE
+
+class QMediaFormatPrivate;
+class Q_MULTIMEDIA_EXPORT QMediaFormat
+{
+public:
+ enum FileFormat {
+ // Video Formats
+ ASF,
+ AVI,
+ Matroska,
+ MPEG4,
+ Ogg,
+ QuickTime,
+ WebM,
+ // Audio Formats
+ AAC,
+ FLAC,
+ MP3,
+ Mpeg4Audio,
+ Opus,
+ Wave,
+ WindowsMediaAudio,
+ LastFileFormat = WindowsMediaAudio
+ };
+
+ enum class AudioCodec {
+ Invalid = -1,
+ MP3,
+ AAC,
+ AC3,
+ EAC3,
+ FLAC,
+ DolbyTrueHD,
+ Opus,
+ Vorbis,
+ Wave,
+ WindowsMediaAudio,
+ LastAudioCodec = WindowsMediaAudio
+ };
+
+ enum class VideoCodec {
+ Invalid = -1,
+ MPEG1,
+ MPEG2,
+ MPEG4,
+ H264,
+ H265,
+ VP8,
+ VP9,
+ AV1,
+ Theora,
+ MotionJPEG,
+ LastVideoCodec = MotionJPEG
+ };
+
+ QMediaFormat(FileFormat format);
+ ~QMediaFormat();
+ QMediaFormat(const QMediaFormat &other);
+ QMediaFormat &operator=(const QMediaFormat &other);
+
+ FileFormat format() const { return fmt; }
+
+ bool setVideoCodec(VideoCodec codec);
+ VideoCodec videoCodec() const { return video; }
+
+ bool setAudioCodec(AudioCodec codec);
+ AudioCodec audioCodec() const { return audio; }
+
+ bool canDecode() const;
+ bool canEncode() const;
+
+ bool isAudioFormat() const;
+
+ static QString fileFormatName(QMediaFormat::FileFormat c);
+ static QString audioCodecName(QMediaFormat::AudioCodec c);
+ static QString videoCodecName(QMediaFormat::VideoCodec c);
+
+ static QString fileFormatDescription(QMediaFormat::FileFormat c);
+ static QString audioCodecDescription(QMediaFormat::AudioCodec c);
+ static QString videoCodecDescription(QMediaFormat::VideoCodec c);
+
+private:
+ FileFormat fmt;
+ AudioCodec audio = AudioCodec::Invalid;
+ VideoCodec video = VideoCodec::Invalid;
+ QMediaFormatPrivate *d = nullptr;
+};
+
+
+class Q_MULTIMEDIA_EXPORT QMediaDecoderInfo
+{
+public:
+ static QList<QMediaFormat::FileFormat> supportedFileFormats();
+ static QList<QMediaFormat::VideoCodec> supportedVideoCodecs();
+ static QList<QMediaFormat::AudioCodec> supportedAudioCodecs();
+};
+
+class Q_MULTIMEDIA_EXPORT QMediaEncoderInfo
+{
+public:
+ static QList<QMediaFormat::FileFormat> supportedFileFormats();
+ static QList<QMediaFormat::VideoCodec> supportedVideoCodecs();
+ static QList<QMediaFormat::AudioCodec> supportedAudioCodecs();
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/multimedia/recording/qmediaencodersettings.cpp b/src/multimedia/recording/qmediaencodersettings.cpp
index ef6fecfd6..13b7f0e06 100644
--- a/src/multimedia/recording/qmediaencodersettings.cpp
+++ b/src/multimedia/recording/qmediaencodersettings.cpp
@@ -880,3 +880,8 @@ void QImageEncoderSettings::setEncodingOptions(const QVariantMap &options)
QT_END_NAMESPACE
+
+QMediaEncoderSettings::QMediaEncoderSettings()
+{
+
+}
diff --git a/src/multimedia/recording/qmediaencodersettings.h b/src/multimedia/recording/qmediaencodersettings.h
index 0d6a9eddf..3bf57d70c 100644
--- a/src/multimedia/recording/qmediaencodersettings.h
+++ b/src/multimedia/recording/qmediaencodersettings.h
@@ -136,6 +136,38 @@ private:
QSharedDataPointer<QVideoEncoderSettingsPrivate> d;
};
+class QMediaFormat;
+class Q_MULTIMEDIA_EXPORT QMediaEncoderSettings
+{
+
+ QMediaEncoderSettings();
+
+ QMediaFormat format();
+ void setMediaFormat(const QMediaFormat &);
+
+ QMultimedia::EncodingMode encodingMode() const;
+ void setEncodingMode(QMultimedia::EncodingMode);
+
+ QMultimedia::EncodingQuality quality() const;
+ void setQuality(QMultimedia::EncodingQuality quality);
+
+ QSize videoResolution() const;
+ void setVideoResolution(const QSize &);
+ void setVideoResolution(int width, int height);
+
+ qreal videoFrameRate() const;
+ void setVideoFrameRate(qreal rate);
+
+ int videoBitRate() const;
+ void setVideoBitRate(int bitrate);
+
+ int audioBitRate() const;
+ void setAudioBitRate(int bitrate);
+
+ int audioChannelCount() const;
+ void setAudioChannelCount(int channels);
+};
+
class QImageEncoderSettingsPrivate;
class Q_MULTIMEDIA_EXPORT QImageEncoderSettings
{
diff --git a/tests/auto/unit/mockbackend/qmockintegration_p.h b/tests/auto/unit/mockbackend/qmockintegration_p.h
index fb2ccfd79..2870633b9 100644
--- a/tests/auto/unit/mockbackend/qmockintegration_p.h
+++ b/tests/auto/unit/mockbackend/qmockintegration_p.h
@@ -67,6 +67,7 @@ public:
~QMockIntegration();
QMediaPlatformDeviceManager *deviceManager() override;
+ QMediaPlatformFormatInfo *formatInfo() override { return nullptr; }
QAudioDecoderControl *createAudioDecoder() override;
QMediaPlatformPlayerInterface *createPlayerInterface() override;