diff options
-rw-r--r-- | examples/multimedia/audiorecorder/audiorecorder.cpp | 2 | ||||
-rw-r--r-- | examples/multimedia/spectrum/app/engine.cpp | 6 | ||||
-rw-r--r-- | examples/multimediawidgets/camera/videosettings.cpp | 1 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiodevice.cpp | 5 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiodevice.h | 1 | ||||
-rw-r--r-- | src/multimedia/audio/qaudioinput.cpp | 2 | ||||
-rw-r--r-- | src/multimedia/platform/darwin/qdarwinformatsinfo.mm | 2 | ||||
-rw-r--r-- | src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp | 50 | ||||
-rw-r--r-- | src/multimedia/platform/gstreamer/qgstreamerformatinfo.cpp | 53 | ||||
-rw-r--r-- | src/multimedia/platform/windows/common/qwindowsmultimediautils.cpp | 24 | ||||
-rw-r--r-- | src/multimedia/platform/windows/qwindowsformatinfo.cpp | 16 | ||||
-rw-r--r-- | src/multimedia/qmediaformat.cpp | 48 | ||||
-rw-r--r-- | src/multimedia/qmediaformat.h | 12 | ||||
-rw-r--r-- | tests/auto/unit/multimedia/qmediaformat/tst_qmediaformat.cpp | 22 | ||||
-rw-r--r-- | tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp | 2 |
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); |