summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/multimedia/audiorecorder/audiorecorder.cpp2
-rw-r--r--examples/multimedia/spectrum/app/engine.cpp6
-rw-r--r--examples/multimediawidgets/camera/videosettings.cpp1
-rw-r--r--src/multimedia/audio/qaudiodevice.cpp5
-rw-r--r--src/multimedia/audio/qaudiodevice.h1
-rw-r--r--src/multimedia/audio/qaudioinput.cpp2
-rw-r--r--src/multimedia/platform/darwin/qdarwinformatsinfo.mm2
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp50
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp53
-rw-r--r--src/multimedia/platform/windows/common/qwindowsmultimediautils.cpp24
-rw-r--r--src/multimedia/platform/windows/qwindowsformatinfo.cpp16
-rw-r--r--src/multimedia/qmediaformat.cpp48
-rw-r--r--src/multimedia/qmediaformat.h12
-rw-r--r--tests/auto/unit/multimedia/qmediaformat/tst_qmediaformat.cpp22
-rw-r--r--tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp2
15 files changed, 174 insertions, 72 deletions
diff --git a/examples/multimedia/audiorecorder/audiorecorder.cpp b/examples/multimedia/audiorecorder/audiorecorder.cpp
index f8437ba4d..af570429e 100644
--- a/examples/multimedia/audiorecorder/audiorecorder.cpp
+++ b/examples/multimedia/audiorecorder/audiorecorder.cpp
@@ -96,7 +96,7 @@ AudioRecorder::AudioRecorder()
//containers
ui->containerBox->addItem(tr("Default"), QVariant(QString()));
for (auto &container : QMediaFormat().supportedFileFormats(QMediaFormat::Encode)) {
- if (container < QMediaFormat::AAC) // ### Somewhat hacky, skip video formats
+ if (container < QMediaFormat::Mpeg4Audio) // ### Somewhat hacky, skip video formats
continue;
ui->containerBox->addItem(QMediaFormat::fileFormatDescription(container), QVariant::fromValue(container));
}
diff --git a/examples/multimedia/spectrum/app/engine.cpp b/examples/multimedia/spectrum/app/engine.cpp
index 6d07a9817..2a6a50168 100644
--- a/examples/multimedia/spectrum/app/engine.cpp
+++ b/examples/multimedia/spectrum/app/engine.cpp
@@ -299,6 +299,8 @@ void Engine::suspend()
case QAudioDevice::Output:
m_audioOutput->suspend();
break;
+ default:
+ break;
}
m_notifyTimer->stop();
}
@@ -380,6 +382,8 @@ void Engine::audioNotify()
calculateSpectrum(spectrumPosition);
}
break;
+ default:
+ break;
}
}
@@ -401,6 +405,8 @@ void Engine::audioStateChanged(QAudio::State state)
case QAudioDevice::Output:
error = m_audioOutput->error();
break;
+ default:
+ break;
}
if (QAudio::NoError != error) {
reset();
diff --git a/examples/multimediawidgets/camera/videosettings.cpp b/examples/multimediawidgets/camera/videosettings.cpp
index 03c4f74c1..858a18b22 100644
--- a/examples/multimediawidgets/camera/videosettings.cpp
+++ b/examples/multimediawidgets/camera/videosettings.cpp
@@ -159,6 +159,7 @@ void VideoSettings::applySettings()
format.setAudioCodec(boxValue(ui->audioCodecBox).value<QMediaFormat::AudioCodec>());
format.setVideoCodec(boxValue(ui->videoCodecBox).value<QMediaFormat::VideoCodec>());
+ mediaRecorder->setMediaFormat(format);
mediaRecorder->setQuality(QMediaRecorder::Quality(ui->qualitySlider->value()));
mediaRecorder->setAudioSampleRate(ui->audioSampleRateBox->value());
mediaRecorder->setVideoResolution(boxValue(ui->videoResolutionBox).toSize());
diff --git a/src/multimedia/audio/qaudiodevice.cpp b/src/multimedia/audio/qaudiodevice.cpp
index bfba09e32..bc2bed906 100644
--- a/src/multimedia/audio/qaudiodevice.cpp
+++ b/src/multimedia/audio/qaudiodevice.cpp
@@ -276,7 +276,7 @@ QAudioDevice::QAudioDevice(QAudioDevicePrivate *p)
*/
QAudioDevice::Mode QAudioDevice::mode() const
{
- return d->mode;
+ return d ? d->mode : Null;
}
#ifndef QT_NO_DEBUG_STREAM
@@ -291,6 +291,9 @@ QDebug operator<<(QDebug dbg, QAudioDevice::Mode mode)
case QAudioDevice::Output:
dbg << "QAudioDevice::Output";
break;
+ case QAudioDevice::Null:
+ dbg << "QAudioDevice::Null";
+ break;
}
return dbg;
}
diff --git a/src/multimedia/audio/qaudiodevice.h b/src/multimedia/audio/qaudiodevice.h
index 367733c77..f414af88f 100644
--- a/src/multimedia/audio/qaudiodevice.h
+++ b/src/multimedia/audio/qaudiodevice.h
@@ -66,6 +66,7 @@ class Q_MULTIMEDIA_EXPORT QAudioDevice
Q_PROPERTY(Mode mode READ mode CONSTANT)
public:
enum Mode {
+ Null,
Input,
Output
};
diff --git a/src/multimedia/audio/qaudioinput.cpp b/src/multimedia/audio/qaudioinput.cpp
index 4d65aee3a..e257e8f3f 100644
--- a/src/multimedia/audio/qaudioinput.cpp
+++ b/src/multimedia/audio/qaudioinput.cpp
@@ -112,7 +112,7 @@ QAudioDevice QAudioInput::device() const
void QAudioInput::setDevice(const QAudioDevice &device)
{
- if (device.mode() != QAudioDevice::Input)
+ if (device.mode() == QAudioDevice::Output)
return;
d->device = device;
d->setAudioDevice(device);
diff --git a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
index afa1adf4a..9ba42c14b 100644
--- a/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
+++ b/src/multimedia/platform/darwin/qdarwinformatsinfo.mm
@@ -47,7 +47,7 @@ static struct {
const char *name;
QMediaFormat::FileFormat value;
} mediaContainerMap[] = {
- { "video/x-ms-asf", QMediaFormat::ASF },
+ { "video/x-ms-asf", QMediaFormat::WMV },
{ "video/avi", QMediaFormat::AVI },
{ "video/x-matroska", QMediaFormat::Matroska },
{ "video/mp4", QMediaFormat::MPEG4 },
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
index ee67ae55d..810709b64 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
@@ -238,20 +238,29 @@ static GstEncodingProfile *createAudioProfile(const QMediaEncoderSettings &setti
static GstEncodingContainerProfile *createEncodingProfile(const QMediaEncoderSettings &settings)
{
auto *containerProfile = createContainerProfile(settings);
- if (containerProfile) {
- GstEncodingProfile *audioProfile = createAudioProfile(settings);
- GstEncodingProfile *videoProfile = settings.videoCodec() != QMediaFormat::VideoCodec::Unspecified ? createVideoProfile(settings) : nullptr;
-// qDebug() << "audio profile" << gst_caps_to_string(gst_encoding_profile_get_format(audioProfile));
-// qDebug() << "video profile" << gst_caps_to_string(gst_encoding_profile_get_format(videoProfile));
-// qDebug() << "conta profile" << gst_caps_to_string(gst_encoding_profile_get_format((GstEncodingProfile *)containerProfile));
-
- if (videoProfile) {
- if (!gst_encoding_container_profile_add_profile(containerProfile, videoProfile))
- gst_encoding_profile_unref(videoProfile);
+ if (!containerProfile) {
+ qWarning() << "QGstreamerMediaEncoder: failed to create container profile!";
+ return nullptr;
+ }
+
+ GstEncodingProfile *audioProfile = createAudioProfile(settings);
+ GstEncodingProfile *videoProfile = nullptr;
+ if (settings.videoCodec() != QMediaFormat::VideoCodec::Unspecified)
+ videoProfile = createVideoProfile(settings);
+// qDebug() << "audio profile" << (audioProfile ? gst_caps_to_string(gst_encoding_profile_get_format(audioProfile)) : "(null)");
+// qDebug() << "video profile" << (videoProfile ? gst_caps_to_string(gst_encoding_profile_get_format(videoProfile)) : "(null)");
+// qDebug() << "conta profile" << gst_caps_to_string(gst_encoding_profile_get_format((GstEncodingProfile *)containerProfile));
+
+ if (videoProfile) {
+ if (!gst_encoding_container_profile_add_profile(containerProfile, videoProfile)) {
+ qWarning() << "QGstreamerMediaEncoder: failed to add video profile!";
+ gst_encoding_profile_unref(videoProfile);
}
- if (audioProfile) {
- if (!gst_encoding_container_profile_add_profile(containerProfile, audioProfile))
- gst_encoding_profile_unref(audioProfile);
+ }
+ if (audioProfile) {
+ if (!gst_encoding_container_profile_add_profile(containerProfile, audioProfile)) {
+ qWarning() << "QGstreamerMediaEncoder: failed to add audio profile!";
+ gst_encoding_profile_unref(audioProfile);
}
}
@@ -356,11 +365,16 @@ void QGstreamerMediaEncoder::stop()
heartbeat.stop();
gstPipeline.setStateSync(GST_STATE_PAUSED);
- audioSrcPad.unlinkPeer();
- videoSrcPad.unlinkPeer();
- m_session->releaseAudioPad(audioSrcPad);
- m_session->releaseVideoPad(videoSrcPad);
- audioSrcPad = videoSrcPad = {};
+ if (!audioSrcPad.isNull()) {
+ audioSrcPad.unlinkPeer();
+ m_session->releaseAudioPad(audioSrcPad);
+ audioSrcPad = {};
+ }
+ if (!videoSrcPad.isNull()) {
+ videoSrcPad.unlinkPeer();
+ m_session->releaseVideoPad(videoSrcPad);
+ videoSrcPad = {};
+ }
gstPipeline.setState(GST_STATE_PLAYING);
//with live sources it's necessary to send EOS even to pipeline
diff --git a/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp b/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp
index 4705848a4..1bf17ac89 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp
+++ b/src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp
@@ -52,7 +52,7 @@ QMediaFormat::AudioCodec QGstreamerFormatInfo::audioCodecForCaps(QGstStructure s
name += 6;
if (!strcmp(name, "mpeg")) {
auto version = structure["mpegversion"].toInt();
- if (0 && version == 1) {
+ if (version == 1) {
auto layer = structure["layer"];
if (!layer.isNull())
return QMediaFormat::AudioCodec::MP3;
@@ -75,6 +75,8 @@ QMediaFormat::AudioCodec QGstreamerFormatInfo::audioCodecForCaps(QGstStructure s
return QMediaFormat::AudioCodec::Opus;
} else if (!strcmp(name, "x-wav")) {
return QMediaFormat::AudioCodec::Wave;
+ } else if (!strcmp(name, "x-wma")) {
+ return QMediaFormat::AudioCodec::WMA;
}
return QMediaFormat::AudioCodec::Unspecified;
}
@@ -111,6 +113,8 @@ QMediaFormat::VideoCodec QGstreamerFormatInfo::videoCodecForCaps(QGstStructure s
return QMediaFormat::VideoCodec::Theora;
} else if (!strcmp(name, "x-jpeg")) {
return QMediaFormat::VideoCodec::MotionJPEG;
+ } else if (!strcmp(name, "x-wmv")) {
+ return QMediaFormat::VideoCodec::WMV;
}
return QMediaFormat::VideoCodec::Unspecified;
}
@@ -120,7 +124,7 @@ QMediaFormat::FileFormat QGstreamerFormatInfo::fileFormatForCaps(QGstStructure s
const char *name = structure.name().data();
if (!strcmp(name, "video/x-ms-asf")) {
- return QMediaFormat::FileFormat::ASF;
+ return QMediaFormat::FileFormat::WMV;
} else if (!strcmp(name, "video/x-msvideo")) {
return QMediaFormat::FileFormat::AVI;
} else if (!strcmp(name, "video/x-matroska")) {
@@ -195,10 +199,10 @@ static QPair<QList<QMediaFormat::AudioCodec>, QList<QMediaFormat::VideoCodec>> g
for (int i = 0; i < caps.size(); i++) {
QGstStructure structure = caps.at(i);
auto a = QGstreamerFormatInfo::audioCodecForCaps(structure);
- if (a != QMediaFormat::AudioCodec::Unspecified)
+ if (a != QMediaFormat::AudioCodec::Unspecified && !audio.contains(a))
audio.append(a);
auto v = QGstreamerFormatInfo::videoCodecForCaps(structure);
- if (v != QMediaFormat::VideoCodec::Unspecified)
+ if (v != QMediaFormat::VideoCodec::Unspecified && !video.contains(v))
video.append(v);
}
}
@@ -271,9 +275,7 @@ QList<QGstreamerFormatInfo::CodecMap> QGstreamerFormatInfo::getMuxerList(bool de
}
if (acceptsRawAudio && fileFormats.size() == 1) {
switch (fileFormats.at(0)) {
- case QMediaFormat::AAC:
case QMediaFormat::Mpeg4Audio:
- case QMediaFormat::ALAC:
default:
break;
case QMediaFormat::MP3:
@@ -294,6 +296,10 @@ QList<QGstreamerFormatInfo::CodecMap> QGstreamerFormatInfo::getMuxerList(bool de
muxers.append({f, audioCodecs, videoCodecs});
if (f == QMediaFormat::MPEG4 && !fileFormats.contains(QMediaFormat::Mpeg4Audio)) {
muxers.append({QMediaFormat::Mpeg4Audio, audioCodecs, {}});
+ if (audioCodecs.contains(QMediaFormat::AudioCodec::AAC))
+ muxers.append({QMediaFormat::AAC, { QMediaFormat::AudioCodec::AAC }, {}});
+ } else if (f == QMediaFormat::WMV && !fileFormats.contains(QMediaFormat::WMA)) {
+ muxers.append({QMediaFormat::WMA, audioCodecs, {}});
}
}
}
@@ -338,7 +344,21 @@ static QList<QImageCapture::FileFormat> getImageFormatList()
}
#if 0
-static void dumpMuxers(const QList<QGstreamerFormatsInfo::CodecMap> &muxerList)
+static void dumpAudioCodecs(const QList<QMediaFormat::AudioCodec> &codecList)
+{
+ qDebug() << "Audio codecs:";
+ for (const auto &c : codecList)
+ qDebug() << " " << QMediaFormat::audioCodecName(c);
+}
+
+static void dumpVideoCodecs(const QList<QMediaFormat::VideoCodec> &codecList)
+{
+ qDebug() << "Video codecs:";
+ for (const auto &c : codecList)
+ qDebug() << " " << QMediaFormat::videoCodecName(c);
+}
+
+static void dumpMuxers(const QList<QPlatformMediaFormatInfo::CodecMap> &muxerList)
{
for (const auto &m : muxerList) {
qDebug() << " " << QMediaFormat::fileFormatName(m.format);
@@ -360,7 +380,9 @@ QGstreamerFormatInfo::QGstreamerFormatInfo()
codecs = getCodecsList(/*decode = */ false);
encoders = getMuxerList(/* demuxer = */false, codecs.first, codecs.second);
- //dumpMuxers(encoders);
+// dumpAudioCodecs(codecs.first);
+// dumpVideoCodecs(codecs.second);
+// dumpMuxers(encoders);
imageFormats = getImageFormatList();
}
@@ -373,20 +395,19 @@ QGstMutableCaps QGstreamerFormatInfo::formatCaps(const QMediaFormat &f) const
Q_ASSERT(format != QMediaFormat::UnspecifiedFormat);
const char *capsForFormat[QMediaFormat::LastFileFormat + 1] = {
- "video/x-ms-asf", // ASF
+ "video/x-ms-asf", // WMV
"video/x-msvideo", // AVI
"video/x-matroska", // Matroska
"video/quicktime, variant=(string)iso", // MPEG4
"video/ogg", // Ogg
"video/quicktime", // QuickTime
"video/webm", // WebM
- "audio/mpeg, mpegversion=(int)4", // AAC
- "audio/x-flac", // FLAC
+ "video/quicktime, variant=(string)iso", // Mpeg4Audio is the same is mp4...
+ "video/quicktime, variant=(string)iso", // AAC is also an MP4 container
+ "video/x-ms-asf", // WMA, same as WMV
"audio/mpeg, mpegversion=(int)1, layer=(int)3", // MP3
- "audio/mpeg, mpegversion=(int)4", // Mpeg4Audio
- "audio/x-alac", // ALAC
+ "audio/x-flac", // FLAC
"audio/x-wav" // Wave
-
};
return gst_caps_from_string(capsForFormat[format]);
}
@@ -406,8 +427,9 @@ QGstMutableCaps QGstreamerFormatInfo::audioCaps(const QMediaFormat &f) const
"audio/x-true-hd", // DolbyTrueHD
"audio/x-opus", // Opus
"audio/x-vorbis", // Vorbis
+ "audio/x-raw", // WAVE
+ "audio/x-wma", // WMA
"audio/x-alac", // ALAC
- "audio/x-wav", // WAVE
};
return gst_caps_from_string(capsForCodec[(int)codec]);
}
@@ -428,6 +450,7 @@ QGstMutableCaps QGstreamerFormatInfo::videoCaps(const QMediaFormat &f) const
"video/x-vp9", // VP9,
"video/x-av1", // AV1,
"video/x-theora", // Theora,
+ "audio/x-wmv", // WMV
"video/x-jpeg", // MotionJPEG,
};
return gst_caps_from_string(capsForCodec[(int)codec]);
diff --git a/src/multimedia/platform/windows/common/qwindowsmultimediautils.cpp b/src/multimedia/platform/windows/common/qwindowsmultimediautils.cpp
index 688ed7947..9e6ee9343 100644
--- a/src/multimedia/platform/windows/common/qwindowsmultimediautils.cpp
+++ b/src/multimedia/platform/windows/common/qwindowsmultimediautils.cpp
@@ -93,11 +93,13 @@ GUID QWindowsMultimediaUtils::videoFormatForCodec(QMediaFormat::VideoCodec codec
return MFVideoFormat_VP90;
case QMediaFormat::VideoCodec::AV1:
return MFVideoFormat_AV1;
+ case QMediaFormat::VideoCodec::WMV:
+ return MFVideoFormat_WMV3;
case QMediaFormat::VideoCodec::MotionJPEG:
return MFVideoFormat_MJPG;
+ default:
+ return MFVideoFormat_H264;
}
- // Use H264 as the default video codec
- return MFVideoFormat_H264;
}
GUID QWindowsMultimediaUtils::audioFormatForCodec(QMediaFormat::AudioCodec codec)
@@ -121,9 +123,11 @@ GUID QWindowsMultimediaUtils::audioFormatForCodec(QMediaFormat::AudioCodec codec
return MFAudioFormat_Dolby_AC3;
case QMediaFormat::AudioCodec::EAC3:
return MFAudioFormat_Dolby_DDPlus;
+ case QMediaFormat::AudioCodec::WMA:
+ return MFAudioFormat_WMAudioV9;
+ default:
+ return MFAudioFormat_AAC;
}
- // Use AAC as the default audio codec
- return MFAudioFormat_AAC;
}
GUID QWindowsMultimediaUtils::containerForVideoFileFormat(QMediaFormat::FileFormat format)
@@ -131,12 +135,13 @@ GUID QWindowsMultimediaUtils::containerForVideoFileFormat(QMediaFormat::FileForm
switch (format) {
case QMediaFormat::FileFormat::MPEG4:
return MFTranscodeContainerType_MPEG4;
- case QMediaFormat::FileFormat::ASF:
+ case QMediaFormat::FileFormat::WMV:
return MFTranscodeContainerType_ASF;
case QMediaFormat::FileFormat::AVI:
return MFTranscodeContainerType_AVI;
+ default:
+ return MFTranscodeContainerType_MPEG4;
}
- return MFTranscodeContainerType_MPEG4;
}
GUID QWindowsMultimediaUtils::containerForAudioFileFormat(QMediaFormat::FileFormat format)
@@ -148,14 +153,15 @@ GUID QWindowsMultimediaUtils::containerForAudioFileFormat(QMediaFormat::FileForm
return MFTranscodeContainerType_ADTS;
case QMediaFormat::FileFormat::Mpeg4Audio:
return MFTranscodeContainerType_MPEG4;
- case QMediaFormat::FileFormat::ALAC:
- return MFTranscodeContainerType_MPEG4;
+ case QMediaFormat::FileFormat::WMA:
+ return MFTranscodeContainerType_ASF;
case QMediaFormat::FileFormat::FLAC:
return MFTranscodeContainerType_FLAC;
case QMediaFormat::FileFormat::Wave:
return MFTranscodeContainerType_WAVE;
+ default:
+ return MFTranscodeContainerType_MPEG4;
}
- return MFTranscodeContainerType_MPEG4;
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/windows/qwindowsformatinfo.cpp b/src/multimedia/platform/windows/qwindowsformatinfo.cpp
index cda24d6eb..85c362b29 100644
--- a/src/multimedia/platform/windows/qwindowsformatinfo.cpp
+++ b/src/multimedia/platform/windows/qwindowsformatinfo.cpp
@@ -62,7 +62,13 @@ QWindowsFormatInfo::QWindowsFormatInfo()
{} },
{ QMediaFormat::Mpeg4Audio,
{ QMediaFormat::AudioCodec::AAC },
- {} }
+ {} },
+ { QMediaFormat::WMA,
+ { QMediaFormat::AudioCodec::WMA },
+ {} },
+ { QMediaFormat::WMV,
+ { QMediaFormat::AudioCodec::WMA },
+ { QMediaFormat::VideoCodec::WMV } }
};
encoders = {
@@ -77,7 +83,13 @@ QWindowsFormatInfo::QWindowsFormatInfo()
{} },
{ QMediaFormat::Mpeg4Audio,
{ QMediaFormat::AudioCodec::AAC },
- {} }
+ {} },
+ { QMediaFormat::WMA,
+ { QMediaFormat::AudioCodec::WMA },
+ {} },
+ { QMediaFormat::WMV,
+ { QMediaFormat::AudioCodec::WMA },
+ { QMediaFormat::VideoCodec::WMV } }
};
// ####
diff --git a/src/multimedia/qmediaformat.cpp b/src/multimedia/qmediaformat.cpp
index ca9fc0cd3..18bc4621d 100644
--- a/src/multimedia/qmediaformat.cpp
+++ b/src/multimedia/qmediaformat.cpp
@@ -49,7 +49,7 @@ namespace {
const char *mimeTypeForFormat[QMediaFormat::LastFileFormat + 2] =
{
"",
- "video/x-ms-asf",
+ "video/x-ms-wmv",
"video/x-msvideo",
"video/x-matroska",
"video/mp4",
@@ -57,11 +57,11 @@ const char *mimeTypeForFormat[QMediaFormat::LastFileFormat + 2] =
"video/quicktime",
"video/webm",
// Audio Formats
+ "audio/mp4",
"audio/aac",
+ "audio/x-ms-wma",
"audio/flac",
"audio/mpeg",
- "audio/mp4",
- "audio/alac",
"audio/wav",
};
@@ -71,7 +71,7 @@ constexpr QMediaFormat::FileFormat videoFormatPriorityList[] =
QMediaFormat::QuickTime,
QMediaFormat::AVI,
QMediaFormat::WebM,
- QMediaFormat::ASF,
+ QMediaFormat::WMV,
QMediaFormat::Matroska,
QMediaFormat::Ogg,
QMediaFormat::UnspecifiedFormat
@@ -79,11 +79,10 @@ constexpr QMediaFormat::FileFormat videoFormatPriorityList[] =
constexpr QMediaFormat::FileFormat audioFormatPriorityList[] =
{
- QMediaFormat::AAC,
- QMediaFormat::MP3,
QMediaFormat::Mpeg4Audio,
+ QMediaFormat::MP3,
+ QMediaFormat::WMA,
QMediaFormat::FLAC,
- QMediaFormat::ALAC,
QMediaFormat::Wave,
QMediaFormat::UnspecifiedFormat
};
@@ -96,6 +95,7 @@ constexpr QMediaFormat::AudioCodec audioPriorityList[] =
QMediaFormat::AudioCodec::Opus,
QMediaFormat::AudioCodec::EAC3,
QMediaFormat::AudioCodec::DolbyTrueHD,
+ QMediaFormat::AudioCodec::WMA,
QMediaFormat::AudioCodec::FLAC,
QMediaFormat::AudioCodec::Vorbis,
QMediaFormat::AudioCodec::Wave,
@@ -109,6 +109,7 @@ constexpr QMediaFormat::VideoCodec videoPriorityList[] =
QMediaFormat::VideoCodec::H264,
QMediaFormat::VideoCodec::AV1,
QMediaFormat::VideoCodec::VP8,
+ QMediaFormat::VideoCodec::WMV,
QMediaFormat::VideoCodec::Theora,
QMediaFormat::VideoCodec::MPEG4,
QMediaFormat::VideoCodec::MPEG2,
@@ -303,7 +304,7 @@ QString QMediaFormat::fileFormatName(QMediaFormat::FileFormat c)
{
constexpr const char *descriptions[QMediaFormat::LastFileFormat + 2] = {
"Unspecified",
- "ASF",
+ "WMV",
"AVI",
"Matroska",
"MPEG-4",
@@ -311,11 +312,11 @@ QString QMediaFormat::fileFormatName(QMediaFormat::FileFormat c)
"QuickTime",
"WebM",
// Audio Formats
+ "MPEG-4 Audio",
"AAC",
- "FLAC",
+ "WMA",
"MP3",
- "MPEG-4 Audio",
- "ALAC",
+ "FLAC",
"Wave"
};
return QString::fromUtf8(descriptions[int(c) + 1]);
@@ -334,6 +335,7 @@ QString QMediaFormat::audioCodecName(QMediaFormat::AudioCodec c)
"Opus",
"Vorbis",
"Wave",
+ "WMA",
"ALAC",
};
return QString::fromUtf8(descriptions[int(c) + 1]);
@@ -352,6 +354,7 @@ QString QMediaFormat::videoCodecName(QMediaFormat::VideoCodec c)
"VP9",
"AV1",
"Theora",
+ "WMV",
"MotionJPEG"
};
return QString::fromUtf8(descriptions[int(c) + 1]);
@@ -361,7 +364,7 @@ QString QMediaFormat::fileFormatDescription(QMediaFormat::FileFormat c)
{
constexpr const char *descriptions[QMediaFormat::LastFileFormat + 2] = {
"Unspecified File Format",
- "Windows Media Format",
+ "Windows Media Video",
"Audio Video Interleave",
"Matroska Multimedia Container",
"MPEG-4 Video Container",
@@ -369,11 +372,11 @@ QString QMediaFormat::fileFormatDescription(QMediaFormat::FileFormat c)
"QuickTime Container",
"WebM",
// Audio Formats
- "Advanced Audio Codec (AAC)",
- "Free Lossless Audio Codec (FLAC)",
+ "MPEG-4 Audio",
+ "AAC",
+ "Windows Media Audio",
"MP3",
- "MPEG-4 Audio Container",
- "Apple Lossless Audio Codec (ALAC)",
+ "Free Lossless Audio Codec (FLAC)",
"Wave File"
};
return QString::fromUtf8(descriptions[int(c) + 1]);
@@ -392,6 +395,7 @@ QString QMediaFormat::audioCodecDescription(QMediaFormat::AudioCodec c)
"Opus",
"Vorbis",
"Wave",
+ "Windows Media Audio",
"Apple Lossless Audio Codec (ALAC)",
};
return QString::fromUtf8(descriptions[int(c) + 1]);
@@ -410,6 +414,7 @@ QString QMediaFormat::videoCodecDescription(QMediaFormat::VideoCodec c)
"VP9",
"AV1",
"Theora",
+ "Windows Media Video",
"MotionJPEG"
};
return QString::fromUtf8(descriptions[int(c) + 1]);
@@ -434,6 +439,11 @@ void QMediaFormat::resolveForEncoding(ResolveFlags flags)
{
const bool requiresVideo = (flags & ResolveFlags::RequiresVideo) != 0;
+ if (!requiresVideo)
+ video = VideoCodec::Unspecified;
+
+ // need to adjust the format. Priority is given first to file format, then video codec, then audio codec
+
QMediaFormat nullFormat;
auto supportedFormats = nullFormat.supportedFileFormats(QMediaFormat::Encode);
auto supportedAudioCodecs = nullFormat.supportedAudioCodecs(QMediaFormat::Encode);
@@ -464,7 +474,7 @@ void QMediaFormat::resolveForEncoding(ResolveFlags flags)
fmt = QMediaFormat::UnspecifiedFormat;
if (!supportedAudioCodecs.contains(audio))
audio = QMediaFormat::AudioCodec::Unspecified;
- if ((flags == NoFlags) || !supportedVideoCodecs.contains(video))
+ if (!requiresVideo || !supportedVideoCodecs.contains(video))
video = QMediaFormat::VideoCodec::Unspecified;
if (requiresVideo) {
@@ -482,8 +492,10 @@ void QMediaFormat::resolveForEncoding(ResolveFlags flags)
if (fmt == QMediaFormat::UnspecifiedFormat)
fmt = bestSupportedFileFormat();
// still nothing? Give up
- if (fmt == QMediaFormat::UnspecifiedFormat)
+ if (fmt == QMediaFormat::UnspecifiedFormat) {
+ *this = {};
return;
+ }
// find a working video codec
if (requiresVideo) {
diff --git a/src/multimedia/qmediaformat.h b/src/multimedia/qmediaformat.h
index d3d3d68a2..d3631ea42 100644
--- a/src/multimedia/qmediaformat.h
+++ b/src/multimedia/qmediaformat.h
@@ -62,19 +62,19 @@ public:
enum FileFormat {
UnspecifiedFormat = -1,
// Video Formats
- ASF,
+ WMV,
AVI,
Matroska,
MPEG4,
Ogg,
QuickTime,
WebM,
- // Audio Formats
+ // Audio Only Formats
+ Mpeg4Audio,
AAC,
- FLAC,
+ WMA,
MP3,
- Mpeg4Audio,
- ALAC,
+ FLAC,
Wave,
LastFileFormat = Wave
};
@@ -91,6 +91,7 @@ public:
Opus,
Vorbis,
Wave,
+ WMA,
ALAC,
LastAudioCodec = ALAC
};
@@ -107,6 +108,7 @@ public:
VP9,
AV1,
Theora,
+ WMV,
MotionJPEG,
LastVideoCodec = MotionJPEG
};
diff --git a/tests/auto/unit/multimedia/qmediaformat/tst_qmediaformat.cpp b/tests/auto/unit/multimedia/qmediaformat/tst_qmediaformat.cpp
index b7a31d300..b3d45e727 100644
--- a/tests/auto/unit/multimedia/qmediaformat/tst_qmediaformat.cpp
+++ b/tests/auto/unit/multimedia/qmediaformat/tst_qmediaformat.cpp
@@ -43,6 +43,7 @@ void tst_QMediaFormat::testResolveForEncoding()
QMediaFormat format;
auto hasVideoCodecs = !format.supportedVideoCodecs(QMediaFormat::Encode).isEmpty();
+ bool hasWav = format.supportedFileFormats(QMediaFormat::Encode).contains(QMediaFormat::Wave);
// Resolve codecs for audio only stream
format.resolveForEncoding(QMediaFormat::NoFlags);
@@ -62,6 +63,27 @@ void tst_QMediaFormat::testResolveForEncoding()
// Resolve again for audio only stream
format.resolveForEncoding(QMediaFormat::NoFlags);
QVERIFY(format.videoCodec() == QMediaFormat::VideoCodec::Unspecified);
+
+ // check some specific conditions
+ if (hasWav) {
+ QMediaFormat f(QMediaFormat::Mpeg4Audio);
+ if (!f.supportedAudioCodecs(QMediaFormat::Encode).contains(QMediaFormat::AudioCodec::Wave)) {
+ qDebug() << "testing!";
+ format.setFileFormat(QMediaFormat::Mpeg4Audio);
+ format.setAudioCodec(QMediaFormat::AudioCodec::Wave);
+ format.resolveForEncoding(QMediaFormat::NoFlags);
+ QVERIFY(format.fileFormat() == QMediaFormat::Mpeg4Audio);
+ QVERIFY(format.audioCodec() != QMediaFormat::AudioCodec::Wave);
+
+ format = {};
+ format.setFileFormat(QMediaFormat::Wave);
+ format.setAudioCodec(QMediaFormat::AudioCodec::AAC);
+ format.resolveForEncoding(QMediaFormat::NoFlags);
+ QVERIFY(format.fileFormat() == QMediaFormat::Wave);
+ QVERIFY(format.audioCodec() == QMediaFormat::AudioCodec::Wave);
+ }
+ }
+
}
QTEST_MAIN(tst_QMediaFormat)
diff --git a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
index ed7b90234..c91728169 100644
--- a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
+++ b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
@@ -317,7 +317,7 @@ void tst_QMediaRecorder::testAudioSettings()
QCOMPARE(recorder.audioSampleRate(), -1);
QMediaFormat format;
- format.setFileFormat(QMediaFormat::AAC);
+ format.setFileFormat(QMediaFormat::FLAC);
recorder.setMediaFormat(format);
QCOMPARE(recorder.mediaFormat(), format);