diff options
Diffstat (limited to 'src')
279 files changed, 3862 insertions, 1211 deletions
diff --git a/src/gsttools/gsttools.pro b/src/gsttools/gsttools.pro index edbf603e3..f5e3fd96f 100644 --- a/src/gsttools/gsttools.pro +++ b/src/gsttools/gsttools.pro @@ -1,7 +1,6 @@ -TEMPLATE = lib - -TARGET = qgsttools_p -QPRO_PWD = $$PWD +TARGET = QtMultimediaGstTools +MODULE = multimediagsttools +CONFIG += internal_module QT = core-private multimedia-private gui-private @@ -36,7 +35,8 @@ PRIVATE_HEADERS += \ qgstreamervideoprobecontrol_p.h \ qgstreameraudioprobecontrol_p.h \ qgstreamervideowindow_p.h \ - qgstreamervideooverlay_p.h + qgstreamervideooverlay_p.h \ + qgsttools_global_p.h SOURCES += \ qgstreamerbushelper.cpp \ @@ -101,7 +101,4 @@ qtConfig(gstreamer_app) { HEADERS += $$PRIVATE_HEADERS -DESTDIR = $$QT.multimedia.libs -target.path = $$[QT_INSTALL_LIBS] - -INSTALLS += target +load(qt_module) diff --git a/src/gsttools/qgstcodecsinfo.cpp b/src/gsttools/qgstcodecsinfo.cpp index 230dc581b..a05ee92aa 100644 --- a/src/gsttools/qgstcodecsinfo.cpp +++ b/src/gsttools/qgstcodecsinfo.cpp @@ -156,7 +156,7 @@ void QGstCodecsInfo::updateCodecs(ElementType elementType) GstRank rank = GstRank(gst_plugin_feature_get_rank(GST_PLUGIN_FEATURE(factory))); // If two elements provide the same codec, use the highest ranked one - QMap<QString, CodecInfo>::const_iterator it = m_codecInfo.find(codec); + QMap<QString, CodecInfo>::const_iterator it = m_codecInfo.constFind(codec); if (it == m_codecInfo.constEnd() || it->rank < rank) { if (it == m_codecInfo.constEnd()) m_codecs.append(codec); diff --git a/src/gsttools/qgstreameraudioinputselector.cpp b/src/gsttools/qgstreameraudioinputselector.cpp index 6d74feb1b..72d079cbc 100644 --- a/src/gsttools/qgstreameraudioinputselector.cpp +++ b/src/gsttools/qgstreameraudioinputselector.cpp @@ -104,7 +104,7 @@ void QGstreamerAudioInputSelector::update() m_descriptions.clear(); //use autoaudiosrc as the first default device - m_names.append("default:"); + m_names.append(QLatin1String("default:")); m_descriptions.append(tr("System default device")); updatePulseDevices(); @@ -150,12 +150,12 @@ void QGstreamerAudioInputSelector::updateAlsaDevices() void QGstreamerAudioInputSelector::updateOssDevices() { - QDir devDir("/dev"); + QDir devDir(QStringLiteral("/dev")); devDir.setFilter(QDir::System); - const QFileInfoList entries = devDir.entryInfoList(QStringList() << "dsp*"); + const QFileInfoList entries = devDir.entryInfoList(QStringList() << QLatin1String("dsp*")); for (const QFileInfo& entryInfo : entries) { m_names.append(QLatin1String("oss:")+entryInfo.filePath()); - m_descriptions.append(QString("OSS device %1").arg(entryInfo.fileName())); + m_descriptions.append(QString::fromLatin1("OSS device %1").arg(entryInfo.fileName())); } } @@ -163,8 +163,8 @@ void QGstreamerAudioInputSelector::updatePulseDevices() { GstElementFactory *factory = gst_element_factory_find("pulsesrc"); if (factory) { - m_names.append("pulseaudio:"); - m_descriptions.append("PulseAudio device."); + m_names.append(QLatin1String("pulseaudio:")); + m_descriptions.append(QLatin1String("PulseAudio device.")); gst_object_unref(GST_OBJECT(factory)); } } diff --git a/src/gsttools/qgstreamerbushelper.cpp b/src/gsttools/qgstreamerbushelper.cpp index 89b2c4ae7..bd35d4b0a 100644 --- a/src/gsttools/qgstreamerbushelper.cpp +++ b/src/gsttools/qgstreamerbushelper.cpp @@ -58,7 +58,7 @@ public: m_tag(0), m_bus(bus), m_helper(parent), - m_intervalTimer(Q_NULLPTR) + m_intervalTimer(nullptr) { // glib event loop can be disabled either by env variable or QT_NO_GLIB define, so check the dispacher QAbstractEventDispatcher *dispatcher = QCoreApplication::eventDispatcher(); diff --git a/src/gsttools/qgstreamervideoinputdevicecontrol.cpp b/src/gsttools/qgstreamervideoinputdevicecontrol.cpp index 2f08575aa..86e6772b7 100644 --- a/src/gsttools/qgstreamervideoinputdevicecontrol.cpp +++ b/src/gsttools/qgstreamervideoinputdevicecontrol.cpp @@ -90,9 +90,8 @@ int QGstreamerVideoInputDeviceControl::selectedDevice() const void QGstreamerVideoInputDeviceControl::setSelectedDevice(int index) { - if (index != m_selectedDevice) { - m_selectedDevice = index; - emit selectedDeviceChanged(index); - emit selectedDeviceChanged(deviceName(index)); - } + // Always update selected device and proxy it to clients + m_selectedDevice = index; + emit selectedDeviceChanged(index); + emit selectedDeviceChanged(deviceName(index)); } diff --git a/src/gsttools/qgstutils.cpp b/src/gsttools/qgstutils.cpp index 06181403e..6a573fa78 100644 --- a/src/gsttools/qgstutils.cpp +++ b/src/gsttools/qgstutils.cpp @@ -471,16 +471,16 @@ void QGstUtils::initializeGst() namespace { const char* getCodecAlias(const QString &codec) { - if (codec.startsWith("avc1.")) + if (codec.startsWith(QLatin1String("avc1."))) return "video/x-h264"; - if (codec.startsWith("mp4a.")) + if (codec.startsWith(QLatin1String("mp4a."))) return "audio/mpeg4"; - if (codec.startsWith("mp4v.20.")) + if (codec.startsWith(QLatin1String("mp4v.20."))) return "video/mpeg4"; - if (codec == "samr") + if (codec == QLatin1String("samr")) return "audio/amr"; return 0; @@ -488,14 +488,14 @@ namespace { const char* getMimeTypeAlias(const QString &mimeType) { - if (mimeType == "video/mp4") + if (mimeType == QLatin1String("video/mp4")) return "video/mpeg4"; - if (mimeType == "audio/mp4") + if (mimeType == QLatin1String("audio/mp4")) return "audio/mpeg4"; - if (mimeType == "video/ogg" - || mimeType == "audio/ogg") + if (mimeType == QLatin1String("video/ogg") + || mimeType == QLatin1String("audio/ogg")) return "application/ogg"; return 0; @@ -513,12 +513,12 @@ QMultimedia::SupportEstimate QGstUtils::hasSupport(const QString &mimeType, bool containsMimeType = supportedMimeTypeSet.contains(mimeTypeLowcase); if (!containsMimeType) { const char* mimeTypeAlias = getMimeTypeAlias(mimeTypeLowcase); - containsMimeType = supportedMimeTypeSet.contains(mimeTypeAlias); + containsMimeType = supportedMimeTypeSet.contains(QLatin1String(mimeTypeAlias)); if (!containsMimeType) { - containsMimeType = supportedMimeTypeSet.contains("video/" + mimeTypeLowcase) - || supportedMimeTypeSet.contains("video/x-" + mimeTypeLowcase) - || supportedMimeTypeSet.contains("audio/" + mimeTypeLowcase) - || supportedMimeTypeSet.contains("audio/x-" + mimeTypeLowcase); + containsMimeType = supportedMimeTypeSet.contains(QLatin1String("video/") + mimeTypeLowcase) + || supportedMimeTypeSet.contains(QLatin1String("video/x-") + mimeTypeLowcase) + || supportedMimeTypeSet.contains(QLatin1String("audio/") + mimeTypeLowcase) + || supportedMimeTypeSet.contains(QLatin1String("audio/x-") + mimeTypeLowcase); } } @@ -527,12 +527,12 @@ QMultimedia::SupportEstimate QGstUtils::hasSupport(const QString &mimeType, QString codecLowcase = codec.toLower(); const char* codecAlias = getCodecAlias(codecLowcase); if (codecAlias) { - if (supportedMimeTypeSet.contains(codecAlias)) + if (supportedMimeTypeSet.contains(QLatin1String(codecAlias))) supportedCodecCount++; - } else if (supportedMimeTypeSet.contains("video/" + codecLowcase) - || supportedMimeTypeSet.contains("video/x-" + codecLowcase) - || supportedMimeTypeSet.contains("audio/" + codecLowcase) - || supportedMimeTypeSet.contains("audio/x-" + codecLowcase)) { + } else if (supportedMimeTypeSet.contains(QLatin1String("video/") + codecLowcase) + || supportedMimeTypeSet.contains(QLatin1String("video/x-") + codecLowcase) + || supportedMimeTypeSet.contains(QLatin1String("audio/") + codecLowcase) + || supportedMimeTypeSet.contains(QLatin1String("audio/x-") + codecLowcase)) { supportedCodecCount++; } } @@ -769,8 +769,8 @@ QSet<QString> QGstUtils::supportedMimeTypes(bool (*isValidFactory)(GstElementFac GstElementFactory *factory; if (GST_IS_TYPE_FIND_FACTORY(feature)) { - QString name(gst_plugin_feature_get_name(feature)); - if (name.contains('/')) //filter out any string without '/' which is obviously not a mime type + QString name(QLatin1String(gst_plugin_feature_get_name(feature))); + if (name.contains(QLatin1Char('/'))) //filter out any string without '/' which is obviously not a mime type supportedMimeTypes.insert(name.toLower()); continue; } else if (!GST_IS_ELEMENT_FACTORY (feature) @@ -788,18 +788,18 @@ QSet<QString> QGstUtils::supportedMimeTypes(bool (*isValidFactory)(GstElementFac if (gst_caps_is_any(caps) || gst_caps_is_empty(caps)) { } else for (guint i = 0; i < gst_caps_get_size(caps); i++) { GstStructure *structure = gst_caps_get_structure(caps, i); - QString nameLowcase = QString(gst_structure_get_name(structure)).toLower(); + QString nameLowcase = QString::fromLatin1(gst_structure_get_name(structure)).toLower(); supportedMimeTypes.insert(nameLowcase); - if (nameLowcase.contains("mpeg")) { + if (nameLowcase.contains(QLatin1String("mpeg"))) { //Because mpeg version number is only included in the detail //description, it is necessary to manually extract this information //in order to match the mime type of mpeg4. const GValue *value = gst_structure_get_value(structure, "mpegversion"); if (value) { gchar *str = gst_value_serialize(value); - QString versions(str); - const QStringList elements = versions.split(QRegExp("\\D+"), QString::SkipEmptyParts); + QString versions = QLatin1String(str); + const QStringList elements = versions.split(QRegExp(QLatin1String("\\D+")), QString::SkipEmptyParts); for (const QString &e : elements) supportedMimeTypes.insert(nameLowcase + e); g_free(str); @@ -1239,7 +1239,7 @@ void QGstUtils::setMetaData(GstElement *element, const QMap<QByteArray, QVariant QMapIterator<QByteArray, QVariant> it(data); while (it.hasNext()) { it.next(); - const QString tagName = it.key(); + const QString tagName = QString::fromLatin1(it.key()); const QVariant tagValue = it.value(); switch (tagValue.type()) { @@ -1439,26 +1439,26 @@ QString QGstUtils::fileExtensionForMimeType(const QString &mimeType) { if (fileExtensionMap->isEmpty()) { //extension for containers hard to guess from mimetype - fileExtensionMap->insert("video/x-matroska", "mkv"); - fileExtensionMap->insert("video/quicktime", "mov"); - fileExtensionMap->insert("video/x-msvideo", "avi"); - fileExtensionMap->insert("video/msvideo", "avi"); - fileExtensionMap->insert("audio/mpeg", "mp3"); - fileExtensionMap->insert("application/x-shockwave-flash", "swf"); - fileExtensionMap->insert("application/x-pn-realmedia", "rm"); + fileExtensionMap->insert(QStringLiteral("video/x-matroska"), QLatin1String("mkv")); + fileExtensionMap->insert(QStringLiteral("video/quicktime"), QLatin1String("mov")); + fileExtensionMap->insert(QStringLiteral("video/x-msvideo"), QLatin1String("avi")); + fileExtensionMap->insert(QStringLiteral("video/msvideo"), QLatin1String("avi")); + fileExtensionMap->insert(QStringLiteral("audio/mpeg"), QLatin1String("mp3")); + fileExtensionMap->insert(QStringLiteral("application/x-shockwave-flash"), QLatin1String("swf")); + fileExtensionMap->insert(QStringLiteral("application/x-pn-realmedia"), QLatin1String("rm")); } //for container names like avi instead of video/x-msvideo, use it as extension - if (!mimeType.contains('/')) + if (!mimeType.contains(QLatin1Char('/'))) return mimeType; - QString format = mimeType.left(mimeType.indexOf(',')); + QString format = mimeType.left(mimeType.indexOf(QLatin1Char(','))); QString extension = fileExtensionMap->value(format); if (!extension.isEmpty() || format.isEmpty()) return extension; - QRegExp rx("[-/]([\\w]+)$"); + QRegExp rx(QStringLiteral("[-/]([\\w]+)$")); if (rx.indexIn(format) != -1) extension = rx.cap(1); diff --git a/src/imports/audioengine/qaudioengine_openal_p.h b/src/imports/audioengine/qaudioengine_openal_p.h index c1dbf6aa2..92735ba86 100644 --- a/src/imports/audioengine/qaudioengine_openal_p.h +++ b/src/imports/audioengine/qaudioengine_openal_p.h @@ -91,12 +91,12 @@ public: StaticSoundBufferAL(QObject *parent, const QUrl &url, QSampleCache *sampleLoader); ~StaticSoundBufferAL(); - State state() const Q_DECL_OVERRIDE; + State state() const override; - void load() Q_DECL_OVERRIDE; + void load() override; - void bindToSource(ALuint alSource) Q_DECL_OVERRIDE; - void unbindFromSource(ALuint alSource) Q_DECL_OVERRIDE; + void bindToSource(ALuint alSource) override; + void unbindFromSource(ALuint alSource) override; inline long addRef() { return ++m_ref; } inline long release() { return --m_ref; } diff --git a/src/imports/audioengine/qdeclarative_playvariation_p.cpp b/src/imports/audioengine/qdeclarative_playvariation_p.cpp index 36ffca668..e6d3697d0 100644 --- a/src/imports/audioengine/qdeclarative_playvariation_p.cpp +++ b/src/imports/audioengine/qdeclarative_playvariation_p.cpp @@ -41,6 +41,7 @@ #include "qdeclarative_audioengine_p.h" #include "qsoundinstance_p.h" #include "qdebug.h" +#include "qrandom.h" #define DEBUG_AUDIOENGINE @@ -272,7 +273,7 @@ void QDeclarativePlayVariation::setSampleObject(QDeclarativeAudioSample *sampleO void QDeclarativePlayVariation::applyParameters(QSoundInstance *soundInstance) { - qreal pitch = qreal(qrand() % 1001) * 0.001f * (m_maxPitch - m_minPitch) + m_minPitch; - qreal gain = qreal(qrand() % 1001) * 0.001f * (m_maxGain - m_minGain) + m_minGain; + qreal pitch = QRandomGenerator::global()->bounded(1001 * 0.001f) * (m_maxPitch - m_minPitch) + m_minPitch; + qreal gain = QRandomGenerator::global()->bounded(1001 * 0.001f) * (m_maxGain - m_minGain) + m_minGain; soundInstance->updateVariationParameters(pitch, gain, m_looping); } diff --git a/src/imports/audioengine/qdeclarative_sound_p.cpp b/src/imports/audioengine/qdeclarative_sound_p.cpp index 0849215be..a11490cea 100644 --- a/src/imports/audioengine/qdeclarative_sound_p.cpp +++ b/src/imports/audioengine/qdeclarative_sound_p.cpp @@ -43,6 +43,7 @@ #include "qdeclarative_soundinstance_p.h" #include "qdeclarative_audioengine_p.h" #include "qdebug.h" +#include "qrandom.h" #define DEBUG_AUDIOENGINE @@ -316,7 +317,7 @@ int QDeclarativeSound::genVariationIndex(int oldVariationIndex) case QDeclarativeSound::Random: { if (oldVariationIndex < 0) oldVariationIndex = 0; - return (oldVariationIndex + (qrand() % (m_playlist.count() + 1))) % m_playlist.count(); + return (oldVariationIndex + (QRandomGenerator::global()->bounded(m_playlist.count() + 1))) % m_playlist.count(); } default: return (oldVariationIndex + 1) % m_playlist.count(); diff --git a/src/imports/multimedia/Video.qml b/src/imports/multimedia/Video.qml index 66b86c74b..19c437869 100644 --- a/src/imports/multimedia/Video.qml +++ b/src/imports/multimedia/Video.qml @@ -38,7 +38,7 @@ ****************************************************************************/ import QtQuick 2.0 -import QtMultimedia 5.9 +import QtMultimedia 5.11 /*! \qmltype Video @@ -302,13 +302,31 @@ Item { \li MediaPlayer.AccessibilityRole - for accessibility, such as with a screen reader. \li MediaPlayer.SonificationRole - sonification, such as with user interface sounds. \li MediaPlayer.GameRole - game audio. + \li MediaPlayer.CustomRole - The role is specified by customAudioRole. \endlist + customAudioRole is cleared when this property is set to anything other than CustomRole. + \since 5.6 */ property alias audioRole: player.audioRole /*! + \qmlproperty string Video::customAudioRole + + This property holds the role of the audio stream when the backend supports audio roles + unknown to Qt. It can be set to specify the type of audio being played, allowing the + system to make appropriate decisions when it comes to volume, routing or post-processing. + + The audio role must be set before setting the source property. + + audioRole is set to CustomRole when this property is set. + + \since 5.11 + */ + property alias customAudioRole: player.customAudioRole + + /*! \qmlproperty bool Video::seekable This property holds whether the playback position of the video can be diff --git a/src/imports/multimedia/multimedia.cpp b/src/imports/multimedia/multimedia.cpp index 6a316a298..6d9292221 100644 --- a/src/imports/multimedia/multimedia.cpp +++ b/src/imports/multimedia/multimedia.cpp @@ -151,6 +151,16 @@ public: qmlRegisterUncreatableType<QDeclarativeCameraFlash, 1>(uri, 5, 9, "CameraFlash", trUtf8("CameraFlash is provided by Camera")); + // 5.11 types + qmlRegisterType<QDeclarativeAudio, 3>(uri, 5, 11, "Audio"); + qmlRegisterType<QDeclarativeAudio, 3>(uri, 5, 11, "MediaPlayer"); + qmlRegisterUncreatableType<QDeclarativeCameraFocus, 1>(uri, 5, 11, "CameraFocus", + trUtf8("CameraFocus is provided by Camera")); + qmlRegisterUncreatableType<QDeclarativeCameraExposure, 1>(uri, 5, 11, "CameraExposure", + trUtf8("CameraExposure is provided by Camera")); + qmlRegisterUncreatableType<QDeclarativeCameraImageProcessing, 3>(uri, 5, 11, "CameraImageProcessing", + trUtf8("CameraImageProcessing is provided by Camera")); + qmlRegisterType<QDeclarativeMediaMetaData>(); qmlRegisterType<QAbstractVideoFilter>(); } diff --git a/src/imports/multimedia/qdeclarativeaudio.cpp b/src/imports/multimedia/qdeclarativeaudio.cpp index 652296509..65606b3cf 100644 --- a/src/imports/multimedia/qdeclarativeaudio.cpp +++ b/src/imports/multimedia/qdeclarativeaudio.cpp @@ -179,8 +179,11 @@ QDeclarativeAudio::Availability QDeclarativeAudio::availability() const \li AccessibilityRole - for accessibility, such as with a screen reader. \li SonificationRole - sonification, such as with user interface sounds. \li GameRole - game audio. + \li CustomRole - The role is specified by customAudioRole. \endlist + customAudioRole is cleared when this property is set to anything other than CustomRole. + \since 5.6 */ QDeclarativeAudio::AudioRole QDeclarativeAudio::audioRole() const @@ -196,12 +199,49 @@ void QDeclarativeAudio::setAudioRole(QDeclarativeAudio::AudioRole audioRole) if (m_complete) { m_player->setAudioRole(QAudio::Role(audioRole)); } else { + if (!m_customAudioRole.isEmpty()) { + m_customAudioRole.clear(); + emit customAudioRoleChanged(); + } m_audioRole = audioRole; emit audioRoleChanged(); } } /*! + \qmlproperty string QtMultimedia::Audio::customAudioRole + + This property holds the role of the audio stream when the backend supports audio + roles unknown to Qt. It can be set to specify the type of audio being played, + allowing the system to make appropriate decisions when it comes to volume, + routing or post-processing. + + The audio role must be set before setting the source property. + + audioRole is set to CustomRole when this property is set. + + \since 5.11 +*/ +QString QDeclarativeAudio::customAudioRole() const +{ + return !m_complete ? m_customAudioRole : m_player->customAudioRole(); +} + +void QDeclarativeAudio::setCustomAudioRole(const QString &audioRole) +{ + if (this->customAudioRole() == audioRole) + return; + + if (m_complete) { + m_player->setCustomAudioRole(audioRole); + } else { + setAudioRole(QDeclarativeAudio::CustomRole); + m_customAudioRole = audioRole; + emit customAudioRoleChanged(); + } +} + +/*! \qmlproperty int QtMultimedia::Audio::notifyInterval The interval at which notifiable properties will update. @@ -850,6 +890,8 @@ void QDeclarativeAudio::classBegin() this, SIGNAL(hasVideoChanged())); connect(m_player, SIGNAL(audioRoleChanged(QAudio::Role)), this, SIGNAL(audioRoleChanged())); + connect(m_player, SIGNAL(customAudioRoleChanged(const QString &)), + this, SIGNAL(customAudioRoleChanged())); connect(m_player, SIGNAL(notifyIntervalChanged(int)), this, SIGNAL(notifyIntervalChanged())); @@ -876,6 +918,8 @@ void QDeclarativeAudio::componentComplete() m_player->setPlaybackRate(m_playbackRate); if (m_audioRole != UnknownRole) m_player->setAudioRole(QAudio::Role(m_audioRole)); + if (!m_customAudioRole.isEmpty()) + m_player->setCustomAudioRole(m_customAudioRole); if (m_notifyInterval != m_player->notifyInterval()) m_player->setNotifyInterval(m_notifyInterval); @@ -1181,12 +1225,30 @@ void QDeclarativeAudio::_q_mediaChanged(const QMediaContent &media) \li AccessibilityRole - for accessibility, such as with a screen reader. \li SonificationRole - sonification, such as with user interface sounds. \li GameRole - game audio. + \li CustomRole - The role is specified by customAudioRole. \endlist + customAudioRole is cleared when this property is set to anything other than CustomRole. + \since 5.6 */ /*! + \qmlproperty string QtMultimedia::MediaPlayer::customAudioRole + + This property holds the role of the audio stream when the backend supports audio + roles unknown to Qt. It can be set to specify the type of audio being played, + allowing the system to make appropriate decisions when it comes to volume, + routing or post-processing. + + The audio role must be set before setting the source property. + + audioRole is set to CustomRole when this property is set. + + \since 5.11 +*/ + +/*! \qmlmethod list<int> QtMultimedia::MediaPlayer::supportedAudioRoles() Returns a list of supported audio roles. diff --git a/src/imports/multimedia/qdeclarativeaudio_p.h b/src/imports/multimedia/qdeclarativeaudio_p.h index 4e2b94300..043b36042 100644 --- a/src/imports/multimedia/qdeclarativeaudio_p.h +++ b/src/imports/multimedia/qdeclarativeaudio_p.h @@ -95,6 +95,7 @@ class QDeclarativeAudio : public QObject, public QQmlParserStatus Q_PROPERTY(QObject *mediaObject READ mediaObject NOTIFY mediaObjectChanged SCRIPTABLE false DESIGNABLE false) Q_PROPERTY(Availability availability READ availability NOTIFY availabilityChanged) Q_PROPERTY(AudioRole audioRole READ audioRole WRITE setAudioRole NOTIFY audioRoleChanged REVISION 1) + Q_PROPERTY(QString customAudioRole READ customAudioRole WRITE setCustomAudioRole NOTIFY customAudioRoleChanged REVISION 3) Q_PROPERTY(int notifyInterval READ notifyInterval WRITE setNotifyInterval NOTIFY notifyIntervalChanged REVISION 2) Q_ENUMS(Status) Q_ENUMS(Error) @@ -150,6 +151,7 @@ public: UnknownRole = QAudio::UnknownRole, AccessibilityRole = QAudio::AccessibilityRole, AlarmRole = QAudio::AlarmRole, + CustomRole = QAudio::CustomRole, GameRole = QAudio::GameRole, MusicRole = QAudio::MusicRole, NotificationRole = QAudio::NotificationRole, @@ -179,6 +181,8 @@ public: AudioRole audioRole() const; void setAudioRole(AudioRole audioRole); + QString customAudioRole() const; + void setCustomAudioRole(const QString &audioRole); QUrl source() const; void setSource(const QUrl &url); @@ -256,6 +260,7 @@ Q_SIGNALS: void playbackRateChanged(); Q_REVISION(1) void audioRoleChanged(); + Q_REVISION(3) void customAudioRoleChanged(); void availabilityChanged(Availability availability); @@ -287,6 +292,7 @@ private: qreal m_vol; qreal m_playbackRate; AudioRole m_audioRole; + QString m_customAudioRole; QMediaPlayer::State m_playbackState; QMediaPlayer::MediaStatus m_status; diff --git a/src/imports/multimedia/qdeclarativecameraexposure.cpp b/src/imports/multimedia/qdeclarativecameraexposure.cpp index 92972e512..af8c6acf6 100644 --- a/src/imports/multimedia/qdeclarativecameraexposure.cpp +++ b/src/imports/multimedia/qdeclarativecameraexposure.cpp @@ -107,6 +107,14 @@ QDeclarativeCameraExposure::QDeclarativeCameraExposure(QCamera *camera, QObject connect(m_exposure, SIGNAL(shutterSpeedChanged(qreal)), this, SIGNAL(shutterSpeedChanged(qreal))); connect(m_exposure, SIGNAL(exposureCompensationChanged(qreal)), this, SIGNAL(exposureCompensationChanged(qreal))); + connect(camera, &QCamera::statusChanged, [this](QCamera::Status status) { + if (status != QCamera::UnloadedStatus && status != QCamera::LoadedStatus + && status != QCamera::ActiveStatus) { + return; + } + + emit supportedExposureModesChanged(); + }); } QDeclarativeCameraExposure::~QDeclarativeCameraExposure() @@ -369,6 +377,27 @@ void QDeclarativeCameraExposure::setExposureMode(QDeclarativeCameraExposure::Exp emit exposureModeChanged(exposureMode()); } } + +/*! + \qmlproperty list<ExposureMode> QtMultimedia::CameraExposure::supportedExposureModes + + This property holds the supported exposure modes of the camera. + + \since 5.11 + \sa exposureMode + */ +QVariantList QDeclarativeCameraExposure::supportedExposureModes() const +{ + QVariantList supportedModes; + + for (int i = int(ExposureAuto); i <= int(QCameraExposure::ExposureBarcode); ++i) { + if (m_exposure->isExposureModeSupported((QCameraExposure::ExposureMode) i)) + supportedModes.append(QVariant(i)); + } + + return supportedModes; +} + /*! \property QDeclarativeCameraExposure::spotMeteringPoint diff --git a/src/imports/multimedia/qdeclarativecameraexposure_p.h b/src/imports/multimedia/qdeclarativecameraexposure_p.h index 806cb775e..ef99b1ce9 100644 --- a/src/imports/multimedia/qdeclarativecameraexposure_p.h +++ b/src/imports/multimedia/qdeclarativecameraexposure_p.h @@ -73,6 +73,7 @@ class QDeclarativeCameraExposure : public QObject Q_PROPERTY(qreal manualIso READ manualIsoSensitivity WRITE setManualIsoSensitivity NOTIFY manualIsoSensitivityChanged) Q_PROPERTY(ExposureMode exposureMode READ exposureMode WRITE setExposureMode NOTIFY exposureModeChanged) + Q_PROPERTY(QVariantList supportedExposureModes READ supportedExposureModes NOTIFY supportedExposureModesChanged REVISION 1) Q_PROPERTY(QPointF spotMeteringPoint READ spotMeteringPoint WRITE setSpotMeteringPoint NOTIFY spotMeteringPointChanged) Q_PROPERTY(MeteringMode meteringMode READ meteringMode WRITE setMeteringMode NOTIFY meteringModeChanged) @@ -114,6 +115,7 @@ public: ~QDeclarativeCameraExposure(); ExposureMode exposureMode() const; + QVariantList supportedExposureModes() const; qreal exposureCompensation() const; int isoSensitivity() const; @@ -153,6 +155,7 @@ Q_SIGNALS: void exposureCompensationChanged(qreal); void exposureModeChanged(ExposureMode); + void supportedExposureModesChanged(); void meteringModeChanged(MeteringMode); void spotMeteringPointChanged(QPointF); diff --git a/src/imports/multimedia/qdeclarativecamerafocus.cpp b/src/imports/multimedia/qdeclarativecamerafocus.cpp index 1d1436d09..1dd216467 100644 --- a/src/imports/multimedia/qdeclarativecamerafocus.cpp +++ b/src/imports/multimedia/qdeclarativecamerafocus.cpp @@ -101,6 +101,15 @@ QDeclarativeCameraFocus::QDeclarativeCameraFocus(QCamera *camera, QObject *paren updateFocusZones(); connect(m_focus, SIGNAL(focusZonesChanged()), SLOT(updateFocusZones())); + connect(camera, &QCamera::statusChanged, [this](QCamera::Status status) { + if (status != QCamera::UnloadedStatus && status != QCamera::LoadedStatus + && status != QCamera::ActiveStatus) { + return; + } + + emit supportedFocusModesChanged(); + emit supportedFocusPointModesChanged(); + }); } QDeclarativeCameraFocus::~QDeclarativeCameraFocus() @@ -161,7 +170,29 @@ QDeclarativeCameraFocus::FocusMode QDeclarativeCameraFocus::focusMode() const } /*! + \qmlproperty list<FocusMode> CameraFocus::supportedFocusModes + + This property holds the supported focus modes of the camera. + + \since 5.11 + \sa focusMode +*/ +QVariantList QDeclarativeCameraFocus::supportedFocusModes() const +{ + QVariantList supportedModes; + + for (int i = int(FocusManual); i <= int(FocusMacro); ++i) { + if (m_focus->isFocusModeSupported((QCameraFocus::FocusMode) i)) + supportedModes.append(i); + } + + return supportedModes; +} + +#if QT_DEPRECATED_SINCE(5, 11) +/*! \qmlmethod bool QtMultimedia::CameraFocus::isFocusModeSupported(mode) const + \obsolete Returns true if the supplied \a mode is a supported focus mode, and false otherwise. @@ -170,6 +201,7 @@ bool QDeclarativeCameraFocus::isFocusModeSupported(QDeclarativeCameraFocus::Focu { return m_focus->isFocusModeSupported(QCameraFocus::FocusModes(int(mode))); } +#endif void QDeclarativeCameraFocus::setFocusMode(QDeclarativeCameraFocus::FocusMode mode) { @@ -220,6 +252,26 @@ QDeclarativeCameraFocus::FocusPointMode QDeclarativeCameraFocus::focusPointMode( return QDeclarativeCameraFocus::FocusPointMode(m_focus->focusPointMode()); } +/*! + \qmlproperty list<enumeration> CameraFocus::supportedFocusPointModes + + This property holds the supported focus point modes of the camera. + + \since 5.10 + \sa focusPointMode +*/ +QVariantList QDeclarativeCameraFocus::supportedFocusPointModes() const +{ + QVariantList supportedModes; + + for (int i = int(FocusPointAuto); i <= int(FocusPointCustom); i++) { + if (m_focus->isFocusPointModeSupported(QCameraFocus::FocusPointMode(i))) + supportedModes.append(i); + } + + return supportedModes; +} + void QDeclarativeCameraFocus::setFocusPointMode(QDeclarativeCameraFocus::FocusPointMode mode) { if (mode != focusPointMode()) { @@ -228,8 +280,10 @@ void QDeclarativeCameraFocus::setFocusPointMode(QDeclarativeCameraFocus::FocusPo } } +#if QT_DEPRECATED_SINCE(5, 10) /*! \qmlmethod bool QtMultimedia::CameraFocus::isFocusPointModeSupported(mode) const + \obsolete Returns true if the supplied \a mode is a supported focus point mode, and false otherwise. @@ -238,6 +292,8 @@ bool QDeclarativeCameraFocus::isFocusPointModeSupported(QDeclarativeCameraFocus: { return m_focus->isFocusPointModeSupported(QCameraFocus::FocusPointMode(mode)); } +#endif + /*! \property QDeclarativeCameraFocus::customFocusPoint diff --git a/src/imports/multimedia/qdeclarativecamerafocus_p.h b/src/imports/multimedia/qdeclarativecamerafocus_p.h index 16a48de53..e3a1c28b7 100644 --- a/src/imports/multimedia/qdeclarativecamerafocus_p.h +++ b/src/imports/multimedia/qdeclarativecamerafocus_p.h @@ -64,8 +64,13 @@ class QDeclarativeCamera; class QDeclarativeCameraFocus : public QObject { Q_OBJECT + Q_PROPERTY(FocusMode focusMode READ focusMode WRITE setFocusMode NOTIFY focusModeChanged) + Q_PROPERTY(QVariantList supportedFocusModes READ supportedFocusModes NOTIFY supportedFocusModesChanged REVISION 1) + Q_PROPERTY(FocusPointMode focusPointMode READ focusPointMode WRITE setFocusPointMode NOTIFY focusPointModeChanged) + Q_PROPERTY(QVariantList supportedFocusPointModes READ supportedFocusPointModes NOTIFY supportedFocusPointModesChanged REVISION 1) + Q_PROPERTY(QPointF customFocusPoint READ customFocusPoint WRITE setCustomFocusPoint NOTIFY customFocusPointChanged) Q_PROPERTY(QObject *focusZones READ focusZones CONSTANT) @@ -91,13 +96,18 @@ public: ~QDeclarativeCameraFocus(); FocusMode focusMode() const; + QVariantList supportedFocusModes() const; + FocusPointMode focusPointMode() const; - QPointF customFocusPoint() const; + QVariantList supportedFocusPointModes() const; + QPointF customFocusPoint() const; QAbstractListModel *focusZones() const; +#if QT_DEPRECATED_SINCE(5, 10) Q_INVOKABLE bool isFocusModeSupported(FocusMode mode) const; Q_INVOKABLE bool isFocusPointModeSupported(FocusPointMode mode) const; +#endif public Q_SLOTS: void setFocusMode(FocusMode); @@ -106,7 +116,9 @@ public Q_SLOTS: Q_SIGNALS: void focusModeChanged(FocusMode); + void supportedFocusModesChanged(); void focusPointModeChanged(FocusPointMode); + void supportedFocusPointModesChanged(); void customFocusPointChanged(const QPointF &); private Q_SLOTS: diff --git a/src/imports/multimedia/qdeclarativecameraimageprocessing.cpp b/src/imports/multimedia/qdeclarativecameraimageprocessing.cpp index e8a816727..8e14a7945 100644 --- a/src/imports/multimedia/qdeclarativecameraimageprocessing.cpp +++ b/src/imports/multimedia/qdeclarativecameraimageprocessing.cpp @@ -84,6 +84,18 @@ QDeclarativeCameraImageProcessing::QDeclarativeCameraImageProcessing(QCamera *ca QObject(parent) { m_imageProcessing = camera->imageProcessing(); + + connect(camera, QOverload<bool>::of(&QCamera::availabilityChanged), + this, &QDeclarativeCameraImageProcessing::availableChanged); + connect(camera, &QCamera::statusChanged, [this](QCamera::Status status) { + if (status != QCamera::UnloadedStatus && status != QCamera::LoadedStatus + && status != QCamera::ActiveStatus) { + return; + } + + emit supportedColorFiltersChanged(); + emit supportedWhiteBalanceModesChanged(); + }); } QDeclarativeCameraImageProcessing::~QDeclarativeCameraImageProcessing() @@ -272,6 +284,56 @@ QDeclarativeCameraImageProcessing::ColorFilter QDeclarativeCameraImageProcessing return ColorFilter(m_imageProcessing->colorFilter()); } +/*! + \qmlproperty bool QtMultimedia::CameraImageProcessing::isAvailable + + This property holds if image processing related settings are supported by this camera. + + \since 5.11 +*/ +bool QDeclarativeCameraImageProcessing::isAvailable() const +{ + return m_imageProcessing->isAvailable(); +} + +/*! + \qmlproperty list<ColorFilter> QtMultimedia::CameraImageProcessing::supportedColorFilters + + This property holds the supported color filters by this camera. + + \since 5.11 +*/ +QVariantList QDeclarativeCameraImageProcessing::supportedColorFilters() const +{ + QVariantList supportedFilters; + + for (int i = int(ColorFilterNone); i <= int(ColorFilterVendor); ++i) { + if (m_imageProcessing->isColorFilterSupported((QCameraImageProcessing::ColorFilter) i)) + supportedFilters.append(i); + } + + return supportedFilters; +} + +/*! + \qmlproperty list<WhiteBalanceMode> QtMultimedia::CameraImageProcessing::supportedWhiteBalanceModes + + This property holds the supported white balance modes by this camera. + + \since 5.11 +*/ +QVariantList QDeclarativeCameraImageProcessing::supportedWhiteBalanceModes() const +{ + QVariantList supportedModes; + + for (int i = int(WhiteBalanceAuto); i <= int(WhiteBalanceVendor); i++) { + if (m_imageProcessing->isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceMode(i))) + supportedModes.append(i); + } + + return supportedModes; +} + void QDeclarativeCameraImageProcessing::setColorFilter(ColorFilter filter) { if (this->colorFilter() != filter) { diff --git a/src/imports/multimedia/qdeclarativecameraimageprocessing_p.h b/src/imports/multimedia/qdeclarativecameraimageprocessing_p.h index eb755d87c..390164250 100644 --- a/src/imports/multimedia/qdeclarativecameraimageprocessing_p.h +++ b/src/imports/multimedia/qdeclarativecameraimageprocessing_p.h @@ -72,6 +72,11 @@ class QDeclarativeCameraImageProcessing : public QObject Q_PROPERTY(qreal sharpeningLevel READ sharpeningLevel WRITE setSharpeningLevel NOTIFY sharpeningLevelChanged) Q_PROPERTY(qreal denoisingLevel READ denoisingLevel WRITE setDenoisingLevel NOTIFY denoisingLevelChanged) Q_PROPERTY(ColorFilter colorFilter READ colorFilter WRITE setColorFilter NOTIFY colorFilterChanged REVISION 1) + Q_PROPERTY(bool available READ isAvailable NOTIFY availableChanged REVISION 3) + Q_PROPERTY(QVariantList supportedColorFilters READ supportedColorFilters + NOTIFY supportedColorFiltersChanged REVISION 3) + Q_PROPERTY(QVariantList supportedWhiteBalanceModes READ supportedWhiteBalanceModes + NOTIFY supportedWhiteBalanceModesChanged REVISION 3) public: enum WhiteBalanceMode { WhiteBalanceAuto = QCameraImageProcessing::WhiteBalanceAuto, @@ -112,6 +117,10 @@ public: ColorFilter colorFilter() const; + bool isAvailable() const; + QVariantList supportedColorFilters() const; + QVariantList supportedWhiteBalanceModes() const; + public Q_SLOTS: void setWhiteBalanceMode(QDeclarativeCameraImageProcessing::WhiteBalanceMode mode) const; void setManualWhiteBalance(qreal colorTemp) const; @@ -136,6 +145,10 @@ Q_SIGNALS: void colorFilterChanged(); + void availableChanged(); + void supportedColorFiltersChanged(); + void supportedWhiteBalanceModesChanged(); + private: friend class QDeclarativeCamera; QDeclarativeCameraImageProcessing(QCamera *camera, QObject *parent = 0); diff --git a/src/multimedia/audio/qaudio.cpp b/src/multimedia/audio/qaudio.cpp index d4f89e898..82613270a 100644 --- a/src/multimedia/audio/qaudio.cpp +++ b/src/multimedia/audio/qaudio.cpp @@ -79,13 +79,18 @@ Q_CONSTRUCTOR_FUNCTION(qRegisterAudioMetaTypes) /*! \enum QAudio::State - \value ActiveState Audio data is being processed, this state is set after start() is called - and while audio data is available to be processed. - \value SuspendedState The audio device is in a suspended state, this state will only be entered - after suspend() is called. - \value StoppedState The audio device is closed, and is not processing any audio data - \value IdleState The QIODevice passed in has no data and audio system's buffer is empty, this state - is set after start() is called and while no audio data is available to be processed. + \value ActiveState Audio data is being processed, this state is set after start() is called + and while audio data is available to be processed. + \value SuspendedState The audio stream is in a suspended state. Entered after suspend() is called + or when another stream takes control of the audio device. In the later case, + a call to resume will return control of the audio device to this stream. This + should usually only be done upon user request. + \value StoppedState The audio device is closed, and is not processing any audio data + \value IdleState The QIODevice passed in has no data and audio system's buffer is empty, this state + is set after start() is called and while no audio data is available to be processed. + \value InterruptedState This stream is in a suspended state because another higher priority stream currently + has control of the audio device. Playback cannot resume until the higher priority + stream relinquishes control of the audio device. */ /*! @@ -110,6 +115,7 @@ Q_CONSTRUCTOR_FUNCTION(qRegisterAudioMetaTypes) \value AccessibilityRole For accessibility, such as with a screen reader \value SonificationRole Sonification, such as with user interface sounds \value GameRole Game audio + \value CustomRole The role is specified by QMediaPlayer::customAudioRole() \since 5.6 \sa QMediaPlayer::setAudioRole() @@ -285,6 +291,9 @@ QDebug operator<<(QDebug dbg, QAudio::State state) case QAudio::IdleState: dbg << "IdleState"; break; + case QAudio::InterruptedState: + dbg << "InterruptedState"; + break; } return dbg; } @@ -339,6 +348,9 @@ QDebug operator<<(QDebug dbg, QAudio::Role role) case QAudio::VoiceCommunicationRole: dbg << "VoiceCommunicationRole"; break; + case QAudio::CustomRole: + dbg << "CustomRole"; + break; } return dbg; } diff --git a/src/multimedia/audio/qaudio.h b/src/multimedia/audio/qaudio.h index 1c38e9f35..90a8c236f 100644 --- a/src/multimedia/audio/qaudio.h +++ b/src/multimedia/audio/qaudio.h @@ -55,7 +55,7 @@ class QString; namespace QAudio { enum Error { NoError, OpenError, IOError, UnderrunError, FatalError }; - enum State { ActiveState, SuspendedState, StoppedState, IdleState }; + enum State { ActiveState, SuspendedState, StoppedState, IdleState, InterruptedState }; enum Mode { AudioInput, AudioOutput }; enum Role { @@ -68,7 +68,8 @@ namespace QAudio RingtoneRole, AccessibilityRole, SonificationRole, - GameRole + GameRole, + CustomRole }; enum VolumeScale { diff --git a/src/multimedia/audio/qaudiobuffer.cpp b/src/multimedia/audio/qaudiobuffer.cpp index fe07d1e47..849d79ab3 100644 --- a/src/multimedia/audio/qaudiobuffer.cpp +++ b/src/multimedia/audio/qaudiobuffer.cpp @@ -531,32 +531,32 @@ void *QAudioBuffer::data() */ /*! - \fn QAudioBuffer::StereoFrame::StereoFrame() + \fn template <typename T> QAudioBuffer::StereoFrame<T>::StereoFrame() Constructs a new frame with the "silent" value for this sample format (0 for signed formats and floats, 0x8* for unsigned formats). */ /*! - \fn QAudioBuffer::StereoFrame::StereoFrame(T leftSample, T rightSample) + \fn template <typename T> QAudioBuffer::StereoFrame<T>::StereoFrame(T leftSample, T rightSample) Constructs a new frame with the supplied \a leftSample and \a rightSample values. */ /*! - \fn QAudioBuffer::StereoFrame::operator=(const StereoFrame &other) + \fn template <typename T> QAudioBuffer::StereoFrame<T>::operator=(const StereoFrame &other) Assigns \a other to this frame. */ /*! - \fn QAudioBuffer::StereoFrame::average() const + \fn template <typename T> QAudioBuffer::StereoFrame<T>::average() const Returns the arithmetic average of the left and right samples. */ -/*! \fn QAudioBuffer::StereoFrame::clear() +/*! \fn template <typename T> QAudioBuffer::StereoFrame<T>::clear() Sets the values of this frame to the "silent" value. */ diff --git a/src/multimedia/audio/qaudiodecoder.h b/src/multimedia/audio/qaudiodecoder.h index 85e0b75f7..4ba107946 100644 --- a/src/multimedia/audio/qaudiodecoder.h +++ b/src/multimedia/audio/qaudiodecoder.h @@ -75,7 +75,7 @@ public: ServiceMissingError }; - explicit QAudioDecoder(QObject *parent = Q_NULLPTR); + explicit QAudioDecoder(QObject *parent = nullptr); ~QAudioDecoder(); static QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs = QStringList()); diff --git a/src/multimedia/audio/qaudioinput.h b/src/multimedia/audio/qaudioinput.h index 5794276d2..db482a145 100644 --- a/src/multimedia/audio/qaudioinput.h +++ b/src/multimedia/audio/qaudioinput.h @@ -62,8 +62,8 @@ class Q_MULTIMEDIA_EXPORT QAudioInput : public QObject Q_OBJECT public: - explicit QAudioInput(const QAudioFormat &format = QAudioFormat(), QObject *parent = Q_NULLPTR); - explicit QAudioInput(const QAudioDeviceInfo &audioDeviceInfo, const QAudioFormat &format = QAudioFormat(), QObject *parent = Q_NULLPTR); + explicit QAudioInput(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr); + explicit QAudioInput(const QAudioDeviceInfo &audioDeviceInfo, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr); ~QAudioInput(); QAudioFormat format() const; diff --git a/src/multimedia/audio/qaudiooutput.h b/src/multimedia/audio/qaudiooutput.h index 9f817271d..1c037cd2b 100644 --- a/src/multimedia/audio/qaudiooutput.h +++ b/src/multimedia/audio/qaudiooutput.h @@ -62,8 +62,8 @@ class Q_MULTIMEDIA_EXPORT QAudioOutput : public QObject Q_OBJECT public: - explicit QAudioOutput(const QAudioFormat &format = QAudioFormat(), QObject *parent = Q_NULLPTR); - explicit QAudioOutput(const QAudioDeviceInfo &audioDeviceInfo, const QAudioFormat &format = QAudioFormat(), QObject *parent = Q_NULLPTR); + explicit QAudioOutput(const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr); + explicit QAudioOutput(const QAudioDeviceInfo &audioDeviceInfo, const QAudioFormat &format = QAudioFormat(), QObject *parent = nullptr); ~QAudioOutput(); QAudioFormat format() const; diff --git a/src/multimedia/audio/qaudioprobe.h b/src/multimedia/audio/qaudioprobe.h index 376a54e34..a3fc4598d 100644 --- a/src/multimedia/audio/qaudioprobe.h +++ b/src/multimedia/audio/qaudioprobe.h @@ -53,7 +53,7 @@ class Q_MULTIMEDIA_EXPORT QAudioProbe : public QObject { Q_OBJECT public: - explicit QAudioProbe(QObject *parent = Q_NULLPTR); + explicit QAudioProbe(QObject *parent = nullptr); ~QAudioProbe(); bool setSource(QMediaObject *source); diff --git a/src/multimedia/audio/qaudiosystemplugin.h b/src/multimedia/audio/qaudiosystemplugin.h index e304f1c46..3539201a2 100644 --- a/src/multimedia/audio/qaudiosystemplugin.h +++ b/src/multimedia/audio/qaudiosystemplugin.h @@ -78,7 +78,7 @@ class Q_MULTIMEDIA_EXPORT QAudioSystemPlugin : public QObject, public QAudioSyst Q_INTERFACES(QAudioSystemFactoryInterface) public: - explicit QAudioSystemPlugin(QObject *parent = Q_NULLPTR); + explicit QAudioSystemPlugin(QObject *parent = nullptr); ~QAudioSystemPlugin(); QList<QByteArray> availableDevices(QAudio::Mode) const override = 0; diff --git a/src/multimedia/audio/qsound.h b/src/multimedia/audio/qsound.h index 304019ced..0b6320025 100644 --- a/src/multimedia/audio/qsound.h +++ b/src/multimedia/audio/qsound.h @@ -58,7 +58,7 @@ public: static void play(const QString& filename); - explicit QSound(const QString &filename, QObject *parent = Q_NULLPTR); + explicit QSound(const QString &filename, QObject *parent = nullptr); ~QSound(); int loops() const; diff --git a/src/multimedia/audio/qsoundeffect.h b/src/multimedia/audio/qsoundeffect.h index 7420d7b81..8bde1fe56 100644 --- a/src/multimedia/audio/qsoundeffect.h +++ b/src/multimedia/audio/qsoundeffect.h @@ -80,7 +80,7 @@ public: Error }; - explicit QSoundEffect(QObject *parent = Q_NULLPTR); + explicit QSoundEffect(QObject *parent = nullptr); ~QSoundEffect(); static QStringList supportedMimeTypes(); diff --git a/src/multimedia/audio/qsoundeffect_pulse_p.cpp b/src/multimedia/audio/qsoundeffect_pulse_p.cpp index a4861d2a9..981d4c01f 100644 --- a/src/multimedia/audio/qsoundeffect_pulse_p.cpp +++ b/src/multimedia/audio/qsoundeffect_pulse_p.cpp @@ -73,20 +73,23 @@ inline pa_sample_spec audioFormatToSampleSpec(const QAudioFormat &format) spec.rate = format.sampleRate(); spec.channels = format.channelCount(); - - if (format.sampleSize() == 8) - spec.format = PA_SAMPLE_U8; - else if (format.sampleSize() == 16) { - switch (format.byteOrder()) { - case QAudioFormat::BigEndian: spec.format = PA_SAMPLE_S16BE; break; - case QAudioFormat::LittleEndian: spec.format = PA_SAMPLE_S16LE; break; - } - } - else if (format.sampleSize() == 32) { - switch (format.byteOrder()) { - case QAudioFormat::BigEndian: spec.format = PA_SAMPLE_S32BE; break; - case QAudioFormat::LittleEndian: spec.format = PA_SAMPLE_S32LE; break; + spec.format = PA_SAMPLE_INVALID; + const bool isBigEndian = (format.byteOrder() == QAudioFormat::BigEndian); + + if (format.sampleType() == QAudioFormat::UnSignedInt) { + if (format.sampleSize() == 8) + spec.format = PA_SAMPLE_U8; + } else if (format.sampleType() == QAudioFormat::SignedInt) { + if (format.sampleSize() == 16) { + spec.format = isBigEndian ? PA_SAMPLE_S16BE : PA_SAMPLE_S16LE; + } else if (format.sampleSize() == 24) { + spec.format = isBigEndian ? PA_SAMPLE_S24BE : PA_SAMPLE_S24LE; + } else if (format.sampleSize() == 32) { + spec.format = isBigEndian ? PA_SAMPLE_S32BE : PA_SAMPLE_S32LE; } + } else if (format.sampleType() == QAudioFormat::Float) { + if (format.sampleSize() == 32) + spec.format = isBigEndian ? PA_SAMPLE_FLOAT32BE : PA_SAMPLE_FLOAT32LE; } return spec; @@ -190,7 +193,11 @@ private Q_SLOTS: pa_context_set_state_callback(m_context, context_state_callback, this); - if (pa_context_connect(m_context, 0, (pa_context_flags_t)0, 0) < 0) { + const QByteArray srvStrEnv = qgetenv("QT_PULSE_SERVER_STRING"); + const char *srvStr = srvStrEnv.isNull() ? 0 : srvStrEnv.constData(); + pa_context_flags_t flags = qEnvironmentVariableIsSet("QT_PULSE_NOAUTOSPAWN") ? PA_CONTEXT_NOAUTOSPAWN : (pa_context_flags_t)0; + + if (pa_context_connect(m_context, srvStr, flags, 0) < 0) { qWarning("PulseAudioService: pa_context_connect() failed"); pa_context_unref(m_context); unlock(); @@ -529,31 +536,34 @@ void QSoundEffectPrivate::setLoopCount(int loopCount) qreal QSoundEffectPrivate::volume() const { - QReadLocker locker(&m_volumeLock); + QMutexLocker locker(&m_volumeLock); return m_volume; } void QSoundEffectPrivate::setVolume(qreal volume) { - QWriteLocker locker(&m_volumeLock); + QMutexLocker locker(&m_volumeLock); if (qFuzzyCompare(m_volume, volume)) return; m_volume = qBound(qreal(0), volume, qreal(1)); + locker.unlock(); emit volumeChanged(); } bool QSoundEffectPrivate::isMuted() const { - QReadLocker locker(&m_volumeLock); + QMutexLocker locker(&m_volumeLock); return m_muted; } void QSoundEffectPrivate::setMuted(bool muted) { - QWriteLocker locker(&m_volumeLock); + m_volumeLock.lock(); m_muted = muted; + m_volumeLock.unlock(); + emit mutedChanged(); } @@ -878,7 +888,7 @@ int QSoundEffectPrivate::writeToStream(const void *data, int size) if (size < 1) return 0; - m_volumeLock.lockForRead(); + m_volumeLock.lock(); qreal volume = m_muted ? 0 : m_volume; m_volumeLock.unlock(); pa_free_cb_t writeDoneCb = stream_write_done_callback; diff --git a/src/multimedia/audio/qsoundeffect_pulse_p.h b/src/multimedia/audio/qsoundeffect_pulse_p.h index 7be88c55a..268a99326 100644 --- a/src/multimedia/audio/qsoundeffect_pulse_p.h +++ b/src/multimedia/audio/qsoundeffect_pulse_p.h @@ -56,7 +56,7 @@ #include <QtCore/qobject.h> #include <QtCore/qdatetime.h> -#include <QtCore/qreadwritelock.h> +#include <QtCore/qmutex.h> #include <qmediaplayer.h> #include <pulse/pulseaudio.h> #include "qsamplecache_p.h" @@ -175,7 +175,8 @@ private: bool m_resourcesAvailable; - mutable QReadWriteLock m_volumeLock; + // Protects volume while PuseAudio is accessing it + mutable QMutex m_volumeLock; QMediaPlayerResourceSetInterface *m_resources; }; diff --git a/src/multimedia/camera/qcamera.h b/src/multimedia/camera/qcamera.h index 685298905..06187fec0 100644 --- a/src/multimedia/camera/qcamera.h +++ b/src/multimedia/camera/qcamera.h @@ -165,10 +165,10 @@ public: FrontFace }; - explicit QCamera(QObject *parent = Q_NULLPTR); - explicit QCamera(const QByteArray& deviceName, QObject *parent = Q_NULLPTR); - explicit QCamera(const QCameraInfo& cameraInfo, QObject *parent = Q_NULLPTR); - explicit QCamera(QCamera::Position position, QObject *parent = Q_NULLPTR); + explicit QCamera(QObject *parent = nullptr); + explicit QCamera(const QByteArray& deviceName, QObject *parent = nullptr); + explicit QCamera(const QCameraInfo& cameraInfo, QObject *parent = nullptr); + explicit QCamera(QCamera::Position position, QObject *parent = nullptr); ~QCamera(); #if QT_DEPRECATED_SINCE(5, 3) @@ -262,7 +262,10 @@ QT_WARNING_DISABLE_CLANG("-Wfloat-equal") QT_WARNING_DISABLE_GCC("-Wfloat-equal") Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator==(const QCamera::FrameRateRange &r1, const QCamera::FrameRateRange &r2) Q_DECL_NOTHROW -{ return r1.minimumFrameRate == r2.minimumFrameRate && r1.maximumFrameRate == r2.maximumFrameRate; } +{ + return qFuzzyCompare(r1.minimumFrameRate, r2.minimumFrameRate) + && qFuzzyCompare(r1.maximumFrameRate, r2.maximumFrameRate); +} QT_WARNING_POP diff --git a/src/multimedia/camera/qcameraexposure.h b/src/multimedia/camera/qcameraexposure.h index e0924ca60..336d4c0b3 100644 --- a/src/multimedia/camera/qcameraexposure.h +++ b/src/multimedia/camera/qcameraexposure.h @@ -135,9 +135,9 @@ public: qreal requestedAperture() const; qreal requestedShutterSpeed() const; - QList<int> supportedIsoSensitivities(bool *continuous = Q_NULLPTR) const; - QList<qreal> supportedApertures(bool *continuous = Q_NULLPTR) const; - QList<qreal> supportedShutterSpeeds(bool *continuous = Q_NULLPTR) const; + QList<int> supportedIsoSensitivities(bool *continuous = nullptr) const; + QList<qreal> supportedApertures(bool *continuous = nullptr) const; + QList<qreal> supportedShutterSpeeds(bool *continuous = nullptr) const; public Q_SLOTS: void setFlashMode(FlashModes mode); @@ -168,7 +168,7 @@ Q_SIGNALS: private: friend class QCamera; friend class QCameraPrivate; - explicit QCameraExposure(QCamera *parent = Q_NULLPTR); + explicit QCameraExposure(QCamera *parent = nullptr); virtual ~QCameraExposure(); Q_DISABLE_COPY(QCameraExposure) diff --git a/src/multimedia/camera/qcameraimagecapture.h b/src/multimedia/camera/qcameraimagecapture.h index 12feb9eec..6fedb7e2c 100644 --- a/src/multimedia/camera/qcameraimagecapture.h +++ b/src/multimedia/camera/qcameraimagecapture.h @@ -87,7 +87,7 @@ public: }; Q_DECLARE_FLAGS(CaptureDestinations, CaptureDestination) - explicit QCameraImageCapture(QMediaObject *mediaObject, QObject *parent = Q_NULLPTR); + explicit QCameraImageCapture(QMediaObject *mediaObject, QObject *parent = nullptr); ~QCameraImageCapture(); bool isAvailable() const; @@ -104,7 +104,7 @@ public: QString imageCodecDescription(const QString &codecName) const; QList<QSize> supportedResolutions(const QImageEncoderSettings &settings = QImageEncoderSettings(), - bool *continuous = Q_NULLPTR) const; + bool *continuous = nullptr) const; QImageEncoderSettings encodingSettings() const; void setEncodingSettings(const QImageEncoderSettings& settings); diff --git a/src/multimedia/controls/controls.pri b/src/multimedia/controls/controls.pri index 7ab2e51c4..cfebe9777 100644 --- a/src/multimedia/controls/controls.pri +++ b/src/multimedia/controls/controls.pri @@ -37,7 +37,8 @@ PUBLIC_HEADERS += \ controls/qmediaaudioprobecontrol.h \ controls/qmediavideoprobecontrol.h \ controls/qmediaavailabilitycontrol.h \ - controls/qaudiorolecontrol.h + controls/qaudiorolecontrol.h \ + controls/qcustomaudiorolecontrol.h PRIVATE_HEADERS += \ controls/qmediaplaylistcontrol_p.h \ @@ -81,5 +82,5 @@ SOURCES += \ controls/qaudioinputselectorcontrol.cpp \ controls/qaudiooutputselectorcontrol.cpp \ controls/qvideodeviceselectorcontrol.cpp \ - controls/qaudiorolecontrol.cpp - + controls/qaudiorolecontrol.cpp \ + controls/qcustomaudiorolecontrol.cpp diff --git a/src/multimedia/controls/qaudiodecodercontrol.h b/src/multimedia/controls/qaudiodecodercontrol.h index f02da4963..6ab27ba62 100644 --- a/src/multimedia/controls/qaudiodecodercontrol.h +++ b/src/multimedia/controls/qaudiodecodercontrol.h @@ -92,7 +92,7 @@ Q_SIGNALS: void durationChanged(qint64 duration); protected: - explicit QAudioDecoderControl(QObject *parent = Q_NULLPTR); + explicit QAudioDecoderControl(QObject *parent = nullptr); }; #define QAudioDecoderControl_iid "org.qt-project.qt.audiodecodercontrol/5.0" diff --git a/src/multimedia/controls/qaudioencodersettingscontrol.h b/src/multimedia/controls/qaudioencodersettingscontrol.h index 1906904d8..1f973f0ea 100644 --- a/src/multimedia/controls/qaudioencodersettingscontrol.h +++ b/src/multimedia/controls/qaudioencodersettingscontrol.h @@ -67,13 +67,13 @@ public: virtual QString codecDescription(const QString &codecName) const = 0; virtual QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, - bool *continuous = Q_NULLPTR) const = 0; + bool *continuous = nullptr) const = 0; virtual QAudioEncoderSettings audioSettings() const = 0; virtual void setAudioSettings(const QAudioEncoderSettings&) = 0; protected: - explicit QAudioEncoderSettingsControl(QObject *parent = Q_NULLPTR); + explicit QAudioEncoderSettingsControl(QObject *parent = nullptr); }; #define QAudioEncoderSettingsControl_iid "org.qt-project.qt.audioencodersettingscontrol/5.0" diff --git a/src/multimedia/controls/qaudioinputselectorcontrol.h b/src/multimedia/controls/qaudioinputselectorcontrol.h index eceaa76dd..9665b55de 100644 --- a/src/multimedia/controls/qaudioinputselectorcontrol.h +++ b/src/multimedia/controls/qaudioinputselectorcontrol.h @@ -68,7 +68,7 @@ Q_SIGNALS: void availableInputsChanged(); protected: - explicit QAudioInputSelectorControl(QObject *parent = Q_NULLPTR); + explicit QAudioInputSelectorControl(QObject *parent = nullptr); }; #define QAudioInputSelectorControl_iid "org.qt-project.qt.audioinputselectorcontrol/5.0" diff --git a/src/multimedia/controls/qaudiooutputselectorcontrol.h b/src/multimedia/controls/qaudiooutputselectorcontrol.h index b2d27a349..de44d0ebb 100644 --- a/src/multimedia/controls/qaudiooutputselectorcontrol.h +++ b/src/multimedia/controls/qaudiooutputselectorcontrol.h @@ -68,7 +68,7 @@ Q_SIGNALS: void availableOutputsChanged(); protected: - explicit QAudioOutputSelectorControl(QObject *parent = Q_NULLPTR); + explicit QAudioOutputSelectorControl(QObject *parent = nullptr); }; #define QAudioOutputSelectorControl_iid "org.qt-project.qt.audiooutputselectorcontrol/5.0" diff --git a/src/multimedia/controls/qaudiorolecontrol.h b/src/multimedia/controls/qaudiorolecontrol.h index 5d9db177b..c59874fdf 100644 --- a/src/multimedia/controls/qaudiorolecontrol.h +++ b/src/multimedia/controls/qaudiorolecontrol.h @@ -64,7 +64,7 @@ Q_SIGNALS: void audioRoleChanged(QAudio::Role role); protected: - explicit QAudioRoleControl(QObject *parent = Q_NULLPTR); + explicit QAudioRoleControl(QObject *parent = nullptr); }; #define QAudioRoleControl_iid "org.qt-project.qt.audiorolecontrol/5.6" diff --git a/src/multimedia/controls/qcameracapturebufferformatcontrol.h b/src/multimedia/controls/qcameracapturebufferformatcontrol.h index cb8c3d6d9..c659384b6 100644 --- a/src/multimedia/controls/qcameracapturebufferformatcontrol.h +++ b/src/multimedia/controls/qcameracapturebufferformatcontrol.h @@ -62,7 +62,7 @@ Q_SIGNALS: void bufferFormatChanged(QVideoFrame::PixelFormat); protected: - explicit QCameraCaptureBufferFormatControl(QObject *parent = Q_NULLPTR); + explicit QCameraCaptureBufferFormatControl(QObject *parent = nullptr); }; #define QCameraCaptureBufferFormatControl_iid "org.qt-project.qt.cameracapturebufferformatcontrol/5.0" diff --git a/src/multimedia/controls/qcameracapturedestinationcontrol.h b/src/multimedia/controls/qcameracapturedestinationcontrol.h index 90142d6b5..30d69d47a 100644 --- a/src/multimedia/controls/qcameracapturedestinationcontrol.h +++ b/src/multimedia/controls/qcameracapturedestinationcontrol.h @@ -62,7 +62,7 @@ Q_SIGNALS: void captureDestinationChanged(QCameraImageCapture::CaptureDestinations); protected: - explicit QCameraCaptureDestinationControl(QObject *parent = Q_NULLPTR); + explicit QCameraCaptureDestinationControl(QObject *parent = nullptr); }; #define QCameraCaptureDestinationControl_iid "org.qt-project.qt.cameracapturedestinationcontrol/5.0" diff --git a/src/multimedia/controls/qcameracontrol.h b/src/multimedia/controls/qcameracontrol.h index f17af0ce9..f7a1b4288 100644 --- a/src/multimedia/controls/qcameracontrol.h +++ b/src/multimedia/controls/qcameracontrol.h @@ -83,7 +83,7 @@ Q_SIGNALS: void captureModeChanged(QCamera::CaptureModes); protected: - explicit QCameraControl(QObject *parent = Q_NULLPTR); + explicit QCameraControl(QObject *parent = nullptr); }; #define QCameraControl_iid "org.qt-project.qt.cameracontrol/5.0" diff --git a/src/multimedia/controls/qcameraexposurecontrol.h b/src/multimedia/controls/qcameraexposurecontrol.h index 88dda12ed..7694380e5 100644 --- a/src/multimedia/controls/qcameraexposurecontrol.h +++ b/src/multimedia/controls/qcameraexposurecontrol.h @@ -87,7 +87,7 @@ Q_SIGNALS: void parameterRangeChanged(int parameter); protected: - explicit QCameraExposureControl(QObject *parent = Q_NULLPTR); + explicit QCameraExposureControl(QObject *parent = nullptr); }; #define QCameraExposureControl_iid "org.qt-project.qt.cameraexposurecontrol/5.0" diff --git a/src/multimedia/controls/qcamerafeedbackcontrol.h b/src/multimedia/controls/qcamerafeedbackcontrol.h index cee97210f..195ad3915 100644 --- a/src/multimedia/controls/qcamerafeedbackcontrol.h +++ b/src/multimedia/controls/qcamerafeedbackcontrol.h @@ -84,7 +84,7 @@ public: virtual bool setEventFeedbackSound(EventType, const QString &filePath) = 0; protected: - explicit QCameraFeedbackControl(QObject *parent = Q_NULLPTR); + explicit QCameraFeedbackControl(QObject *parent = nullptr); }; #define QCameraFeedbackControl_iid "org.qt-project.qt.camerafeedbackcontrol/5.0" diff --git a/src/multimedia/controls/qcameraflashcontrol.h b/src/multimedia/controls/qcameraflashcontrol.h index 08e991f5a..d4b7d1f4c 100644 --- a/src/multimedia/controls/qcameraflashcontrol.h +++ b/src/multimedia/controls/qcameraflashcontrol.h @@ -68,7 +68,7 @@ Q_SIGNALS: void flashReady(bool); protected: - explicit QCameraFlashControl(QObject *parent = Q_NULLPTR); + explicit QCameraFlashControl(QObject *parent = nullptr); }; #define QCameraFlashControl_iid "org.qt-project.qt.cameraflashcontrol/5.0" diff --git a/src/multimedia/controls/qcamerafocuscontrol.h b/src/multimedia/controls/qcamerafocuscontrol.h index 32da7cc31..a93d2fd1e 100644 --- a/src/multimedia/controls/qcamerafocuscontrol.h +++ b/src/multimedia/controls/qcamerafocuscontrol.h @@ -77,7 +77,7 @@ Q_SIGNALS: void focusZonesChanged(); protected: - explicit QCameraFocusControl(QObject *parent = Q_NULLPTR); + explicit QCameraFocusControl(QObject *parent = nullptr); }; #define QCameraFocusControl_iid "org.qt-project.qt.camerafocuscontrol/5.0" diff --git a/src/multimedia/controls/qcameraimagecapturecontrol.h b/src/multimedia/controls/qcameraimagecapturecontrol.h index 4fe7b9387..e6700fce5 100644 --- a/src/multimedia/controls/qcameraimagecapturecontrol.h +++ b/src/multimedia/controls/qcameraimagecapturecontrol.h @@ -80,7 +80,7 @@ Q_SIGNALS: void error(int id, int error, const QString &errorString); protected: - explicit QCameraImageCaptureControl(QObject *parent = Q_NULLPTR); + explicit QCameraImageCaptureControl(QObject *parent = nullptr); }; #define QCameraImageCaptureControl_iid "org.qt-project.qt.cameraimagecapturecontrol/5.0" diff --git a/src/multimedia/controls/qcameraimageprocessingcontrol.h b/src/multimedia/controls/qcameraimageprocessingcontrol.h index ee46143e4..8be435f8f 100644 --- a/src/multimedia/controls/qcameraimageprocessingcontrol.h +++ b/src/multimedia/controls/qcameraimageprocessingcontrol.h @@ -82,7 +82,7 @@ public: virtual void setParameter(ProcessingParameter parameter, const QVariant &value) = 0; protected: - explicit QCameraImageProcessingControl(QObject *parent = Q_NULLPTR); + explicit QCameraImageProcessingControl(QObject *parent = nullptr); }; #define QCameraImageProcessingControl_iid "org.qt-project.qt.cameraimageprocessingcontrol/5.0" diff --git a/src/multimedia/controls/qcamerainfocontrol.h b/src/multimedia/controls/qcamerainfocontrol.h index 32f85fc3a..9ee0a3abf 100644 --- a/src/multimedia/controls/qcamerainfocontrol.h +++ b/src/multimedia/controls/qcamerainfocontrol.h @@ -58,7 +58,7 @@ public: virtual int cameraOrientation(const QString &deviceName) const = 0; protected: - explicit QCameraInfoControl(QObject *parent = Q_NULLPTR); + explicit QCameraInfoControl(QObject *parent = nullptr); }; #define QCameraInfoControl_iid "org.qt-project.qt.camerainfocontrol/5.3" diff --git a/src/multimedia/controls/qcameralockscontrol.h b/src/multimedia/controls/qcameralockscontrol.h index 01178642f..d545d971e 100644 --- a/src/multimedia/controls/qcameralockscontrol.h +++ b/src/multimedia/controls/qcameralockscontrol.h @@ -67,7 +67,7 @@ Q_SIGNALS: void lockStatusChanged(QCamera::LockType type, QCamera::LockStatus status, QCamera::LockChangeReason reason); protected: - explicit QCameraLocksControl(QObject *parent = Q_NULLPTR); + explicit QCameraLocksControl(QObject *parent = nullptr); }; #define QCameraLocksControl_iid "org.qt-project.qt.cameralockscontrol/5.0" diff --git a/src/multimedia/controls/qcameraviewfindersettingscontrol.h b/src/multimedia/controls/qcameraviewfindersettingscontrol.h index c67fdaabb..7877bd1db 100644 --- a/src/multimedia/controls/qcameraviewfindersettingscontrol.h +++ b/src/multimedia/controls/qcameraviewfindersettingscontrol.h @@ -70,7 +70,7 @@ public: virtual void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) = 0; protected: - explicit QCameraViewfinderSettingsControl(QObject *parent = Q_NULLPTR); + explicit QCameraViewfinderSettingsControl(QObject *parent = nullptr); }; #define QCameraViewfinderSettingsControl_iid "org.qt-project.qt.cameraviewfindersettingscontrol/5.0" @@ -92,7 +92,7 @@ public: virtual void setViewfinderSettings(const QCameraViewfinderSettings &settings) = 0; protected: - explicit QCameraViewfinderSettingsControl2(QObject *parent = Q_NULLPTR); + explicit QCameraViewfinderSettingsControl2(QObject *parent = nullptr); }; #define QCameraViewfinderSettingsControl2_iid "org.qt-project.qt.cameraviewfindersettingscontrol2/5.5" diff --git a/src/multimedia/controls/qcamerazoomcontrol.h b/src/multimedia/controls/qcamerazoomcontrol.h index 776d6ddab..feca6a362 100644 --- a/src/multimedia/controls/qcamerazoomcontrol.h +++ b/src/multimedia/controls/qcamerazoomcontrol.h @@ -75,7 +75,7 @@ Q_SIGNALS: void currentDigitalZoomChanged(qreal digitalZoom); protected: - explicit QCameraZoomControl(QObject *parent = Q_NULLPTR); + explicit QCameraZoomControl(QObject *parent = nullptr); }; #define QCameraZoomControl_iid "org.qt-project.qt.camerazoomcontrol/5.0" diff --git a/src/multimedia/controls/qcustomaudiorolecontrol.cpp b/src/multimedia/controls/qcustomaudiorolecontrol.cpp new file mode 100644 index 000000000..39431be01 --- /dev/null +++ b/src/multimedia/controls/qcustomaudiorolecontrol.cpp @@ -0,0 +1,117 @@ +/**************************************************************************** +** +** Copyright (C) 2017 QNX Software Systems. All rights reserved. +** 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 "qmediacontrol_p.h" +#include "qcustomaudiorolecontrol.h" + +QT_BEGIN_NAMESPACE + +/*! + \class QCustomAudioRoleControl + \inmodule QtMultimedia + \ingroup multimedia_control + \since 5.11 + + \brief The QCustomAudioRoleControl class provides control over the audio role of a media object. + + If a QMediaService supports audio roles it may implement QCustomAudioRoleControl in order to + provide access to roles unknown to Qt. + + The functionality provided by this control is exposed to application code through the + QMediaPlayer class. + + The interface name of QCustomAudioRoleControl is \c org.qt-project.qt.customaudiorolecontrol/5.11 as + defined in QCustomAudioRoleControl_iid. + + \sa QMediaService::requestControl(), QMediaPlayer +*/ + +/*! + \macro QCustomAudioRoleControl_iid + + \c org.qt-project.qt.customaudiorolecontrol/5.11 + + Defines the interface name of the QCustomAudioRoleControl class. + + \relates QCustomAudioRoleControl +*/ + +/*! + Construct a QCustomAudioRoleControl with the given \a parent. +*/ +QCustomAudioRoleControl::QCustomAudioRoleControl(QObject *parent) + : QMediaControl(*new QMediaControlPrivate, parent) +{ +} + +/*! + Destroys the audio role control. +*/ +QCustomAudioRoleControl::~QCustomAudioRoleControl() +{ +} + +/*! + \fn QAudio::Role QCustomAudioRoleControl::customAudioRole() const + + Returns the audio role of the media played by the media service. +*/ + +/*! + \fn void QCustomAudioRoleControl::setCustomAudioRole(const QString &role) + + Sets the audio \a role of the media played by the media service. +*/ + +/*! + \fn QStringList QCustomAudioRoleControl::supportedCustomAudioRoles() const + + Returns a list of custom audio roles that the media service supports. An + empty list may indicate that the supported custom audio roles aren't known. + The list may not be complete. +*/ + +/*! + \fn void QCustomAudioRoleControl::customAudioRoleChanged(const QString &role) + + Signal emitted when the audio \a role has changed. + */ + +#include "moc_qcustomaudiorolecontrol.cpp" +QT_END_NAMESPACE diff --git a/src/multimedia/controls/qcustomaudiorolecontrol.h b/src/multimedia/controls/qcustomaudiorolecontrol.h new file mode 100644 index 000000000..f71bc67df --- /dev/null +++ b/src/multimedia/controls/qcustomaudiorolecontrol.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2017 QNX Software Systems. All rights reserved. +** 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 QCUSTOMAUDIOROLECONTROL_H +#define QCUSTOMAUDIOROLECONTROL_H + +#include <QtMultimedia/qmediacontrol.h> +#include <QtMultimedia/qaudio.h> + +QT_BEGIN_NAMESPACE + +// Class forward declaration required for QDoc bug +class QString; +class QStringList; + +class Q_MULTIMEDIA_EXPORT QCustomAudioRoleControl : public QMediaControl +{ + Q_OBJECT + +public: + virtual ~QCustomAudioRoleControl(); + + virtual QString customAudioRole() const = 0; + virtual void setCustomAudioRole(const QString &role) = 0; + + virtual QStringList supportedCustomAudioRoles() const = 0; + +Q_SIGNALS: + void customAudioRoleChanged(const QString &role); + +protected: + explicit QCustomAudioRoleControl(QObject *parent = nullptr); +}; + +#define QCustomAudioRoleControl_iid "org.qt-project.qt.customaudiorolecontrol/5.11" +Q_MEDIA_DECLARE_CONTROL(QCustomAudioRoleControl, QCustomAudioRoleControl_iid) + +QT_END_NAMESPACE + +#endif // QCUSTOMAUDIOROLECONTROL_H diff --git a/src/multimedia/controls/qimageencodercontrol.h b/src/multimedia/controls/qimageencodercontrol.h index 292e16b1f..9c2164413 100644 --- a/src/multimedia/controls/qimageencodercontrol.h +++ b/src/multimedia/controls/qimageencodercontrol.h @@ -68,13 +68,13 @@ public: virtual QString imageCodecDescription(const QString &codecName) const = 0; virtual QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, - bool *continuous = Q_NULLPTR) const = 0; + bool *continuous = nullptr) const = 0; virtual QImageEncoderSettings imageSettings() const = 0; virtual void setImageSettings(const QImageEncoderSettings &settings) = 0; protected: - explicit QImageEncoderControl(QObject *parent = Q_NULLPTR); + explicit QImageEncoderControl(QObject *parent = nullptr); }; #define QImageEncoderControl_iid "org.qt-project.qt.imageencodercontrol/5.0" diff --git a/src/multimedia/controls/qmediaaudioprobecontrol.h b/src/multimedia/controls/qmediaaudioprobecontrol.h index 9d679c768..74cb1bc5a 100644 --- a/src/multimedia/controls/qmediaaudioprobecontrol.h +++ b/src/multimedia/controls/qmediaaudioprobecontrol.h @@ -56,7 +56,7 @@ Q_SIGNALS: void flush(); protected: - explicit QMediaAudioProbeControl(QObject *parent = Q_NULLPTR); + explicit QMediaAudioProbeControl(QObject *parent = nullptr); }; #define QMediaAudioProbeControl_iid "org.qt-project.qt.mediaaudioprobecontrol/5.0" diff --git a/src/multimedia/controls/qmediaavailabilitycontrol.h b/src/multimedia/controls/qmediaavailabilitycontrol.h index 55149ccb0..a61617b1f 100644 --- a/src/multimedia/controls/qmediaavailabilitycontrol.h +++ b/src/multimedia/controls/qmediaavailabilitycontrol.h @@ -62,7 +62,7 @@ Q_SIGNALS: void availabilityChanged(QMultimedia::AvailabilityStatus availability); protected: - explicit QMediaAvailabilityControl(QObject *parent = Q_NULLPTR); + explicit QMediaAvailabilityControl(QObject *parent = nullptr); }; #define QMediaAvailabilityControl_iid "org.qt-project.qt.mediaavailabilitycontrol/5.0" diff --git a/src/multimedia/controls/qmediacontainercontrol.h b/src/multimedia/controls/qmediacontainercontrol.h index 8c315590e..23c2918b9 100644 --- a/src/multimedia/controls/qmediacontainercontrol.h +++ b/src/multimedia/controls/qmediacontainercontrol.h @@ -62,7 +62,7 @@ public: virtual QString containerDescription(const QString &formatMimeType) const = 0; protected: - explicit QMediaContainerControl(QObject *parent = Q_NULLPTR); + explicit QMediaContainerControl(QObject *parent = nullptr); }; #define QMediaContainerControl_iid "org.qt-project.qt.mediacontainercontrol/5.0" diff --git a/src/multimedia/controls/qmediagaplessplaybackcontrol.h b/src/multimedia/controls/qmediagaplessplaybackcontrol.h index 8ab31ef62..23e2b4fc2 100644 --- a/src/multimedia/controls/qmediagaplessplaybackcontrol.h +++ b/src/multimedia/controls/qmediagaplessplaybackcontrol.h @@ -66,7 +66,7 @@ Q_SIGNALS: void advancedToNextMedia(); protected: - explicit QMediaGaplessPlaybackControl(QObject *parent = Q_NULLPTR); + explicit QMediaGaplessPlaybackControl(QObject *parent = nullptr); }; #define QMediaGaplessPlaybackControl_iid "org.qt-project.qt.mediagaplessplaybackcontrol/5.0" diff --git a/src/multimedia/controls/qmedianetworkaccesscontrol.h b/src/multimedia/controls/qmedianetworkaccesscontrol.h index 1c258a0bb..daae4f389 100644 --- a/src/multimedia/controls/qmedianetworkaccesscontrol.h +++ b/src/multimedia/controls/qmedianetworkaccesscontrol.h @@ -65,7 +65,7 @@ Q_SIGNALS: void configurationChanged(const QNetworkConfiguration& configuration); protected: - explicit QMediaNetworkAccessControl(QObject *parent = Q_NULLPTR); + explicit QMediaNetworkAccessControl(QObject *parent = nullptr); }; #define QMediaNetworkAccessControl_iid "org.qt-project.qt.medianetworkaccesscontrol/5.0" diff --git a/src/multimedia/controls/qmediaplayercontrol.cpp b/src/multimedia/controls/qmediaplayercontrol.cpp index 46de05b51..07b277ffb 100644 --- a/src/multimedia/controls/qmediaplayercontrol.cpp +++ b/src/multimedia/controls/qmediaplayercontrol.cpp @@ -353,7 +353,7 @@ QMediaPlayerControl::QMediaPlayerControl(QObject *parent): Pauses playback of the current media. - If sucessful the player control will immediately enter the \l {QMediaPlayer::PausedState} + If successful the player control will immediately enter the \l {QMediaPlayer::PausedState} {paused} state. \sa state(), play(), stop() diff --git a/src/multimedia/controls/qmediaplayercontrol.h b/src/multimedia/controls/qmediaplayercontrol.h index a3fb1d4e1..d231097f4 100644 --- a/src/multimedia/controls/qmediaplayercontrol.h +++ b/src/multimedia/controls/qmediaplayercontrol.h @@ -110,7 +110,7 @@ Q_SIGNALS: void error(int error, const QString &errorString); protected: - explicit QMediaPlayerControl(QObject *parent = Q_NULLPTR); + explicit QMediaPlayerControl(QObject *parent = nullptr); }; #define QMediaPlayerControl_iid "org.qt-project.qt.mediaplayercontrol/5.0" diff --git a/src/multimedia/controls/qmediarecordercontrol.h b/src/multimedia/controls/qmediarecordercontrol.h index 85f5c78d5..a0529ce59 100644 --- a/src/multimedia/controls/qmediarecordercontrol.h +++ b/src/multimedia/controls/qmediarecordercontrol.h @@ -88,7 +88,7 @@ public Q_SLOTS: virtual void setVolume(qreal volume) = 0; protected: - explicit QMediaRecorderControl(QObject *parent = Q_NULLPTR); + explicit QMediaRecorderControl(QObject *parent = nullptr); }; #define QMediaRecorderControl_iid "org.qt-project.qt.mediarecordercontrol/5.0" diff --git a/src/multimedia/controls/qmediastreamscontrol.h b/src/multimedia/controls/qmediastreamscontrol.h index 3c36e96cb..e2506882d 100644 --- a/src/multimedia/controls/qmediastreamscontrol.h +++ b/src/multimedia/controls/qmediastreamscontrol.h @@ -73,7 +73,7 @@ Q_SIGNALS: void activeStreamsChanged(); protected: - explicit QMediaStreamsControl(QObject *parent = Q_NULLPTR); + explicit QMediaStreamsControl(QObject *parent = nullptr); }; #define QMediaStreamsControl_iid "org.qt-project.qt.mediastreamscontrol/5.0" diff --git a/src/multimedia/controls/qmediavideoprobecontrol.h b/src/multimedia/controls/qmediavideoprobecontrol.h index 25caefee6..363975055 100644 --- a/src/multimedia/controls/qmediavideoprobecontrol.h +++ b/src/multimedia/controls/qmediavideoprobecontrol.h @@ -58,7 +58,7 @@ Q_SIGNALS: void flush(); protected: - explicit QMediaVideoProbeControl(QObject *parent = Q_NULLPTR); + explicit QMediaVideoProbeControl(QObject *parent = nullptr); }; #define QMediaVideoProbeControl_iid "org.qt-project.qt.mediavideoprobecontrol/5.0" diff --git a/src/multimedia/controls/qmetadatareadercontrol.h b/src/multimedia/controls/qmetadatareadercontrol.h index 455ce814e..b7be6b7b5 100644 --- a/src/multimedia/controls/qmetadatareadercontrol.h +++ b/src/multimedia/controls/qmetadatareadercontrol.h @@ -71,7 +71,7 @@ Q_SIGNALS: void metaDataAvailableChanged(bool available); protected: - explicit QMetaDataReaderControl(QObject *parent = Q_NULLPTR); + explicit QMetaDataReaderControl(QObject *parent = nullptr); }; #define QMetaDataReaderControl_iid "org.qt-project.qt.metadatareadercontrol/5.0" diff --git a/src/multimedia/controls/qmetadatawritercontrol.h b/src/multimedia/controls/qmetadatawritercontrol.h index da3413f77..95a314b90 100644 --- a/src/multimedia/controls/qmetadatawritercontrol.h +++ b/src/multimedia/controls/qmetadatawritercontrol.h @@ -74,7 +74,7 @@ Q_SIGNALS: void metaDataAvailableChanged(bool available); protected: - explicit QMetaDataWriterControl(QObject *parent = Q_NULLPTR); + explicit QMetaDataWriterControl(QObject *parent = nullptr); }; #define QMetaDataWriterControl_iid "org.qt-project.qt.metadatawritercontrol/5.0" diff --git a/src/multimedia/controls/qradiodatacontrol.h b/src/multimedia/controls/qradiodatacontrol.h index 28b3a57b2..98302b918 100644 --- a/src/multimedia/controls/qradiodatacontrol.h +++ b/src/multimedia/controls/qradiodatacontrol.h @@ -76,7 +76,7 @@ Q_SIGNALS: void error(QRadioData::Error err); protected: - explicit QRadioDataControl(QObject *parent = Q_NULLPTR); + explicit QRadioDataControl(QObject *parent = nullptr); }; #define QRadioDataControl_iid "org.qt-project.qt.radiodatacontrol/5.0" diff --git a/src/multimedia/controls/qradiotunercontrol.h b/src/multimedia/controls/qradiotunercontrol.h index 9a9e12059..bdf529d42 100644 --- a/src/multimedia/controls/qradiotunercontrol.h +++ b/src/multimedia/controls/qradiotunercontrol.h @@ -107,7 +107,7 @@ Q_SIGNALS: void antennaConnectedChanged(bool connectionStatus); protected: - explicit QRadioTunerControl(QObject *parent = Q_NULLPTR); + explicit QRadioTunerControl(QObject *parent = nullptr); }; #define QRadioTunerControl_iid "org.qt-project.qt.radiotunercontrol/5.0" diff --git a/src/multimedia/controls/qvideodeviceselectorcontrol.h b/src/multimedia/controls/qvideodeviceselectorcontrol.h index 10a703bb2..2d55c0d70 100644 --- a/src/multimedia/controls/qvideodeviceselectorcontrol.h +++ b/src/multimedia/controls/qvideodeviceselectorcontrol.h @@ -71,7 +71,7 @@ Q_SIGNALS: void devicesChanged(); protected: - explicit QVideoDeviceSelectorControl(QObject *parent = Q_NULLPTR); + explicit QVideoDeviceSelectorControl(QObject *parent = nullptr); }; #define QVideoDeviceSelectorControl_iid "org.qt-project.qt.videodeviceselectorcontrol/5.0" diff --git a/src/multimedia/controls/qvideoencodersettingscontrol.h b/src/multimedia/controls/qvideoencodersettingscontrol.h index ea1401aeb..366d585ee 100644 --- a/src/multimedia/controls/qvideoencodersettingscontrol.h +++ b/src/multimedia/controls/qvideoencodersettingscontrol.h @@ -65,10 +65,10 @@ public: virtual ~QVideoEncoderSettingsControl(); virtual QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings, - bool *continuous = Q_NULLPTR) const = 0; + bool *continuous = nullptr) const = 0; virtual QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings, - bool *continuous = Q_NULLPTR) const = 0; + bool *continuous = nullptr) const = 0; virtual QStringList supportedVideoCodecs() const = 0; virtual QString videoCodecDescription(const QString &codecName) const = 0; @@ -77,7 +77,7 @@ public: virtual void setVideoSettings(const QVideoEncoderSettings &settings) = 0; protected: - explicit QVideoEncoderSettingsControl(QObject *parent = Q_NULLPTR); + explicit QVideoEncoderSettingsControl(QObject *parent = nullptr); }; #define QVideoEncoderSettingsControl_iid "org.qt-project.qt.videoencodersettingscontrol/5.0" diff --git a/src/multimedia/controls/qvideorenderercontrol.h b/src/multimedia/controls/qvideorenderercontrol.h index 2ddab28e1..87552271a 100644 --- a/src/multimedia/controls/qvideorenderercontrol.h +++ b/src/multimedia/controls/qvideorenderercontrol.h @@ -56,7 +56,7 @@ public: virtual void setSurface(QAbstractVideoSurface *surface) = 0; protected: - explicit QVideoRendererControl(QObject *parent = Q_NULLPTR); + explicit QVideoRendererControl(QObject *parent = nullptr); }; #define QVideoRendererControl_iid "org.qt-project.qt.videorenderercontrol/5.0" diff --git a/src/multimedia/controls/qvideowindowcontrol.h b/src/multimedia/controls/qvideowindowcontrol.h index d26579ddc..510a29989 100644 --- a/src/multimedia/controls/qvideowindowcontrol.h +++ b/src/multimedia/controls/qvideowindowcontrol.h @@ -94,7 +94,7 @@ Q_SIGNALS: void nativeSizeChanged(); protected: - explicit QVideoWindowControl(QObject *parent = Q_NULLPTR); + explicit QVideoWindowControl(QObject *parent = nullptr); }; #define QVideoWindowControl_iid "org.qt-project.qt.videowindowcontrol/5.0" diff --git a/src/multimedia/doc/qtmultimedia.qdocconf b/src/multimedia/doc/qtmultimedia.qdocconf index e3d3827c5..074fcb75e 100644 --- a/src/multimedia/doc/qtmultimedia.qdocconf +++ b/src/multimedia/doc/qtmultimedia.qdocconf @@ -43,6 +43,9 @@ qhp.QtMultimedia.subprojects.examples.sortPages = true exampledirs += ../../../examples \ snippets +manifestmeta.highlighted.names = "QtMultimedia/QML Video Shader Effects Example" \ + "QtMultimedia/Media Player Example" + headerdirs += ../.. imagedirs += src/images \ diff --git a/src/multimedia/gsttools_headers/gstvideoconnector_p.h b/src/multimedia/gsttools_headers/gstvideoconnector_p.h index 4fa1456c8..a38ca2e65 100644 --- a/src/multimedia/gsttools_headers/gstvideoconnector_p.h +++ b/src/multimedia/gsttools_headers/gstvideoconnector_p.h @@ -51,6 +51,8 @@ // We mean it. // +#include <private/qgsttools_global_p.h> + #include <gst/gst.h> G_BEGIN_DECLS @@ -69,7 +71,7 @@ G_BEGIN_DECLS typedef struct _GstVideoConnector GstVideoConnector; typedef struct _GstVideoConnectorClass GstVideoConnectorClass; -struct _GstVideoConnector { +struct Q_GSTTOOLS_EXPORT _GstVideoConnector { GstElement element; GstPad *srcpad; @@ -81,14 +83,14 @@ struct _GstVideoConnector { GstBuffer *latest_buffer; }; -struct _GstVideoConnectorClass { +struct Q_GSTTOOLS_EXPORT _GstVideoConnectorClass { GstElementClass parent_class; /* action signal to resend new segment */ void (*resend_new_segment) (GstElement * element, gboolean emitFailedSignal); }; -GType gst_video_connector_get_type (void); +GType Q_GSTTOOLS_EXPORT gst_video_connector_get_type (void); G_END_DECLS diff --git a/src/multimedia/gsttools_headers/qgstappsrc_p.h b/src/multimedia/gsttools_headers/qgstappsrc_p.h index e50915231..c7e87037d 100644 --- a/src/multimedia/gsttools_headers/qgstappsrc_p.h +++ b/src/multimedia/gsttools_headers/qgstappsrc_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <QtCore/qobject.h> #include <QtCore/qiodevice.h> @@ -63,7 +64,7 @@ QT_BEGIN_NAMESPACE -class QGstAppSrc : public QObject +class Q_GSTTOOLS_EXPORT QGstAppSrc : public QObject { Q_OBJECT public: diff --git a/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h b/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h index e03da1ab5..45e573262 100644 --- a/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h +++ b/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <qabstractvideobuffer.h> #include <qvideosurfaceformat.h> #include <QtCore/qobject.h> @@ -65,7 +66,7 @@ const QLatin1String QGstBufferPoolPluginKey("bufferpool"); /*! Abstract interface for video buffers allocation. */ -class QGstBufferPoolInterface +class Q_GSTTOOLS_EXPORT QGstBufferPoolInterface { public: virtual ~QGstBufferPoolInterface() {} diff --git a/src/multimedia/gsttools_headers/qgstcodecsinfo_p.h b/src/multimedia/gsttools_headers/qgstcodecsinfo_p.h index af1a4486f..33ab3de4b 100644 --- a/src/multimedia/gsttools_headers/qgstcodecsinfo_p.h +++ b/src/multimedia/gsttools_headers/qgstcodecsinfo_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <QtCore/qmap.h> #include <QtCore/qstringlist.h> @@ -58,7 +59,7 @@ QT_BEGIN_NAMESPACE -class QGstCodecsInfo +class Q_GSTTOOLS_EXPORT QGstCodecsInfo { public: enum ElementType { AudioEncoder, VideoEncoder, Muxer }; diff --git a/src/multimedia/gsttools_headers/qgstreameraudioinputselector_p.h b/src/multimedia/gsttools_headers/qgstreameraudioinputselector_p.h index 1a961c6d9..0c193fda9 100644 --- a/src/multimedia/gsttools_headers/qgstreameraudioinputselector_p.h +++ b/src/multimedia/gsttools_headers/qgstreameraudioinputselector_p.h @@ -51,12 +51,13 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <qaudioinputselectorcontrol.h> #include <QtCore/qstringlist.h> QT_BEGIN_NAMESPACE -class QGstreamerAudioInputSelector : public QAudioInputSelectorControl +class Q_GSTTOOLS_EXPORT QGstreamerAudioInputSelector : public QAudioInputSelectorControl { Q_OBJECT public: diff --git a/src/multimedia/gsttools_headers/qgstreameraudioprobecontrol_p.h b/src/multimedia/gsttools_headers/qgstreameraudioprobecontrol_p.h index bacf8c71d..4fc5c7704 100644 --- a/src/multimedia/gsttools_headers/qgstreameraudioprobecontrol_p.h +++ b/src/multimedia/gsttools_headers/qgstreameraudioprobecontrol_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <gst/gst.h> #include <qmediaaudioprobecontrol.h> #include <QtCore/qmutex.h> @@ -61,7 +62,7 @@ QT_BEGIN_NAMESPACE -class QGstreamerAudioProbeControl +class Q_GSTTOOLS_EXPORT QGstreamerAudioProbeControl : public QMediaAudioProbeControl , public QGstreamerBufferProbe , public QSharedData diff --git a/src/multimedia/gsttools_headers/qgstreamerbufferprobe_p.h b/src/multimedia/gsttools_headers/qgstreamerbufferprobe_p.h index f7ba2bbd9..35644f934 100644 --- a/src/multimedia/gsttools_headers/qgstreamerbufferprobe_p.h +++ b/src/multimedia/gsttools_headers/qgstreamerbufferprobe_p.h @@ -51,13 +51,15 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <gst/gst.h> #include <QtCore/qglobal.h> + QT_BEGIN_NAMESPACE -class QGstreamerBufferProbe +class Q_GSTTOOLS_EXPORT QGstreamerBufferProbe { public: enum Flags diff --git a/src/multimedia/gsttools_headers/qgstreamerbushelper_p.h b/src/multimedia/gsttools_headers/qgstreamerbushelper_p.h index 3216c07da..c7d06faf8 100644 --- a/src/multimedia/gsttools_headers/qgstreamerbushelper_p.h +++ b/src/multimedia/gsttools_headers/qgstreamerbushelper_p.h @@ -51,9 +51,11 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <QObject> #include "qgstreamermessage_p.h" + #include <gst/gst.h> QT_BEGIN_NAMESPACE @@ -78,7 +80,7 @@ Q_DECLARE_INTERFACE(QGstreamerBusMessageFilter, QGstreamerBusMessageFilter_iid) class QGstreamerBusHelperPrivate; -class QGstreamerBusHelper : public QObject +class Q_GSTTOOLS_EXPORT QGstreamerBusHelper : public QObject { Q_OBJECT friend class QGstreamerBusHelperPrivate; diff --git a/src/multimedia/gsttools_headers/qgstreamermessage_p.h b/src/multimedia/gsttools_headers/qgstreamermessage_p.h index 5d832ccfa..2f9d1745c 100644 --- a/src/multimedia/gsttools_headers/qgstreamermessage_p.h +++ b/src/multimedia/gsttools_headers/qgstreamermessage_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <QMetaType> #include <gst/gst.h> @@ -60,7 +61,7 @@ QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; -class QGstreamerMessage +class Q_GSTTOOLS_EXPORT QGstreamerMessage { public: QGstreamerMessage(); diff --git a/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h b/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h index e1ac453c7..b660cc7b3 100644 --- a/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h +++ b/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <qvideodeviceselectorcontrol.h> #include <QtCore/qstringlist.h> @@ -59,7 +60,7 @@ QT_BEGIN_NAMESPACE -class QGstreamerVideoInputDeviceControl : public QVideoDeviceSelectorControl +class Q_GSTTOOLS_EXPORT QGstreamerVideoInputDeviceControl : public QVideoDeviceSelectorControl { Q_OBJECT public: diff --git a/src/multimedia/gsttools_headers/qgstreamervideoprobecontrol_p.h b/src/multimedia/gsttools_headers/qgstreamervideoprobecontrol_p.h index b599b0e78..b15b6099c 100644 --- a/src/multimedia/gsttools_headers/qgstreamervideoprobecontrol_p.h +++ b/src/multimedia/gsttools_headers/qgstreamervideoprobecontrol_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <gst/gst.h> #include <gst/video/video.h> #include <qmediavideoprobecontrol.h> @@ -62,7 +63,7 @@ QT_BEGIN_NAMESPACE -class QGstreamerVideoProbeControl +class Q_GSTTOOLS_EXPORT QGstreamerVideoProbeControl : public QMediaVideoProbeControl , public QGstreamerBufferProbe , public QSharedData diff --git a/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h b/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h index 1d22e1125..2f0b80d45 100644 --- a/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h +++ b/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <qvideorenderercontrol.h> #include <private/qvideosurfacegstsink_p.h> #include <qabstractvideosurface.h> @@ -59,7 +60,7 @@ QT_BEGIN_NAMESPACE -class QGstreamerVideoRenderer : public QVideoRendererControl, public QGstreamerVideoRendererInterface +class Q_GSTTOOLS_EXPORT QGstreamerVideoRenderer : public QVideoRendererControl, public QGstreamerVideoRendererInterface { Q_OBJECT Q_INTERFACES(QGstreamerVideoRendererInterface) diff --git a/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h b/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h index b2dfece60..3e3240725 100644 --- a/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h +++ b/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <qvideowidgetcontrol.h> #include "qgstreamervideorendererinterface_p.h" @@ -59,9 +60,9 @@ QT_BEGIN_NAMESPACE -class QGstreamerVideoWidget; +class Q_GSTTOOLS_EXPORT QGstreamerVideoWidget; -class QGstreamerVideoWidgetControl +class Q_GSTTOOLS_EXPORT QGstreamerVideoWidgetControl : public QVideoWidgetControl , public QGstreamerVideoRendererInterface , public QGstreamerSyncMessageFilter diff --git a/src/multimedia/gsttools_headers/qgstreamervideowindow_p.h b/src/multimedia/gsttools_headers/qgstreamervideowindow_p.h index b489650f9..5f893f10e 100644 --- a/src/multimedia/gsttools_headers/qgstreamervideowindow_p.h +++ b/src/multimedia/gsttools_headers/qgstreamervideowindow_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <qvideowindowcontrol.h> #include "qgstreamervideorendererinterface_p.h" @@ -61,7 +62,7 @@ QT_BEGIN_NAMESPACE class QAbstractVideoSurface; -class QGstreamerVideoWindow : +class Q_GSTTOOLS_EXPORT QGstreamerVideoWindow : public QVideoWindowControl, public QGstreamerVideoRendererInterface, public QGstreamerSyncMessageFilter, diff --git a/src/multimedia/gsttools_headers/qgsttools_global_p.h b/src/multimedia/gsttools_headers/qgsttools_global_p.h new file mode 100644 index 000000000..babcd3aaf --- /dev/null +++ b/src/multimedia/gsttools_headers/qgsttools_global_p.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2017 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 QGSTTOOLS_GLOBAL_H +#define QGSTTOOLS_GLOBAL_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 <QtCore/qglobal.h> + +QT_BEGIN_NAMESPACE + +#ifndef QT_STATIC +# if defined(QT_BUILD_MULTIMEDIAGSTTOOLS_LIB) +# define Q_GSTTOOLS_EXPORT Q_DECL_EXPORT +# else +# define Q_GSTTOOLS_EXPORT Q_DECL_IMPORT +# endif +#else +# define Q_GSTTOOLS_EXPORT +#endif + +QT_END_NAMESPACE + +#endif // QGSTTOOLS_GLOBAL_H diff --git a/src/multimedia/gsttools_headers/qgstutils_p.h b/src/multimedia/gsttools_headers/qgstutils_p.h index 8b7de3661..24d3e889d 100644 --- a/src/multimedia/gsttools_headers/qgstutils_p.h +++ b/src/multimedia/gsttools_headers/qgstutils_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <QtCore/qmap.h> #include <QtCore/qset.h> #include <QtCore/qvector.h> @@ -85,7 +86,7 @@ class QImage; class QVideoSurfaceFormat; namespace QGstUtils { - struct CameraInfo + struct Q_GSTTOOLS_EXPORT CameraInfo { QString name; QString description; @@ -94,74 +95,74 @@ namespace QGstUtils { QByteArray driver; }; - QMap<QByteArray, QVariant> gstTagListToMap(const GstTagList *list); + Q_GSTTOOLS_EXPORT QMap<QByteArray, QVariant> gstTagListToMap(const GstTagList *list); - QSize capsResolution(const GstCaps *caps); - QSize capsCorrectedResolution(const GstCaps *caps); - QAudioFormat audioFormatForCaps(const GstCaps *caps); + Q_GSTTOOLS_EXPORT QSize capsResolution(const GstCaps *caps); + Q_GSTTOOLS_EXPORT QSize capsCorrectedResolution(const GstCaps *caps); + Q_GSTTOOLS_EXPORT QAudioFormat audioFormatForCaps(const GstCaps *caps); #if GST_CHECK_VERSION(1,0,0) - QAudioFormat audioFormatForSample(GstSample *sample); + Q_GSTTOOLS_EXPORT QAudioFormat audioFormatForSample(GstSample *sample); #else - QAudioFormat audioFormatForBuffer(GstBuffer *buffer); + Q_GSTTOOLS_EXPORT QAudioFormat audioFormatForBuffer(GstBuffer *buffer); #endif - GstCaps *capsForAudioFormat(const QAudioFormat &format); - void initializeGst(); - QMultimedia::SupportEstimate hasSupport(const QString &mimeType, + Q_GSTTOOLS_EXPORT GstCaps *capsForAudioFormat(const QAudioFormat &format); + Q_GSTTOOLS_EXPORT void initializeGst(); + Q_GSTTOOLS_EXPORT QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList &codecs, const QSet<QString> &supportedMimeTypeSet); - QVector<CameraInfo> enumerateCameras(GstElementFactory *factory = 0); - QList<QByteArray> cameraDevices(GstElementFactory * factory = 0); - QString cameraDescription(const QString &device, GstElementFactory * factory = 0); - QCamera::Position cameraPosition(const QString &device, GstElementFactory * factory = 0); - int cameraOrientation(const QString &device, GstElementFactory * factory = 0); - QByteArray cameraDriver(const QString &device, GstElementFactory * factory = 0); + Q_GSTTOOLS_EXPORT QVector<CameraInfo> enumerateCameras(GstElementFactory *factory = 0); + Q_GSTTOOLS_EXPORT QList<QByteArray> cameraDevices(GstElementFactory * factory = 0); + Q_GSTTOOLS_EXPORT QString cameraDescription(const QString &device, GstElementFactory * factory = 0); + Q_GSTTOOLS_EXPORT QCamera::Position cameraPosition(const QString &device, GstElementFactory * factory = 0); + Q_GSTTOOLS_EXPORT int cameraOrientation(const QString &device, GstElementFactory * factory = 0); + Q_GSTTOOLS_EXPORT QByteArray cameraDriver(const QString &device, GstElementFactory * factory = 0); - QSet<QString> supportedMimeTypes(bool (*isValidFactory)(GstElementFactory *factory)); + Q_GSTTOOLS_EXPORT QSet<QString> supportedMimeTypes(bool (*isValidFactory)(GstElementFactory *factory)); #if GST_CHECK_VERSION(1,0,0) - QImage bufferToImage(GstBuffer *buffer, const GstVideoInfo &info); - QVideoSurfaceFormat formatForCaps( + Q_GSTTOOLS_EXPORT QImage bufferToImage(GstBuffer *buffer, const GstVideoInfo &info); + Q_GSTTOOLS_EXPORT QVideoSurfaceFormat formatForCaps( GstCaps *caps, GstVideoInfo *info = 0, QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle); #else - QImage bufferToImage(GstBuffer *buffer); - QVideoSurfaceFormat formatForCaps( + Q_GSTTOOLS_EXPORT QImage bufferToImage(GstBuffer *buffer); + Q_GSTTOOLS_EXPORT QVideoSurfaceFormat formatForCaps( GstCaps *caps, int *bytesPerLine = 0, QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle); #endif - GstCaps *capsForFormats(const QList<QVideoFrame::PixelFormat> &formats); + Q_GSTTOOLS_EXPORT GstCaps *capsForFormats(const QList<QVideoFrame::PixelFormat> &formats); void setFrameTimeStamps(QVideoFrame *frame, GstBuffer *buffer); - void setMetaData(GstElement *element, const QMap<QByteArray, QVariant> &data); - void setMetaData(GstBin *bin, const QMap<QByteArray, QVariant> &data); + Q_GSTTOOLS_EXPORT void setMetaData(GstElement *element, const QMap<QByteArray, QVariant> &data); + Q_GSTTOOLS_EXPORT void setMetaData(GstBin *bin, const QMap<QByteArray, QVariant> &data); - GstCaps *videoFilterCaps(); + Q_GSTTOOLS_EXPORT GstCaps *videoFilterCaps(); - QSize structureResolution(const GstStructure *s); - QVideoFrame::PixelFormat structurePixelFormat(const GstStructure *s, int *bpp = 0); - QSize structurePixelAspectRatio(const GstStructure *s); - QPair<qreal, qreal> structureFrameRateRange(const GstStructure *s); + Q_GSTTOOLS_EXPORT QSize structureResolution(const GstStructure *s); + Q_GSTTOOLS_EXPORT QVideoFrame::PixelFormat structurePixelFormat(const GstStructure *s, int *bpp = 0); + Q_GSTTOOLS_EXPORT QSize structurePixelAspectRatio(const GstStructure *s); + Q_GSTTOOLS_EXPORT QPair<qreal, qreal> structureFrameRateRange(const GstStructure *s); - QString fileExtensionForMimeType(const QString &mimeType); + Q_GSTTOOLS_EXPORT QString fileExtensionForMimeType(const QString &mimeType); } -void qt_gst_object_ref_sink(gpointer object); -GstCaps *qt_gst_pad_get_current_caps(GstPad *pad); -GstCaps *qt_gst_pad_get_caps(GstPad *pad); -GstStructure *qt_gst_structure_new_empty(const char *name); -gboolean qt_gst_element_query_position(GstElement *element, GstFormat format, gint64 *cur); -gboolean qt_gst_element_query_duration(GstElement *element, GstFormat format, gint64 *cur); -GstCaps *qt_gst_caps_normalize(GstCaps *caps); -const gchar *qt_gst_element_get_factory_name(GstElement *element); -gboolean qt_gst_caps_can_intersect(const GstCaps * caps1, const GstCaps * caps2); -GList *qt_gst_video_sinks(); -void qt_gst_util_double_to_fraction(gdouble src, gint *dest_n, gint *dest_d); - -QDebug operator <<(QDebug debug, GstCaps *caps); +Q_GSTTOOLS_EXPORT void qt_gst_object_ref_sink(gpointer object); +Q_GSTTOOLS_EXPORT GstCaps *qt_gst_pad_get_current_caps(GstPad *pad); +Q_GSTTOOLS_EXPORT GstCaps *qt_gst_pad_get_caps(GstPad *pad); +Q_GSTTOOLS_EXPORT GstStructure *qt_gst_structure_new_empty(const char *name); +Q_GSTTOOLS_EXPORT gboolean qt_gst_element_query_position(GstElement *element, GstFormat format, gint64 *cur); +Q_GSTTOOLS_EXPORT gboolean qt_gst_element_query_duration(GstElement *element, GstFormat format, gint64 *cur); +Q_GSTTOOLS_EXPORT GstCaps *qt_gst_caps_normalize(GstCaps *caps); +Q_GSTTOOLS_EXPORT const gchar *qt_gst_element_get_factory_name(GstElement *element); +Q_GSTTOOLS_EXPORT gboolean qt_gst_caps_can_intersect(const GstCaps * caps1, const GstCaps * caps2); +Q_GSTTOOLS_EXPORT GList *qt_gst_video_sinks(); +Q_GSTTOOLS_EXPORT void qt_gst_util_double_to_fraction(gdouble src, gint *dest_n, gint *dest_d); + +Q_GSTTOOLS_EXPORT QDebug operator <<(QDebug debug, GstCaps *caps); QT_END_NAMESPACE diff --git a/src/multimedia/gsttools_headers/qgstvideobuffer_p.h b/src/multimedia/gsttools_headers/qgstvideobuffer_p.h index d2802d9a2..c67c57021 100644 --- a/src/multimedia/gsttools_headers/qgstvideobuffer_p.h +++ b/src/multimedia/gsttools_headers/qgstvideobuffer_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <qabstractvideobuffer.h> #include <QtCore/qvariant.h> @@ -60,14 +61,14 @@ QT_BEGIN_NAMESPACE #if GST_CHECK_VERSION(1,0,0) -class QGstVideoBuffer : public QAbstractPlanarVideoBuffer +class Q_GSTTOOLS_EXPORT QGstVideoBuffer : public QAbstractPlanarVideoBuffer { public: QGstVideoBuffer(GstBuffer *buffer, const GstVideoInfo &info); QGstVideoBuffer(GstBuffer *buffer, const GstVideoInfo &info, HandleType handleType, const QVariant &handle); #else -class QGstVideoBuffer : public QAbstractVideoBuffer +class Q_GSTTOOLS_EXPORT QGstVideoBuffer : public QAbstractVideoBuffer { public: QGstVideoBuffer(GstBuffer *buffer, int bytesPerLine); diff --git a/src/multimedia/gsttools_headers/qgstvideorendererplugin_p.h b/src/multimedia/gsttools_headers/qgstvideorendererplugin_p.h index 6a0c4c6bd..df36dbe09 100644 --- a/src/multimedia/gsttools_headers/qgstvideorendererplugin_p.h +++ b/src/multimedia/gsttools_headers/qgstvideorendererplugin_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <private/qgsttools_global_p.h> #include <qabstractvideobuffer.h> #include <qvideosurfaceformat.h> #include <QtCore/qobject.h> @@ -64,7 +65,7 @@ class QAbstractVideoSurface; const QLatin1String QGstVideoRendererPluginKey("gstvideorenderer"); -class QGstVideoRenderer +class Q_GSTTOOLS_EXPORT QGstVideoRenderer { public: virtual ~QGstVideoRenderer() {} @@ -81,7 +82,7 @@ public: /* Abstract interface for video buffers allocation. */ -class QGstVideoRendererInterface +class Q_GSTTOOLS_EXPORT QGstVideoRendererInterface { public: virtual ~QGstVideoRendererInterface() {} @@ -92,7 +93,7 @@ public: #define QGstVideoRendererInterface_iid "org.qt-project.qt.gstvideorenderer/5.4" Q_DECLARE_INTERFACE(QGstVideoRendererInterface, QGstVideoRendererInterface_iid) -class QGstVideoRendererPlugin : public QObject, public QGstVideoRendererInterface +class Q_GSTTOOLS_EXPORT QGstVideoRendererPlugin : public QObject, public QGstVideoRendererInterface { Q_OBJECT Q_INTERFACES(QGstVideoRendererInterface) diff --git a/src/multimedia/multimedia.pro b/src/multimedia/multimedia.pro index 0f3f3ff6b..63c50f09e 100644 --- a/src/multimedia/multimedia.pro +++ b/src/multimedia/multimedia.pro @@ -67,14 +67,12 @@ include(recording/recording.pri) include(video/video.pri) ANDROID_BUNDLED_JAR_DEPENDENCIES = \ - jar/QtMultimedia-bundled.jar:org.qtproject.qt5.android.multimedia.QtMultimediaUtils -ANDROID_JAR_DEPENDENCIES = \ jar/QtMultimedia.jar:org.qtproject.qt5.android.multimedia.QtMultimediaUtils ANDROID_LIB_DEPENDENCIES = \ plugins/mediaservice/libqtmedia_android.so \ - lib/libQt5MultimediaQuick_p.so:Qt5Quick + lib/libQt5MultimediaQuick.so:Qt5Quick ANDROID_BUNDLED_FILES += \ - lib/libQt5MultimediaQuick_p.so + lib/libQt5MultimediaQuick.so ANDROID_PERMISSIONS += \ android.permission.CAMERA \ android.permission.RECORD_AUDIO diff --git a/src/multimedia/playback/qmedianetworkplaylistprovider.cpp b/src/multimedia/playback/qmedianetworkplaylistprovider.cpp index a4ad97251..3f24d0f55 100644 --- a/src/multimedia/playback/qmedianetworkplaylistprovider.cpp +++ b/src/multimedia/playback/qmedianetworkplaylistprovider.cpp @@ -42,6 +42,7 @@ #include "qmediacontent.h" #include "qmediaobject_p.h" #include "qplaylistfileparser_p.h" +#include "qrandom.h" QT_BEGIN_NAMESPACE @@ -266,7 +267,7 @@ void QMediaNetworkPlaylistProvider::shuffle() QList<QMediaContent> resources; while (!d->resources.isEmpty()) { - resources.append(d->resources.takeAt(qrand() % d->resources.size())); + resources.append(d->resources.takeAt(QRandomGenerator::global()->bounded(d->resources.size()))); } d->resources = resources; diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp index 16fdec8ea..01c91babc 100644 --- a/src/multimedia/playback/qmediaplayer.cpp +++ b/src/multimedia/playback/qmediaplayer.cpp @@ -49,6 +49,7 @@ #include <qmediaplaylistsourcecontrol_p.h> #include <qmedianetworkaccesscontrol.h> #include <qaudiorolecontrol.h> +#include <qcustomaudiorolecontrol.h> #include <QtCore/qcoreevent.h> #include <QtCore/qmetaobject.h> @@ -111,6 +112,7 @@ public: : provider(0) , control(0) , audioRoleControl(0) + , customAudioRoleControl(0) , playlist(0) , networkAccessControl(0) , state(QMediaPlayer::StoppedState) @@ -124,6 +126,7 @@ public: QMediaServiceProvider *provider; QMediaPlayerControl* control; QAudioRoleControl *audioRoleControl; + QCustomAudioRoleControl *customAudioRoleControl; QString errorString; QPointer<QObject> videoOutput; @@ -616,6 +619,15 @@ QMediaPlayer::QMediaPlayer(QObject *parent, QMediaPlayer::Flags flags): if (d->audioRoleControl) { connect(d->audioRoleControl, &QAudioRoleControl::audioRoleChanged, this, &QMediaPlayer::audioRoleChanged); + + d->customAudioRoleControl = qobject_cast<QCustomAudioRoleControl *>( + d->service->requestControl(QCustomAudioRoleControl_iid)); + if (d->customAudioRoleControl) { + connect(d->customAudioRoleControl, + &QCustomAudioRoleControl::customAudioRoleChanged, + this, + &QMediaPlayer::customAudioRoleChanged); + } } } if (d->networkAccessControl != 0) { @@ -641,6 +653,8 @@ QMediaPlayer::~QMediaPlayer() d->service->releaseControl(d->control); if (d->audioRoleControl) d->service->releaseControl(d->audioRoleControl); + if (d->customAudioRoleControl) + d->service->releaseControl(d->customAudioRoleControl); d->provider->releaseService(d->service); } @@ -718,7 +732,17 @@ void QMediaPlayer::setNetworkConfigurations(const QList<QNetworkConfiguration> & QMediaPlayer::State QMediaPlayer::state() const { - return d_func()->state; + Q_D(const QMediaPlayer); + + // In case if EndOfMedia status is already received + // but state is not. + if (d->control != 0 + && d->status == QMediaPlayer::EndOfMedia + && d->state != d->control->state()) { + return d->control->state(); + } + + return d->state; } QMediaPlayer::MediaStatus QMediaPlayer::mediaStatus() const @@ -1150,8 +1174,13 @@ void QMediaPlayer::setAudioRole(QAudio::Role audioRole) { Q_D(QMediaPlayer); - if (d->audioRoleControl) + if (d->audioRoleControl) { + if (d->customAudioRoleControl != nullptr && d->audioRoleControl->audioRole() != audioRole) { + d->customAudioRoleControl->setCustomAudioRole(QString()); + } + d->audioRoleControl->setAudioRole(audioRole); + } } /*! @@ -1172,6 +1201,48 @@ QList<QAudio::Role> QMediaPlayer::supportedAudioRoles() const return QList<QAudio::Role>(); } +QString QMediaPlayer::customAudioRole() const +{ + Q_D(const QMediaPlayer); + + if (audioRole() != QAudio::CustomRole) + return QString(); + + if (d->customAudioRoleControl != nullptr) + return d->customAudioRoleControl->customAudioRole(); + + return QString(); +} + +void QMediaPlayer::setCustomAudioRole(const QString &audioRole) +{ + Q_D(QMediaPlayer); + + if (d->customAudioRoleControl) { + Q_ASSERT(d->audioRoleControl); + setAudioRole(QAudio::CustomRole); + d->customAudioRoleControl->setCustomAudioRole(audioRole); + } +} + +/*! + Returns a list of supported custom audio roles. An empty list may + indicate that the supported custom audio roles aren't known. The + list may not be complete. + + \since 5.11 + \sa customAudioRole +*/ +QStringList QMediaPlayer::supportedCustomAudioRoles() const +{ + Q_D(const QMediaPlayer); + + if (d->customAudioRoleControl) + return d->customAudioRoleControl->supportedCustomAudioRoles(); + + return QStringList(); +} + // Enums /*! \enum QMediaPlayer::State @@ -1279,6 +1350,14 @@ QList<QAudio::Role> QMediaPlayer::supportedAudioRoles() const \since 5.6 */ +/*! + \fn void QMediaPlayer::customAudioRoleChanged(const QString &role) + + Signals that the audio \a role of the media player has changed. + + \since 5.11 +*/ + // Properties /*! \property QMediaPlayer::state @@ -1461,11 +1540,30 @@ QList<QAudio::Role> QMediaPlayer::supportedAudioRoles() const The audio role must be set before calling setMedia(). + customAudioRole is cleared when this property is set to anything other than + QAudio::CustomRole. + \since 5.6 \sa supportedAudioRoles() */ /*! + \property QMediaPlayer::customAudioRole + \brief the role of the audio stream played by the media player. + + It can be set to specify the type of audio being played when the backend supports + audio roles unknown to Qt. Specifying a role allows the system to make appropriate + decisions when it comes to volume, routing or post-processing. + + The audio role must be set before calling setMedia(). + + audioRole is set to QAudio::CustomRole when this property is set. + + \since 5.11 + \sa supportedCustomAudioRoles() +*/ + +/*! \fn void QMediaPlayer::durationChanged(qint64 duration) Signal the duration of the content has changed to \a duration, expressed in milliseconds. diff --git a/src/multimedia/playback/qmediaplayer.h b/src/multimedia/playback/qmediaplayer.h index f23a94104..e69a32ee4 100644 --- a/src/multimedia/playback/qmediaplayer.h +++ b/src/multimedia/playback/qmediaplayer.h @@ -73,7 +73,8 @@ class Q_MULTIMEDIA_EXPORT QMediaPlayer : public QMediaObject Q_PROPERTY(qreal playbackRate READ playbackRate WRITE setPlaybackRate NOTIFY playbackRateChanged) Q_PROPERTY(State state READ state NOTIFY stateChanged) Q_PROPERTY(MediaStatus mediaStatus READ mediaStatus NOTIFY mediaStatusChanged) - Q_PROPERTY(QAudio::Role audioRole READ audioRole WRITE setAudioRole) + Q_PROPERTY(QAudio::Role audioRole READ audioRole WRITE setAudioRole NOTIFY audioRoleChanged) + Q_PROPERTY(QString customAudioRole READ customAudioRole WRITE setCustomAudioRole NOTIFY customAudioRoleChanged) Q_PROPERTY(QString error READ errorString) Q_ENUMS(State) Q_ENUMS(MediaStatus) @@ -119,7 +120,7 @@ public: MediaIsPlaylist }; - explicit QMediaPlayer(QObject *parent = Q_NULLPTR, Flags flags = Flags()); + explicit QMediaPlayer(QObject *parent = nullptr, Flags flags = Flags()); ~QMediaPlayer(); static QMultimedia::SupportEstimate hasSupport(const QString &mimeType, @@ -162,6 +163,9 @@ public: QAudio::Role audioRole() const; void setAudioRole(QAudio::Role audioRole); QList<QAudio::Role> supportedAudioRoles() const; + QString customAudioRole() const; + void setCustomAudioRole(const QString &audioRole); + QStringList supportedCustomAudioRoles() const; public Q_SLOTS: void play(); @@ -174,7 +178,7 @@ public Q_SLOTS: void setPlaybackRate(qreal rate); - void setMedia(const QMediaContent &media, QIODevice *stream = Q_NULLPTR); + void setMedia(const QMediaContent &media, QIODevice *stream = nullptr); void setPlaylist(QMediaPlaylist *playlist); void setNetworkConfigurations(const QList<QNetworkConfiguration> &configurations); @@ -200,6 +204,7 @@ Q_SIGNALS: void playbackRateChanged(qreal rate); void audioRoleChanged(QAudio::Role role); + void customAudioRoleChanged(const QString &role); void error(QMediaPlayer::Error error); diff --git a/src/multimedia/playback/qmediaplaylist.h b/src/multimedia/playback/qmediaplaylist.h index b16e734f8..4eb93bd02 100644 --- a/src/multimedia/playback/qmediaplaylist.h +++ b/src/multimedia/playback/qmediaplaylist.h @@ -67,7 +67,7 @@ public: enum PlaybackMode { CurrentItemOnce, CurrentItemInLoop, Sequential, Loop, Random }; enum Error { NoError, FormatError, FormatNotSupportedError, NetworkError, AccessDeniedError }; - explicit QMediaPlaylist(QObject *parent = Q_NULLPTR); + explicit QMediaPlaylist(QObject *parent = nullptr); virtual ~QMediaPlaylist(); QMediaObject *mediaObject() const override; @@ -96,11 +96,11 @@ public: bool removeMedia(int start, int end); bool clear(); - void load(const QNetworkRequest &request, const char *format = Q_NULLPTR); - void load(const QUrl &location, const char *format = Q_NULLPTR); - void load(QIODevice *device, const char *format = Q_NULLPTR); + void load(const QNetworkRequest &request, const char *format = nullptr); + void load(const QUrl &location, const char *format = nullptr); + void load(QIODevice *device, const char *format = nullptr); - bool save(const QUrl &location, const char *format = Q_NULLPTR); + bool save(const QUrl &location, const char *format = nullptr); bool save(QIODevice * device, const char *format); Error error() const; diff --git a/src/multimedia/playback/qmediaplaylistnavigator.cpp b/src/multimedia/playback/qmediaplaylistnavigator.cpp index 192fd463c..0966c9396 100644 --- a/src/multimedia/playback/qmediaplaylistnavigator.cpp +++ b/src/multimedia/playback/qmediaplaylistnavigator.cpp @@ -43,6 +43,7 @@ #include "qmediaobject_p.h" #include <QtCore/qdebug.h> +#include <QtCore/qrandom.h> QT_BEGIN_NAMESPACE @@ -124,7 +125,7 @@ int QMediaPlaylistNavigatorPrivate::nextItemPos(int steps) const randomModePositions.append(-1); int res = randomModePositions[randomPositionsOffset+steps]; if (res<0 || res >= playlist->mediaCount()) { - res = qrand() % playlist->mediaCount(); + res = QRandomGenerator::global()->bounded(playlist->mediaCount()); randomModePositions[randomPositionsOffset+steps] = res; } @@ -177,7 +178,7 @@ int QMediaPlaylistNavigatorPrivate::previousItemPos(int steps) const int res = randomModePositions[randomPositionsOffset-steps]; if (res<0 || res >= playlist->mediaCount()) { - res = qrand() % playlist->mediaCount(); + res = QRandomGenerator::global()->bounded(playlist->mediaCount()); randomModePositions[randomPositionsOffset-steps] = res; } diff --git a/src/multimedia/playback/qplaylistfileparser.cpp b/src/multimedia/playback/qplaylistfileparser.cpp index 47a3d239e..0d33f040d 100644 --- a/src/multimedia/playback/qplaylistfileparser.cpp +++ b/src/multimedia/playback/qplaylistfileparser.cpp @@ -551,7 +551,7 @@ void QPlaylistFileParser::start(const QNetworkRequest& request, const QString &m if (!d->m_currentParser.isNull()) { abort(); - d->m_pendingJob = { Q_NULLPTR, QMediaResource(request, mimeType) }; + d->m_pendingJob = { nullptr, QMediaResource(request, mimeType) }; return; } diff --git a/src/multimedia/qmediacontrol.h b/src/multimedia/qmediacontrol.h index 680b18e7f..cff42e3ca 100644 --- a/src/multimedia/qmediacontrol.h +++ b/src/multimedia/qmediacontrol.h @@ -59,8 +59,8 @@ public: ~QMediaControl(); protected: - explicit QMediaControl(QObject *parent = Q_NULLPTR); - explicit QMediaControl(QMediaControlPrivate &dd, QObject *parent = Q_NULLPTR); + explicit QMediaControl(QObject *parent = nullptr); + explicit QMediaControl(QMediaControlPrivate &dd, QObject *parent = nullptr); QMediaControlPrivate *d_ptr; diff --git a/src/multimedia/qmediaobject.cpp b/src/multimedia/qmediaobject.cpp index a2f0d58aa..71b2d148c 100644 --- a/src/multimedia/qmediaobject.cpp +++ b/src/multimedia/qmediaobject.cpp @@ -55,7 +55,13 @@ void QMediaObjectPrivate::_q_notify() const QMetaObject* m = q->metaObject(); - for (int pi : qAsConst(notifyProperties)) { + // QTBUG-57045 + // we create a copy of notifyProperties container to ensure that if a property is removed + // from the original container as a result of invoking propertyChanged signal, the iterator + // won't become invalidated + QSet<int> properties = notifyProperties; + + for (int pi : qAsConst(properties)) { QMetaProperty p = m->property(pi); p.notifySignal().invoke( q, QGenericArgument(QMetaType::typeName(p.userType()), p.read(q).data())); diff --git a/src/multimedia/radio/qradiodata.h b/src/multimedia/radio/qradiodata.h index 826c652ff..ffc8b44ba 100644 --- a/src/multimedia/radio/qradiodata.h +++ b/src/multimedia/radio/qradiodata.h @@ -82,7 +82,7 @@ public: College }; - explicit QRadioData(QMediaObject *mediaObject, QObject *parent = Q_NULLPTR); + explicit QRadioData(QMediaObject *mediaObject, QObject *parent = nullptr); ~QRadioData(); QMultimedia::AvailabilityStatus availability() const; diff --git a/src/multimedia/radio/qradiotuner.h b/src/multimedia/radio/qradiotuner.h index 7952a2e6c..9e62c849d 100644 --- a/src/multimedia/radio/qradiotuner.h +++ b/src/multimedia/radio/qradiotuner.h @@ -78,7 +78,7 @@ public: enum StereoMode { ForceStereo, ForceMono, Auto }; enum SearchMode { SearchFast, SearchGetStationId }; - explicit QRadioTuner(QObject *parent = Q_NULLPTR); + explicit QRadioTuner(QObject *parent = nullptr); ~QRadioTuner(); QMultimedia::AvailabilityStatus availability() const override; diff --git a/src/multimedia/recording/qaudiorecorder.h b/src/multimedia/recording/qaudiorecorder.h index 75f95d354..e57794b40 100644 --- a/src/multimedia/recording/qaudiorecorder.h +++ b/src/multimedia/recording/qaudiorecorder.h @@ -62,7 +62,7 @@ class Q_MULTIMEDIA_EXPORT QAudioRecorder : public QMediaRecorder Q_OBJECT Q_PROPERTY(QString audioInput READ audioInput WRITE setAudioInput NOTIFY audioInputChanged) public: - explicit QAudioRecorder(QObject *parent = Q_NULLPTR); + explicit QAudioRecorder(QObject *parent = nullptr); ~QAudioRecorder(); QStringList audioInputs() const; diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h index a12bcd632..0fdcf80e4 100644 --- a/src/multimedia/recording/qmediarecorder.h +++ b/src/multimedia/recording/qmediarecorder.h @@ -106,7 +106,7 @@ public: OutOfSpaceError }; - explicit QMediaRecorder(QMediaObject *mediaObject, QObject *parent = Q_NULLPTR); + explicit QMediaRecorder(QMediaObject *mediaObject, QObject *parent = nullptr); ~QMediaRecorder(); QMediaObject *mediaObject() const override; @@ -137,16 +137,16 @@ public: QString audioCodecDescription(const QString &codecName) const; QList<int> supportedAudioSampleRates(const QAudioEncoderSettings &settings = QAudioEncoderSettings(), - bool *continuous = Q_NULLPTR) const; + bool *continuous = nullptr) const; QStringList supportedVideoCodecs() const; QString videoCodecDescription(const QString &codecName) const; QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings = QVideoEncoderSettings(), - bool *continuous = Q_NULLPTR) const; + bool *continuous = nullptr) const; QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings = QVideoEncoderSettings(), - bool *continuous = Q_NULLPTR) const; + bool *continuous = nullptr) const; QAudioEncoderSettings audioSettings() const; QVideoEncoderSettings videoSettings() const; @@ -193,7 +193,7 @@ Q_SIGNALS: void availabilityChanged(QMultimedia::AvailabilityStatus availability); protected: - QMediaRecorder(QMediaRecorderPrivate &dd, QMediaObject *mediaObject, QObject *parent = Q_NULLPTR); + QMediaRecorder(QMediaRecorderPrivate &dd, QMediaObject *mediaObject, QObject *parent = nullptr); bool setMediaObject(QMediaObject *object) override; QMediaRecorderPrivate *d_ptr; diff --git a/src/multimedia/video/qabstractvideofilter.h b/src/multimedia/video/qabstractvideofilter.h index 7e125fac4..6263f4730 100644 --- a/src/multimedia/video/qabstractvideofilter.h +++ b/src/multimedia/video/qabstractvideofilter.h @@ -68,7 +68,7 @@ class Q_MULTIMEDIA_EXPORT QAbstractVideoFilter : public QObject Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged) public: - explicit QAbstractVideoFilter(QObject *parent = Q_NULLPTR); + explicit QAbstractVideoFilter(QObject *parent = nullptr); ~QAbstractVideoFilter(); bool isActive() const; diff --git a/src/multimedia/video/qabstractvideosurface.h b/src/multimedia/video/qabstractvideosurface.h index f3d3e0799..391c9e696 100644 --- a/src/multimedia/video/qabstractvideosurface.h +++ b/src/multimedia/video/qabstractvideosurface.h @@ -64,7 +64,7 @@ public: ResourceError }; - explicit QAbstractVideoSurface(QObject *parent = Q_NULLPTR); + explicit QAbstractVideoSurface(QObject *parent = nullptr); ~QAbstractVideoSurface(); virtual QList<QVideoFrame::PixelFormat> supportedPixelFormats( diff --git a/src/multimedia/video/qimagevideobuffer.cpp b/src/multimedia/video/qimagevideobuffer.cpp index 59f708fed..f407e02d0 100644 --- a/src/multimedia/video/qimagevideobuffer.cpp +++ b/src/multimedia/video/qimagevideobuffer.cpp @@ -89,7 +89,7 @@ uchar *QImageVideoBuffer::map(MapMode mode, int *numBytes, int *bytesPerLine) d->mapMode = mode; if (numBytes) - *numBytes = d->image.byteCount(); + *numBytes = int(d->image.sizeInBytes()); if (bytesPerLine) *bytesPerLine = d->image.bytesPerLine(); diff --git a/src/multimedia/video/qvideoframe.cpp b/src/multimedia/video/qvideoframe.cpp index 8578eee1c..bbb87b63b 100644 --- a/src/multimedia/video/qvideoframe.cpp +++ b/src/multimedia/video/qvideoframe.cpp @@ -1025,23 +1025,23 @@ extern void QT_FASTCALL qt_convert_NV12_to_ARGB32(const QVideoFrame&, uchar*); extern void QT_FASTCALL qt_convert_NV21_to_ARGB32(const QVideoFrame&, uchar*); static VideoFrameConvertFunc qConvertFuncs[QVideoFrame::NPixelFormats] = { - /* Format_Invalid */ Q_NULLPTR, // Not needed - /* Format_ARGB32 */ Q_NULLPTR, // Not needed - /* Format_ARGB32_Premultiplied */ Q_NULLPTR, // Not needed - /* Format_RGB32 */ Q_NULLPTR, // Not needed - /* Format_RGB24 */ Q_NULLPTR, // Not needed - /* Format_RGB565 */ Q_NULLPTR, // Not needed - /* Format_RGB555 */ Q_NULLPTR, // Not needed - /* Format_ARGB8565_Premultiplied */ Q_NULLPTR, // Not needed + /* Format_Invalid */ nullptr, // Not needed + /* Format_ARGB32 */ nullptr, // Not needed + /* Format_ARGB32_Premultiplied */ nullptr, // Not needed + /* Format_RGB32 */ nullptr, // Not needed + /* Format_RGB24 */ nullptr, // Not needed + /* Format_RGB565 */ nullptr, // Not needed + /* Format_RGB555 */ nullptr, // Not needed + /* Format_ARGB8565_Premultiplied */ nullptr, // Not needed /* Format_BGRA32 */ qt_convert_BGRA32_to_ARGB32, /* Format_BGRA32_Premultiplied */ qt_convert_BGRA32_to_ARGB32, /* Format_BGR32 */ qt_convert_BGRA32_to_ARGB32, /* Format_BGR24 */ qt_convert_BGR24_to_ARGB32, /* Format_BGR565 */ qt_convert_BGR565_to_ARGB32, /* Format_BGR555 */ qt_convert_BGR555_to_ARGB32, - /* Format_BGRA5658_Premultiplied */ Q_NULLPTR, + /* Format_BGRA5658_Premultiplied */ nullptr, /* Format_AYUV444 */ qt_convert_AYUV444_to_ARGB32, - /* Format_AYUV444_Premultiplied */ Q_NULLPTR, + /* Format_AYUV444_Premultiplied */ nullptr, /* Format_YUV444 */ qt_convert_YUV444_to_ARGB32, /* Format_YUV420P */ qt_convert_YUV420P_to_ARGB32, /* Format_YV12 */ qt_convert_YV12_to_ARGB32, @@ -1049,15 +1049,15 @@ static VideoFrameConvertFunc qConvertFuncs[QVideoFrame::NPixelFormats] = { /* Format_YUYV */ qt_convert_YUYV_to_ARGB32, /* Format_NV12 */ qt_convert_NV12_to_ARGB32, /* Format_NV21 */ qt_convert_NV21_to_ARGB32, - /* Format_IMC1 */ Q_NULLPTR, - /* Format_IMC2 */ Q_NULLPTR, - /* Format_IMC3 */ Q_NULLPTR, - /* Format_IMC4 */ Q_NULLPTR, - /* Format_Y8 */ Q_NULLPTR, - /* Format_Y16 */ Q_NULLPTR, - /* Format_Jpeg */ Q_NULLPTR, // Not needed - /* Format_CameraRaw */ Q_NULLPTR, - /* Format_AdobeDng */ Q_NULLPTR + /* Format_IMC1 */ nullptr, + /* Format_IMC2 */ nullptr, + /* Format_IMC3 */ nullptr, + /* Format_IMC4 */ nullptr, + /* Format_Y8 */ nullptr, + /* Format_Y16 */ nullptr, + /* Format_Jpeg */ nullptr, // Not needed + /* Format_CameraRaw */ nullptr, + /* Format_AdobeDng */ nullptr }; static void qInitConvertFuncsAsm() diff --git a/src/multimedia/video/qvideoprobe.h b/src/multimedia/video/qvideoprobe.h index 854e71272..93ba4d2f5 100644 --- a/src/multimedia/video/qvideoprobe.h +++ b/src/multimedia/video/qvideoprobe.h @@ -53,7 +53,7 @@ class Q_MULTIMEDIA_EXPORT QVideoProbe : public QObject { Q_OBJECT public: - explicit QVideoProbe(QObject *parent = Q_NULLPTR); + explicit QVideoProbe(QObject *parent = nullptr); ~QVideoProbe(); bool setSource(QMediaObject *source); diff --git a/src/multimedia/video/qvideosurfaceformat.cpp b/src/multimedia/video/qvideosurfaceformat.cpp index c31c52ff7..384ab4e53 100644 --- a/src/multimedia/video/qvideosurfaceformat.cpp +++ b/src/multimedia/video/qvideosurfaceformat.cpp @@ -450,6 +450,35 @@ void QVideoSurfaceFormat::setYCbCrColorSpace(QVideoSurfaceFormat::YCbCrColorSpac } /*! + Returns \c true if the surface is mirrored around its vertical axis. + This is typically needed for video frames coming from a front camera of a mobile device. + + \note The mirroring here differs from QImage::mirrored, as a vertically mirrored QImage + will be mirrored around its x-axis. + + \since 5.11 + */ +bool QVideoSurfaceFormat::isMirrored() const +{ + return d->mirrored; +} + +/*! + Sets if the surface is mirrored around its vertical axis. + This is typically needed for video frames coming from a front camera of a mobile device. + Default value is false. + + \note The mirroring here differs from QImage::mirrored, as a vertically mirrored QImage + will be mirrored around its x-axis. + + \since 5.11 + */ +void QVideoSurfaceFormat::setMirrored(bool mirrored) +{ + d->mirrored = mirrored; +} + +/*! Returns a suggested size in pixels for the video stream. This is the size of the viewport scaled according to the pixel aspect ratio. diff --git a/src/multimedia/video/qvideosurfaceformat.h b/src/multimedia/video/qvideosurfaceformat.h index 83785ac0a..175b199a7 100644 --- a/src/multimedia/video/qvideosurfaceformat.h +++ b/src/multimedia/video/qvideosurfaceformat.h @@ -117,6 +117,9 @@ public: YCbCrColorSpace yCbCrColorSpace() const; void setYCbCrColorSpace(YCbCrColorSpace colorSpace); + bool isMirrored() const; + void setMirrored(bool mirrored); + QSize sizeHint() const; QList<QByteArray> propertyNames() const; diff --git a/src/multimediawidgets/multimediawidgets.pro b/src/multimediawidgets/multimediawidgets.pro index 8e4a78278..57d4194ec 100644 --- a/src/multimediawidgets/multimediawidgets.pro +++ b/src/multimediawidgets/multimediawidgets.pro @@ -28,4 +28,6 @@ qtConfig(graphicsview) { HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS +msvc:lessThan(QMAKE_MSC_VER, 1900): QMAKE_CXXFLAGS += -Zm200 + load(qt_module) diff --git a/src/multimediawidgets/qcameraviewfinder.h b/src/multimediawidgets/qcameraviewfinder.h index 57f20809a..eb0f396cc 100644 --- a/src/multimediawidgets/qcameraviewfinder.h +++ b/src/multimediawidgets/qcameraviewfinder.h @@ -61,7 +61,7 @@ class Q_MULTIMEDIAWIDGETS_EXPORT QCameraViewfinder : public QVideoWidget { Q_OBJECT public: - explicit QCameraViewfinder(QWidget *parent = Q_NULLPTR); + explicit QCameraViewfinder(QWidget *parent = nullptr); ~QCameraViewfinder(); QMediaObject *mediaObject() const override; diff --git a/src/multimediawidgets/qgraphicsvideoitem.cpp b/src/multimediawidgets/qgraphicsvideoitem.cpp index 584cb429a..002fc2cc2 100644 --- a/src/multimediawidgets/qgraphicsvideoitem.cpp +++ b/src/multimediawidgets/qgraphicsvideoitem.cpp @@ -254,7 +254,7 @@ bool QGraphicsVideoItem::setMediaObject(QMediaObject *object) d->rendererControl = qobject_cast<QVideoRendererControl *>(control); if (d->rendererControl) { - //don't set the surface untill the item is painted + //don't set the surface until the item is painted //at least once and the surface is configured if (!d->updatePaintDevice) d->rendererControl->setSurface(d->surface); diff --git a/src/multimediawidgets/qgraphicsvideoitem.h b/src/multimediawidgets/qgraphicsvideoitem.h index 4a86d4412..3902389d9 100644 --- a/src/multimediawidgets/qgraphicsvideoitem.h +++ b/src/multimediawidgets/qgraphicsvideoitem.h @@ -61,7 +61,7 @@ class Q_MULTIMEDIAWIDGETS_EXPORT QGraphicsVideoItem : public QGraphicsObject, pu Q_PROPERTY(QSizeF size READ size WRITE setSize) Q_PROPERTY(QSizeF nativeSize READ nativeSize NOTIFY nativeSizeChanged) public: - explicit QGraphicsVideoItem(QGraphicsItem *parent = Q_NULLPTR); + explicit QGraphicsVideoItem(QGraphicsItem *parent = nullptr); ~QGraphicsVideoItem(); QMediaObject *mediaObject() const override; @@ -79,7 +79,7 @@ public: QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = Q_NULLPTR) override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; Q_SIGNALS: void nativeSizeChanged(const QSizeF &size); diff --git a/src/multimediawidgets/qpaintervideosurface.cpp b/src/multimediawidgets/qpaintervideosurface.cpp index 214e5ec7e..0147690e1 100644 --- a/src/multimediawidgets/qpaintervideosurface.cpp +++ b/src/multimediawidgets/qpaintervideosurface.cpp @@ -191,6 +191,10 @@ QAbstractVideoSurface::Error QVideoSurfaceGenericPainter::paint( m_imageSize.height(), m_frame.bytesPerLine(), m_imageFormat); + // Do not render into ARGB32 images using QPainter. + // Using QImage::Format_ARGB32_Premultiplied is significantly faster. + if (m_imageFormat == QImage::Format_ARGB32) + image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied); const QTransform oldTransform = painter->transform(); QTransform transform = oldTransform; @@ -1250,8 +1254,8 @@ QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::paint( if (scissorTestEnabled) glEnable(GL_SCISSOR_TEST); - const int width = QOpenGLContext::currentContext()->surface()->size().width(); - const int height = QOpenGLContext::currentContext()->surface()->size().height(); + const int width = painter->viewport().width(); + const int height = painter->viewport().height(); const QTransform transform = painter->deviceTransform(); diff --git a/src/multimediawidgets/qvideowidget.cpp b/src/multimediawidgets/qvideowidget.cpp index c43f7a006..9a01c73aa 100644 --- a/src/multimediawidgets/qvideowidget.cpp +++ b/src/multimediawidgets/qvideowidget.cpp @@ -237,10 +237,8 @@ void QRendererVideoWidgetBackend::paintEvent(QPaintEvent *event) QBrush brush = m_widget->palette().window(); - QVector<QRect> rects = borderRegion.rects(); - for (QVector<QRect>::iterator it = rects.begin(), end = rects.end(); it != end; ++it) { - painter.fillRect(*it, brush); - } + for (const QRect &r : borderRegion) + painter.fillRect(r, brush); } if (m_surface->isActive() && m_boundingRect.intersects(event->rect())) { diff --git a/src/multimediawidgets/qvideowidget.h b/src/multimediawidgets/qvideowidget.h index c8474288b..00b160821 100644 --- a/src/multimediawidgets/qvideowidget.h +++ b/src/multimediawidgets/qvideowidget.h @@ -64,7 +64,7 @@ class Q_MULTIMEDIAWIDGETS_EXPORT QVideoWidget : public QWidget, public QMediaBin Q_PROPERTY(int saturation READ saturation WRITE setSaturation NOTIFY saturationChanged) public: - explicit QVideoWidget(QWidget *parent = Q_NULLPTR); + explicit QVideoWidget(QWidget *parent = nullptr); ~QVideoWidget(); QMediaObject *mediaObject() const override; diff --git a/src/multimediawidgets/qvideowidgetcontrol.h b/src/multimediawidgets/qvideowidgetcontrol.h index 7d9423882..c0d177d08 100644 --- a/src/multimediawidgets/qvideowidgetcontrol.h +++ b/src/multimediawidgets/qvideowidgetcontrol.h @@ -85,7 +85,7 @@ Q_SIGNALS: void saturationChanged(int saturation); protected: - explicit QVideoWidgetControl(QObject *parent = Q_NULLPTR); + explicit QVideoWidgetControl(QObject *parent = nullptr); }; #define QVideoWidgetControl_iid "org.qt-project.qt.videowidgetcontrol/5.0" diff --git a/src/plugins/alsa/qalsaaudiooutput.cpp b/src/plugins/alsa/qalsaaudiooutput.cpp index cd97ae85b..ddbe04de9 100644 --- a/src/plugins/alsa/qalsaaudiooutput.cpp +++ b/src/plugins/alsa/qalsaaudiooutput.cpp @@ -316,9 +316,6 @@ bool QAlsaAudioOutput::open() return false; } - if (!QAlsaAudioDeviceInfo::availableDevices(QAudio::AudioOutput).contains(m_device)) - return false; - QString dev; #if SND_LIB_VERSION < 0x1000e // 1.0.14 if (m_device != "default") diff --git a/src/plugins/alsa/qalsaplugin.h b/src/plugins/alsa/qalsaplugin.h index b3c530f88..cebede13b 100644 --- a/src/plugins/alsa/qalsaplugin.h +++ b/src/plugins/alsa/qalsaplugin.h @@ -56,11 +56,11 @@ public: QAlsaPlugin(QObject *parent = 0); ~QAlsaPlugin() {} - QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) Q_DECL_OVERRIDE; + QByteArray defaultDevice(QAudio::Mode mode) const override; + QList<QByteArray> availableDevices(QAudio::Mode mode) const override; + QAbstractAudioInput *createInput(const QByteArray &device) override; + QAbstractAudioOutput *createOutput(const QByteArray &device) override; + QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) override; }; QT_END_NAMESPACE diff --git a/src/plugins/android/jar/bundledjar.pro b/src/plugins/android/jar/bundledjar.pro deleted file mode 100644 index cc76164a7..000000000 --- a/src/plugins/android/jar/bundledjar.pro +++ /dev/null @@ -1,3 +0,0 @@ -TARGET = QtMultimedia-bundled -CONFIG += bundled_jar_file -include(jar.pri) diff --git a/src/plugins/android/jar/distributedjar.pro b/src/plugins/android/jar/distributedjar.pro deleted file mode 100644 index 34724c197..000000000 --- a/src/plugins/android/jar/distributedjar.pro +++ /dev/null @@ -1,2 +0,0 @@ -TARGET = QtMultimedia -include(jar.pri) diff --git a/src/plugins/android/jar/jar.pri b/src/plugins/android/jar/jar.pri deleted file mode 100644 index 5408fb109..000000000 --- a/src/plugins/android/jar/jar.pri +++ /dev/null @@ -1,19 +0,0 @@ -load(qt_build_paths) -CONFIG += java -DESTDIR = $$MODULE_BASE_OUTDIR/jar - -JAVACLASSPATH += $$PWD/src - -JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtCameraListener.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtMediaRecorderListener.java \ - $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceHolderCallback.java - -# install -target.path = $$[QT_INSTALL_PREFIX]/jar -INSTALLS += target - -OTHER_FILES += $$JAVASOURCES diff --git a/src/plugins/android/jar/jar.pro b/src/plugins/android/jar/jar.pro index 6a4fcd389..96e492f63 100644 --- a/src/plugins/android/jar/jar.pro +++ b/src/plugins/android/jar/jar.pro @@ -1,3 +1,21 @@ -TEMPLATE=subdirs -SUBDIRS += distributedjar.pro bundledjar.pro +TARGET = QtMultimedia +load(qt_build_paths) +CONFIG += java +DESTDIR = $$MODULE_BASE_OUTDIR/jar + +JAVACLASSPATH += $$PWD/src + +JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtCameraListener.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtMediaRecorderListener.java \ + $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceHolderCallback.java + +# install +target.path = $$[QT_INSTALL_PREFIX]/jar +INSTALLS += target + +OTHER_FILES += $$JAVASOURCES diff --git a/src/plugins/android/src/common/qandroidvideooutput.h b/src/plugins/android/src/common/qandroidvideooutput.h index 936e4c40b..62a936881 100644 --- a/src/plugins/android/src/common/qandroidvideooutput.h +++ b/src/plugins/android/src/common/qandroidvideooutput.h @@ -93,19 +93,19 @@ class QAndroidTextureVideoOutput : public QAndroidVideoOutput Q_OBJECT public: explicit QAndroidTextureVideoOutput(QObject *parent = 0); - ~QAndroidTextureVideoOutput() Q_DECL_OVERRIDE; + ~QAndroidTextureVideoOutput() override; QAbstractVideoSurface *surface() const; void setSurface(QAbstractVideoSurface *surface); - AndroidSurfaceTexture *surfaceTexture() Q_DECL_OVERRIDE; + AndroidSurfaceTexture *surfaceTexture() override; - bool isReady() Q_DECL_OVERRIDE; - void setVideoSize(const QSize &) Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; + bool isReady() override; + void setVideoSize(const QSize &) override; + void stop() override; + void reset() override; - void customEvent(QEvent *) Q_DECL_OVERRIDE; + void customEvent(QEvent *) override; private Q_SLOTS: void onFrameAvailable(); diff --git a/src/plugins/android/src/mediacapture/qandroidaudioencodersettingscontrol.h b/src/plugins/android/src/mediacapture/qandroidaudioencodersettingscontrol.h index b94964be0..e68bf6ef7 100644 --- a/src/plugins/android/src/mediacapture/qandroidaudioencodersettingscontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidaudioencodersettingscontrol.h @@ -52,11 +52,11 @@ class QAndroidAudioEncoderSettingsControl : public QAudioEncoderSettingsControl public: explicit QAndroidAudioEncoderSettingsControl(QAndroidCaptureSession *session); - QStringList supportedAudioCodecs() const Q_DECL_OVERRIDE; - QString codecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QAudioEncoderSettings audioSettings() const Q_DECL_OVERRIDE; - void setAudioSettings(const QAudioEncoderSettings &settings) Q_DECL_OVERRIDE; + QStringList supportedAudioCodecs() const override; + QString codecDescription(const QString &codecName) const override; + QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const override; + QAudioEncoderSettings audioSettings() const override; + void setAudioSettings(const QAudioEncoderSettings &settings) override; private: QAndroidCaptureSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidcameracapturebufferformatcontrol.h b/src/plugins/android/src/mediacapture/qandroidcameracapturebufferformatcontrol.h index 3572b126d..b27727543 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameracapturebufferformatcontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameracapturebufferformatcontrol.h @@ -50,9 +50,9 @@ class QAndroidCameraCaptureBufferFormatControl : public QCameraCaptureBufferForm public: QAndroidCameraCaptureBufferFormatControl(); - QList<QVideoFrame::PixelFormat> supportedBufferFormats() const Q_DECL_OVERRIDE; - QVideoFrame::PixelFormat bufferFormat() const Q_DECL_OVERRIDE; - void setBufferFormat(QVideoFrame::PixelFormat format) Q_DECL_OVERRIDE; + QList<QVideoFrame::PixelFormat> supportedBufferFormats() const override; + QVideoFrame::PixelFormat bufferFormat() const override; + void setBufferFormat(QVideoFrame::PixelFormat format) override; }; QT_END_NAMESPACE diff --git a/src/plugins/android/src/mediacapture/qandroidcameracapturedestinationcontrol.h b/src/plugins/android/src/mediacapture/qandroidcameracapturedestinationcontrol.h index 656aa2ced..1edfdab12 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameracapturedestinationcontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameracapturedestinationcontrol.h @@ -52,9 +52,9 @@ class QAndroidCameraCaptureDestinationControl : public QCameraCaptureDestination public: explicit QAndroidCameraCaptureDestinationControl(QAndroidCameraSession *session); - bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const Q_DECL_OVERRIDE; - QCameraImageCapture::CaptureDestinations captureDestination() const Q_DECL_OVERRIDE; - void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) Q_DECL_OVERRIDE; + bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const override; + QCameraImageCapture::CaptureDestinations captureDestination() const override; + void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) override; private: QAndroidCameraSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidcameraexposurecontrol.h b/src/plugins/android/src/mediacapture/qandroidcameraexposurecontrol.h index e6b7fda8b..e87e6cd3a 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameraexposurecontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameraexposurecontrol.h @@ -52,12 +52,12 @@ class QAndroidCameraExposureControl : public QCameraExposureControl public: explicit QAndroidCameraExposureControl(QAndroidCameraSession *session); - bool isParameterSupported(ExposureParameter parameter) const Q_DECL_OVERRIDE; - QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const Q_DECL_OVERRIDE; + bool isParameterSupported(ExposureParameter parameter) const override; + QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const override; - QVariant requestedValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - QVariant actualValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - bool setValue(ExposureParameter parameter, const QVariant& value) Q_DECL_OVERRIDE; + QVariant requestedValue(ExposureParameter parameter) const override; + QVariant actualValue(ExposureParameter parameter) const override; + bool setValue(ExposureParameter parameter, const QVariant& value) override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidcameraflashcontrol.h b/src/plugins/android/src/mediacapture/qandroidcameraflashcontrol.h index 7a0015eaf..071c45c72 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameraflashcontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameraflashcontrol.h @@ -52,10 +52,10 @@ class QAndroidCameraFlashControl : public QCameraFlashControl public: explicit QAndroidCameraFlashControl(QAndroidCameraSession *session); - QCameraExposure::FlashModes flashMode() const Q_DECL_OVERRIDE; - void setFlashMode(QCameraExposure::FlashModes mode) Q_DECL_OVERRIDE; - bool isFlashModeSupported(QCameraExposure::FlashModes mode) const Q_DECL_OVERRIDE; - bool isFlashReady() const Q_DECL_OVERRIDE; + QCameraExposure::FlashModes flashMode() const override; + void setFlashMode(QCameraExposure::FlashModes mode) override; + bool isFlashModeSupported(QCameraExposure::FlashModes mode) const override; + bool isFlashReady() const override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.h b/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.h index a3ba089da..9c606cf7d 100644 --- a/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.h @@ -52,15 +52,15 @@ class QAndroidCameraFocusControl : public QCameraFocusControl public: explicit QAndroidCameraFocusControl(QAndroidCameraSession *session); - QCameraFocus::FocusModes focusMode() const Q_DECL_OVERRIDE; - void setFocusMode(QCameraFocus::FocusModes mode) Q_DECL_OVERRIDE; - bool isFocusModeSupported(QCameraFocus::FocusModes mode) const Q_DECL_OVERRIDE; - QCameraFocus::FocusPointMode focusPointMode() const Q_DECL_OVERRIDE; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) Q_DECL_OVERRIDE; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const Q_DECL_OVERRIDE; - QPointF customFocusPoint() const Q_DECL_OVERRIDE; - void setCustomFocusPoint(const QPointF &point) Q_DECL_OVERRIDE; - QCameraFocusZoneList focusZones() const Q_DECL_OVERRIDE; + QCameraFocus::FocusModes focusMode() const override; + void setFocusMode(QCameraFocus::FocusModes mode) override; + bool isFocusModeSupported(QCameraFocus::FocusModes mode) const override; + QCameraFocus::FocusPointMode focusPointMode() const override; + void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; + bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; + QPointF customFocusPoint() const override; + void setCustomFocusPoint(const QPointF &point) override; + QCameraFocusZoneList focusZones() const override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidcameraimagecapturecontrol.h b/src/plugins/android/src/mediacapture/qandroidcameraimagecapturecontrol.h index 720eed748..cfe748c39 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameraimagecapturecontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameraimagecapturecontrol.h @@ -52,13 +52,13 @@ class QAndroidCameraImageCaptureControl : public QCameraImageCaptureControl public: explicit QAndroidCameraImageCaptureControl(QAndroidCameraSession *session); - bool isReadyForCapture() const Q_DECL_OVERRIDE; + bool isReadyForCapture() const override; - QCameraImageCapture::DriveMode driveMode() const Q_DECL_OVERRIDE; - void setDriveMode(QCameraImageCapture::DriveMode mode) Q_DECL_OVERRIDE; + QCameraImageCapture::DriveMode driveMode() const override; + void setDriveMode(QCameraImageCapture::DriveMode mode) override; - int capture(const QString &fileName) Q_DECL_OVERRIDE; - void cancelCapture() Q_DECL_OVERRIDE; + int capture(const QString &fileName) override; + void cancelCapture() override; private: QAndroidCameraSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidcameraimageprocessingcontrol.h b/src/plugins/android/src/mediacapture/qandroidcameraimageprocessingcontrol.h index 8a750864a..9845c80dc 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameraimageprocessingcontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameraimageprocessingcontrol.h @@ -52,10 +52,10 @@ class QAndroidCameraImageProcessingControl : public QCameraImageProcessingContro public: explicit QAndroidCameraImageProcessingControl(QAndroidCameraSession *session); - bool isParameterSupported(ProcessingParameter) const Q_DECL_OVERRIDE; - bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const Q_DECL_OVERRIDE; - QVariant parameter(ProcessingParameter parameter) const Q_DECL_OVERRIDE; - void setParameter(ProcessingParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; + bool isParameterSupported(ProcessingParameter) const override; + bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const override; + QVariant parameter(ProcessingParameter parameter) const override; + void setParameter(ProcessingParameter parameter, const QVariant &value) override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidcameralockscontrol.h b/src/plugins/android/src/mediacapture/qandroidcameralockscontrol.h index e0a224b6e..149da0f32 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameralockscontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameralockscontrol.h @@ -53,10 +53,10 @@ class QAndroidCameraLocksControl : public QCameraLocksControl public: explicit QAndroidCameraLocksControl(QAndroidCameraSession *session); - QCamera::LockTypes supportedLocks() const Q_DECL_OVERRIDE; - QCamera::LockStatus lockStatus(QCamera::LockType lock) const Q_DECL_OVERRIDE; - void searchAndLock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; - void unlock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; + QCamera::LockTypes supportedLocks() const override; + QCamera::LockStatus lockStatus(QCamera::LockType lock) const override; + void searchAndLock(QCamera::LockTypes locks) override; + void unlock(QCamera::LockTypes locks) override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.cpp b/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.cpp index 64b9e7e32..2243df732 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.cpp @@ -56,13 +56,13 @@ class QAndroidCameraDataVideoOutput : public QAndroidVideoOutput Q_OBJECT public: explicit QAndroidCameraDataVideoOutput(QAndroidCameraVideoRendererControl *control); - ~QAndroidCameraDataVideoOutput() Q_DECL_OVERRIDE; + ~QAndroidCameraDataVideoOutput() override; - AndroidSurfaceHolder *surfaceHolder() Q_DECL_OVERRIDE; + AndroidSurfaceHolder *surfaceHolder() override; - bool isReady() Q_DECL_OVERRIDE; + bool isReady() override; - void stop() Q_DECL_OVERRIDE; + void stop() override; private Q_SLOTS: void onSurfaceCreated(); @@ -108,7 +108,7 @@ QAndroidCameraDataVideoOutput::QAndroidCameraDataVideoOutput(QAndroidCameraVideo QAndroidCameraDataVideoOutput::~QAndroidCameraDataVideoOutput() { - m_control->cameraSession()->setPreviewCallback(Q_NULLPTR); + m_control->cameraSession()->setPreviewCallback(nullptr); delete m_surfaceView; } @@ -146,7 +146,7 @@ void QAndroidCameraDataVideoOutput::configureFormat() } if (m_pixelFormat == QVideoFrame::Format_Invalid) { - m_control->cameraSession()->setPreviewCallback(Q_NULLPTR); + m_control->cameraSession()->setPreviewCallback(nullptr); qWarning("The video surface is not compatible with any format supported by the camera"); } else { m_control->cameraSession()->setPreviewCallback(this); diff --git a/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.h b/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.h index a5c3c0d34..538226239 100644 --- a/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcameravideorenderercontrol.h @@ -53,10 +53,10 @@ class QAndroidCameraVideoRendererControl : public QVideoRendererControl Q_OBJECT public: QAndroidCameraVideoRendererControl(QAndroidCameraSession *session, QObject *parent = 0); - ~QAndroidCameraVideoRendererControl() Q_DECL_OVERRIDE; + ~QAndroidCameraVideoRendererControl() override; - QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; - void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; QAndroidCameraSession *cameraSession() const { return m_cameraSession; } diff --git a/src/plugins/android/src/mediacapture/qandroidcamerazoomcontrol.h b/src/plugins/android/src/mediacapture/qandroidcamerazoomcontrol.h index 770ad659a..96fc4f77b 100644 --- a/src/plugins/android/src/mediacapture/qandroidcamerazoomcontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidcamerazoomcontrol.h @@ -53,13 +53,13 @@ class QAndroidCameraZoomControl : public QCameraZoomControl public: explicit QAndroidCameraZoomControl(QAndroidCameraSession *session); - qreal maximumOpticalZoom() const Q_DECL_OVERRIDE; - qreal maximumDigitalZoom() const Q_DECL_OVERRIDE; - qreal requestedOpticalZoom() const Q_DECL_OVERRIDE; - qreal requestedDigitalZoom() const Q_DECL_OVERRIDE; - qreal currentOpticalZoom() const Q_DECL_OVERRIDE; - qreal currentDigitalZoom() const Q_DECL_OVERRIDE; - void zoomTo(qreal optical, qreal digital) Q_DECL_OVERRIDE; + qreal maximumOpticalZoom() const override; + qreal maximumDigitalZoom() const override; + qreal requestedOpticalZoom() const override; + qreal requestedDigitalZoom() const override; + qreal currentOpticalZoom() const override; + qreal currentDigitalZoom() const override; + void zoomTo(qreal optical, qreal digital) override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidimageencodercontrol.h b/src/plugins/android/src/mediacapture/qandroidimageencodercontrol.h index 36e10024e..52f602e78 100644 --- a/src/plugins/android/src/mediacapture/qandroidimageencodercontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidimageencodercontrol.h @@ -52,11 +52,11 @@ class QAndroidImageEncoderControl : public QImageEncoderControl public: explicit QAndroidImageEncoderControl(QAndroidCameraSession *session); - QStringList supportedImageCodecs() const Q_DECL_OVERRIDE; - QString imageCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QImageEncoderSettings imageSettings() const Q_DECL_OVERRIDE; - void setImageSettings(const QImageEncoderSettings &settings) Q_DECL_OVERRIDE; + QStringList supportedImageCodecs() const override; + QString imageCodecDescription(const QString &codecName) const override; + QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const override; + QImageEncoderSettings imageSettings() const override; + void setImageSettings(const QImageEncoderSettings &settings) override; private Q_SLOTS: void onCameraOpened(); diff --git a/src/plugins/android/src/mediacapture/qandroidmediacontainercontrol.h b/src/plugins/android/src/mediacapture/qandroidmediacontainercontrol.h index 35c715072..1d90fb6cd 100644 --- a/src/plugins/android/src/mediacapture/qandroidmediacontainercontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidmediacontainercontrol.h @@ -52,10 +52,10 @@ class QAndroidMediaContainerControl : public QMediaContainerControl public: QAndroidMediaContainerControl(QAndroidCaptureSession *session); - QStringList supportedContainers() const Q_DECL_OVERRIDE; - QString containerFormat() const Q_DECL_OVERRIDE; - void setContainerFormat(const QString &format) Q_DECL_OVERRIDE; - QString containerDescription(const QString &formatMimeType) const Q_DECL_OVERRIDE; + QStringList supportedContainers() const override; + QString containerFormat() const override; + void setContainerFormat(const QString &format) override; + QString containerDescription(const QString &formatMimeType) const override; private: QAndroidCaptureSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidmediarecordercontrol.h b/src/plugins/android/src/mediacapture/qandroidmediarecordercontrol.h index 187a0f944..6da59a50d 100644 --- a/src/plugins/android/src/mediacapture/qandroidmediarecordercontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidmediarecordercontrol.h @@ -52,19 +52,19 @@ class QAndroidMediaRecorderControl : public QMediaRecorderControl public: explicit QAndroidMediaRecorderControl(QAndroidCaptureSession *session); - QUrl outputLocation() const Q_DECL_OVERRIDE; - bool setOutputLocation(const QUrl &location) Q_DECL_OVERRIDE; - QMediaRecorder::State state() const Q_DECL_OVERRIDE; - QMediaRecorder::Status status() const Q_DECL_OVERRIDE; - qint64 duration() const Q_DECL_OVERRIDE; - bool isMuted() const Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; - void applySettings() Q_DECL_OVERRIDE; + QUrl outputLocation() const override; + bool setOutputLocation(const QUrl &location) override; + QMediaRecorder::State state() const override; + QMediaRecorder::Status status() const override; + qint64 duration() const override; + bool isMuted() const override; + qreal volume() const override; + void applySettings() override; public Q_SLOTS: - void setState(QMediaRecorder::State state) Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; - void setVolume(qreal volume) Q_DECL_OVERRIDE; + void setState(QMediaRecorder::State state) override; + void setMuted(bool muted) override; + void setVolume(qreal volume) override; private: QAndroidCaptureSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidvideoencodersettingscontrol.h b/src/plugins/android/src/mediacapture/qandroidvideoencodersettingscontrol.h index 91f84500e..146b44ac4 100644 --- a/src/plugins/android/src/mediacapture/qandroidvideoencodersettingscontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidvideoencodersettingscontrol.h @@ -52,12 +52,12 @@ class QAndroidVideoEncoderSettingsControl : public QVideoEncoderSettingsControl public: explicit QAndroidVideoEncoderSettingsControl(QAndroidCaptureSession *session); - QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QStringList supportedVideoCodecs() const Q_DECL_OVERRIDE; - QString videoCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QVideoEncoderSettings videoSettings() const Q_DECL_OVERRIDE; - void setVideoSettings(const QVideoEncoderSettings &settings) Q_DECL_OVERRIDE; + QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous = 0) const override; + QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous = 0) const override; + QStringList supportedVideoCodecs() const override; + QString videoCodecDescription(const QString &codecName) const override; + QVideoEncoderSettings videoSettings() const override; + void setVideoSettings(const QVideoEncoderSettings &settings) override; private: QAndroidCaptureSession *m_session; diff --git a/src/plugins/android/src/mediacapture/qandroidviewfindersettingscontrol.h b/src/plugins/android/src/mediacapture/qandroidviewfindersettingscontrol.h index 79ebf3fc2..c7863a144 100644 --- a/src/plugins/android/src/mediacapture/qandroidviewfindersettingscontrol.h +++ b/src/plugins/android/src/mediacapture/qandroidviewfindersettingscontrol.h @@ -58,9 +58,9 @@ class QAndroidViewfinderSettingsControl2 : public QCameraViewfinderSettingsContr public: explicit QAndroidViewfinderSettingsControl2(QAndroidCameraSession *session); - QList<QCameraViewfinderSettings> supportedViewfinderSettings() const Q_DECL_OVERRIDE; - QCameraViewfinderSettings viewfinderSettings() const Q_DECL_OVERRIDE; - void setViewfinderSettings(const QCameraViewfinderSettings &settings) Q_DECL_OVERRIDE; + QList<QCameraViewfinderSettings> supportedViewfinderSettings() const override; + QCameraViewfinderSettings viewfinderSettings() const override; + void setViewfinderSettings(const QCameraViewfinderSettings &settings) override; private: QAndroidCameraSession *m_cameraSession; diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h index d6ec63af8..04f728a59 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h @@ -54,24 +54,24 @@ class QAndroidMediaPlayerControl : public QMediaPlayerControl Q_OBJECT public: explicit QAndroidMediaPlayerControl(QObject *parent = 0); - ~QAndroidMediaPlayerControl() Q_DECL_OVERRIDE; + ~QAndroidMediaPlayerControl() override; - QMediaPlayer::State state() const Q_DECL_OVERRIDE; - QMediaPlayer::MediaStatus mediaStatus() const Q_DECL_OVERRIDE; - qint64 duration() const Q_DECL_OVERRIDE; - qint64 position() const Q_DECL_OVERRIDE; - int volume() const Q_DECL_OVERRIDE; - bool isMuted() const Q_DECL_OVERRIDE; - int bufferStatus() const Q_DECL_OVERRIDE; - bool isAudioAvailable() const Q_DECL_OVERRIDE; - bool isVideoAvailable() const Q_DECL_OVERRIDE; - bool isSeekable() const Q_DECL_OVERRIDE; - QMediaTimeRange availablePlaybackRanges() const Q_DECL_OVERRIDE; - qreal playbackRate() const Q_DECL_OVERRIDE; - void setPlaybackRate(qreal rate) Q_DECL_OVERRIDE; - QMediaContent media() const Q_DECL_OVERRIDE; - const QIODevice *mediaStream() const Q_DECL_OVERRIDE; - void setMedia(const QMediaContent &mediaContent, QIODevice *stream) Q_DECL_OVERRIDE; + QMediaPlayer::State state() const override; + QMediaPlayer::MediaStatus mediaStatus() const override; + qint64 duration() const override; + qint64 position() const override; + int volume() const override; + bool isMuted() const override; + int bufferStatus() const override; + bool isAudioAvailable() const override; + bool isVideoAvailable() const override; + bool isSeekable() const override; + QMediaTimeRange availablePlaybackRanges() const override; + qreal playbackRate() const override; + void setPlaybackRate(qreal rate) override; + QMediaContent media() const override; + const QIODevice *mediaStream() const override; + void setMedia(const QMediaContent &mediaContent, QIODevice *stream) override; void setVideoOutput(QAndroidVideoOutput *videoOutput); @@ -79,12 +79,12 @@ Q_SIGNALS: void metaDataUpdated(); public Q_SLOTS: - void setPosition(qint64 position) Q_DECL_OVERRIDE; - void play() Q_DECL_OVERRIDE; - void pause() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void setVolume(int volume) Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; + void setPosition(qint64 position) override; + void play() override; + void pause() override; + void stop() override; + void setVolume(int volume) override; + void setMuted(bool muted) override; private Q_SLOTS: void onVideoOutputReady(bool ready); diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayervideorenderercontrol.h b/src/plugins/android/src/mediaplayer/qandroidmediaplayervideorenderercontrol.h index 2f01d986f..ef213cc57 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayervideorenderercontrol.h +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayervideorenderercontrol.h @@ -52,10 +52,10 @@ class QAndroidMediaPlayerVideoRendererControl : public QVideoRendererControl Q_OBJECT public: QAndroidMediaPlayerVideoRendererControl(QAndroidMediaPlayerControl *mediaPlayer, QObject *parent = 0); - ~QAndroidMediaPlayerVideoRendererControl() Q_DECL_OVERRIDE; + ~QAndroidMediaPlayerVideoRendererControl() override; - QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; - void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; private: QAndroidMediaPlayerControl *m_mediaPlayerControl; diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaservice.h b/src/plugins/android/src/mediaplayer/qandroidmediaservice.h index f81078d0f..f78d05ddd 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaservice.h +++ b/src/plugins/android/src/mediaplayer/qandroidmediaservice.h @@ -53,10 +53,10 @@ class QAndroidMediaService : public QMediaService Q_OBJECT public: explicit QAndroidMediaService(QObject *parent = 0); - ~QAndroidMediaService() Q_DECL_OVERRIDE; + ~QAndroidMediaService() override; - QMediaControl* requestControl(const char *name) Q_DECL_OVERRIDE; - void releaseControl(QMediaControl *control) Q_DECL_OVERRIDE; + QMediaControl* requestControl(const char *name) override; + void releaseControl(QMediaControl *control) override; private: QAndroidMediaPlayerControl *mMediaControl; diff --git a/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.h b/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.h index 4354eb54e..f2b1b47f1 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.h +++ b/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.h @@ -53,12 +53,12 @@ class QAndroidMetaDataReaderControl : public QMetaDataReaderControl Q_OBJECT public: explicit QAndroidMetaDataReaderControl(QObject *parent = 0); - ~QAndroidMetaDataReaderControl() Q_DECL_OVERRIDE; + ~QAndroidMetaDataReaderControl() override; - bool isMetaDataAvailable() const Q_DECL_OVERRIDE; + bool isMetaDataAvailable() const override; - QVariant metaData(const QString &key) const Q_DECL_OVERRIDE; - QStringList availableMetaData() const Q_DECL_OVERRIDE; + QVariant metaData(const QString &key) const override; + QStringList availableMetaData() const override; public Q_SLOTS: void onMediaChanged(const QMediaContent &media); diff --git a/src/plugins/android/src/qandroidmediaserviceplugin.h b/src/plugins/android/src/qandroidmediaserviceplugin.h index 2ac6f2f14..3ae1a36b6 100644 --- a/src/plugins/android/src/qandroidmediaserviceplugin.h +++ b/src/plugins/android/src/qandroidmediaserviceplugin.h @@ -63,17 +63,17 @@ public: QAndroidMediaServicePlugin(); ~QAndroidMediaServicePlugin(); - QMediaService* create(QString const& key) Q_DECL_OVERRIDE; - void release(QMediaService *service) Q_DECL_OVERRIDE; + QMediaService* create(QString const& key) override; + void release(QMediaService *service) override; - QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const Q_DECL_OVERRIDE; + QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const override; - QByteArray defaultDevice(const QByteArray &service) const Q_DECL_OVERRIDE; - QList<QByteArray> devices(const QByteArray &service) const Q_DECL_OVERRIDE; - QString deviceDescription(const QByteArray &service, const QByteArray &device) Q_DECL_OVERRIDE; + QByteArray defaultDevice(const QByteArray &service) const override; + QList<QByteArray> devices(const QByteArray &service) const override; + QString deviceDescription(const QByteArray &service, const QByteArray &device) override; - QCamera::Position cameraPosition(const QByteArray &device) const Q_DECL_OVERRIDE; - int cameraOrientation(const QByteArray &device) const Q_DECL_OVERRIDE; + QCamera::Position cameraPosition(const QByteArray &device) const override; + int cameraOrientation(const QByteArray &device) const override; }; QT_END_NAMESPACE diff --git a/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h b/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h index 3d81d6294..4ba987e53 100644 --- a/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h +++ b/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h @@ -54,11 +54,11 @@ class AVFAudioEncoderSettingsControl : public QAudioEncoderSettingsControl public: explicit AVFAudioEncoderSettingsControl(AVFCameraService *service); - QStringList supportedAudioCodecs() const Q_DECL_OVERRIDE; - QString codecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QAudioEncoderSettings audioSettings() const Q_DECL_OVERRIDE; - void setAudioSettings(const QAudioEncoderSettings &settings) Q_DECL_OVERRIDE; + QStringList supportedAudioCodecs() const override; + QString codecDescription(const QString &codecName) const override; + QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const override; + QAudioEncoderSettings audioSettings() const override; + void setAudioSettings(const QAudioEncoderSettings &settings) override; NSDictionary *applySettings(); void unapplySettings(); diff --git a/src/plugins/avfoundation/camera/avfcameraexposurecontrol.h b/src/plugins/avfoundation/camera/avfcameraexposurecontrol.h index 30f90208c..0e2846889 100644 --- a/src/plugins/avfoundation/camera/avfcameraexposurecontrol.h +++ b/src/plugins/avfoundation/camera/avfcameraexposurecontrol.h @@ -57,13 +57,13 @@ class AVFCameraExposureControl : public QCameraExposureControl public: AVFCameraExposureControl(AVFCameraService *service); - bool isParameterSupported(ExposureParameter parameter) const Q_DECL_OVERRIDE; + bool isParameterSupported(ExposureParameter parameter) const override; QVariantList supportedParameterRange(ExposureParameter parameter, - bool *continuous) const Q_DECL_OVERRIDE; + bool *continuous) const override; - QVariant requestedValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - QVariant actualValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - bool setValue(ExposureParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; + QVariant requestedValue(ExposureParameter parameter) const override; + QVariant actualValue(ExposureParameter parameter) const override; + bool setValue(ExposureParameter parameter, const QVariant &value) override; private Q_SLOTS: void cameraStateChanged(); diff --git a/src/plugins/avfoundation/camera/avfcameraexposurecontrol.mm b/src/plugins/avfoundation/camera/avfcameraexposurecontrol.mm index 591854204..7540ab86c 100644 --- a/src/plugins/avfoundation/camera/avfcameraexposurecontrol.mm +++ b/src/plugins/avfoundation/camera/avfcameraexposurecontrol.mm @@ -56,10 +56,9 @@ QT_BEGIN_NAMESPACE namespace { -// All these methods to work with exposure/ISO/SS in custom mode -// are quite new (iOS 8 or later and no OS X support). +// All these methods to work with exposure/ISO/SS in custom mode do not support macOS. -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS // Misc. helpers to check values/ranges: @@ -213,13 +212,13 @@ void qt_set_duration_iso(QPointer<AVFCameraService> service, QPointer<AVFCameraE completionHandler:completionHandler]; } -#endif // QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#endif // defined(Q_OS_IOS) } // Unnamed namespace. AVFCameraExposureControl::AVFCameraExposureControl(AVFCameraService *service) : m_service(service), - m_session(Q_NULLPTR) + m_session(nullptr) { Q_ASSERT(service); m_session = m_service->session(); @@ -230,7 +229,7 @@ AVFCameraExposureControl::AVFCameraExposureControl(AVFCameraService *service) bool AVFCameraExposureControl::isParameterSupported(ExposureParameter parameter) const { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); if (!captureDevice) return false; @@ -250,7 +249,7 @@ QVariantList AVFCameraExposureControl::supportedParameterRange(ExposureParameter bool *continuous) const { QVariantList parameterRange; -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); if (!captureDevice || !isParameterSupported(parameter)) { @@ -333,7 +332,7 @@ QVariant AVFCameraExposureControl::requestedValue(ExposureParameter parameter) c QVariant AVFCameraExposureControl::actualValue(ExposureParameter parameter) const { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); if (!captureDevice || !isParameterSupported(parameter)) { // Actually, at the moment !captiredevice => !isParameterSupported. @@ -386,7 +385,7 @@ bool AVFCameraExposureControl::setValue(ExposureParameter parameter, const QVari bool AVFCameraExposureControl::setExposureMode(const QVariant &value) { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS if (!value.canConvert<QCameraExposure::ExposureMode>()) { qDebugCamera() << Q_FUNC_INFO << "invalid exposure mode value," << "QCameraExposure::ExposureMode expected"; @@ -433,7 +432,7 @@ bool AVFCameraExposureControl::setExposureMode(const QVariant &value) bool AVFCameraExposureControl::setExposureCompensation(const QVariant &value) { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS if (!value.canConvert<qreal>()) { qDebugCamera() << Q_FUNC_INFO << "invalid exposure compensation" <<"value, floating point number expected"; @@ -474,7 +473,7 @@ bool AVFCameraExposureControl::setExposureCompensation(const QVariant &value) bool AVFCameraExposureControl::setShutterSpeed(const QVariant &value) { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS if (value.isNull()) return setExposureMode(QVariant::fromValue(QCameraExposure::ExposureAuto)); @@ -521,7 +520,7 @@ bool AVFCameraExposureControl::setShutterSpeed(const QVariant &value) bool AVFCameraExposureControl::setISO(const QVariant &value) { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS if (value.isNull()) return setExposureMode(QVariant::fromValue(QCameraExposure::ExposureAuto)); @@ -565,7 +564,7 @@ bool AVFCameraExposureControl::setISO(const QVariant &value) void AVFCameraExposureControl::cameraStateChanged() { -#if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) +#ifdef Q_OS_IOS if (m_session->state() != QCamera::ActiveState) return; diff --git a/src/plugins/avfoundation/camera/avfcameraflashcontrol.h b/src/plugins/avfoundation/camera/avfcameraflashcontrol.h index f8a11a821..58403e829 100644 --- a/src/plugins/avfoundation/camera/avfcameraflashcontrol.h +++ b/src/plugins/avfoundation/camera/avfcameraflashcontrol.h @@ -56,10 +56,10 @@ class AVFCameraFlashControl : public QCameraFlashControl public: AVFCameraFlashControl(AVFCameraService *service); - QCameraExposure::FlashModes flashMode() const Q_DECL_OVERRIDE; - void setFlashMode(QCameraExposure::FlashModes mode) Q_DECL_OVERRIDE; - bool isFlashModeSupported(QCameraExposure::FlashModes mode) const Q_DECL_OVERRIDE; - bool isFlashReady() const Q_DECL_OVERRIDE; + QCameraExposure::FlashModes flashMode() const override; + void setFlashMode(QCameraExposure::FlashModes mode) override; + bool isFlashModeSupported(QCameraExposure::FlashModes mode) const override; + bool isFlashReady() const override; private Q_SLOTS: void cameraStateChanged(QCamera::State newState); diff --git a/src/plugins/avfoundation/camera/avfcamerafocuscontrol.h b/src/plugins/avfoundation/camera/avfcamerafocuscontrol.h index 9d8b7a5ab..26135e534 100644 --- a/src/plugins/avfoundation/camera/avfcamerafocuscontrol.h +++ b/src/plugins/avfoundation/camera/avfcamerafocuscontrol.h @@ -58,17 +58,17 @@ class AVFCameraFocusControl : public QCameraFocusControl public: explicit AVFCameraFocusControl(AVFCameraService *service); - QCameraFocus::FocusModes focusMode() const Q_DECL_OVERRIDE; - void setFocusMode(QCameraFocus::FocusModes mode) Q_DECL_OVERRIDE; - bool isFocusModeSupported(QCameraFocus::FocusModes mode) const Q_DECL_OVERRIDE; + QCameraFocus::FocusModes focusMode() const override; + void setFocusMode(QCameraFocus::FocusModes mode) override; + bool isFocusModeSupported(QCameraFocus::FocusModes mode) const override; - QCameraFocus::FocusPointMode focusPointMode() const Q_DECL_OVERRIDE; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) Q_DECL_OVERRIDE; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const Q_DECL_OVERRIDE; - QPointF customFocusPoint() const Q_DECL_OVERRIDE; - void setCustomFocusPoint(const QPointF &point) Q_DECL_OVERRIDE; + QCameraFocus::FocusPointMode focusPointMode() const override; + void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; + bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; + QPointF customFocusPoint() const override; + void setCustomFocusPoint(const QPointF &point) override; - QCameraFocusZoneList focusZones() const Q_DECL_OVERRIDE; + QCameraFocusZoneList focusZones() const override; private Q_SLOTS: void cameraStateChanged(); diff --git a/src/plugins/avfoundation/camera/avfcameraservice.mm b/src/plugins/avfoundation/camera/avfcameraservice.mm index 7fd04250e..71ea31e5b 100644 --- a/src/plugins/avfoundation/camera/avfcameraservice.mm +++ b/src/plugins/avfoundation/camera/avfcameraservice.mm @@ -37,7 +37,6 @@ ** ****************************************************************************/ -#include <QtCore/qoperatingsystemversion.h> #include <QtCore/qvariant.h> #include <QtCore/qdebug.h> @@ -95,9 +94,8 @@ AVFCameraService::AVFCameraService(QObject *parent): m_imageCaptureControl = new AVFImageCaptureControl(this); m_cameraFocusControl = new AVFCameraFocusControl(this); m_cameraExposureControl = 0; -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) - m_cameraExposureControl = new AVFCameraExposureControl(this); +#ifdef Q_OS_IOS + m_cameraExposureControl = new AVFCameraExposureControl(this); #endif m_cameraZoomControl = 0; diff --git a/src/plugins/avfoundation/camera/avfcamerautility.mm b/src/plugins/avfoundation/camera/avfcamerautility.mm index b864162a3..8a2254c2e 100644 --- a/src/plugins/avfoundation/camera/avfcamerautility.mm +++ b/src/plugins/avfoundation/camera/avfcamerautility.mm @@ -40,7 +40,6 @@ #include "avfcamerautility.h" #include "avfcameradebug.h" -#include <QtCore/qoperatingsystemversion.h> #include <QtCore/qvector.h> #include <QtCore/qpair.h> #include <private/qmultimediautils_p.h> @@ -180,12 +179,10 @@ QSize qt_device_format_high_resolution(AVCaptureDeviceFormat *format) { Q_ASSERT(format); QSize res; -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) { - const CMVideoDimensions hrDim(format.highResolutionStillImageDimensions); - res.setWidth(hrDim.width); - res.setHeight(hrDim.height); - } +#if defined(Q_OS_IOS) + const CMVideoDimensions hrDim(format.highResolutionStillImageDimensions); + res.setWidth(hrDim.width); + res.setHeight(hrDim.height); #endif return res; } diff --git a/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.h b/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.h index bed755339..588aa7b74 100644 --- a/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.h +++ b/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.h @@ -67,9 +67,9 @@ class AVFCameraViewfinderSettingsControl2 : public QCameraViewfinderSettingsCont public: AVFCameraViewfinderSettingsControl2(AVFCameraService *service); - QList<QCameraViewfinderSettings> supportedViewfinderSettings() const Q_DECL_OVERRIDE; - QCameraViewfinderSettings viewfinderSettings() const Q_DECL_OVERRIDE; - void setViewfinderSettings(const QCameraViewfinderSettings &settings) Q_DECL_OVERRIDE; + QList<QCameraViewfinderSettings> supportedViewfinderSettings() const override; + QCameraViewfinderSettings viewfinderSettings() const override; + void setViewfinderSettings(const QCameraViewfinderSettings &settings) override; // "Converters": static QVideoFrame::PixelFormat QtPixelFormatFromCVFormat(unsigned avPixelFormat); @@ -97,9 +97,9 @@ class AVFCameraViewfinderSettingsControl : public QCameraViewfinderSettingsContr public: AVFCameraViewfinderSettingsControl(AVFCameraService *service); - bool isViewfinderParameterSupported(ViewfinderParameter parameter) const Q_DECL_OVERRIDE; - QVariant viewfinderParameter(ViewfinderParameter parameter) const Q_DECL_OVERRIDE; - void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; + bool isViewfinderParameterSupported(ViewfinderParameter parameter) const override; + QVariant viewfinderParameter(ViewfinderParameter parameter) const override; + void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) override; private: void setResolution(const QVariant &resolution); diff --git a/src/plugins/avfoundation/camera/avfcamerazoomcontrol.h b/src/plugins/avfoundation/camera/avfcamerazoomcontrol.h index 6a460ad59..2307dfc28 100644 --- a/src/plugins/avfoundation/camera/avfcamerazoomcontrol.h +++ b/src/plugins/avfoundation/camera/avfcamerazoomcontrol.h @@ -57,15 +57,15 @@ class AVFCameraZoomControl : public QCameraZoomControl public: AVFCameraZoomControl(AVFCameraService *service); - qreal maximumOpticalZoom() const Q_DECL_OVERRIDE; - qreal maximumDigitalZoom() const Q_DECL_OVERRIDE; + qreal maximumOpticalZoom() const override; + qreal maximumDigitalZoom() const override; - qreal requestedOpticalZoom() const Q_DECL_OVERRIDE; - qreal requestedDigitalZoom() const Q_DECL_OVERRIDE; - qreal currentOpticalZoom() const Q_DECL_OVERRIDE; - qreal currentDigitalZoom() const Q_DECL_OVERRIDE; + qreal requestedOpticalZoom() const override; + qreal requestedDigitalZoom() const override; + qreal currentOpticalZoom() const override; + qreal currentDigitalZoom() const override; - void zoomTo(qreal optical, qreal digital) Q_DECL_OVERRIDE; + void zoomTo(qreal optical, qreal digital) override; private Q_SLOTS: void cameraStateChanged(); diff --git a/src/plugins/avfoundation/camera/avfimageencodercontrol.h b/src/plugins/avfoundation/camera/avfimageencodercontrol.h index 22a6b2722..7e2e34294 100644 --- a/src/plugins/avfoundation/camera/avfimageencodercontrol.h +++ b/src/plugins/avfoundation/camera/avfimageencodercontrol.h @@ -61,12 +61,12 @@ class AVFImageEncoderControl : public QImageEncoderControl public: AVFImageEncoderControl(AVFCameraService *service); - QStringList supportedImageCodecs() const Q_DECL_OVERRIDE; - QString imageCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; + QStringList supportedImageCodecs() const override; + QString imageCodecDescription(const QString &codecName) const override; QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, - bool *continuous) const Q_DECL_OVERRIDE; - QImageEncoderSettings imageSettings() const Q_DECL_OVERRIDE; - void setImageSettings(const QImageEncoderSettings &settings) Q_DECL_OVERRIDE; + bool *continuous) const override; + QImageEncoderSettings imageSettings() const override; + void setImageSettings(const QImageEncoderSettings &settings) override; QImageEncoderSettings requestedSettings() const; diff --git a/src/plugins/avfoundation/camera/avfimageencodercontrol.mm b/src/plugins/avfoundation/camera/avfimageencodercontrol.mm index 8384ce6ae..e858d93c4 100644 --- a/src/plugins/avfoundation/camera/avfimageencodercontrol.mm +++ b/src/plugins/avfoundation/camera/avfimageencodercontrol.mm @@ -48,7 +48,6 @@ #include <QtMultimedia/qmediaencodersettings.h> -#include <QtCore/qoperatingsystemversion.h> #include <QtCore/qdebug.h> #include <AVFoundation/AVFoundation.h> @@ -94,17 +93,15 @@ QList<QSize> AVFImageEncoderControl::supportedResolutions(const QImageEncoderSet const QSize res(qt_device_format_resolution(format)); if (!res.isNull() && res.isValid()) resolutions << res; -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) { - // From Apple's docs (iOS): - // By default, AVCaptureStillImageOutput emits images with the same dimensions as - // its source AVCaptureDevice instance’s activeFormat.formatDescription. However, - // if you set this property to YES, the receiver emits still images at the capture - // device’s highResolutionStillImageDimensions value. - const QSize hrRes(qt_device_format_high_resolution(format)); - if (!hrRes.isNull() && hrRes.isValid()) - resolutions << res; - } +#ifdef Q_OS_IOS + // From Apple's docs (iOS): + // By default, AVCaptureStillImageOutput emits images with the same dimensions as + // its source AVCaptureDevice instance’s activeFormat.formatDescription. However, + // if you set this property to YES, the receiver emits still images at the capture + // device’s highResolutionStillImageDimensions value. + const QSize hrRes(qt_device_format_high_resolution(format)); + if (!hrRes.isNull() && hrRes.isValid()) + resolutions << res; #endif } @@ -133,17 +130,15 @@ QImageEncoderSettings AVFImageEncoderControl::imageSettings() const } QSize res(qt_device_format_resolution(captureDevice.activeFormat)); -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) { - if (!m_service->imageCaptureControl() || !m_service->imageCaptureControl()->stillImageOutput()) { - qDebugCamera() << Q_FUNC_INFO << "no still image output"; - return settings; - } - - AVCaptureStillImageOutput *stillImageOutput = m_service->imageCaptureControl()->stillImageOutput(); - if (stillImageOutput.highResolutionStillImageOutputEnabled) - res = qt_device_format_high_resolution(captureDevice.activeFormat); +#ifdef Q_OS_IOS + if (!m_service->imageCaptureControl() || !m_service->imageCaptureControl()->stillImageOutput()) { + qDebugCamera() << Q_FUNC_INFO << "no still image output"; + return settings; } + + AVCaptureStillImageOutput *stillImageOutput = m_service->imageCaptureControl()->stillImageOutput(); + if (stillImageOutput.highResolutionStillImageOutputEnabled) + res = qt_device_format_high_resolution(captureDevice.activeFormat); #endif if (res.isNull() || !res.isValid()) { qDebugCamera() << Q_FUNC_INFO << "failed to exctract the image resolution"; @@ -217,14 +212,12 @@ bool AVFImageEncoderControl::applySettings() activeFormatChanged = qt_set_active_format(captureDevice, match, true); -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::IOS, 8)) { - AVCaptureStillImageOutput *imageOutput = m_service->imageCaptureControl()->stillImageOutput(); - if (res == qt_device_format_high_resolution(captureDevice.activeFormat)) - imageOutput.highResolutionStillImageOutputEnabled = YES; - else - imageOutput.highResolutionStillImageOutputEnabled = NO; - } +#ifdef Q_OS_IOS + AVCaptureStillImageOutput *imageOutput = m_service->imageCaptureControl()->stillImageOutput(); + if (res == qt_device_format_high_resolution(captureDevice.activeFormat)) + imageOutput.highResolutionStillImageOutputEnabled = YES; + else + imageOutput.highResolutionStillImageOutputEnabled = NO; #endif return activeFormatChanged; diff --git a/src/plugins/avfoundation/camera/avfmediacontainercontrol.h b/src/plugins/avfoundation/camera/avfmediacontainercontrol.h index 45d69f18b..e43e70baf 100644 --- a/src/plugins/avfoundation/camera/avfmediacontainercontrol.h +++ b/src/plugins/avfoundation/camera/avfmediacontainercontrol.h @@ -53,10 +53,10 @@ class AVFMediaContainerControl : public QMediaContainerControl public: explicit AVFMediaContainerControl(AVFCameraService *service); - QStringList supportedContainers() const Q_DECL_OVERRIDE; - QString containerFormat() const Q_DECL_OVERRIDE; - void setContainerFormat(const QString &format) Q_DECL_OVERRIDE; - QString containerDescription(const QString &formatMimeType) const Q_DECL_OVERRIDE; + QStringList supportedContainers() const override; + QString containerFormat() const override; + void setContainerFormat(const QString &format) override; + QString containerDescription(const QString &formatMimeType) const override; NSString *fileType() const; diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h index a0967efa3..8e049a595 100644 --- a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h +++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h @@ -65,24 +65,24 @@ public: AVFMediaRecorderControlIOS(AVFCameraService *service, QObject *parent = 0); ~AVFMediaRecorderControlIOS(); - QUrl outputLocation() const Q_DECL_OVERRIDE; - bool setOutputLocation(const QUrl &location) Q_DECL_OVERRIDE; + QUrl outputLocation() const override; + bool setOutputLocation(const QUrl &location) override; - QMediaRecorder::State state() const Q_DECL_OVERRIDE; - QMediaRecorder::Status status() const Q_DECL_OVERRIDE; + QMediaRecorder::State state() const override; + QMediaRecorder::Status status() const override; - qint64 duration() const Q_DECL_OVERRIDE; + qint64 duration() const override; - bool isMuted() const Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; + bool isMuted() const override; + qreal volume() const override; - void applySettings() Q_DECL_OVERRIDE; + void applySettings() override; void unapplySettings(); public Q_SLOTS: - void setState(QMediaRecorder::State state) Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; - void setVolume(qreal volume) Q_DECL_OVERRIDE; + void setState(QMediaRecorder::State state) override; + void setMuted(bool muted) override; + void setVolume(qreal volume) override; private: diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm index d657dc17d..0b31bd0bc 100644 --- a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm +++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.mm @@ -49,6 +49,7 @@ #include "avfmediacontainercontrol.h" #include "avfcamerautility.h" +#include <QtCore/qmath.h> #include <QtCore/qdebug.h> QT_USE_NAMESPACE @@ -273,14 +274,11 @@ void AVFMediaRecorderControlIOS::setState(QMediaRecorder::State state) else rotation = (screenOrientation + (360 - cameraInfo.orientation)) % 360; - // convert to radians - rotation *= M_PI / 180.f; - if ([m_writer setupWithFileURL:nsFileURL cameraService:m_service audioSettings:m_audioSettings videoSettings:m_videoSettings - transform:CGAffineTransformMakeRotation(rotation)]) { + transform:CGAffineTransformMakeRotation(qDegreesToRadians(rotation))]) { m_state = QMediaRecorder::RecordingState; m_lastStatus = QMediaRecorder::StartingStatus; diff --git a/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h b/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h index 4d90377d5..9bdf5a788 100644 --- a/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h +++ b/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h @@ -59,16 +59,16 @@ public: explicit AVFVideoEncoderSettingsControl(AVFCameraService *service); QList<QSize> supportedResolutions(const QVideoEncoderSettings &requestedVideoSettings, - bool *continuous = 0) const Q_DECL_OVERRIDE; + bool *continuous = 0) const override; QList<qreal> supportedFrameRates(const QVideoEncoderSettings &requestedVideoSettings, - bool *continuous = 0) const Q_DECL_OVERRIDE; + bool *continuous = 0) const override; - QStringList supportedVideoCodecs() const Q_DECL_OVERRIDE; - QString videoCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; + QStringList supportedVideoCodecs() const override; + QString videoCodecDescription(const QString &codecName) const override; - QVideoEncoderSettings videoSettings() const Q_DECL_OVERRIDE; - void setVideoSettings(const QVideoEncoderSettings &requestedVideoSettings) Q_DECL_OVERRIDE; + QVideoEncoderSettings videoSettings() const override; + void setVideoSettings(const QVideoEncoderSettings &requestedVideoSettings) override; NSDictionary *applySettings(AVCaptureConnection *connection); void unapplySettings(AVCaptureConnection *connection); diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm index 5f7bae1c8..bf7ebb4a0 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm @@ -60,6 +60,7 @@ void AVFMediaPlayerControl::setSession(AVFMediaPlayerSession *session) connect(m_session, SIGNAL(positionChanged(qint64)), this, SIGNAL(positionChanged(qint64))); connect(m_session, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64))); + connect(m_session, SIGNAL(bufferStatusChanged(int)), this, SIGNAL(bufferStatusChanged(int))); connect(m_session, SIGNAL(stateChanged(QMediaPlayer::State)), this, SIGNAL(stateChanged(QMediaPlayer::State))); connect(m_session, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h index 9a55b7b74..e20f4a1ec 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h @@ -106,12 +106,15 @@ public Q_SLOTS: void processLoadStateChange(); void processLoadStateFailure(); + void processBufferStateChange(int bufferStatus); + void processDurationChange(qint64 duration); Q_SIGNALS: void positionChanged(qint64 position); void durationChanged(qint64 duration); void stateChanged(QMediaPlayer::State newState); + void bufferStatusChanged(int bufferStatus); void mediaStatusChanged(QMediaPlayer::MediaStatus status); void volumeChanged(int volume); void mutedChanged(bool muted); @@ -179,6 +182,7 @@ private: qint64 m_requestedPosition; qint64 m_duration; + int m_bufferStatus; bool m_videoAvailable; bool m_audioAvailable; bool m_seekable; diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm index b6fe01053..06fb71ef8 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm @@ -52,7 +52,8 @@ static NSString* const AVF_TRACKS_KEY = @"tracks"; static NSString* const AVF_PLAYABLE_KEY = @"playable"; //AVPlayerItem keys -static NSString* const AVF_STATUS_KEY = @"status"; +static NSString* const AVF_STATUS_KEY = @"status"; +static NSString* const AVF_BUFFER_LIKELY_KEEP_UP_KEY = @"playbackLikelyToKeepUp"; //AVPlayer keys static NSString* const AVF_RATE_KEY = @"rate"; @@ -61,6 +62,7 @@ static NSString* const AVF_CURRENT_ITEM_DURATION_KEY = @"currentItem.duration static void *AVFMediaPlayerSessionObserverRateObservationContext = &AVFMediaPlayerSessionObserverRateObservationContext; static void *AVFMediaPlayerSessionObserverStatusObservationContext = &AVFMediaPlayerSessionObserverStatusObservationContext; +static void *AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext = &AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext; static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMediaPlayerSessionObserverCurrentItemObservationContext; static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext = &AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext; @@ -72,6 +74,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext AVPlayerItem *m_playerItem; AVPlayerLayer *m_playerLayer; NSURL *m_URL; + BOOL m_bufferIsLikelyToKeepUp; } @property (readonly, getter=player) AVPlayer* m_player; @@ -102,6 +105,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext return nil; self->m_session = session; + self->m_bufferIsLikelyToKeepUp = FALSE; return self; } @@ -141,6 +145,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext { if (m_playerItem) { [m_playerItem removeObserver:self forKeyPath:AVF_STATUS_KEY]; + [m_playerItem removeObserver:self forKeyPath:AVF_BUFFER_LIKELY_KEEP_UP_KEY]; [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification @@ -219,6 +224,11 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVFMediaPlayerSessionObserverStatusObservationContext]; + [m_playerItem addObserver:self + forKeyPath:AVF_BUFFER_LIKELY_KEEP_UP_KEY + options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew + context:AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext]; + //When the player item has played to its end time we'll toggle //the movie controller Pause button to be the Play button [[NSNotificationCenter defaultCenter] addObserver:self @@ -338,6 +348,15 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext break; } } + else if (context == AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext) + { + const bool isPlaybackLikelyToKeepUp = [m_playerItem isPlaybackLikelyToKeepUp]; + if (isPlaybackLikelyToKeepUp != m_bufferIsLikelyToKeepUp) { + m_bufferIsLikelyToKeepUp = isPlaybackLikelyToKeepUp; + QMetaObject::invokeMethod(m_session, "processBufferStateChange", Qt::AutoConnection, + Q_ARG(int, isPlaybackLikelyToKeepUp ? 100 : 0)); + } + } //AVPlayer "rate" property value observer. else if (context == AVFMediaPlayerSessionObserverRateObservationContext) { @@ -402,6 +421,7 @@ AVFMediaPlayerSession::AVFMediaPlayerSession(AVFMediaPlayerService *service, QOb , m_rate(1.0) , m_requestedPosition(-1) , m_duration(0) + , m_bufferStatus(0) , m_videoAvailable(false) , m_audioAvailable(false) , m_seekable(false) @@ -536,11 +556,10 @@ qint64 AVFMediaPlayerSession::duration() const int AVFMediaPlayerSession::bufferStatus() const { - //BUG: bufferStatus may be relevant? #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif - return 100; + return m_bufferStatus; } int AVFMediaPlayerSession::volume() const @@ -898,6 +917,15 @@ void AVFMediaPlayerSession::processLoadStateFailure() Q_EMIT stateChanged((m_state = QMediaPlayer::StoppedState)); } +void AVFMediaPlayerSession::processBufferStateChange(int bufferStatus) +{ + if (bufferStatus == m_bufferStatus) + return; + + m_bufferStatus = bufferStatus; + Q_EMIT bufferStatusChanged(bufferStatus); +} + void AVFMediaPlayerSession::processDurationChange(qint64 duration) { if (duration == m_duration) diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm index 4952551dc..5727cb0f4 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm +++ b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm @@ -41,6 +41,14 @@ #include <AVFoundation/AVFoundation.h> +#if QT_HAS_INCLUDE(<AppKit/AppKit.h>) +#include <AppKit/AppKit.h> +#endif + +#if QT_HAS_INCLUDE(<UIKit/UIKit.h>) +#include <UIKit/UIKit.h> +#endif + QT_USE_NAMESPACE AVFVideoWindowControl::AVFVideoWindowControl(QObject *parent) diff --git a/src/plugins/common/evr/evrcustompresenter.cpp b/src/plugins/common/evr/evrcustompresenter.cpp index 38e8c3a8f..b07dbe719 100644 --- a/src/plugins/common/evr/evrcustompresenter.cpp +++ b/src/plugins/common/evr/evrcustompresenter.cpp @@ -560,7 +560,6 @@ EVRCustomPresenter::EVRCustomPresenter(QAbstractVideoSurface *surface) , m_mediaType(0) , m_surface(0) , m_canRenderToSurface(false) - , m_sampleToPresent(0) { // Initial source rectangle = (0,0,1,1) m_sourceRect.top = 0; @@ -1351,13 +1350,6 @@ HRESULT EVRCustomPresenter::createOptimalVideoType(IMFMediaType *proposedType, I // Modify the new type. - // Set the pixel aspect ratio (PAR) to 1:1 (see assumption #1, above) - // The ratio is packed in a single UINT64. A helper function is normally available for - // that (MFSetAttributeRatio) but it's not correctly defined in MinGW 4.9.1. - hr = mtOptimal->SetUINT64(MF_MT_PIXEL_ASPECT_RATIO, (((UINT64) 1) << 32) | ((UINT64) 1)); - if (FAILED(hr)) - goto done; - hr = proposedType->GetUINT64(MF_MT_FRAME_SIZE, &size); width = int(HI32(size)); height = int(LO32(size)); diff --git a/src/plugins/common/evr/evrcustompresenter.h b/src/plugins/common/evr/evrcustompresenter.h index 5c240ea95..199dee774 100644 --- a/src/plugins/common/evr/evrcustompresenter.h +++ b/src/plugins/common/evr/evrcustompresenter.h @@ -367,8 +367,6 @@ private: QAbstractVideoSurface *m_surface; bool m_canRenderToSurface; - - IMFSample *m_sampleToPresent; }; bool qt_evr_setCustomPresenter(IUnknown *evr, EVRCustomPresenter *presenter); diff --git a/src/plugins/common/evr/evrd3dpresentengine.cpp b/src/plugins/common/evr/evrd3dpresentengine.cpp index 754faef2d..54403faba 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.cpp +++ b/src/plugins/common/evr/evrd3dpresentengine.cpp @@ -50,7 +50,7 @@ #include <QOffscreenSurface> #ifdef MAYBE_ANGLE -# include <qtgui/qguiapplication.h> +# include <qguiapplication.h> # include <qpa/qplatformnativeinterface.h> # include <qopenglfunctions.h> # include <EGL/eglext.h> @@ -581,6 +581,10 @@ done: : qt_evr_pixelFormatFromD3DFormat(d3dFormat), m_useTextureRendering ? QAbstractVideoBuffer::GLTextureHandle : QAbstractVideoBuffer::NoHandle); + UINT32 horizontal = 1, vertical = 1; + hr = MFGetAttributeRatio(format, MF_MT_PIXEL_ASPECT_RATIO, &horizontal, &vertical); + if (SUCCEEDED(hr)) + m_surfaceFormat.setPixelAspectRatio(horizontal, vertical); } else { releaseResources(); } diff --git a/src/plugins/coreaudio/coreaudioplugin.h b/src/plugins/coreaudio/coreaudioplugin.h index da18d8cfe..5407bdeb9 100644 --- a/src/plugins/coreaudio/coreaudioplugin.h +++ b/src/plugins/coreaudio/coreaudioplugin.h @@ -54,11 +54,11 @@ public: explicit CoreAudioPlugin(QObject *parent = 0); ~CoreAudioPlugin() {} - QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) Q_DECL_OVERRIDE; + QByteArray defaultDevice(QAudio::Mode mode) const override; + QList<QByteArray> availableDevices(QAudio::Mode mode) const override; + QAbstractAudioInput *createInput(const QByteArray &device) override; + QAbstractAudioOutput *createOutput(const QByteArray &device) override; + QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) override; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/camera.pri b/src/plugins/directshow/camera/camera.pri index d8ee59aa9..0e1c1e895 100644 --- a/src/plugins/directshow/camera/camera.pri +++ b/src/plugins/directshow/camera/camera.pri @@ -11,7 +11,11 @@ HEADERS += \ $$PWD/dscamerasession.h \ $$PWD/directshowcameraglobal.h \ $$PWD/dscameraviewfindersettingscontrol.h \ - $$PWD/dscameraimageprocessingcontrol.h + $$PWD/dscameraimageprocessingcontrol.h \ + $$PWD/directshowcameraexposurecontrol.h \ + $$PWD/directshowcameracapturedestinationcontrol.h \ + $$PWD/directshowcameracapturebufferformatcontrol.h \ + $$PWD/directshowcamerazoomcontrol.h SOURCES += \ $$PWD/dscameraservice.cpp \ @@ -21,7 +25,11 @@ SOURCES += \ $$PWD/dsimagecapturecontrol.cpp \ $$PWD/dscamerasession.cpp \ $$PWD/dscameraviewfindersettingscontrol.cpp \ - $$PWD/dscameraimageprocessingcontrol.cpp + $$PWD/dscameraimageprocessingcontrol.cpp \ + $$PWD/directshowcameraexposurecontrol.cpp \ + $$PWD/directshowcameracapturedestinationcontrol.cpp \ + $$PWD/directshowcameracapturebufferformatcontrol.cpp \ + $$PWD/directshowcamerazoomcontrol.cpp *-msvc*:INCLUDEPATH += $$(DXSDK_DIR)/include QMAKE_USE += directshow diff --git a/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.cpp b/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.cpp new file mode 100644 index 000000000..cc0a0ad17 --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.cpp @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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 "directshowcameracapturebufferformatcontrol.h" + +#include "dscamerasession.h" + +QT_BEGIN_NAMESPACE + +DirectShowCameraCaptureBufferFormatControl::DirectShowCameraCaptureBufferFormatControl() +{ +} + +QList<QVideoFrame::PixelFormat> DirectShowCameraCaptureBufferFormatControl::supportedBufferFormats() const +{ + return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_RGB32; +} + +QVideoFrame::PixelFormat DirectShowCameraCaptureBufferFormatControl::bufferFormat() const +{ + return QVideoFrame::Format_RGB32; +} + +void DirectShowCameraCaptureBufferFormatControl::setBufferFormat(QVideoFrame::PixelFormat format) +{ + Q_UNUSED(format); +} + +QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.h b/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.h new file mode 100644 index 000000000..cacd3652b --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameracapturebufferformatcontrol.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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 DIRECTSHOWCAMERACAPTUREBUFFERFORMATCONTROL_H +#define DIRECTSHOWCAMERACAPTUREBUFFERFORMATCONTROL_H + +#include <QtMultimedia/qcameracapturebufferformatcontrol.h> + +QT_BEGIN_NAMESPACE + +class DirectShowCameraCaptureBufferFormatControl : public QCameraCaptureBufferFormatControl +{ + Q_OBJECT +public: + DirectShowCameraCaptureBufferFormatControl(); + + QList<QVideoFrame::PixelFormat> supportedBufferFormats() const override; + QVideoFrame::PixelFormat bufferFormat() const override; + void setBufferFormat(QVideoFrame::PixelFormat format) override; +}; + +QT_END_NAMESPACE + +#endif // DIRECTSHOWCAMERACAPTUREBUFFERFORMATCONTROL_H diff --git a/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.cpp b/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.cpp new file mode 100644 index 000000000..bfb10fc03 --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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 "directshowcameracapturedestinationcontrol.h" + +#include "dscamerasession.h" + +QT_BEGIN_NAMESPACE + +DirectShowCameraCaptureDestinationControl::DirectShowCameraCaptureDestinationControl(DSCameraSession *session) + : m_session(session) +{ + connect(m_session, &DSCameraSession::captureDestinationChanged, + this, &DirectShowCameraCaptureDestinationControl::captureDestinationChanged); +} + +bool DirectShowCameraCaptureDestinationControl::isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const +{ + return m_session->isCaptureDestinationSupported(destination); +} + +QCameraImageCapture::CaptureDestinations DirectShowCameraCaptureDestinationControl::captureDestination() const +{ + return m_session->captureDestination(); +} + +void DirectShowCameraCaptureDestinationControl::setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) +{ + m_session->setCaptureDestination(destination); +} + +QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.h b/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.h new file mode 100644 index 000000000..224df9dbc --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameracapturedestinationcontrol.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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 DIRECTSHOWCAMERACAPTUREDESTINATIONCONTROL_H +#define DIRECTSHOWCAMERACAPTUREDESTINATIONCONTROL_H + +#include <QtMultimedia/qcameracapturedestinationcontrol.h> + +QT_BEGIN_NAMESPACE + +class DSCameraSession; + +class DirectShowCameraCaptureDestinationControl : public QCameraCaptureDestinationControl +{ + Q_OBJECT +public: + DirectShowCameraCaptureDestinationControl(DSCameraSession *session); + + bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const override; + QCameraImageCapture::CaptureDestinations captureDestination() const override; + void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) override; + +private: + DSCameraSession *m_session; + +}; + +QT_END_NAMESPACE + +#endif // DIRECTSHOWCAMERACAPTUREDESTINATIONCONTROL_H diff --git a/src/plugins/directshow/camera/directshowcameraexposurecontrol.cpp b/src/plugins/directshow/camera/directshowcameraexposurecontrol.cpp new file mode 100644 index 000000000..7ece366ea --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameraexposurecontrol.cpp @@ -0,0 +1,411 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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 "directshowcameraexposurecontrol.h" +#include "dscamerasession.h" +#include "directshowglobal.h" +#include "directshowutils.h" + +#include <functional> +#include <cmath> + +QT_BEGIN_NAMESPACE + +static qreal convertToSec(long v) { return (v < 0) ? (1 / std::pow(2., qreal(v))) : std::pow(2., qreal(v)); } +static Q_DECL_CONSTEXPR qreal convertToFvalue(long v) { return qreal(v) / 10.; } + +DirectShowCameraExposureControl::DirectShowCameraExposureControl(DSCameraSession *session) + : m_session(session) + , m_shutterSpeedValues({ 0, 0, 0, 0, 0 }) + , m_apertureValues({ 0, 0, 0, 0, 0 }) + , m_requestedShutterSpeed(qreal(0.0)) + , m_currentShutterSpeed(qreal(-1.0)) + , m_requestedAperture(qreal(0.0)) + , m_currentAperture(qreal(-1.0)) + , m_requestedExposureMode(QCameraExposure::ExposureAuto) + , m_currentExposureMode(QCameraExposure::ExposureAuto) +{ + Q_ASSERT(m_session); + connect(m_session, &DSCameraSession::statusChanged, + this, &DirectShowCameraExposureControl::onStatusChanged); +} + +bool DirectShowCameraExposureControl::isParameterSupported(QCameraExposureControl::ExposureParameter parameter) const +{ + if (parameter == ShutterSpeed) + return (m_shutterSpeedValues.caps & CameraControl_Flags_Manual); + if (parameter == Aperture) + return (m_apertureValues.caps & CameraControl_Flags_Manual); + if (parameter == ExposureMode) + return true; + + return false; +} + +QVariantList DirectShowCameraExposureControl::supportedParameterRange(QCameraExposureControl::ExposureParameter parameter, + bool *continuous) const +{ + if (continuous) + *continuous = false; + + if (parameter == ShutterSpeed) + return m_supportedShutterSpeeds; + + if (parameter == Aperture) + return m_supportedApertureValues; + + if (parameter == ExposureMode) + return m_supportedExposureModes; + + return QVariantList(); +} + +QVariant DirectShowCameraExposureControl::requestedValue(QCameraExposureControl::ExposureParameter parameter) const +{ + if (parameter == ShutterSpeed) + return QVariant::fromValue(m_requestedShutterSpeed); + + if (parameter == Aperture) + return QVariant::fromValue(m_requestedAperture); + + if (parameter == ExposureMode) + return QVariant::fromValue(m_requestedExposureMode); + + return QVariant(); +} + +QVariant DirectShowCameraExposureControl::actualValue(QCameraExposureControl::ExposureParameter parameter) const +{ + if (parameter == ExposureMode) + return QVariant::fromValue(m_currentExposureMode); + + if (parameter == ShutterSpeed) { + return qFuzzyCompare(m_currentShutterSpeed, qreal(-1.0)) + ? QVariant() + : QVariant::fromValue(m_currentShutterSpeed); + } + + if (parameter == Aperture) { + return qFuzzyCompare(m_currentAperture, qreal(-1.0)) + ? QVariant() + : QVariant::fromValue(m_currentAperture); + } + + return QVariant(); +} + +bool DirectShowCameraExposureControl::setValue(QCameraExposureControl::ExposureParameter parameter, + const QVariant &value) +{ + IAMCameraControl *cameraControl = nullptr; + const DirectShowUtils::ScopedSafeRelease<IAMCameraControl> rControl { &cameraControl }; + if (!m_session->getCameraControlInterface(&cameraControl)) + return false; + + // Reset exposure mode if the value is invalid. + if (!value.isValid()) { + m_requestedExposureMode = QCameraExposure::ExposureAuto; + return setExposureMode(cameraControl, m_requestedExposureMode); + } + + if (parameter == ShutterSpeed || parameter == Aperture) { + bool ok = false; + const qreal newValue = value.toReal(&ok); + if (!ok) + return false; + + // Change the exposure mode first + setExposureMode(cameraControl, QCameraExposure::ExposureManual); + + if (parameter == ShutterSpeed) { + m_requestedShutterSpeed = newValue; + return setShutterSpeed(cameraControl, m_requestedShutterSpeed); + } else { + m_requestedAperture = newValue; + return setAperture(cameraControl, m_requestedAperture); + } + } + + if (parameter == ExposureMode) { + m_requestedExposureMode = value.value<QCameraExposure::ExposureMode>(); + return setExposureMode(cameraControl, m_requestedExposureMode); + } + + return false; +} + +void DirectShowCameraExposureControl::onStatusChanged(QCamera::Status status) +{ + const bool shouldUpdate = (qFuzzyCompare(m_currentAperture, qreal(-1.0)) && qFuzzyCompare(m_currentShutterSpeed, qreal(-1.0))); + + if (status == QCamera::LoadedStatus && shouldUpdate) + updateExposureSettings(); + + if (status == QCamera::UnloadedStatus) { + m_supportedApertureValues.clear(); + m_supportedExposureModes.clear(); + m_supportedShutterSpeeds.clear(); + m_currentAperture = qreal(-1.0); + m_currentShutterSpeed = qreal(-1.0); + m_currentExposureMode = QCameraExposure::ExposureAuto; + } +} + +void DirectShowCameraExposureControl::updateExposureSettings() +{ + IAMCameraControl *cameraControl = nullptr; + const DirectShowUtils::ScopedSafeRelease<IAMCameraControl> rControl { &cameraControl }; + if (!m_session->getCameraControlInterface(&cameraControl)) + return; + + const auto updateValues = [cameraControl](long property, + ExposureValues ¤tValues, + QVariantList ¶meterRange, + const std::function<qreal(long)> &converter, + bool *changed) -> bool { + ExposureValues values { 0, 0, 0, 0, 0 }; + if (FAILED(cameraControl->GetRange(property, + &values.minValue, + &values.maxValue, + &values.stepping, + &values.defaultValue, + &values.caps))) { + return false; + } + + const bool minValueChanged = values.minValue != currentValues.minValue; + const bool maxValueChanged = values.maxValue != currentValues.maxValue; + const bool steppingChanged = values.stepping != currentValues.stepping; + + if (minValueChanged || maxValueChanged || steppingChanged) { + parameterRange.clear(); + long nextValue = values.minValue; + while (nextValue != values.maxValue && values.stepping != 0) { + parameterRange << converter(nextValue); + nextValue += values.stepping; + } + + if (changed) + *changed = true; + } + + currentValues = values; + return true; + }; + + const auto getCurrentValue = [cameraControl](long property, const std::function<qreal(long)> &converter, qreal *value) -> bool { + long currentValue; + long currentFlags; + if (FAILED(cameraControl->Get(property, ¤tValue, ¤tFlags))) + return false; + + *value = converter(currentValue); + return true; + }; + + // Shutter speed + bool changed = false; + if (!updateValues(CameraControl_Exposure, m_shutterSpeedValues, m_supportedShutterSpeeds, convertToSec, &changed)) + qCDebug(qtDirectShowPlugin, "Unable to update the shutter speed values"); + + if (changed) + Q_EMIT parameterRangeChanged(int(ShutterSpeed)); + + if ((m_shutterSpeedValues.caps & CameraControl_Flags_Manual)) { + if (getCurrentValue(CameraControl_Exposure, convertToSec, &m_currentShutterSpeed)) { + if (m_currentExposureMode == QCameraExposure::ExposureManual) + setShutterSpeed(cameraControl, m_requestedShutterSpeed); + } else { + m_currentShutterSpeed = qreal(-1.0); + qCDebug(qtDirectShowPlugin, "Unable to get the current shutter speed!"); + } + } + + // Aperture + changed = false; + if (!updateValues(CameraControl_Iris, m_apertureValues, m_supportedApertureValues, convertToFvalue, &changed)) + qCDebug(qtDirectShowPlugin, "Unable to update the aperture values"); + + if (changed) + Q_EMIT parameterRangeChanged(int(Aperture)); + + if (getCurrentValue(CameraControl_Iris, convertToFvalue, &m_currentAperture)) { + if (m_currentExposureMode == QCameraExposure::ExposureManual) + setAperture(cameraControl, m_requestedAperture); + } else { + m_currentAperture = qreal(-1.0); + qCDebug(qtDirectShowPlugin, "Unable to get the current aperture value!"); + } + + // Update exposure modes + const bool hasAutoExposure = (m_apertureValues.caps & CameraControl_Flags_Auto) + || (m_shutterSpeedValues.caps & CameraControl_Flags_Auto); + const bool hasManualExposure = (m_apertureValues.caps & CameraControl_Flags_Manual) + || (m_shutterSpeedValues.caps & CameraControl_Flags_Manual); + + QVariantList exposureModes; + if (hasAutoExposure && !m_supportedExposureModes.contains(QVariant::fromValue(QCameraExposure::ExposureAuto))) + exposureModes << QVariant::fromValue(QCameraExposure::ExposureAuto); + + if (hasManualExposure && !m_supportedExposureModes.contains(QVariant::fromValue(QCameraExposure::ExposureManual))) + exposureModes << QVariant::fromValue(QCameraExposure::ExposureManual); + + if (!exposureModes.isEmpty() || !m_supportedExposureModes.isEmpty()) { + m_supportedExposureModes = exposureModes; + Q_EMIT parameterRangeChanged(int(ExposureMode)); + } +} + +bool DirectShowCameraExposureControl::setShutterSpeed(IAMCameraControl *cameraControl, qreal shutterSpeed) +{ + if (m_currentExposureMode != QCameraExposure::ExposureManual) { + qCDebug(qtDirectShowPlugin, "Trying to set shutter speed value while in auto exposure mode!"); + return false; + } + + if (qFuzzyCompare(m_currentShutterSpeed, shutterSpeed)) + return true; + + if ((m_shutterSpeedValues.caps & CameraControl_Flags_Manual) == 0) + return false; + + if (!m_supportedShutterSpeeds.contains(QVariant::fromValue(shutterSpeed))) + return false; + + if (qFuzzyIsNull(shutterSpeed) || (shutterSpeed < qreal(0.0))) + return false; + + const long newValue = long(log2(shutterSpeed)); + if (FAILED(cameraControl->Set(CameraControl_Exposure, newValue, CameraControl_Flags_Manual))) { + qCDebug(qtDirectShowPlugin, "Unable to set shutter speed value to: %d", int(shutterSpeed)); + return false; + } + + m_currentShutterSpeed = shutterSpeed; + Q_EMIT actualValueChanged(int(ShutterSpeed)); + return true; +} + +bool DirectShowCameraExposureControl::setAperture(IAMCameraControl *cameraControl, qreal aperture) +{ + if (m_currentExposureMode != QCameraExposure::ExposureManual) { + qCDebug(qtDirectShowPlugin, "Trying to set aperture value while in auto exposure mode!"); + return false; + } + + if (qFuzzyCompare(m_currentAperture, aperture)) + return true; + + if ((m_apertureValues.caps & CameraControl_Flags_Manual) == 0) + return false; + + if (!m_supportedApertureValues.contains(QVariant::fromValue(aperture))) + return false; + + if (aperture < qreal(0.0)) + return false; + + const long newValue = long(10 * aperture); + if (FAILED(cameraControl->Set(CameraControl_Iris, newValue, CameraControl_Flags_Manual))) { + qCDebug(qtDirectShowPlugin, "Unable to set aperture value to: %d", int(aperture)); + return false; + } + + m_currentAperture = aperture; + Q_EMIT actualValueChanged(int(Aperture)); + + return true; +} + +bool DirectShowCameraExposureControl::setExposureMode(IAMCameraControl *cameraControl, QCameraExposure::ExposureMode mode) +{ + if (m_currentExposureMode == mode) + return true; + + bool exposureModeChanged = true; + + // Set auto exposure mode + if (mode == QCameraExposure::ExposureAuto) { + if ((m_apertureValues.caps & CameraControl_Flags_Auto) + && FAILED(cameraControl->Set(CameraControl_Iris, 0, CameraControl_Flags_Auto))) { + qCDebug(qtDirectShowPlugin, "Setting auto exposure mode failed!"); + exposureModeChanged = false; + } + + if ((m_shutterSpeedValues.caps & CameraControl_Flags_Auto) + && FAILED(cameraControl->Set(CameraControl_Exposure, 0, CameraControl_Flags_Auto))) { + qCDebug(qtDirectShowPlugin, "Setting auto exposure mode failed"); + exposureModeChanged = false; + } + + if (exposureModeChanged) { + m_currentExposureMode = mode; + Q_EMIT actualValueChanged(int(ExposureMode)); + } + + return exposureModeChanged; + } + + // Change the current exposure mode to manual first. + m_currentExposureMode = QCameraExposure::ExposureManual; + + const qreal newShutterSpeed = qFuzzyCompare(m_requestedShutterSpeed, -1.0) + ? convertToSec(m_shutterSpeedValues.defaultValue) + : m_requestedShutterSpeed; + if ((m_shutterSpeedValues.caps & CameraControl_Flags_Manual)) + setShutterSpeed(cameraControl, newShutterSpeed); + + const qreal newAperture = qFuzzyCompare(m_requestedAperture, -1.0) + ? convertToFvalue(m_apertureValues.defaultValue) + : m_requestedAperture; + if ((m_apertureValues.caps & CameraControl_Flags_Manual)) + setAperture(cameraControl, newAperture); + + + // Check if any of the values changed. + exposureModeChanged = (qFuzzyCompare(m_currentShutterSpeed, newShutterSpeed) + || qFuzzyCompare(m_currentAperture, newAperture)); + + if (exposureModeChanged) + Q_EMIT actualValueChanged(int(ExposureMode)); + + return exposureModeChanged; +} + +QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/directshowcameraexposurecontrol.h b/src/plugins/directshow/camera/directshowcameraexposurecontrol.h new file mode 100644 index 000000000..db3fc5984 --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameraexposurecontrol.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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 DIRECTSHOWCAMERAEXPOSURECONTROL_H +#define DIRECTSHOWCAMERAEXPOSURECONTROL_H + +#include <QtMultimedia/qcameraexposurecontrol.h> + +struct IAMCameraControl; + +QT_BEGIN_NAMESPACE + +class DSCameraSession; + +class DirectShowCameraExposureControl : public QCameraExposureControl +{ + Q_OBJECT +public: + DirectShowCameraExposureControl(DSCameraSession *session); + + bool isParameterSupported(ExposureParameter parameter) const override; + QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const override; + QVariant requestedValue(ExposureParameter parameter) const override; + QVariant actualValue(ExposureParameter parameter) const override; + bool setValue(ExposureParameter parameter, const QVariant &value) override; + +private Q_SLOTS: + void onStatusChanged(QCamera::Status status); + +private: + DSCameraSession *m_session; + + struct ExposureValues + { + long caps; + long minValue; + long maxValue; + long stepping; + long defaultValue; + } m_shutterSpeedValues, m_apertureValues; + + qreal m_requestedShutterSpeed; + qreal m_currentShutterSpeed; + + qreal m_requestedAperture; + qreal m_currentAperture; + + QVariantList m_supportedShutterSpeeds; + QVariantList m_supportedApertureValues; + QVariantList m_supportedExposureModes; + + QCameraExposure::ExposureMode m_requestedExposureMode; + QCameraExposure::ExposureMode m_currentExposureMode; + + void updateExposureSettings(); + + bool setShutterSpeed(IAMCameraControl *cameraControl, qreal shutterSpeed); + bool setAperture(IAMCameraControl *cameraControl, qreal aperture); + bool setExposureMode(IAMCameraControl *cameraControl, QCameraExposure::ExposureMode mode); +}; + +QT_END_NAMESPACE + +#endif // DIRECTSHOWCAMERAEXPOSURECONTROL_H diff --git a/src/plugins/directshow/camera/directshowcamerazoomcontrol.cpp b/src/plugins/directshow/camera/directshowcamerazoomcontrol.cpp new file mode 100644 index 000000000..209cb5d96 --- /dev/null +++ b/src/plugins/directshow/camera/directshowcamerazoomcontrol.cpp @@ -0,0 +1,209 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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 "directshowcamerazoomcontrol.h" +#include "dscamerasession.h" +#include "directshowutils.h" + +QT_BEGIN_NAMESPACE + +inline static qreal defaultZoomValue() { return qreal(1.0); } + +DirectShowCameraZoomControl::DirectShowCameraZoomControl(DSCameraSession *session) + : m_session(session) + , m_opticalZoom({0, 0, 0, 0, 0}) + , m_currentOpticalZoom(qreal(0.0)) + , m_requestedOpticalZoom(qreal(0.0)) + , m_maxOpticalZoom(qreal(1.0)) +{ + Q_ASSERT(m_session); + connect(m_session, &DSCameraSession::statusChanged, + this, &DirectShowCameraZoomControl::onStatusChanged); +} + +qreal DirectShowCameraZoomControl::maximumOpticalZoom() const +{ + return m_maxOpticalZoom; +} + +qreal DirectShowCameraZoomControl::maximumDigitalZoom() const +{ + return defaultZoomValue(); +} + +qreal DirectShowCameraZoomControl::requestedOpticalZoom() const +{ + return qMax(defaultZoomValue(), m_requestedOpticalZoom); +} + +qreal DirectShowCameraZoomControl::requestedDigitalZoom() const +{ + return defaultZoomValue(); +} + +qreal DirectShowCameraZoomControl::currentOpticalZoom() const +{ + return qMax(defaultZoomValue(), m_currentOpticalZoom); +} + +qreal DirectShowCameraZoomControl::currentDigitalZoom() const +{ + return defaultZoomValue(); +} + +void DirectShowCameraZoomControl::zoomTo(qreal optical, qreal digital) +{ + Q_UNUSED(digital); + if (!(m_opticalZoom.caps & CameraControl_Flags_Manual)) + return; + + if (qFuzzyCompare(optical, m_requestedOpticalZoom)) + return; + + m_requestedOpticalZoom = optical; + Q_EMIT requestedOpticalZoomChanged(m_requestedOpticalZoom); + + if (qFuzzyCompare(m_requestedOpticalZoom, m_currentOpticalZoom)) + return; + + if (m_session->status() != QCamera::LoadedStatus && m_session->status() != QCamera::ActiveStatus) + return; // We'll wait until the camera is loaded, see: statusChanged connection + + opticalZoomToPrivate(optical); +} + +void DirectShowCameraZoomControl::onStatusChanged(QCamera::Status status) +{ + if (status == QCamera::LoadedStatus) { + updateZoomValues(); + } else if (status == QCamera::UnloadedStatus) { + SecureZeroMemory(&m_opticalZoom, sizeof(ZoomValues)); + m_currentOpticalZoom = qreal(0.0); + m_requestedOpticalZoom = qreal(0.0); + } + +} + +void DirectShowCameraZoomControl::updateZoomValues() +{ + IAMCameraControl *cameraControl = nullptr; + const DirectShowUtils::ScopedSafeRelease<IAMCameraControl> rControl { &cameraControl }; + if (!m_session->getCameraControlInterface(&cameraControl)) + return; + + ZoomValues values { 0, 0, 0, 0, 0 }; + // Zoom levels in DS are in the range [10, 600] + // The default zoom is device specific. + HRESULT hr = cameraControl->GetRange(CameraControl_Zoom, + &values.minZoom, + &values.maxZoom, + &values.stepping, + &values.defaultZoom, + &values.caps); + + if (FAILED(hr)) { + qCDebug(qtDirectShowPlugin, "Getting the camera's zoom properties failed"); + SecureZeroMemory(&m_opticalZoom, sizeof(ZoomValues)); + return; + } + + if (!(values.caps & CameraControl_Flags_Manual)) { + qCDebug(qtDirectShowPlugin, "Camera does not support manual zoom"); + SecureZeroMemory(&m_opticalZoom, sizeof(ZoomValues)); + return; + } + + if (values.maxZoom != m_opticalZoom.maxZoom) { + const qreal newMaxZoomScale = (values.minZoom == 0) ? defaultZoomValue() + : (qreal(values.maxZoom) / qreal(values.minZoom)); + if (!qFuzzyCompare(newMaxZoomScale, m_maxOpticalZoom)) { + m_maxOpticalZoom = newMaxZoomScale; + Q_EMIT maximumOpticalZoomChanged(m_maxOpticalZoom); + } + } + + m_opticalZoom = values; + + long currentZoom = 0; + long flags = 0; + if (FAILED(cameraControl->Get(CameraControl_Zoom, ¤tZoom, &flags))) { + qCDebug(qtDirectShowPlugin, "Getting the camera's current zoom value failed!"); + return; + } + + qreal currentOpticalZoom = (m_opticalZoom.minZoom == 0) ? defaultZoomValue() + : (qreal(currentZoom) / qreal(m_opticalZoom.minZoom)); + currentOpticalZoom = qMax(defaultZoomValue(), currentOpticalZoom); + if (!qFuzzyCompare(m_currentOpticalZoom, currentOpticalZoom)) { + m_currentOpticalZoom = currentOpticalZoom; + Q_EMIT currentOpticalZoomChanged(m_currentOpticalZoom); + } + + // Check if there is a pending zoom value. + if (!qFuzzyCompare(m_currentOpticalZoom, m_requestedOpticalZoom)) + opticalZoomToPrivate(m_requestedOpticalZoom); +} + +bool DirectShowCameraZoomControl::opticalZoomToPrivate(qreal scaleFactor) +{ + IAMCameraControl *cameraControl = nullptr; + const DirectShowUtils::ScopedSafeRelease<IAMCameraControl> rControl { &cameraControl }; + if (!m_session->getCameraControlInterface(&cameraControl)) + return false; + + // Convert to DS zoom value + const int newDSOpticalZoom = qRound(m_opticalZoom.minZoom * scaleFactor); + long newDSOpticalZoomAdjusted = newDSOpticalZoom - (newDSOpticalZoom % m_opticalZoom.stepping); + newDSOpticalZoomAdjusted = qBound(m_opticalZoom.minZoom, newDSOpticalZoomAdjusted, m_opticalZoom.maxZoom); + + if (FAILED(cameraControl->Set(CameraControl_Zoom, newDSOpticalZoomAdjusted, CameraControl_Flags_Manual))) { + qCDebug(qtDirectShowPlugin, "Setting the camera's zoom value failed"); + return false; + } + + const qreal newScaleFactor = (m_opticalZoom.minZoom == 0) ? defaultZoomValue() + : (qreal(newDSOpticalZoomAdjusted) / qreal(m_opticalZoom.minZoom)); + // convert back to Qt scale value + m_currentOpticalZoom = qMax(defaultZoomValue(), newScaleFactor); + Q_EMIT currentOpticalZoomChanged(m_currentOpticalZoom); + + return true; +} + +QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/directshowcamerazoomcontrol.h b/src/plugins/directshow/camera/directshowcamerazoomcontrol.h new file mode 100644 index 000000000..f6fb05b0e --- /dev/null +++ b/src/plugins/directshow/camera/directshowcamerazoomcontrol.h @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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 DIRECTSHOWCAMERAZOOMCONTROL_H +#define DIRECTSHOWCAMERAZOOMCONTROL_H + +#include <QtMultimedia/qcamerazoomcontrol.h> +#include <QtMultimedia/qcamera.h> + +QT_BEGIN_NAMESPACE + +class DSCameraSession; + +class DirectShowCameraZoomControl : public QCameraZoomControl +{ + Q_OBJECT +public: + DirectShowCameraZoomControl(DSCameraSession *session); + + qreal maximumOpticalZoom() const override; + qreal maximumDigitalZoom() const override; + qreal requestedOpticalZoom() const override; + qreal requestedDigitalZoom() const override; + qreal currentOpticalZoom() const override; + qreal currentDigitalZoom() const override; + void zoomTo(qreal optical, qreal digital) override; + +private Q_SLOTS: + void onStatusChanged(QCamera::Status status); + +private: + DSCameraSession *m_session; + struct ZoomValues + { + long maxZoom; + long minZoom; + long stepping; + long defaultZoom; + long caps; + } m_opticalZoom; + + qreal m_currentOpticalZoom; + qreal m_requestedOpticalZoom; + qreal m_maxOpticalZoom; + + void updateZoomValues(); + bool opticalZoomToPrivate(qreal value); +}; + +QT_END_NAMESPACE + +#endif // DIRECTSHOWCAMERAZOOMCONTROL_H diff --git a/src/plugins/directshow/camera/dscameraservice.cpp b/src/plugins/directshow/camera/dscameraservice.cpp index 836f1aaa5..a806cabe3 100644 --- a/src/plugins/directshow/camera/dscameraservice.cpp +++ b/src/plugins/directshow/camera/dscameraservice.cpp @@ -48,19 +48,29 @@ #include "dsimagecapturecontrol.h" #include "dscameraviewfindersettingscontrol.h" #include "dscameraimageprocessingcontrol.h" +#include "directshowcameraexposurecontrol.h" +#include "directshowcameracapturedestinationcontrol.h" +#include "directshowcameracapturebufferformatcontrol.h" +#include "directshowvideoprobecontrol.h" +#include "directshowcamerazoomcontrol.h" QT_BEGIN_NAMESPACE DSCameraService::DSCameraService(QObject *parent): QMediaService(parent) + , m_session(new DSCameraSession(this)) + , m_control(new DSCameraControl(m_session)) + , m_videoDevice(new DSVideoDeviceControl(m_session)) , m_videoRenderer(0) + , m_imageCapture(new DSImageCaptureControl(m_session)) + , m_viewfinderSettings(new DSCameraViewfinderSettingsControl(m_session)) + , m_imageProcessingControl(new DSCameraImageProcessingControl(m_session)) + , m_exposureControl(new DirectShowCameraExposureControl(m_session)) + , m_captureDestinationControl(new DirectShowCameraCaptureDestinationControl(m_session)) + , m_captureBufferFormatControl(new DirectShowCameraCaptureBufferFormatControl) + , m_videoProbeControl(nullptr) + , m_zoomControl(new DirectShowCameraZoomControl(m_session)) { - m_session = new DSCameraSession(this); - m_control = new DSCameraControl(m_session); - m_videoDevice = new DSVideoDeviceControl(m_session); - m_imageCapture = new DSImageCaptureControl(m_session); - m_viewfinderSettings = new DSCameraViewfinderSettingsControl(m_session); - m_imageProcessingControl = new DSCameraImageProcessingControl(m_session); } DSCameraService::~DSCameraService() @@ -72,6 +82,11 @@ DSCameraService::~DSCameraService() delete m_videoRenderer; delete m_imageCapture; delete m_session; + delete m_exposureControl; + delete m_captureDestinationControl; + delete m_captureBufferFormatControl; + delete m_videoProbeControl; + delete m_zoomControl; } QMediaControl* DSCameraService::requestControl(const char *name) @@ -98,6 +113,27 @@ QMediaControl* DSCameraService::requestControl(const char *name) if (qstrcmp(name, QCameraImageProcessingControl_iid) == 0) return m_imageProcessingControl; + if (qstrcmp(name, QCameraExposureControl_iid) == 0) + return m_exposureControl; + + if (qstrcmp(name, QCameraCaptureDestinationControl_iid) == 0) + return m_captureDestinationControl; + + if (qstrcmp(name, QCameraCaptureBufferFormatControl_iid) == 0) + return m_captureBufferFormatControl; + + if (qstrcmp(name, QMediaVideoProbeControl_iid) == 0) { + if (!m_videoProbeControl) + m_videoProbeControl = new DirectShowVideoProbeControl; + + m_videoProbeControl->ref(); + m_session->addVideoProbe(m_videoProbeControl); + return m_videoProbeControl; + } + + if (qstrcmp(name, QCameraZoomControl_iid) == 0) + return m_zoomControl; + return 0; } @@ -108,6 +144,14 @@ void DSCameraService::releaseControl(QMediaControl *control) m_videoRenderer = 0; return; } + + if (control == m_videoProbeControl) { + m_session->removeVideoProbe(m_videoProbeControl); + if (!m_videoProbeControl->deref()) { + delete m_videoProbeControl; + m_videoProbeControl = nullptr; + } + } } QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/dscameraservice.h b/src/plugins/directshow/camera/dscameraservice.h index 8976e41cf..f444eeb51 100644 --- a/src/plugins/directshow/camera/dscameraservice.h +++ b/src/plugins/directshow/camera/dscameraservice.h @@ -52,6 +52,11 @@ class DSVideoDeviceControl; class DSImageCaptureControl; class DSCameraViewfinderSettingsControl; class DSCameraImageProcessingControl; +class DirectShowCameraExposureControl; +class DirectShowCameraCaptureDestinationControl; +class DirectShowCameraCaptureBufferFormatControl; +class DirectShowVideoProbeControl; +class DirectShowCameraZoomControl; class DSCameraService : public QMediaService { @@ -65,13 +70,18 @@ public: virtual void releaseControl(QMediaControl *control); private: - DSCameraControl *m_control; DSCameraSession *m_session; + DSCameraControl *m_control; DSVideoDeviceControl *m_videoDevice; QMediaControl *m_videoRenderer; DSImageCaptureControl *m_imageCapture; DSCameraViewfinderSettingsControl *m_viewfinderSettings; DSCameraImageProcessingControl *m_imageProcessingControl; + DirectShowCameraExposureControl *m_exposureControl; + DirectShowCameraCaptureDestinationControl *m_captureDestinationControl; + DirectShowCameraCaptureBufferFormatControl *m_captureBufferFormatControl; + DirectShowVideoProbeControl *m_videoProbeControl; + DirectShowCameraZoomControl *m_zoomControl; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp index dc0dfc8b3..9b642872a 100644 --- a/src/plugins/directshow/camera/dscamerasession.cpp +++ b/src/plugins/directshow/camera/dscamerasession.cpp @@ -51,24 +51,27 @@ #include "directshowcameraglobal.h" #include "directshowmediatype.h" #include "directshowutils.h" +#include "directshowvideoprobecontrol.h" QT_BEGIN_NAMESPACE DSCameraSession::DSCameraSession(QObject *parent) : QObject(parent) - , m_graphBuilder(Q_NULLPTR) - , m_filterGraph(Q_NULLPTR) + , m_graphBuilder(nullptr) + , m_filterGraph(nullptr) , m_sourceDeviceName(QLatin1String("default")) - , m_sourceFilter(Q_NULLPTR) + , m_sourceFilter(nullptr) , m_needsHorizontalMirroring(false) - , m_previewSampleGrabber(Q_NULLPTR) - , m_nullRendererFilter(Q_NULLPTR) + , m_previewSampleGrabber(nullptr) + , m_nullRendererFilter(nullptr) , m_previewStarted(false) - , m_surface(Q_NULLPTR) + , m_surface(nullptr) , m_previewPixelFormat(QVideoFrame::Format_Invalid) , m_readyForCapture(false) , m_imageIdCounter(0) , m_currentImageId(-1) + , m_captureDestinations(QCameraImageCapture::CaptureToFile) + , m_videoProbeControl(nullptr) , m_status(QCamera::UnloadedStatus) { connect(this, SIGNAL(statusChanged(QCamera::Status)), @@ -354,6 +357,39 @@ bool DSCameraSession::getCameraControlInterface(IAMCameraControl **cameraControl return true; } +bool DSCameraSession::isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const +{ + return destination & (QCameraImageCapture::CaptureToFile | QCameraImageCapture::CaptureToBuffer); +} + +QCameraImageCapture::CaptureDestinations DSCameraSession::captureDestination() const +{ + return m_captureDestinations; +} + +void DSCameraSession::setCaptureDestination(QCameraImageCapture::CaptureDestinations destinations) +{ + if (m_captureDestinations == destinations) + return; + + m_captureDestinations = destinations; + Q_EMIT captureDestinationChanged(m_captureDestinations); +} + +void DSCameraSession::addVideoProbe(DirectShowVideoProbeControl *probe) +{ + const QMutexLocker locker(&m_probeMutex); + m_videoProbeControl = probe; +} + +void DSCameraSession::removeVideoProbe(DirectShowVideoProbeControl *probe) +{ + Q_UNUSED(probe); + Q_ASSERT(m_videoProbeControl == probe); + const QMutexLocker locker(&m_probeMutex); + m_videoProbeControl = nullptr; +} + bool DSCameraSession::load() { unload(); @@ -547,6 +583,12 @@ void DSCameraSession::onFrameAvailable(double time, const QByteArray &data) m_presentMutex.unlock(); + { + const QMutexLocker locker(&m_probeMutex); + if (m_currentFrame.isValid() && m_videoProbeControl) + Q_EMIT m_videoProbeControl->videoFrameProbed(m_currentFrame); + } + // Image capture QMutexLocker locker(&m_captureMutex); if (m_currentImageId != -1 && !m_capturedFrame.isValid()) { @@ -586,8 +628,8 @@ void DSCameraSession::presentFrame() m_capturedFrame.unmap(); - QtConcurrent::run(this, &DSCameraSession::saveCapturedImage, - m_currentImageId, captureImage, m_imageCaptureFileName); + QtConcurrent::run(this, &DSCameraSession::processCapturedImage, + m_currentImageId, m_captureDestinations, captureImage, m_imageCaptureFileName); m_imageCaptureFileName.clear(); m_currentImageId = -1; @@ -603,14 +645,22 @@ void DSCameraSession::presentFrame() updateReadyForCapture(); } -void DSCameraSession::saveCapturedImage(int id, const QImage &image, const QString &path) +void DSCameraSession::processCapturedImage(int id, + QCameraImageCapture::CaptureDestinations captureDestinations, + const QImage &image, + const QString &path) { - if (image.save(path, "JPG")) { - emit imageSaved(id, path); - } else { - emit captureError(id, QCameraImageCapture::ResourceError, - tr("Could not save image to file.")); + if (captureDestinations & QCameraImageCapture::CaptureToFile) { + if (image.save(path, "JPG")) { + Q_EMIT imageSaved(id, path); + } else { + Q_EMIT captureError(id, QCameraImageCapture::ResourceError, + tr("Could not save image to file.")); + } } + + if (captureDestinations & QCameraImageCapture::CaptureToBuffer) + Q_EMIT imageAvailable(id, QVideoFrame(image)); } bool DSCameraSession::createFilterGraph() diff --git a/src/plugins/directshow/camera/dscamerasession.h b/src/plugins/directshow/camera/dscamerasession.h index 90407f49e..e28015534 100644 --- a/src/plugins/directshow/camera/dscamerasession.h +++ b/src/plugins/directshow/camera/dscamerasession.h @@ -50,6 +50,7 @@ #include <QtMultimedia/qabstractvideosurface.h> #include <QtMultimedia/qvideosurfaceformat.h> #include <QtMultimedia/qcameraimageprocessingcontrol.h> +#include <QtMultimedia/qcameraimagecapture.h> #include <private/qmediastoragelocation_p.h> #include <tchar.h> @@ -76,6 +77,7 @@ struct ICaptureGraphBuilder2; QT_BEGIN_NAMESPACE class DirectShowSampleGrabber; +class DirectShowVideoProbeControl; class DSCameraSession : public QObject { @@ -120,13 +122,22 @@ public: bool getCameraControlInterface(IAMCameraControl **cameraControl) const; + bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const; + QCameraImageCapture::CaptureDestinations captureDestination() const; + void setCaptureDestination(QCameraImageCapture::CaptureDestinations destinations); + + void addVideoProbe(DirectShowVideoProbeControl *probe); + void removeVideoProbe(DirectShowVideoProbeControl *probe); + Q_SIGNALS: void statusChanged(QCamera::Status); void imageExposed(int id); void imageCaptured(int id, const QImage &preview); void imageSaved(int id, const QString &fileName); + void imageAvailable(int id, const QVideoFrame &buffer); void readyForCaptureChanged(bool); void captureError(int id, int error, const QString &errorString); + void captureDestinationChanged(QCameraImageCapture::CaptureDestinations); private Q_SLOTS: void presentFrame(); @@ -157,7 +168,7 @@ private: void setStatus(QCamera::Status status); void onFrameAvailable(double time, const QByteArray &data); - void saveCapturedImage(int id, const QImage &image, const QString &path); + void processCapturedImage(int id, QCameraImageCapture::CaptureDestinations captureDestinations, const QImage &image, const QString &path); bool createFilterGraph(); bool connectGraph(); @@ -208,6 +219,11 @@ private: int m_imageIdCounter; int m_currentImageId; QVideoFrame m_capturedFrame; + QCameraImageCapture::CaptureDestinations m_captureDestinations; + + // Video probe + QMutex m_probeMutex; + DirectShowVideoProbeControl *m_videoProbeControl; // Internal state QCamera::Status m_status; diff --git a/src/plugins/directshow/camera/dsimagecapturecontrol.cpp b/src/plugins/directshow/camera/dsimagecapturecontrol.cpp index 9d4a7ea1d..c92ce98e1 100644 --- a/src/plugins/directshow/camera/dsimagecapturecontrol.cpp +++ b/src/plugins/directshow/camera/dsimagecapturecontrol.cpp @@ -57,6 +57,8 @@ DSImageCaptureControl::DSImageCaptureControl(DSCameraSession *session) this, SIGNAL(readyForCaptureChanged(bool))); connect(m_session, SIGNAL(captureError(int,int,QString)), this, SIGNAL(error(int,int,QString))); + connect(m_session, &DSCameraSession::imageAvailable, + this, &DSImageCaptureControl::imageAvailable); } DSImageCaptureControl::~DSImageCaptureControl() diff --git a/src/plugins/directshow/directshow.pro b/src/plugins/directshow/directshow.pro index 2857f87d9..54d617166 100644 --- a/src/plugins/directshow/directshow.pro +++ b/src/plugins/directshow/directshow.pro @@ -8,7 +8,13 @@ win32:!qtHaveModule(opengl)|qtConfig(dynamicgl) { HEADERS += dsserviceplugin.h SOURCES += dsserviceplugin.cpp -mingw: DEFINES += NO_DSHOW_STRSAFE +# Remove WINVER/_WIN32_WINNT definitions added to qt_build_config.prf +# by qtbase/d57a7c41712f8627a462d893329dc3f0dbb52d32 since the multimedia +# headers of MinGW 5.3/7.1 are too broken to compile with 0x0601. +mingw { + DEFINES -= WINVER=0x0601 _WIN32_WINNT=0x0601 + DEFINES += NO_DSHOW_STRSAFE +} include(common/common.pri) qtConfig(directshow-player): include(player/player.pri) diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp index 51be7e500..cb4f0cdf9 100644 --- a/src/plugins/directshow/dsserviceplugin.cpp +++ b/src/plugins/directshow/dsserviceplugin.cpp @@ -123,7 +123,9 @@ QMediaServiceProviderHint::Features DSServicePlugin::supportedFeatures( QByteArray DSServicePlugin::defaultDevice(const QByteArray &service) const { if (service == Q_MEDIASERVICE_CAMERA) { + addRefCount(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); + releaseRefCount(); if (!devs.isEmpty()) return devs.first().first; } @@ -135,7 +137,9 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const QList<QByteArray> result; if (service == Q_MEDIASERVICE_CAMERA) { + addRefCount(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); + releaseRefCount(); for (const DSVideoDeviceInfo &info : devs) result.append(info.first); } @@ -146,7 +150,9 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const QString DSServicePlugin::deviceDescription(const QByteArray &service, const QByteArray &device) { if (service == Q_MEDIASERVICE_CAMERA) { + addRefCount(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); + releaseRefCount(); for (const DSVideoDeviceInfo &info : devs) { if (info.first == device) return info.second; diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp index 40f77e899..ee7f5ec9e 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp @@ -63,7 +63,7 @@ DirectShowVideoRendererControl::~DirectShowVideoRendererControl() { #if QT_CONFIG(evr) if (m_evrPresenter) { - m_evrPresenter->setSurface(Q_NULLPTR); + m_evrPresenter->setSurface(nullptr); m_evrPresenter->Release(); } #endif @@ -83,7 +83,7 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface) #if QT_CONFIG(evr) if (m_evrPresenter) { - m_evrPresenter->setSurface(Q_NULLPTR); + m_evrPresenter->setSurface(nullptr); m_evrPresenter->Release(); m_evrPresenter = 0; } diff --git a/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp b/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp index f819c9f24..9d281e10c 100644 --- a/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinimageprocessing.cpp @@ -58,7 +58,7 @@ CameraBinImageProcessing::CameraBinImageProcessing(CameraBinSession *session) , m_session(session) , m_whiteBalanceMode(QCameraImageProcessing::WhiteBalanceAuto) #if QT_CONFIG(linux_v4l) - , m_v4lImageControl(Q_NULLPTR) + , m_v4lImageControl(nullptr) #endif { #if QT_CONFIG(gstreamer_photography) diff --git a/src/plugins/gstreamer/camerabin/camerabinserviceplugin.cpp b/src/plugins/gstreamer/camerabin/camerabinserviceplugin.cpp index 2d3c7c2ea..4f45a0a2f 100644 --- a/src/plugins/gstreamer/camerabin/camerabinserviceplugin.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinserviceplugin.cpp @@ -74,7 +74,7 @@ QMediaService* CameraBinServicePlugin::create(const QString &key) "GStreamer %u.%u." "\nPlease install the 'bad' GStreamer plugin package.", major, minor); - return Q_NULLPTR; + return nullptr; } return new CameraBinService(sourceFactory()); diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index f06d95ea3..823cfe408 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -466,6 +466,9 @@ GstElement *CameraBinSession::buildCameraSource() #if CAMERABIN_DEBUG qDebug() << Q_FUNC_INFO; #endif + if (m_inputDevice.isEmpty()) + return nullptr; + if (!m_inputDeviceHasChanged) return m_cameraSrc; @@ -482,7 +485,7 @@ GstElement *CameraBinSession::buildCameraSource() if (!m_cameraSrc) m_cameraSrc = camSrc; - if (m_cameraSrc && !m_inputDevice.isEmpty()) { + if (m_cameraSrc) { #if CAMERABIN_DEBUG qDebug() << "set camera device" << m_inputDevice; #endif @@ -729,21 +732,18 @@ void CameraBinSession::setState(QCamera::State newState) if (newState == m_pendingState) return; - emit pendingStateChanged(newState); + m_pendingState = newState; + emit pendingStateChanged(m_pendingState); #if CAMERABIN_DEBUG qDebug() << Q_FUNC_INFO << newState; #endif setStateHelper(newState); - m_pendingState = newState; } void CameraBinSession::setStateHelper(QCamera::State state) { - if (state == m_pendingState) - return; - switch (state) { case QCamera::UnloadedState: unload(); diff --git a/src/plugins/gstreamer/common.pri b/src/plugins/gstreamer/common.pri index cbe87be4f..d0c5c7bdd 100644 --- a/src/plugins/gstreamer/common.pri +++ b/src/plugins/gstreamer/common.pri @@ -1,12 +1,10 @@ -QT += core-private multimedia-private network +QT += core-private multimedia-private multimediagsttools-private network qtHaveModule(widgets) { QT += widgets multimediawidgets-private DEFINES += HAVE_WIDGETS } -LIBS += -lqgsttools_p - QMAKE_USE += gstreamer qtConfig(resourcepolicy): \ diff --git a/src/plugins/opensles/qopenslesaudiooutput.cpp b/src/plugins/opensles/qopenslesaudiooutput.cpp index 70d77a380..0b1f444bd 100644 --- a/src/plugins/opensles/qopenslesaudiooutput.cpp +++ b/src/plugins/opensles/qopenslesaudiooutput.cpp @@ -69,13 +69,13 @@ QOpenSLESAudioOutput::QOpenSLESAudioOutput(const QByteArray &device) : m_deviceName(device), m_state(QAudio::StoppedState), m_error(QAudio::NoError), - m_outputMixObject(Q_NULLPTR), - m_playerObject(Q_NULLPTR), - m_playItf(Q_NULLPTR), - m_volumeItf(Q_NULLPTR), - m_bufferQueueItf(Q_NULLPTR), - m_audioSource(Q_NULLPTR), - m_buffers(Q_NULLPTR), + m_outputMixObject(nullptr), + m_playerObject(nullptr), + m_playItf(nullptr), + m_volumeItf(nullptr), + m_bufferQueueItf(nullptr), + m_audioSource(nullptr), + m_buffers(nullptr), m_volume(1.0), m_pullMode(false), m_nextBuffer(0), @@ -157,7 +157,7 @@ QIODevice *QOpenSLESAudioOutput::start() stop(); if (!preparePlayer()) - return Q_NULLPTR; + return nullptr; m_pullMode = false; m_processedBytes = 0; @@ -458,8 +458,8 @@ bool QOpenSLESAudioOutput::preparePlayer() if (SL_RESULT_SUCCESS != (*engine)->CreateOutputMix(engine, &m_outputMixObject, 0, - Q_NULLPTR, - Q_NULLPTR)) { + nullptr, + nullptr)) { qWarning() << "Unable to create output mix"; setError(QAudio::FatalError); return false; @@ -472,7 +472,7 @@ bool QOpenSLESAudioOutput::preparePlayer() } SLDataLocator_OutputMix outputMixLocator = { SL_DATALOCATOR_OUTPUTMIX, m_outputMixObject }; - SLDataSink audioSink = { &outputMixLocator, Q_NULLPTR }; + SLDataSink audioSink = { &outputMixLocator, nullptr }; #ifndef ANDROID const int iids = 2; @@ -598,28 +598,28 @@ void QOpenSLESAudioOutput::destroyPlayer() if (m_playerObject) { (*m_playerObject)->Destroy(m_playerObject); - m_playerObject = Q_NULLPTR; + m_playerObject = nullptr; } if (m_outputMixObject) { (*m_outputMixObject)->Destroy(m_outputMixObject); - m_outputMixObject = Q_NULLPTR; + m_outputMixObject = nullptr; } if (!m_pullMode && m_audioSource) { m_audioSource->close(); delete m_audioSource; - m_audioSource = Q_NULLPTR; + m_audioSource = nullptr; } delete [] m_buffers; - m_buffers = Q_NULLPTR; + m_buffers = nullptr; m_processedBytes = 0; m_nextBuffer = 0; m_availableBuffers.storeRelease(BUFFER_COUNT); - m_playItf = Q_NULLPTR; - m_volumeItf = Q_NULLPTR; - m_bufferQueueItf = Q_NULLPTR; + m_playItf = nullptr; + m_volumeItf = nullptr; + m_bufferQueueItf = nullptr; m_startRequiresInit = true; } @@ -630,7 +630,7 @@ void QOpenSLESAudioOutput::stopPlayer() if (m_audioSource && !m_pullMode) { m_audioSource->close(); delete m_audioSource; - m_audioSource = Q_NULLPTR; + m_audioSource = nullptr; } // We need to change the state manually... diff --git a/src/plugins/opensles/qopenslesaudiooutput.h b/src/plugins/opensles/qopenslesaudiooutput.h index 4c724dca6..b480f00e6 100644 --- a/src/plugins/opensles/qopenslesaudiooutput.h +++ b/src/plugins/opensles/qopenslesaudiooutput.h @@ -57,30 +57,30 @@ public: QOpenSLESAudioOutput(const QByteArray &device); ~QOpenSLESAudioOutput(); - void start(QIODevice *device) Q_DECL_OVERRIDE; - QIODevice *start() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void suspend() Q_DECL_OVERRIDE; - void resume() Q_DECL_OVERRIDE; - int bytesFree() const Q_DECL_OVERRIDE; - int periodSize() const Q_DECL_OVERRIDE; - void setBufferSize(int value) Q_DECL_OVERRIDE; - int bufferSize() const Q_DECL_OVERRIDE; - void setNotifyInterval(int milliSeconds) Q_DECL_OVERRIDE; - int notifyInterval() const Q_DECL_OVERRIDE; - qint64 processedUSecs() const Q_DECL_OVERRIDE; - qint64 elapsedUSecs() const Q_DECL_OVERRIDE; - QAudio::Error error() const Q_DECL_OVERRIDE; - QAudio::State state() const Q_DECL_OVERRIDE; - void setFormat(const QAudioFormat &format) Q_DECL_OVERRIDE; - QAudioFormat format() const Q_DECL_OVERRIDE; - - void setVolume(qreal volume) Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; - - void setCategory(const QString &category) Q_DECL_OVERRIDE; - QString category() const Q_DECL_OVERRIDE; + void start(QIODevice *device) override; + QIODevice *start() override; + void stop() override; + void reset() override; + void suspend() override; + void resume() override; + int bytesFree() const override; + int periodSize() const override; + void setBufferSize(int value) override; + int bufferSize() const override; + void setNotifyInterval(int milliSeconds) override; + int notifyInterval() const override; + qint64 processedUSecs() const override; + qint64 elapsedUSecs() const override; + QAudio::Error error() const override; + QAudio::State state() const override; + void setFormat(const QAudioFormat &format) override; + QAudioFormat format() const override; + + void setVolume(qreal volume) override; + qreal volume() const override; + + void setCategory(const QString &category) override; + QString category() const override; private: friend class SLIODevicePrivate; @@ -138,11 +138,11 @@ class SLIODevicePrivate : public QIODevice public: inline SLIODevicePrivate(QOpenSLESAudioOutput *audio) : m_audioDevice(audio) {} - inline ~SLIODevicePrivate() Q_DECL_OVERRIDE {} + inline ~SLIODevicePrivate() override {} protected: - inline qint64 readData(char *, qint64) Q_DECL_OVERRIDE { return 0; } - inline qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE; + inline qint64 readData(char *, qint64) override { return 0; } + inline qint64 writeData(const char *data, qint64 len) override; private: QOpenSLESAudioOutput *m_audioDevice; diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 98a1bf242..71b9ec6e1 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -40,7 +40,8 @@ win32:!winrt { winrt { - SUBDIRS += winrt + SUBDIRS += winrt \ + audiocapture } unix:!mac:!android { diff --git a/src/plugins/pulseaudio/qaudioinput_pulse.cpp b/src/plugins/pulseaudio/qaudioinput_pulse.cpp index 050731071..2b5325132 100644 --- a/src/plugins/pulseaudio/qaudioinput_pulse.cpp +++ b/src/plugins/pulseaudio/qaudioinput_pulse.cpp @@ -226,7 +226,7 @@ QIODevice *QPulseAudioInput::start() close(); if (!open()) - return Q_NULLPTR; + return nullptr; m_pullMode = false; m_audioSource = new PulseInputPrivate(this); diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp index 0c7dc270a..3c20908dc 100644 --- a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp +++ b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp @@ -256,7 +256,7 @@ QIODevice *QPulseAudioOutput::start() m_pullMode = false; if (!open()) - return Q_NULLPTR; + return nullptr; m_audioSource = new PulseOutputPrivate(this); m_audioSource->open(QIODevice::WriteOnly|QIODevice::Unbuffered); diff --git a/src/plugins/pulseaudio/qpulsehelpers.cpp b/src/plugins/pulseaudio/qpulsehelpers.cpp index 17579bdd9..0604c97f5 100644 --- a/src/plugins/pulseaudio/qpulsehelpers.cpp +++ b/src/plugins/pulseaudio/qpulsehelpers.cpp @@ -49,30 +49,23 @@ pa_sample_spec audioFormatToSampleSpec(const QAudioFormat &format) spec.rate = format.sampleRate(); spec.channels = format.channelCount(); - - if (format.sampleSize() == 8) { - spec.format = PA_SAMPLE_U8; - } else if (format.sampleSize() == 16) { - switch (format.byteOrder()) { - case QAudioFormat::BigEndian: spec.format = PA_SAMPLE_S16BE; break; - case QAudioFormat::LittleEndian: spec.format = PA_SAMPLE_S16LE; break; - } - } else if (format.sampleSize() == 24) { - switch (format.byteOrder()) { - case QAudioFormat::BigEndian: spec.format = PA_SAMPLE_S24BE; break; - case QAudioFormat::LittleEndian: spec.format = PA_SAMPLE_S24LE; break; - } - } else if (format.sampleSize() == 32) { - switch (format.byteOrder()) { - case QAudioFormat::BigEndian: - format.sampleType() == QAudioFormat::Float ? spec.format = PA_SAMPLE_FLOAT32BE : spec.format = PA_SAMPLE_S32BE; - break; - case QAudioFormat::LittleEndian: - format.sampleType() == QAudioFormat::Float ? spec.format = PA_SAMPLE_FLOAT32LE : spec.format = PA_SAMPLE_S32LE; - break; + spec.format = PA_SAMPLE_INVALID; + const bool isBigEndian = (format.byteOrder() == QAudioFormat::BigEndian); + + if (format.sampleType() == QAudioFormat::UnSignedInt) { + if (format.sampleSize() == 8) + spec.format = PA_SAMPLE_U8; + } else if (format.sampleType() == QAudioFormat::SignedInt) { + if (format.sampleSize() == 16) { + spec.format = isBigEndian ? PA_SAMPLE_S16BE : PA_SAMPLE_S16LE; + } else if (format.sampleSize() == 24) { + spec.format = isBigEndian ? PA_SAMPLE_S24BE : PA_SAMPLE_S24LE; + } else if (format.sampleSize() == 32) { + spec.format = isBigEndian ? PA_SAMPLE_S32BE : PA_SAMPLE_S32LE; } - } else { - spec.format = PA_SAMPLE_INVALID; + } else if (format.sampleType() == QAudioFormat::Float) { + if (format.sampleSize() == 32) + spec.format = isBigEndian ? PA_SAMPLE_FLOAT32BE : PA_SAMPLE_FLOAT32LE; } return spec; diff --git a/src/plugins/qnx-audio/audio/qnxaudiodeviceinfo.h b/src/plugins/qnx-audio/audio/qnxaudiodeviceinfo.h index 432c22163..cb620be3b 100644 --- a/src/plugins/qnx-audio/audio/qnxaudiodeviceinfo.h +++ b/src/plugins/qnx-audio/audio/qnxaudiodeviceinfo.h @@ -52,15 +52,15 @@ public: QnxAudioDeviceInfo(const QString &deviceName, QAudio::Mode mode); ~QnxAudioDeviceInfo(); - QAudioFormat preferredFormat() const Q_DECL_OVERRIDE; - bool isFormatSupported(const QAudioFormat &format) const Q_DECL_OVERRIDE; - QString deviceName() const Q_DECL_OVERRIDE; - QStringList supportedCodecs() Q_DECL_OVERRIDE; - QList<int> supportedSampleRates() Q_DECL_OVERRIDE; - QList<int> supportedChannelCounts() Q_DECL_OVERRIDE; - QList<int> supportedSampleSizes() Q_DECL_OVERRIDE; - QList<QAudioFormat::Endian> supportedByteOrders() Q_DECL_OVERRIDE; - QList<QAudioFormat::SampleType> supportedSampleTypes() Q_DECL_OVERRIDE; + QAudioFormat preferredFormat() const override; + bool isFormatSupported(const QAudioFormat &format) const override; + QString deviceName() const override; + QStringList supportedCodecs() override; + QList<int> supportedSampleRates() override; + QList<int> supportedChannelCounts() override; + QList<int> supportedSampleSizes() override; + QList<QAudioFormat::Endian> supportedByteOrders() override; + QList<QAudioFormat::SampleType> supportedSampleTypes() override; private: const QString m_name; diff --git a/src/plugins/qnx-audio/audio/qnxaudioinput.h b/src/plugins/qnx-audio/audio/qnxaudioinput.h index 4c6bb2676..c677b6c96 100644 --- a/src/plugins/qnx-audio/audio/qnxaudioinput.h +++ b/src/plugins/qnx-audio/audio/qnxaudioinput.h @@ -59,26 +59,26 @@ public: QnxAudioInput(); ~QnxAudioInput(); - void start(QIODevice*) Q_DECL_OVERRIDE; - QIODevice* start() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void suspend() Q_DECL_OVERRIDE; - void resume() Q_DECL_OVERRIDE; - int bytesReady() const Q_DECL_OVERRIDE; - int periodSize() const Q_DECL_OVERRIDE; - void setBufferSize(int ) Q_DECL_OVERRIDE; - int bufferSize() const Q_DECL_OVERRIDE; - void setNotifyInterval(int ) Q_DECL_OVERRIDE; - int notifyInterval() const Q_DECL_OVERRIDE; - qint64 processedUSecs() const Q_DECL_OVERRIDE; - qint64 elapsedUSecs() const Q_DECL_OVERRIDE; - QAudio::Error error() const Q_DECL_OVERRIDE; - QAudio::State state() const Q_DECL_OVERRIDE; - void setFormat(const QAudioFormat&) Q_DECL_OVERRIDE; - QAudioFormat format() const Q_DECL_OVERRIDE; - void setVolume(qreal) Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; + void start(QIODevice*) override; + QIODevice* start() override; + void stop() override; + void reset() override; + void suspend() override; + void resume() override; + int bytesReady() const override; + int periodSize() const override; + void setBufferSize(int ) override; + int bufferSize() const override; + void setNotifyInterval(int ) override; + int notifyInterval() const override; + qint64 processedUSecs() const override; + qint64 elapsedUSecs() const override; + QAudio::Error error() const override; + QAudio::State state() const override; + void setFormat(const QAudioFormat&) override; + QAudioFormat format() const override; + void setVolume(qreal) override; + qreal volume() const override; private slots: void userFeed(); @@ -124,8 +124,8 @@ class InputPrivate : public QIODevice public: InputPrivate(QnxAudioInput *audio); - qint64 readData(char *data, qint64 len) Q_DECL_OVERRIDE; - qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE; + qint64 readData(char *data, qint64 len) override; + qint64 writeData(const char *data, qint64 len) override; void trigger(); diff --git a/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp b/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp index d08d01e6d..c4c09f543 100644 --- a/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp +++ b/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp @@ -43,19 +43,24 @@ #include <private/qaudiohelpers_p.h> +#pragma GCC diagnostic ignored "-Wvla" + QT_BEGIN_NAMESPACE QnxAudioOutput::QnxAudioOutput() - : m_source(0), - m_pushSource(false), - m_notifyInterval(1000), - m_error(QAudio::NoError), - m_state(QAudio::StoppedState), - m_volume(1.0), - m_periodSize(0), - m_pcmHandle(0), - m_bytesWritten(0), - m_intervalOffset(0) + : m_source(0) + , m_pushSource(false) + , m_notifyInterval(1000) + , m_error(QAudio::NoError) + , m_state(QAudio::StoppedState) + , m_volume(1.0) + , m_periodSize(0) + , m_pcmHandle(0) + , m_bytesWritten(0) + , m_intervalOffset(0) +#if _NTO_VERSION >= 700 + , m_pcmNotifier(0) +#endif { m_timer.setSingleShot(false); m_timer.setInterval(20); @@ -124,20 +129,16 @@ void QnxAudioOutput::reset() void QnxAudioOutput::suspend() { - m_timer.stop(); snd_pcm_playback_pause(m_pcmHandle); - setState(QAudio::SuspendedState); + if (state() != QAudio::InterruptedState) + suspendInternal(QAudio::SuspendedState); } void QnxAudioOutput::resume() { snd_pcm_playback_resume(m_pcmHandle); - if (m_pushSource) - setState(QAudio::IdleState); - else { - setState(QAudio::ActiveState); - m_timer.start(); - } + if (state() != QAudio::InterruptedState) + resumeInternal(); } int QnxAudioOutput::bytesFree() const @@ -146,6 +147,7 @@ int QnxAudioOutput::bytesFree() const return 0; snd_pcm_channel_status_t status; + memset(&status, 0, sizeof(status)); status.channel = SND_PCM_CHANNEL_PLAYBACK; const int errorCode = snd_pcm_plugin_status(m_pcmHandle, &status); @@ -214,9 +216,21 @@ qreal QnxAudioOutput::volume() const return m_volume; } +void QnxAudioOutput::setCategory(const QString &category) +{ + m_category = category; +} + +QString QnxAudioOutput::category() const +{ + return m_category; +} + void QnxAudioOutput::pullData() { - if (m_state == QAudio::StoppedState || m_state == QAudio::SuspendedState) + if (m_state == QAudio::StoppedState + || m_state == QAudio::SuspendedState + || m_state == QAudio::InterruptedState) return; const int bytesAvailable = bytesFree(); @@ -290,6 +304,8 @@ bool QnxAudioOutput::open() return false; } + addPcmEventFilter(); + // Necessary so that bytesFree() which uses the "free" member of the status struct works snd_pcm_plugin_set_disable(m_pcmHandle, PLUGIN_MMAP); @@ -303,6 +319,7 @@ bool QnxAudioOutput::open() } snd_pcm_channel_params_t params = QnxAudioUtils::formatToChannelParams(m_format, QAudio::AudioOutput, info.max_fragment_size); + setTypeName(¶ms); if ((errorCode = snd_pcm_plugin_params(m_pcmHandle, ¶ms)) < 0) { qWarning("QnxAudioOutput: open error, couldn't set channel params (0x%x)", -errorCode); @@ -331,6 +348,8 @@ bool QnxAudioOutput::open() m_intervalOffset = 0; m_bytesWritten = 0; + createPcmNotifiers(); + return true; } @@ -338,6 +357,8 @@ void QnxAudioOutput::close() { m_timer.stop(); + destroyPcmNotifiers(); + if (m_pcmHandle) { snd_pcm_plugin_flush(m_pcmHandle, SND_PCM_CHANNEL_PLAYBACK); snd_pcm_close(m_pcmHandle); @@ -400,6 +421,109 @@ qint64 QnxAudioOutput::write(const char *data, qint64 len) } } +void QnxAudioOutput::suspendInternal(QAudio::State suspendState) +{ + m_timer.stop(); + setState(suspendState); +} + +void QnxAudioOutput::resumeInternal() +{ + if (m_pushSource) { + setState(QAudio::IdleState); + } else { + setState(QAudio::ActiveState); + m_timer.start(); + } +} + +#if _NTO_VERSION >= 700 + +QAudio::State suspendState(const snd_pcm_event_t &event) +{ + Q_ASSERT(event.type == SND_PCM_EVENT_AUDIOMGMT_STATUS); + Q_ASSERT(event.data.audiomgmt_status.new_status == SND_PCM_STATUS_SUSPENDED); + return event.data.audiomgmt_status.flags & SND_PCM_STATUS_EVENT_HARD_SUSPEND + ? QAudio::InterruptedState : QAudio::SuspendedState; +} + +void QnxAudioOutput::addPcmEventFilter() +{ + /* Enable PCM events */ + snd_pcm_filter_t filter; + memset(&filter, 0, sizeof(filter)); + filter.enable = (1<<SND_PCM_EVENT_AUDIOMGMT_STATUS) | + (1<<SND_PCM_EVENT_AUDIOMGMT_MUTE) | + (1<<SND_PCM_EVENT_OUTPUTCLASS); + snd_pcm_set_filter(m_pcmHandle, SND_PCM_CHANNEL_PLAYBACK, &filter); +} + +void QnxAudioOutput::createPcmNotifiers() +{ + // QSocketNotifier::Read for poll based event dispatcher. Exception for + // select based event dispatcher. + m_pcmNotifier = new QSocketNotifier(snd_pcm_file_descriptor(m_pcmHandle, + SND_PCM_CHANNEL_PLAYBACK), + QSocketNotifier::Read, this); + connect(m_pcmNotifier, &QSocketNotifier::activated, + this, &QnxAudioOutput::pcmNotifierActivated); +} + +void QnxAudioOutput::destroyPcmNotifiers() +{ + if (m_pcmNotifier) { + delete m_pcmNotifier; + m_pcmNotifier = 0; + } +} + +void QnxAudioOutput::setTypeName(snd_pcm_channel_params_t *params) +{ + if (m_category.isEmpty()) + return; + + QByteArray latin1Category = m_category.toLatin1(); + + if (QString::fromLatin1(latin1Category) != m_category) { + qWarning("QnxAudioOutput: audio category name isn't a Latin1 string."); + return; + } + + if (latin1Category.size() >= static_cast<int>(sizeof(params->audio_type_name))) { + qWarning("QnxAudioOutput: audio category name too long."); + return; + } + + strcpy(params->audio_type_name, latin1Category.constData()); +} + +void QnxAudioOutput::pcmNotifierActivated(int socket) +{ + Q_UNUSED(socket); + + snd_pcm_event_t pcm_event; + memset(&pcm_event, 0, sizeof(pcm_event)); + while (snd_pcm_channel_read_event(m_pcmHandle, SND_PCM_CHANNEL_PLAYBACK, &pcm_event) == 0) { + if (pcm_event.type == SND_PCM_EVENT_AUDIOMGMT_STATUS) { + if (pcm_event.data.audiomgmt_status.new_status == SND_PCM_STATUS_SUSPENDED) + suspendInternal(suspendState(pcm_event)); + else if (pcm_event.data.audiomgmt_status.new_status == SND_PCM_STATUS_RUNNING) + resumeInternal(); + else if (pcm_event.data.audiomgmt_status.new_status == SND_PCM_STATUS_PAUSED) + suspendInternal(QAudio::SuspendedState); + } + } +} + +#else + +void QnxAudioOutput::addPcmEventFilter() {} +void QnxAudioOutput::createPcmNotifiers() {} +void QnxAudioOutput::destroyPcmNotifiers() {} +void QnxAudioOutput::setTypeName(snd_pcm_channel_params_t *) {} + +#endif + QnxPushIODevice::QnxPushIODevice(QnxAudioOutput *output) : QIODevice(output), m_output(output) diff --git a/src/plugins/qnx-audio/audio/qnxaudiooutput.h b/src/plugins/qnx-audio/audio/qnxaudiooutput.h index 5ee69b542..7a0979f77 100644 --- a/src/plugins/qnx-audio/audio/qnxaudiooutput.h +++ b/src/plugins/qnx-audio/audio/qnxaudiooutput.h @@ -45,8 +45,10 @@ #include <QTime> #include <QTimer> #include <QIODevice> +#include <QSocketNotifier> #include <sys/asoundlib.h> +#include <sys/neutrino.h> QT_BEGIN_NAMESPACE @@ -60,26 +62,28 @@ public: QnxAudioOutput(); ~QnxAudioOutput(); - void start(QIODevice *source) Q_DECL_OVERRIDE; - QIODevice *start() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void suspend() Q_DECL_OVERRIDE; - void resume() Q_DECL_OVERRIDE; - int bytesFree() const Q_DECL_OVERRIDE; - int periodSize() const Q_DECL_OVERRIDE; - void setBufferSize(int) Q_DECL_OVERRIDE {} - int bufferSize() const Q_DECL_OVERRIDE { return 0; } - void setNotifyInterval(int ms) Q_DECL_OVERRIDE; - int notifyInterval() const Q_DECL_OVERRIDE; - qint64 processedUSecs() const Q_DECL_OVERRIDE; - qint64 elapsedUSecs() const Q_DECL_OVERRIDE; - QAudio::Error error() const Q_DECL_OVERRIDE; - QAudio::State state() const Q_DECL_OVERRIDE; - void setFormat(const QAudioFormat &format) Q_DECL_OVERRIDE; - QAudioFormat format() const Q_DECL_OVERRIDE; - void setVolume(qreal volume) Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; + void start(QIODevice *source) override; + QIODevice *start() override; + void stop() override; + void reset() override; + void suspend() override; + void resume() override; + int bytesFree() const override; + int periodSize() const override; + void setBufferSize(int) override {} + int bufferSize() const override { return 0; } + void setNotifyInterval(int ms) override; + int notifyInterval() const override; + qint64 processedUSecs() const override; + qint64 elapsedUSecs() const override; + QAudio::Error error() const override; + QAudio::State state() const override; + void setFormat(const QAudioFormat &format) override; + QAudioFormat format() const override; + void setVolume(qreal volume) override; + qreal volume() const override; + void setCategory(const QString &category) override; + QString category() const override; private slots: void pullData(); @@ -90,6 +94,14 @@ private: void setError(QAudio::Error error); void setState(QAudio::State state); + void addPcmEventFilter(); + void createPcmNotifiers(); + void destroyPcmNotifiers(); + void setTypeName(snd_pcm_channel_params_t *params); + + void suspendInternal(QAudio::State suspendState); + void resumeInternal(); + friend class QnxPushIODevice; qint64 write(const char *data, qint64 len); @@ -102,6 +114,7 @@ private: QAudio::State m_state; QAudioFormat m_format; qreal m_volume; + QString m_category; int m_periodSize; snd_pcm_t *m_pcmHandle; @@ -109,6 +122,13 @@ private: QTime m_startTimeStamp; QTime m_intervalTimeStamp; qint64 m_intervalOffset; + +#if _NTO_VERSION >= 700 + QSocketNotifier *m_pcmNotifier; + +private slots: + void pcmNotifierActivated(int socket); +#endif }; class QnxPushIODevice : public QIODevice diff --git a/src/plugins/qnx-audio/audio/qnxaudioplugin.h b/src/plugins/qnx-audio/audio/qnxaudioplugin.h index 1d8b8a74b..d41f4020a 100644 --- a/src/plugins/qnx-audio/audio/qnxaudioplugin.h +++ b/src/plugins/qnx-audio/audio/qnxaudioplugin.h @@ -55,11 +55,11 @@ public: explicit QnxAudioPlugin(QObject *parent = 0); ~QnxAudioPlugin() {} - QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) Q_DECL_OVERRIDE; + QByteArray defaultDevice(QAudio::Mode mode) const override; + QList<QByteArray> availableDevices(QAudio::Mode mode) const override; + QAbstractAudioInput *createInput(const QByteArray &device) override; + QAbstractAudioOutput *createOutput(const QByteArray &device) override; + QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) override; }; QT_END_NAMESPACE diff --git a/src/plugins/qnx/camera/bbcameraaudioencodersettingscontrol.h b/src/plugins/qnx/camera/bbcameraaudioencodersettingscontrol.h index 44ee80026..38c01f86c 100644 --- a/src/plugins/qnx/camera/bbcameraaudioencodersettingscontrol.h +++ b/src/plugins/qnx/camera/bbcameraaudioencodersettingscontrol.h @@ -51,11 +51,11 @@ class BbCameraAudioEncoderSettingsControl : public QAudioEncoderSettingsControl public: explicit BbCameraAudioEncoderSettingsControl(BbCameraSession *session, QObject *parent = 0); - QStringList supportedAudioCodecs() const Q_DECL_OVERRIDE; - QString codecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QAudioEncoderSettings audioSettings() const Q_DECL_OVERRIDE; - void setAudioSettings(const QAudioEncoderSettings &settings) Q_DECL_OVERRIDE; + QStringList supportedAudioCodecs() const override; + QString codecDescription(const QString &codecName) const override; + QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const override; + QAudioEncoderSettings audioSettings() const override; + void setAudioSettings(const QAudioEncoderSettings &settings) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameracapturebufferformatcontrol.h b/src/plugins/qnx/camera/bbcameracapturebufferformatcontrol.h index 2be6f0c3b..4aac740c8 100644 --- a/src/plugins/qnx/camera/bbcameracapturebufferformatcontrol.h +++ b/src/plugins/qnx/camera/bbcameracapturebufferformatcontrol.h @@ -49,9 +49,9 @@ class BbCameraCaptureBufferFormatControl : public QCameraCaptureBufferFormatCont public: explicit BbCameraCaptureBufferFormatControl(QObject *parent = 0); - QList<QVideoFrame::PixelFormat> supportedBufferFormats() const Q_DECL_OVERRIDE; - QVideoFrame::PixelFormat bufferFormat() const Q_DECL_OVERRIDE; - void setBufferFormat(QVideoFrame::PixelFormat format) Q_DECL_OVERRIDE; + QList<QVideoFrame::PixelFormat> supportedBufferFormats() const override; + QVideoFrame::PixelFormat bufferFormat() const override; + void setBufferFormat(QVideoFrame::PixelFormat format) override; }; QT_END_NAMESPACE diff --git a/src/plugins/qnx/camera/bbcameracapturedestinationcontrol.h b/src/plugins/qnx/camera/bbcameracapturedestinationcontrol.h index ab6f54b3d..9586ec56a 100644 --- a/src/plugins/qnx/camera/bbcameracapturedestinationcontrol.h +++ b/src/plugins/qnx/camera/bbcameracapturedestinationcontrol.h @@ -51,9 +51,9 @@ class BbCameraCaptureDestinationControl : public QCameraCaptureDestinationContro public: explicit BbCameraCaptureDestinationControl(BbCameraSession *session, QObject *parent = 0); - bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const Q_DECL_OVERRIDE; - QCameraImageCapture::CaptureDestinations captureDestination() const Q_DECL_OVERRIDE; - void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) Q_DECL_OVERRIDE; + bool isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const override; + QCameraImageCapture::CaptureDestinations captureDestination() const override; + void setCaptureDestination(QCameraImageCapture::CaptureDestinations destination) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameracontrol.h b/src/plugins/qnx/camera/bbcameracontrol.h index a22c8d6fa..0c97bd83c 100644 --- a/src/plugins/qnx/camera/bbcameracontrol.h +++ b/src/plugins/qnx/camera/bbcameracontrol.h @@ -51,16 +51,16 @@ class BbCameraControl : public QCameraControl public: explicit BbCameraControl(BbCameraSession *session, QObject *parent = 0); - QCamera::State state() const Q_DECL_OVERRIDE; - void setState(QCamera::State state) Q_DECL_OVERRIDE; + QCamera::State state() const override; + void setState(QCamera::State state) override; - QCamera::Status status() const Q_DECL_OVERRIDE; + QCamera::Status status() const override; - QCamera::CaptureModes captureMode() const Q_DECL_OVERRIDE; - void setCaptureMode(QCamera::CaptureModes) Q_DECL_OVERRIDE; - bool isCaptureModeSupported(QCamera::CaptureModes mode) const Q_DECL_OVERRIDE; + QCamera::CaptureModes captureMode() const override; + void setCaptureMode(QCamera::CaptureModes) override; + bool isCaptureModeSupported(QCamera::CaptureModes mode) const override; - bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const Q_DECL_OVERRIDE; + bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameraexposurecontrol.h b/src/plugins/qnx/camera/bbcameraexposurecontrol.h index 4f5a71518..2d0da29bd 100644 --- a/src/plugins/qnx/camera/bbcameraexposurecontrol.h +++ b/src/plugins/qnx/camera/bbcameraexposurecontrol.h @@ -51,12 +51,12 @@ class BbCameraExposureControl : public QCameraExposureControl public: explicit BbCameraExposureControl(BbCameraSession *session, QObject *parent = 0); - virtual bool isParameterSupported(ExposureParameter parameter) const Q_DECL_OVERRIDE; - virtual QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const Q_DECL_OVERRIDE; + bool isParameterSupported(ExposureParameter parameter) const override; + QVariantList supportedParameterRange(ExposureParameter parameter, bool *continuous) const override; - virtual QVariant requestedValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - virtual QVariant actualValue(ExposureParameter parameter) const Q_DECL_OVERRIDE; - virtual bool setValue(ExposureParameter parameter, const QVariant& value) Q_DECL_OVERRIDE; + QVariant requestedValue(ExposureParameter parameter) const override; + QVariant actualValue(ExposureParameter parameter) const override; + bool setValue(ExposureParameter parameter, const QVariant& value) override; private Q_SLOTS: void statusChanged(QCamera::Status status); diff --git a/src/plugins/qnx/camera/bbcameraflashcontrol.h b/src/plugins/qnx/camera/bbcameraflashcontrol.h index e4b5f0a7f..8ce9c1f41 100644 --- a/src/plugins/qnx/camera/bbcameraflashcontrol.h +++ b/src/plugins/qnx/camera/bbcameraflashcontrol.h @@ -51,10 +51,10 @@ class BbCameraFlashControl : public QCameraFlashControl public: explicit BbCameraFlashControl(BbCameraSession *session, QObject *parent = 0); - QCameraExposure::FlashModes flashMode() const Q_DECL_OVERRIDE; - void setFlashMode(QCameraExposure::FlashModes mode) Q_DECL_OVERRIDE; - bool isFlashModeSupported(QCameraExposure::FlashModes mode) const Q_DECL_OVERRIDE; - bool isFlashReady() const Q_DECL_OVERRIDE; + QCameraExposure::FlashModes flashMode() const override; + void setFlashMode(QCameraExposure::FlashModes mode) override; + bool isFlashModeSupported(QCameraExposure::FlashModes mode) const override; + bool isFlashReady() const override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcamerafocuscontrol.h b/src/plugins/qnx/camera/bbcamerafocuscontrol.h index 2501aafdd..bf11ea03e 100644 --- a/src/plugins/qnx/camera/bbcamerafocuscontrol.h +++ b/src/plugins/qnx/camera/bbcamerafocuscontrol.h @@ -51,15 +51,15 @@ class BbCameraFocusControl : public QCameraFocusControl public: explicit BbCameraFocusControl(BbCameraSession *session, QObject *parent = 0); - QCameraFocus::FocusModes focusMode() const Q_DECL_OVERRIDE; - void setFocusMode(QCameraFocus::FocusModes mode) Q_DECL_OVERRIDE; - bool isFocusModeSupported(QCameraFocus::FocusModes mode) const Q_DECL_OVERRIDE; - QCameraFocus::FocusPointMode focusPointMode() const Q_DECL_OVERRIDE; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) Q_DECL_OVERRIDE; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const Q_DECL_OVERRIDE; - QPointF customFocusPoint() const Q_DECL_OVERRIDE; - void setCustomFocusPoint(const QPointF &point) Q_DECL_OVERRIDE; - QCameraFocusZoneList focusZones() const Q_DECL_OVERRIDE; + QCameraFocus::FocusModes focusMode() const override; + void setFocusMode(QCameraFocus::FocusModes mode) override; + bool isFocusModeSupported(QCameraFocus::FocusModes mode) const override; + QCameraFocus::FocusPointMode focusPointMode() const override; + void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; + bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; + QPointF customFocusPoint() const override; + void setCustomFocusPoint(const QPointF &point) override; + QCameraFocusZoneList focusZones() const override; private: void updateCustomFocusRegion(); diff --git a/src/plugins/qnx/camera/bbcameraimagecapturecontrol.h b/src/plugins/qnx/camera/bbcameraimagecapturecontrol.h index 4d239ef59..b8013ba1f 100644 --- a/src/plugins/qnx/camera/bbcameraimagecapturecontrol.h +++ b/src/plugins/qnx/camera/bbcameraimagecapturecontrol.h @@ -51,13 +51,13 @@ class BbCameraImageCaptureControl : public QCameraImageCaptureControl public: explicit BbCameraImageCaptureControl(BbCameraSession *session, QObject *parent = 0); - bool isReadyForCapture() const Q_DECL_OVERRIDE; + bool isReadyForCapture() const override; - QCameraImageCapture::DriveMode driveMode() const Q_DECL_OVERRIDE; - void setDriveMode(QCameraImageCapture::DriveMode mode) Q_DECL_OVERRIDE; + QCameraImageCapture::DriveMode driveMode() const override; + void setDriveMode(QCameraImageCapture::DriveMode mode) override; - int capture(const QString &fileName) Q_DECL_OVERRIDE; - void cancelCapture() Q_DECL_OVERRIDE; + int capture(const QString &fileName) override; + void cancelCapture() override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameraimageprocessingcontrol.h b/src/plugins/qnx/camera/bbcameraimageprocessingcontrol.h index 2060b4d99..0eefdd2a1 100644 --- a/src/plugins/qnx/camera/bbcameraimageprocessingcontrol.h +++ b/src/plugins/qnx/camera/bbcameraimageprocessingcontrol.h @@ -51,10 +51,10 @@ class BbCameraImageProcessingControl : public QCameraImageProcessingControl public: explicit BbCameraImageProcessingControl(BbCameraSession *session, QObject *parent = 0); - bool isParameterSupported(ProcessingParameter) const Q_DECL_OVERRIDE; - bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const Q_DECL_OVERRIDE; - QVariant parameter(ProcessingParameter parameter) const Q_DECL_OVERRIDE; - void setParameter(ProcessingParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; + bool isParameterSupported(ProcessingParameter) const override; + bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const override; + QVariant parameter(ProcessingParameter parameter) const override; + void setParameter(ProcessingParameter parameter, const QVariant &value) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameralockscontrol.h b/src/plugins/qnx/camera/bbcameralockscontrol.h index f6a7e1864..be3d1bd02 100644 --- a/src/plugins/qnx/camera/bbcameralockscontrol.h +++ b/src/plugins/qnx/camera/bbcameralockscontrol.h @@ -59,10 +59,10 @@ public: explicit BbCameraLocksControl(BbCameraSession *session, QObject *parent = 0); - QCamera::LockTypes supportedLocks() const Q_DECL_OVERRIDE; - QCamera::LockStatus lockStatus(QCamera::LockType lock) const Q_DECL_OVERRIDE; - void searchAndLock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; - void unlock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; + QCamera::LockTypes supportedLocks() const override; + QCamera::LockStatus lockStatus(QCamera::LockType lock) const override; + void searchAndLock(QCamera::LockTypes locks) override; + void unlock(QCamera::LockTypes locks) override; private Q_SLOTS: void cameraOpened(); diff --git a/src/plugins/qnx/camera/bbcameramediarecordercontrol.h b/src/plugins/qnx/camera/bbcameramediarecordercontrol.h index 0ba82969f..af46479a5 100644 --- a/src/plugins/qnx/camera/bbcameramediarecordercontrol.h +++ b/src/plugins/qnx/camera/bbcameramediarecordercontrol.h @@ -51,19 +51,19 @@ class BbCameraMediaRecorderControl : public QMediaRecorderControl public: explicit BbCameraMediaRecorderControl(BbCameraSession *session, QObject *parent = 0); - QUrl outputLocation() const Q_DECL_OVERRIDE; - bool setOutputLocation(const QUrl &location) Q_DECL_OVERRIDE; - QMediaRecorder::State state() const Q_DECL_OVERRIDE; - QMediaRecorder::Status status() const Q_DECL_OVERRIDE; - qint64 duration() const Q_DECL_OVERRIDE; - bool isMuted() const Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; - void applySettings() Q_DECL_OVERRIDE; + QUrl outputLocation() const override; + bool setOutputLocation(const QUrl &location) override; + QMediaRecorder::State state() const override; + QMediaRecorder::Status status() const override; + qint64 duration() const override; + bool isMuted() const override; + qreal volume() const override; + void applySettings() override; public Q_SLOTS: - void setState(QMediaRecorder::State state) Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; - void setVolume(qreal volume) Q_DECL_OVERRIDE; + void setState(QMediaRecorder::State state) override; + void setMuted(bool muted) override; + void setVolume(qreal volume) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameraorientationhandler.h b/src/plugins/qnx/camera/bbcameraorientationhandler.h index e730acdc7..006a259cc 100644 --- a/src/plugins/qnx/camera/bbcameraorientationhandler.h +++ b/src/plugins/qnx/camera/bbcameraorientationhandler.h @@ -51,7 +51,7 @@ public: explicit BbCameraOrientationHandler(QObject *parent = 0); ~BbCameraOrientationHandler(); - bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE; + bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; int orientation() const; diff --git a/src/plugins/qnx/camera/bbcameravideoencodersettingscontrol.h b/src/plugins/qnx/camera/bbcameravideoencodersettingscontrol.h index 1e0ed8708..f67196be1 100644 --- a/src/plugins/qnx/camera/bbcameravideoencodersettingscontrol.h +++ b/src/plugins/qnx/camera/bbcameravideoencodersettingscontrol.h @@ -51,12 +51,12 @@ class BbCameraVideoEncoderSettingsControl : public QVideoEncoderSettingsControl public: explicit BbCameraVideoEncoderSettingsControl(BbCameraSession *session, QObject *parent = 0); - QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QStringList supportedVideoCodecs() const Q_DECL_OVERRIDE; - QString videoCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QVideoEncoderSettings videoSettings() const Q_DECL_OVERRIDE; - void setVideoSettings(const QVideoEncoderSettings &settings) Q_DECL_OVERRIDE; + QList<QSize> supportedResolutions(const QVideoEncoderSettings &settings, bool *continuous = 0) const override; + QList<qreal> supportedFrameRates(const QVideoEncoderSettings &settings, bool *continuous = 0) const override; + QStringList supportedVideoCodecs() const override; + QString videoCodecDescription(const QString &codecName) const override; + QVideoEncoderSettings videoSettings() const override; + void setVideoSettings(const QVideoEncoderSettings &settings) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcameraviewfindersettingscontrol.h b/src/plugins/qnx/camera/bbcameraviewfindersettingscontrol.h index b9c4af8a3..7a8e57a13 100644 --- a/src/plugins/qnx/camera/bbcameraviewfindersettingscontrol.h +++ b/src/plugins/qnx/camera/bbcameraviewfindersettingscontrol.h @@ -51,9 +51,9 @@ class BbCameraViewfinderSettingsControl : public QCameraViewfinderSettingsContro public: explicit BbCameraViewfinderSettingsControl(BbCameraSession *session, QObject *parent = 0); - bool isViewfinderParameterSupported(ViewfinderParameter parameter) const Q_DECL_OVERRIDE; - QVariant viewfinderParameter(ViewfinderParameter parameter) const Q_DECL_OVERRIDE; - void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) Q_DECL_OVERRIDE; + bool isViewfinderParameterSupported(ViewfinderParameter parameter) const override; + QVariant viewfinderParameter(ViewfinderParameter parameter) const override; + void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbcamerazoomcontrol.h b/src/plugins/qnx/camera/bbcamerazoomcontrol.h index fc5813db4..7b5e06f8d 100644 --- a/src/plugins/qnx/camera/bbcamerazoomcontrol.h +++ b/src/plugins/qnx/camera/bbcamerazoomcontrol.h @@ -52,13 +52,13 @@ class BbCameraZoomControl : public QCameraZoomControl public: explicit BbCameraZoomControl(BbCameraSession *session, QObject *parent = 0); - qreal maximumOpticalZoom() const Q_DECL_OVERRIDE; - qreal maximumDigitalZoom() const Q_DECL_OVERRIDE; - qreal requestedOpticalZoom() const Q_DECL_OVERRIDE; - qreal requestedDigitalZoom() const Q_DECL_OVERRIDE; - qreal currentOpticalZoom() const Q_DECL_OVERRIDE; - qreal currentDigitalZoom() const Q_DECL_OVERRIDE; - void zoomTo(qreal optical, qreal digital) Q_DECL_OVERRIDE; + qreal maximumOpticalZoom() const override; + qreal maximumDigitalZoom() const override; + qreal requestedOpticalZoom() const override; + qreal requestedDigitalZoom() const override; + qreal currentOpticalZoom() const override; + qreal currentDigitalZoom() const override; + void zoomTo(qreal optical, qreal digital) override; private Q_SLOTS: void statusChanged(QCamera::Status status); diff --git a/src/plugins/qnx/camera/bbimageencodercontrol.h b/src/plugins/qnx/camera/bbimageencodercontrol.h index adb506f1f..bb246def6 100644 --- a/src/plugins/qnx/camera/bbimageencodercontrol.h +++ b/src/plugins/qnx/camera/bbimageencodercontrol.h @@ -51,11 +51,11 @@ class BbImageEncoderControl : public QImageEncoderControl public: explicit BbImageEncoderControl(BbCameraSession *session, QObject *parent = 0); - QStringList supportedImageCodecs() const Q_DECL_OVERRIDE; - QString imageCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QImageEncoderSettings imageSettings() const Q_DECL_OVERRIDE; - void setImageSettings(const QImageEncoderSettings &settings) Q_DECL_OVERRIDE; + QStringList supportedImageCodecs() const override; + QString imageCodecDescription(const QString &codecName) const override; + QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const override; + QImageEncoderSettings imageSettings() const override; + void setImageSettings(const QImageEncoderSettings &settings) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/camera/bbvideodeviceselectorcontrol.h b/src/plugins/qnx/camera/bbvideodeviceselectorcontrol.h index 051fd713a..08d6cbb14 100644 --- a/src/plugins/qnx/camera/bbvideodeviceselectorcontrol.h +++ b/src/plugins/qnx/camera/bbvideodeviceselectorcontrol.h @@ -52,16 +52,16 @@ class BbVideoDeviceSelectorControl : public QVideoDeviceSelectorControl public: explicit BbVideoDeviceSelectorControl(BbCameraSession *session, QObject *parent = 0); - int deviceCount() const Q_DECL_OVERRIDE; - QString deviceName(int index) const Q_DECL_OVERRIDE; - QString deviceDescription(int index) const Q_DECL_OVERRIDE; - int defaultDevice() const Q_DECL_OVERRIDE; - int selectedDevice() const Q_DECL_OVERRIDE; + int deviceCount() const override; + QString deviceName(int index) const override; + QString deviceDescription(int index) const override; + int defaultDevice() const override; + int selectedDevice() const override; static void enumerateDevices(QList<QByteArray> *devices, QStringList *descriptions); public Q_SLOTS: - void setSelectedDevice(int index) Q_DECL_OVERRIDE; + void setSelectedDevice(int index) override; private: BbCameraSession* m_session; diff --git a/src/plugins/qnx/camera/bbvideorenderercontrol.h b/src/plugins/qnx/camera/bbvideorenderercontrol.h index 44bd5ca1b..441ff369d 100644 --- a/src/plugins/qnx/camera/bbvideorenderercontrol.h +++ b/src/plugins/qnx/camera/bbvideorenderercontrol.h @@ -51,8 +51,8 @@ class BbVideoRendererControl : public QVideoRendererControl public: explicit BbVideoRendererControl(BbCameraSession *session, QObject *parent = 0); - QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; - void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; private: BbCameraSession *m_session; diff --git a/src/plugins/qnx/common/windowgrabber.h b/src/plugins/qnx/common/windowgrabber.h index 4278f2e3a..4b2217f74 100644 --- a/src/plugins/qnx/common/windowgrabber.h +++ b/src/plugins/qnx/common/windowgrabber.h @@ -100,7 +100,7 @@ public: void pause(); void resume(); - bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE; + bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; bool handleScreenEvent(screen_event_t event); diff --git a/src/plugins/qnx/mediaplayer/mediaplayer.pri b/src/plugins/qnx/mediaplayer/mediaplayer.pri index 4c4363a91..f39b542cc 100644 --- a/src/plugins/qnx/mediaplayer/mediaplayer.pri +++ b/src/plugins/qnx/mediaplayer/mediaplayer.pri @@ -1,6 +1,7 @@ INCLUDEPATH += $$PWD HEADERS += \ + $$PWD/mmrendereraudiorolecontrol.h \ $$PWD/mmrenderermediaplayercontrol.h \ $$PWD/mmrenderermediaplayerservice.h \ $$PWD/mmrenderermetadata.h \ @@ -9,8 +10,10 @@ HEADERS += \ $$PWD/mmrendererutil.h \ $$PWD/mmrenderervideowindowcontrol.h \ $$PWD/mmreventmediaplayercontrol.h \ - $$PWD/mmreventthread.h + $$PWD/mmreventthread.h \ + $$PWD/mmrenderercustomaudiorolecontrol.h SOURCES += \ + $$PWD/mmrendereraudiorolecontrol.cpp \ $$PWD/mmrenderermediaplayercontrol.cpp \ $$PWD/mmrenderermediaplayerservice.cpp \ $$PWD/mmrenderermetadata.cpp \ @@ -19,6 +22,7 @@ SOURCES += \ $$PWD/mmrendererutil.cpp \ $$PWD/mmrenderervideowindowcontrol.cpp \ $$PWD/mmreventmediaplayercontrol.cpp \ - $$PWD/mmreventthread.cpp + $$PWD/mmreventthread.cpp \ + $$PWD/mmrenderercustomaudiorolecontrol.cpp QMAKE_USE += mmrenderer diff --git a/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.cpp b/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.cpp new file mode 100644 index 000000000..e470ed4c5 --- /dev/null +++ b/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2017 QNX Software Systems. All rights reserved. +** 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 "mmrendereraudiorolecontrol.h" +#include "mmrendererutil.h" + +QT_BEGIN_NAMESPACE + +MmRendererAudioRoleControl::MmRendererAudioRoleControl(QObject *parent) + : QAudioRoleControl(parent) + , m_role(QAudio::UnknownRole) +{ +} + +QAudio::Role MmRendererAudioRoleControl::audioRole() const +{ + return m_role; +} + +void MmRendererAudioRoleControl::setAudioRole(QAudio::Role role) +{ + if (m_role != role) { + m_role = role; + emit audioRoleChanged(m_role); + } +} + +QList<QAudio::Role> MmRendererAudioRoleControl::supportedAudioRoles() const +{ + return qnxSupportedAudioRoles(); +} + +QT_END_NAMESPACE diff --git a/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.h b/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.h new file mode 100644 index 000000000..d0d2165eb --- /dev/null +++ b/src/plugins/qnx/mediaplayer/mmrendereraudiorolecontrol.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2017 QNX Software Systems. All rights reserved. +** 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 MMRENDERERAUDIOROLECONTROL_H +#define MMRENDERERAUDIOROLECONTROL_H + +#include <qaudiorolecontrol.h> + +QT_BEGIN_NAMESPACE + +class MmRendererAudioRoleControl : public QAudioRoleControl +{ + Q_OBJECT +public: + explicit MmRendererAudioRoleControl(QObject *parent = 0); + + QAudio::Role audioRole() const override; + void setAudioRole(QAudio::Role role) override; + + QList<QAudio::Role> supportedAudioRoles() const override; + +private: + QAudio::Role m_role; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.cpp b/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.cpp new file mode 100644 index 000000000..c8971d41c --- /dev/null +++ b/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.cpp @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2017 QNX Software Systems. All rights reserved. +** 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 "mmrenderercustomaudiorolecontrol.h" +#include "mmrendererutil.h" + +QT_BEGIN_NAMESPACE + +MmRendererCustomAudioRoleControl::MmRendererCustomAudioRoleControl(QObject *parent) + : QCustomAudioRoleControl(parent) +{ +} + +QString MmRendererCustomAudioRoleControl::customAudioRole() const +{ + return m_role; +} + +void MmRendererCustomAudioRoleControl::setCustomAudioRole(const QString &role) +{ + if (m_role != role) { + m_role = role; + emit customAudioRoleChanged(m_role); + } +} + +QStringList MmRendererCustomAudioRoleControl::supportedCustomAudioRoles() const +{ + return QStringList(); +} + +QT_END_NAMESPACE diff --git a/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.h b/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.h new file mode 100644 index 000000000..ff16f9355 --- /dev/null +++ b/src/plugins/qnx/mediaplayer/mmrenderercustomaudiorolecontrol.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2017 QNX Software Systems. All rights reserved. +** 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 MMRENDERERCUSTOMAUDIOROLECONTROL_H +#define MMRENDERERCUSTOMAUDIOROLECONTROL_H + +#include <qcustomaudiorolecontrol.h> + +QT_BEGIN_NAMESPACE + +class MmRendererCustomAudioRoleControl : public QCustomAudioRoleControl +{ + Q_OBJECT +public: + explicit MmRendererCustomAudioRoleControl(QObject *parent = 0); + + QString customAudioRole() const Q_DECL_OVERRIDE; + void setCustomAudioRole(const QString &role) Q_DECL_OVERRIDE; + + QStringList supportedCustomAudioRoles() const Q_DECL_OVERRIDE; + +private: + QString m_role; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp index d8b0a3934..c66ac937d 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp @@ -36,6 +36,8 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ +#include "mmrendereraudiorolecontrol.h" +#include "mmrenderercustomaudiorolecontrol.h" #include "mmrenderermediaplayercontrol.h" #include "mmrenderermetadatareadercontrol.h" #include "mmrendererplayervideorenderercontrol.h" @@ -70,7 +72,6 @@ MmRendererMediaPlayerControl::MmRendererMediaPlayerControl(QObject *parent) m_mediaStatus(QMediaPlayer::NoMedia), m_playAfterMediaLoaded(false), m_inputAttached(false), - m_stopEventsToIgnore(0), m_bufferLevel(0) { m_loadingTimer.setSingleShot(true); @@ -109,35 +110,51 @@ void MmRendererMediaPlayerControl::openConnection() startMonitoring(); } -void MmRendererMediaPlayerControl::handleMmStatusUpdate(qint64 newPosition) -{ - // Prevent spurious position change events from overriding our own position, for example - // when setting the position to 0 in stop(). - // Also, don't change the position while we're loading the media, as then play() would - // set a wrong initial position. - if (m_state != QMediaPlayer::PlayingState || - m_mediaStatus == QMediaPlayer::LoadingMedia || - m_mediaStatus == QMediaPlayer::NoMedia || - m_mediaStatus == QMediaPlayer::InvalidMedia) - return; - - setMmPosition(newPosition); -} - void MmRendererMediaPlayerControl::handleMmStopped() { // Only react to stop events that happen when the end of the stream is reached and // playback is stopped because of this. - // Ignore other stop event sources, souch as calling mmr_stop() ourselves and - // mmr_input_attach(). - if (m_stopEventsToIgnore > 0) { - --m_stopEventsToIgnore; - } else { + // Ignore other stop event sources, such as calling mmr_stop() ourselves. + if (m_state != QMediaPlayer::StoppedState) { setMediaStatus(QMediaPlayer::EndOfMedia); stopInternal(IgnoreMmRenderer); } } +void MmRendererMediaPlayerControl::handleMmSuspend(const QString &reason) +{ + if (m_state == QMediaPlayer::StoppedState) + return; + + Q_UNUSED(reason); + setMediaStatus(QMediaPlayer::StalledMedia); +} + +void MmRendererMediaPlayerControl::handleMmSuspendRemoval(const QString &bufferStatus) +{ + if (m_state == QMediaPlayer::StoppedState) + return; + + if (bufferStatus == QLatin1String("buffering")) + setMediaStatus(QMediaPlayer::BufferingMedia); + else + setMediaStatus(QMediaPlayer::BufferedMedia); +} + +void MmRendererMediaPlayerControl::handleMmPause() +{ + if (m_state == QMediaPlayer::PlayingState) { + setState(QMediaPlayer::PausedState); + } +} + +void MmRendererMediaPlayerControl::handleMmPlay() +{ + if (m_state == QMediaPlayer::PausedState) { + setState(QMediaPlayer::PlayingState); + } +} + void MmRendererMediaPlayerControl::closeConnection() { stopMonitoring(); @@ -184,6 +201,8 @@ void MmRendererMediaPlayerControl::attach() return; } + resetMonitoring(); + if (m_videoRendererControl) m_videoRendererControl->attachDisplay(m_context); @@ -197,6 +216,20 @@ void MmRendererMediaPlayerControl::attach() return; } + if (m_audioId != -1 && m_audioRoleControl) { + QAudio::Role audioRole = m_audioRoleControl->audioRole(); + QString audioType = (audioRole == QAudio::CustomRole && m_customAudioRoleControl) + ? m_customAudioRoleControl->customAudioRole() + : qnxAudioType(audioRole); + QByteArray latin1AudioType = audioType.toLatin1(); + if (!audioType.isEmpty() && latin1AudioType == audioType) { + strm_dict_t *dict = strm_dict_new(); + dict = strm_dict_set(dict, "audio_type", latin1AudioType.constData()); + if (mmr_output_parameters(m_context, m_audioId, dict) != 0) + emitMmError("mmr_output_parameters: Setting audio_type failed"); + } + } + const QByteArray resourcePath = resourcePathForUrl(m_media.canonicalUrl()); if (resourcePath.isEmpty()) { detach(); @@ -210,11 +243,6 @@ void MmRendererMediaPlayerControl::attach() return; } - // For whatever reason, the mmrenderer sends out a MMR_STOPPED event when calling - // mmr_input_attach() above. Ignore it, as otherwise we'll trigger stopping right after we - // started. - m_stopEventsToIgnore++; - m_inputAttached = true; setMediaStatus(QMediaPlayer::LoadedMedia); @@ -346,12 +374,12 @@ void MmRendererMediaPlayerControl::setState(QMediaPlayer::State state) void MmRendererMediaPlayerControl::stopInternal(StopCommand stopCommand) { + resetMonitoring(); setPosition(0); if (m_state != QMediaPlayer::StoppedState) { if (stopCommand == StopMmRenderer) { - ++m_stopEventsToIgnore; mmr_stop(m_context); } @@ -509,6 +537,7 @@ void MmRendererMediaPlayerControl::play() if (m_mediaStatus == QMediaPlayer::EndOfMedia) m_position = 0; + resetMonitoring(); setPositionInternal(m_position); setVolumeInternal(m_muted ? 0 : m_volume); setPlaybackRateInternal(m_rate); @@ -519,7 +548,6 @@ void MmRendererMediaPlayerControl::play() return; } - m_stopEventsToIgnore = 0; // once playing, stop events must be proccessed setState( QMediaPlayer::PlayingState); } @@ -556,6 +584,16 @@ void MmRendererMediaPlayerControl::setMetaDataReaderControl(MmRendererMetaDataRe m_metaDataReaderControl = metaDataReaderControl; } +void MmRendererMediaPlayerControl::setAudioRoleControl(MmRendererAudioRoleControl *audioRoleControl) +{ + m_audioRoleControl = audioRoleControl; +} + +void MmRendererMediaPlayerControl::setCustomAudioRoleControl(MmRendererCustomAudioRoleControl *customAudioRoleControl) +{ + m_customAudioRoleControl = customAudioRoleControl; +} + void MmRendererMediaPlayerControl::setMmPosition(qint64 newPosition) { if (newPosition != 0 && newPosition != m_position) { @@ -573,18 +611,11 @@ void MmRendererMediaPlayerControl::setMmBufferStatus(const QString &bufferStatus // ignore "idle" buffer status } -void MmRendererMediaPlayerControl::setMmBufferLevel(const QString &bufferLevel) +void MmRendererMediaPlayerControl::setMmBufferLevel(int level, int capacity) { - // buffer level has format level/capacity, e.g. "91319/124402" - const int slashPos = bufferLevel.indexOf('/'); - if (slashPos != -1) { - const int fill = bufferLevel.leftRef(slashPos).toInt(); - const int capacity = bufferLevel.midRef(slashPos + 1).toInt(); - if (capacity != 0) { - m_bufferLevel = fill / static_cast<float>(capacity) * 100.0f; - emit bufferStatusChanged(m_bufferLevel); - } - } + m_bufferLevel = capacity == 0 ? 0 : level / static_cast<float>(capacity) * 100.0f; + m_bufferLevel = qBound(0, m_bufferLevel, 100); + emit bufferStatusChanged(m_bufferLevel); } void MmRendererMediaPlayerControl::updateMetaData(const strm_dict *dict) diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h index 2edbd50e0..3426ef2f2 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h @@ -52,6 +52,8 @@ typedef struct strm_dict strm_dict_t; QT_BEGIN_NAMESPACE +class MmRendererAudioRoleControl; +class MmRendererCustomAudioRoleControl; class MmRendererMetaDataReaderControl; class MmRendererPlayerVideoRendererControl; class MmRendererVideoWindowControl; @@ -62,40 +64,40 @@ class MmRendererMediaPlayerControl : public QMediaPlayerControl, public QAbstrac public: explicit MmRendererMediaPlayerControl(QObject *parent = 0); - QMediaPlayer::State state() const Q_DECL_OVERRIDE; + QMediaPlayer::State state() const override; - QMediaPlayer::MediaStatus mediaStatus() const Q_DECL_OVERRIDE; + QMediaPlayer::MediaStatus mediaStatus() const override; - qint64 duration() const Q_DECL_OVERRIDE; + qint64 duration() const override; - qint64 position() const Q_DECL_OVERRIDE; - void setPosition(qint64 position) Q_DECL_OVERRIDE; + qint64 position() const override; + void setPosition(qint64 position) override; - int volume() const Q_DECL_OVERRIDE; - void setVolume(int volume) Q_DECL_OVERRIDE; + int volume() const override; + void setVolume(int volume) override; - bool isMuted() const Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; + bool isMuted() const override; + void setMuted(bool muted) override; - int bufferStatus() const Q_DECL_OVERRIDE; + int bufferStatus() const override; - bool isAudioAvailable() const Q_DECL_OVERRIDE; - bool isVideoAvailable() const Q_DECL_OVERRIDE; + bool isAudioAvailable() const override; + bool isVideoAvailable() const override; - bool isSeekable() const Q_DECL_OVERRIDE; + bool isSeekable() const override; - QMediaTimeRange availablePlaybackRanges() const Q_DECL_OVERRIDE; + QMediaTimeRange availablePlaybackRanges() const override; - qreal playbackRate() const Q_DECL_OVERRIDE; - void setPlaybackRate(qreal rate) Q_DECL_OVERRIDE; + qreal playbackRate() const override; + void setPlaybackRate(qreal rate) override; - QMediaContent media() const Q_DECL_OVERRIDE; - const QIODevice *mediaStream() const Q_DECL_OVERRIDE; - void setMedia(const QMediaContent &media, QIODevice *stream) Q_DECL_OVERRIDE; + QMediaContent media() const override; + const QIODevice *mediaStream() const override; + void setMedia(const QMediaContent &media, QIODevice *stream) override; - void play() Q_DECL_OVERRIDE; - void pause() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; + void play() override; + void pause() override; + void stop() override; MmRendererPlayerVideoRendererControl *videoRendererControl() const; void setVideoRendererControl(MmRendererPlayerVideoRendererControl *videoControl); @@ -103,19 +105,25 @@ public: MmRendererVideoWindowControl *videoWindowControl() const; void setVideoWindowControl(MmRendererVideoWindowControl *videoControl); void setMetaDataReaderControl(MmRendererMetaDataReaderControl *metaDataReaderControl); + void setAudioRoleControl(MmRendererAudioRoleControl *audioRoleControl); + void setCustomAudioRoleControl(MmRendererCustomAudioRoleControl *customAudioRoleControl); protected: virtual void startMonitoring() = 0; virtual void stopMonitoring() = 0; + virtual void resetMonitoring() = 0; void openConnection(); void emitMmError(const QString &msg); void emitPError(const QString &msg); void setMmPosition(qint64 newPosition); void setMmBufferStatus(const QString &bufferStatus); - void setMmBufferLevel(const QString &bufferLevel); + void setMmBufferLevel(int level, int capacity); void handleMmStopped(); - void handleMmStatusUpdate(qint64 position); + void handleMmSuspend(const QString &reason); + void handleMmSuspendRemoval(const QString &bufferStatus); + void handleMmPause(); + void handleMmPlay(); void updateMetaData(const strm_dict_t *dict); // must be called from subclass dtors (calls virtual function stopMonitoring()) @@ -156,12 +164,13 @@ private: QPointer<MmRendererPlayerVideoRendererControl> m_videoRendererControl; QPointer<MmRendererVideoWindowControl> m_videoWindowControl; QPointer<MmRendererMetaDataReaderControl> m_metaDataReaderControl; + QPointer<MmRendererAudioRoleControl> m_audioRoleControl; + QPointer<MmRendererCustomAudioRoleControl> m_customAudioRoleControl; MmRendererMetaData m_metaData; qint64 m_position; QMediaPlayer::MediaStatus m_mediaStatus; bool m_playAfterMediaLoaded; bool m_inputAttached; - int m_stopEventsToIgnore; int m_bufferLevel; QTimer m_loadingTimer; }; diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.cpp b/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.cpp index 1258d199c..190cb8b80 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.cpp @@ -38,6 +38,8 @@ ****************************************************************************/ #include "mmrenderermediaplayerservice.h" +#include "mmrendereraudiorolecontrol.h" +#include "mmrenderercustomaudiorolecontrol.h" #include "mmrenderermediaplayercontrol.h" #include "mmrenderermetadatareadercontrol.h" #include "mmrendererplayervideorenderercontrol.h" @@ -66,6 +68,8 @@ MmRendererMediaPlayerService::~MmRendererMediaPlayerService() delete m_videoWindowControl; delete m_mediaPlayerControl; delete m_metaDataReaderControl; + delete m_audioRoleControl; + delete m_customAudioRoleControl; } QMediaControl *MmRendererMediaPlayerService::requestControl(const char *name) @@ -76,15 +80,25 @@ QMediaControl *MmRendererMediaPlayerService::requestControl(const char *name) updateControls(); } return m_mediaPlayerControl; - } - else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) { + } else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) { if (!m_metaDataReaderControl) { m_metaDataReaderControl = new MmRendererMetaDataReaderControl(); updateControls(); } return m_metaDataReaderControl; - } - else if (qstrcmp(name, QVideoRendererControl_iid) == 0) { + } else if (qstrcmp(name, QAudioRoleControl_iid) == 0) { + if (!m_audioRoleControl) { + m_audioRoleControl = new MmRendererAudioRoleControl(); + updateControls(); + } + return m_audioRoleControl; + } else if (qstrcmp(name, QCustomAudioRoleControl_iid) == 0) { + if (!m_customAudioRoleControl) { + m_customAudioRoleControl = new MmRendererCustomAudioRoleControl(); + updateControls(); + } + return m_customAudioRoleControl; + } else if (qstrcmp(name, QVideoRendererControl_iid) == 0) { if (!m_appHasDrmPermissionChecked) { m_appHasDrmPermission = checkForDrmPermission(); m_appHasDrmPermissionChecked = true; @@ -102,8 +116,7 @@ QMediaControl *MmRendererMediaPlayerService::requestControl(const char *name) updateControls(); } return m_videoRendererControl; - } - else if (qstrcmp(name, QVideoWindowControl_iid) == 0) { + } else if (qstrcmp(name, QVideoWindowControl_iid) == 0) { if (!m_videoWindowControl) { m_videoWindowControl = new MmRendererVideoWindowControl(); updateControls(); @@ -123,6 +136,10 @@ void MmRendererMediaPlayerService::releaseControl(QMediaControl *control) m_mediaPlayerControl = 0; if (control == m_metaDataReaderControl) m_metaDataReaderControl = 0; + if (control == m_audioRoleControl) + m_audioRoleControl = 0; + if (control == m_customAudioRoleControl) + m_customAudioRoleControl = 0; delete control; } @@ -136,6 +153,12 @@ void MmRendererMediaPlayerService::updateControls() if (m_metaDataReaderControl && m_mediaPlayerControl) m_mediaPlayerControl->setMetaDataReaderControl(m_metaDataReaderControl); + + if (m_audioRoleControl && m_mediaPlayerControl) + m_mediaPlayerControl->setAudioRoleControl(m_audioRoleControl); + + if (m_customAudioRoleControl && m_mediaPlayerControl) + m_mediaPlayerControl->setCustomAudioRoleControl(m_customAudioRoleControl); } QT_END_NAMESPACE diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.h b/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.h index de85293cb..ab3054af5 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.h +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayerservice.h @@ -44,6 +44,8 @@ QT_BEGIN_NAMESPACE +class MmRendererAudioRoleControl; +class MmRendererCustomAudioRoleControl; class MmRendererMediaPlayerControl; class MmRendererMetaDataReaderControl; class MmRendererPlayerVideoRendererControl; @@ -56,8 +58,8 @@ public: explicit MmRendererMediaPlayerService(QObject *parent = 0); ~MmRendererMediaPlayerService(); - QMediaControl *requestControl(const char *name) Q_DECL_OVERRIDE; - void releaseControl(QMediaControl *control) Q_DECL_OVERRIDE; + QMediaControl *requestControl(const char *name) override; + void releaseControl(QMediaControl *control) override; private: void updateControls(); @@ -66,6 +68,8 @@ private: QPointer<MmRendererVideoWindowControl> m_videoWindowControl; QPointer<MmRendererMediaPlayerControl> m_mediaPlayerControl; QPointer<MmRendererMetaDataReaderControl> m_metaDataReaderControl; + QPointer<MmRendererAudioRoleControl> m_audioRoleControl; + QPointer<MmRendererCustomAudioRoleControl> m_customAudioRoleControl; bool m_appHasDrmPermission : 1; bool m_appHasDrmPermissionChecked : 1; diff --git a/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.h b/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.h index 9c000224e..878420460 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.h +++ b/src/plugins/qnx/mediaplayer/mmrenderermetadatareadercontrol.h @@ -50,10 +50,10 @@ class MmRendererMetaDataReaderControl : public QMetaDataReaderControl public: explicit MmRendererMetaDataReaderControl(QObject *parent = 0); - bool isMetaDataAvailable() const Q_DECL_OVERRIDE; + bool isMetaDataAvailable() const override; - QVariant metaData(const QString &key) const Q_DECL_OVERRIDE; - QStringList availableMetaData() const Q_DECL_OVERRIDE; + QVariant metaData(const QString &key) const override; + QStringList availableMetaData() const override; void setMetaData(const MmRendererMetaData &data); diff --git a/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.h b/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.h index 878aa4bb0..c547ef534 100644 --- a/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.h +++ b/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.h @@ -56,8 +56,8 @@ public: explicit MmRendererPlayerVideoRendererControl(QObject *parent = 0); ~MmRendererPlayerVideoRendererControl(); - QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; - void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; // Called by media control void attachDisplay(mmr_context_t *context); @@ -65,7 +65,7 @@ public: void pause(); void resume(); - void customEvent(QEvent *) Q_DECL_OVERRIDE; + void customEvent(QEvent *) override; private Q_SLOTS: void updateScene(const QSize &size); diff --git a/src/plugins/qnx/mediaplayer/mmrendererutil.cpp b/src/plugins/qnx/mediaplayer/mmrendererutil.cpp index 239d9d52e..d8af4a746 100644 --- a/src/plugins/qnx/mediaplayer/mmrendererutil.cpp +++ b/src/plugins/qnx/mediaplayer/mmrendererutil.cpp @@ -41,6 +41,11 @@ #include <QDebug> #include <QDir> #include <QFile> +#include <QJsonDocument> +#include <QJsonObject> +#include <QJsonValue> +#include <QMutex> +#include <QMutex> #include <QString> #include <QXmlStreamReader> @@ -85,6 +90,97 @@ static const MmError mmErrors[] = { }; static const unsigned int numMmErrors = sizeof(mmErrors) / sizeof(MmError); +static QBasicMutex roleMapMutex; +static bool roleMapInitialized = false; +static QString roleMap[QAudio::CustomRole + 1]; + +template <typename T, size_t N> +constexpr size_t countof(T (&)[N]) +{ + return N; +} + +constexpr bool inBounds(QAudio::Role r) +{ + return r >= 0 && r < countof(roleMap); +} + +QString keyValueMapsLocation() +{ + QByteArray qtKeyValueMaps = qgetenv("QT_KEY_VALUE_MAPS"); + if (qtKeyValueMaps.isNull()) + return QStringLiteral("/etc/qt/keyvaluemaps"); + else + return qtKeyValueMaps; +} + +QJsonObject loadMapObject(const QString &keyValueMapPath) +{ + QFile mapFile(keyValueMapsLocation() + keyValueMapPath); + if (mapFile.open(QIODevice::ReadOnly)) { + QByteArray mapFileContents = mapFile.readAll(); + QJsonDocument mapDocument = QJsonDocument::fromJson(mapFileContents); + if (mapDocument.isObject()) { + QJsonObject mapObject = mapDocument.object(); + return mapObject; + } + } + return QJsonObject(); +} + +static void loadRoleMap() +{ + QMutexLocker locker(&roleMapMutex); + + if (!roleMapInitialized) { + QJsonObject mapObject = loadMapObject("/QAudio/Role.json"); + if (!mapObject.isEmpty()) { + // Wrapping the loads in a switch like this ensures that anyone adding + // a new enumerator will be notified that this code must be updated. A + // compile error will occur because the enumerator is missing from the + // switch. A compile error will also occur if the enumerator used to + // size the mapping table isn't updated when a new enumerator is added. + // One or more enumerators will be outside the bounds of the array when + // the wrong enumerator is used to size the array. + // + // The code loads a mapping for each enumerator because role is set + // to UnknownRole and all the cases drop through to the next case. +#pragma GCC diagnostic push +#pragma GCC diagnostic error "-Wswitch" +#define loadRoleMapping(r) \ + case QAudio::r: \ + static_assert(inBounds(QAudio::r), #r " out-of-bounds." \ + " Do you need to change the enumerator used to size the mapping table" \ + " because you added new QAudio::Role enumerators?"); \ + roleMap[QAudio::r] = mapObject.value(QLatin1String(#r)).toString(); + + QAudio::Role role = QAudio::UnknownRole; + switch (role) { + loadRoleMapping(UnknownRole); + loadRoleMapping(MusicRole); + loadRoleMapping(VideoRole); + loadRoleMapping(VoiceCommunicationRole); + loadRoleMapping(AlarmRole); + loadRoleMapping(NotificationRole); + loadRoleMapping(RingtoneRole); + loadRoleMapping(AccessibilityRole); + loadRoleMapping(SonificationRole); + loadRoleMapping(GameRole); + loadRoleMapping(CustomRole); + } +#undef loadRoleMapping +#pragma GCC diagnostic pop + + if (!roleMap[QAudio::CustomRole].isEmpty()) { + qWarning("CustomRole mapping ignored"); + roleMap[QAudio::CustomRole].clear(); + } + } + + roleMapInitialized = true; + } +} + QString mmErrorMessage(const QString &msg, mmr_context_t *context, int *errorCode) { const mmr_error_info_t * const mmError = mmr_error_info(context); @@ -124,4 +220,27 @@ bool checkForDrmPermission() return false; } +QString qnxAudioType(QAudio::Role role) +{ + loadRoleMap(); + + if (role >= 0 && role < countof(roleMap)) + return roleMap[role]; + else + return QString(); +} + +QList<QAudio::Role> qnxSupportedAudioRoles() +{ + loadRoleMap(); + + QList<QAudio::Role> result; + for (size_t i = 0; i < countof(roleMap); ++i) { + if (!roleMap[i].isEmpty() || (i == QAudio::UnknownRole)) + result.append(static_cast<QAudio::Role>(i)); + } + + return result; +} + QT_END_NAMESPACE diff --git a/src/plugins/qnx/mediaplayer/mmrendererutil.h b/src/plugins/qnx/mediaplayer/mmrendererutil.h index 8017b2690..ac6f73a7d 100644 --- a/src/plugins/qnx/mediaplayer/mmrendererutil.h +++ b/src/plugins/qnx/mediaplayer/mmrendererutil.h @@ -40,6 +40,7 @@ #define MMRENDERERUTIL_H #include <QtCore/qglobal.h> +#include <QtMultimedia/qaudio.h> typedef struct mmr_context mmr_context_t; @@ -51,6 +52,9 @@ QString mmErrorMessage(const QString &msg, mmr_context_t *context, int * errorCo bool checkForDrmPermission(); +QString qnxAudioType(QAudio::Role role); +QList<QAudio::Role> qnxSupportedAudioRoles(); + QT_END_NAMESPACE #endif diff --git a/src/plugins/qnx/mediaplayer/mmrenderervideowindowcontrol.h b/src/plugins/qnx/mediaplayer/mmrenderervideowindowcontrol.h index 5bfd192bb..8327e259d 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderervideowindowcontrol.h +++ b/src/plugins/qnx/mediaplayer/mmrenderervideowindowcontrol.h @@ -54,33 +54,33 @@ public: explicit MmRendererVideoWindowControl(QObject *parent = 0); ~MmRendererVideoWindowControl(); - WId winId() const Q_DECL_OVERRIDE; - void setWinId(WId id) Q_DECL_OVERRIDE; + WId winId() const override; + void setWinId(WId id) override; - QRect displayRect() const Q_DECL_OVERRIDE; - void setDisplayRect(const QRect &rect) Q_DECL_OVERRIDE; + QRect displayRect() const override; + void setDisplayRect(const QRect &rect) override; - bool isFullScreen() const Q_DECL_OVERRIDE; - void setFullScreen(bool fullScreen) Q_DECL_OVERRIDE; + bool isFullScreen() const override; + void setFullScreen(bool fullScreen) override; - void repaint() Q_DECL_OVERRIDE; + void repaint() override; - QSize nativeSize() const Q_DECL_OVERRIDE; + QSize nativeSize() const override; - Qt::AspectRatioMode aspectRatioMode() const Q_DECL_OVERRIDE; - void setAspectRatioMode(Qt::AspectRatioMode mode) Q_DECL_OVERRIDE; + Qt::AspectRatioMode aspectRatioMode() const override; + void setAspectRatioMode(Qt::AspectRatioMode mode) override; - int brightness() const Q_DECL_OVERRIDE; - void setBrightness(int brightness) Q_DECL_OVERRIDE; + int brightness() const override; + void setBrightness(int brightness) override; - int contrast() const Q_DECL_OVERRIDE; - void setContrast(int contrast) Q_DECL_OVERRIDE; + int contrast() const override; + void setContrast(int contrast) override; - int hue() const Q_DECL_OVERRIDE; - void setHue(int hue) Q_DECL_OVERRIDE; + int hue() const override; + void setHue(int hue) override; - int saturation() const Q_DECL_OVERRIDE; - void setSaturation(int saturation) Q_DECL_OVERRIDE; + int saturation() const override; + void setSaturation(int saturation) override; // // Called by media control diff --git a/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.cpp b/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.cpp index a0bac1261..c050c03c5 100644 --- a/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.cpp @@ -42,13 +42,39 @@ #include "mmrenderervideowindowcontrol.h" #include <mm/renderer.h> +#include <tuple> QT_BEGIN_NAMESPACE +static std::tuple<int, int, bool> parseBufferLevel(const QByteArray &value) +{ + const int slashPos = value.indexOf('/'); + if (slashPos <= 0) + return std::make_tuple(0, 0, false); + + bool ok = false; + const int level = value.left(slashPos).toInt(&ok); + if (!ok || level < 0) + return std::make_tuple(0, 0, false); + + const int capacity = value.mid(slashPos + 1).toInt(&ok); + if (!ok || capacity < 0) + return std::make_tuple(0, 0, false); + + return std::make_tuple(level, capacity, true); +} + MmrEventMediaPlayerControl::MmrEventMediaPlayerControl(QObject *parent) : MmRendererMediaPlayerControl(parent) , m_eventThread(nullptr) + , m_bufferStatus("") + , m_bufferLevel(0) + , m_bufferCapacity(0) + , m_position(0) + , m_suspended(false) + , m_suspendedReason("unknown") , m_state(MMR_STATE_IDLE) + , m_speed(0) { openConnection(); } @@ -75,6 +101,18 @@ void MmrEventMediaPlayerControl::stopMonitoring() m_eventThread = nullptr; } +void MmrEventMediaPlayerControl::resetMonitoring() +{ + m_bufferStatus = ""; + m_bufferLevel = 0; + m_bufferCapacity = 0; + m_position = 0; + m_suspended = false; + m_suspendedReason = "unknown"; + m_state = MMR_STATE_IDLE; + m_speed = 0; +} + bool MmrEventMediaPlayerControl::nativeEventFilter(const QByteArray &eventType, void *message, long *result) @@ -102,32 +140,68 @@ void MmrEventMediaPlayerControl::readEvents() if (event->data) { const strm_string_t *value; value = strm_dict_find_rstr(event->data, "bufferstatus"); - if (value) - setMmBufferStatus(QString::fromLatin1(strm_string_get(value))); + if (value) { + m_bufferStatus = QByteArray(strm_string_get(value)); + if (!m_suspended) + setMmBufferStatus(m_bufferStatus); + } value = strm_dict_find_rstr(event->data, "bufferlevel"); - if (value) - setMmBufferLevel(QString::fromLatin1(strm_string_get(value))); + if (value) { + const char *cstrValue = strm_string_get(value); + int level; + int capacity; + bool ok; + std::tie(level, capacity, ok) = parseBufferLevel(QByteArray(cstrValue)); + if (!ok) { + qCritical("Could not parse buffer capacity from '%s'", cstrValue); + } else { + m_bufferLevel = level; + m_bufferCapacity = capacity; + setMmBufferLevel(level, capacity); + } + } + + value = strm_dict_find_rstr(event->data, "suspended"); + if (value) { + if (!m_suspended) { + m_suspended = true; + m_suspendedReason = strm_string_get(value); + handleMmSuspend(m_suspendedReason); + } + } else if (m_suspended) { + m_suspended = false; + handleMmSuspendRemoval(m_bufferStatus); + } } if (event->pos_str) { const QByteArray valueBa = QByteArray(event->pos_str); bool ok; - const qint64 position = valueBa.toLongLong(&ok); + m_position = valueBa.toLongLong(&ok); if (!ok) { qCritical("Could not parse position from '%s'", valueBa.constData()); } else { - setMmPosition(position); + setMmPosition(m_position); } } break; } + case MMR_EVENT_STATE: { + if (event->state == MMR_STATE_PLAYING && m_speed != event->speed) { + m_speed = event->speed; + if (m_speed == 0) + handleMmPause(); + else + handleMmPlay(); + } + break; + } case MMR_EVENT_METADATA: { updateMetaData(event->data); break; } case MMR_EVENT_ERROR: - case MMR_EVENT_STATE: case MMR_EVENT_NONE: case MMR_EVENT_OVERFLOW: case MMR_EVENT_WARNING: diff --git a/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.h b/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.h index e0aa952a7..0e4defc5c 100644 --- a/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.h +++ b/src/plugins/qnx/mediaplayer/mmreventmediaplayercontrol.h @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE class MmrEventThread; -class MmrEventMediaPlayerControl Q_DECL_FINAL : public MmRendererMediaPlayerControl +class MmrEventMediaPlayerControl final : public MmRendererMediaPlayerControl { Q_OBJECT public: @@ -56,6 +56,7 @@ public: void startMonitoring() override; void stopMonitoring() override; + void resetMonitoring() override; bool nativeEventFilter(const QByteArray &eventType, void *message, @@ -66,7 +67,18 @@ private Q_SLOTS: private: MmrEventThread *m_eventThread; + + // status properties. + QByteArray m_bufferStatus; + int m_bufferLevel; + int m_bufferCapacity; + qint64 m_position; + bool m_suspended; + QByteArray m_suspendedReason; + + // state properties. mmr_state_t m_state; + int m_speed; }; QT_END_NAMESPACE diff --git a/src/plugins/qnx/neutrinoserviceplugin.h b/src/plugins/qnx/neutrinoserviceplugin.h index 6e4b6861e..62ed7f0bd 100644 --- a/src/plugins/qnx/neutrinoserviceplugin.h +++ b/src/plugins/qnx/neutrinoserviceplugin.h @@ -53,9 +53,9 @@ class NeutrinoServicePlugin public: NeutrinoServicePlugin(); - QMediaService *create(const QString &key) Q_DECL_OVERRIDE; - void release(QMediaService *service) Q_DECL_OVERRIDE; - QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const Q_DECL_OVERRIDE; + QMediaService *create(const QString &key) override; + void release(QMediaService *service) override; + QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const override; }; QT_END_NAMESPACE diff --git a/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp b/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp index e1a46841d..53345dec8 100644 --- a/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp +++ b/src/plugins/wasapi/qwasapiaudiodeviceinfo.cpp @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcMmDeviceInfo, "qt.multimedia.deviceinfo") QWasapiAudioDeviceInfo::QWasapiAudioDeviceInfo(QByteArray dev, QAudio::Mode mode) - : m_deviceName(dev) + : m_deviceName(QString::fromLocal8Bit(dev)) { qCDebug(lcMmDeviceInfo) << __FUNCTION__ << dev << mode; m_interface = QWasapiUtils::createOrGetInterface(dev, mode); diff --git a/src/plugins/wasapi/qwasapiaudiodeviceinfo.h b/src/plugins/wasapi/qwasapiaudiodeviceinfo.h index 97966c171..878d0273a 100644 --- a/src/plugins/wasapi/qwasapiaudiodeviceinfo.h +++ b/src/plugins/wasapi/qwasapiaudiodeviceinfo.h @@ -61,15 +61,15 @@ public: explicit QWasapiAudioDeviceInfo(QByteArray dev,QAudio::Mode mode); ~QWasapiAudioDeviceInfo(); - QAudioFormat preferredFormat() const Q_DECL_OVERRIDE; - bool isFormatSupported(const QAudioFormat& format) const Q_DECL_OVERRIDE; - QString deviceName() const Q_DECL_OVERRIDE; - QStringList supportedCodecs() Q_DECL_OVERRIDE; - QList<int> supportedSampleRates() Q_DECL_OVERRIDE; - QList<int> supportedChannelCounts() Q_DECL_OVERRIDE; - QList<int> supportedSampleSizes() Q_DECL_OVERRIDE; - QList<QAudioFormat::Endian> supportedByteOrders() Q_DECL_OVERRIDE; - QList<QAudioFormat::SampleType> supportedSampleTypes() Q_DECL_OVERRIDE; + QAudioFormat preferredFormat() const override; + bool isFormatSupported(const QAudioFormat& format) const override; + QString deviceName() const override; + QStringList supportedCodecs() override; + QList<int> supportedSampleRates() override; + QList<int> supportedChannelCounts() override; + QList<int> supportedSampleSizes() override; + QList<QAudioFormat::Endian> supportedByteOrders() override; + QList<QAudioFormat::SampleType> supportedSampleTypes() override; private: Microsoft::WRL::ComPtr<AudioInterface> m_interface; diff --git a/src/plugins/wasapi/qwasapiaudioinput.h b/src/plugins/wasapi/qwasapiaudioinput.h index 34ede06b7..babfb5b10 100644 --- a/src/plugins/wasapi/qwasapiaudioinput.h +++ b/src/plugins/wasapi/qwasapiaudioinput.h @@ -66,26 +66,26 @@ public: explicit QWasapiAudioInput(const QByteArray &device); ~QWasapiAudioInput(); - void start(QIODevice* device) Q_DECL_OVERRIDE; - QIODevice* start() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void suspend() Q_DECL_OVERRIDE; - void resume() Q_DECL_OVERRIDE; - int bytesReady() const Q_DECL_OVERRIDE; - int periodSize() const Q_DECL_OVERRIDE; - void setBufferSize(int value) Q_DECL_OVERRIDE; - int bufferSize() const Q_DECL_OVERRIDE; - void setNotifyInterval(int milliSeconds) Q_DECL_OVERRIDE; - int notifyInterval() const Q_DECL_OVERRIDE; - qint64 processedUSecs() const Q_DECL_OVERRIDE; - qint64 elapsedUSecs() const Q_DECL_OVERRIDE; - QAudio::Error error() const Q_DECL_OVERRIDE; - QAudio::State state() const Q_DECL_OVERRIDE; - void setFormat(const QAudioFormat& fmt) Q_DECL_OVERRIDE; - QAudioFormat format() const Q_DECL_OVERRIDE; - void setVolume(qreal) Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; + void start(QIODevice* device) override; + QIODevice* start() override; + void stop() override; + void reset() override; + void suspend() override; + void resume() override; + int bytesReady() const override; + int periodSize() const override; + void setBufferSize(int value) override; + int bufferSize() const override; + void setNotifyInterval(int milliSeconds) override; + int notifyInterval() const override; + qint64 processedUSecs() const override; + qint64 elapsedUSecs() const override; + QAudio::Error error() const override; + QAudio::State state() const override; + void setFormat(const QAudioFormat& fmt) override; + QAudioFormat format() const override; + void setVolume(qreal) override; + qreal volume() const override; void process(); public slots: diff --git a/src/plugins/wasapi/qwasapiaudiooutput.h b/src/plugins/wasapi/qwasapiaudiooutput.h index 02974071b..49219c5cc 100644 --- a/src/plugins/wasapi/qwasapiaudiooutput.h +++ b/src/plugins/wasapi/qwasapiaudiooutput.h @@ -67,26 +67,26 @@ public: explicit QWasapiAudioOutput(const QByteArray &device); ~QWasapiAudioOutput(); - void start(QIODevice* device) Q_DECL_OVERRIDE; - QIODevice* start() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void suspend() Q_DECL_OVERRIDE; - void resume() Q_DECL_OVERRIDE; - int bytesFree() const Q_DECL_OVERRIDE; - int periodSize() const Q_DECL_OVERRIDE; - void setBufferSize(int value) Q_DECL_OVERRIDE; - int bufferSize() const Q_DECL_OVERRIDE; - void setNotifyInterval(int milliSeconds) Q_DECL_OVERRIDE; - int notifyInterval() const Q_DECL_OVERRIDE; - qint64 processedUSecs() const Q_DECL_OVERRIDE; - qint64 elapsedUSecs() const Q_DECL_OVERRIDE; - QAudio::Error error() const Q_DECL_OVERRIDE; - QAudio::State state() const Q_DECL_OVERRIDE; - void setFormat(const QAudioFormat& fmt) Q_DECL_OVERRIDE; - QAudioFormat format() const Q_DECL_OVERRIDE; - void setVolume(qreal) Q_DECL_OVERRIDE; - qreal volume() const Q_DECL_OVERRIDE; + void start(QIODevice* device) override; + QIODevice* start() override; + void stop() override; + void reset() override; + void suspend() override; + void resume() override; + int bytesFree() const override; + int periodSize() const override; + void setBufferSize(int value) override; + int bufferSize() const override; + void setNotifyInterval(int milliSeconds) override; + int notifyInterval() const override; + qint64 processedUSecs() const override; + qint64 elapsedUSecs() const override; + QAudio::Error error() const override; + QAudio::State state() const override; + void setFormat(const QAudioFormat& fmt) override; + QAudioFormat format() const override; + void setVolume(qreal) override; + qreal volume() const override; void process(); public slots: diff --git a/src/plugins/wasapi/qwasapiplugin.h b/src/plugins/wasapi/qwasapiplugin.h index e69e7895f..7b20676f6 100644 --- a/src/plugins/wasapi/qwasapiplugin.h +++ b/src/plugins/wasapi/qwasapiplugin.h @@ -60,11 +60,11 @@ public: explicit QWasapiPlugin(QObject *parent = 0); ~QWasapiPlugin() {} - QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) Q_DECL_OVERRIDE; + QByteArray defaultDevice(QAudio::Mode mode) const override; + QList<QByteArray> availableDevices(QAudio::Mode mode) const override; + QAbstractAudioInput *createInput(const QByteArray &device) override; + QAbstractAudioOutput *createOutput(const QByteArray &device) override; + QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) override; private: QList<QByteArray> m_deviceNames; diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.h b/src/plugins/windowsaudio/qwindowsaudiooutput.h index 19b4b92af..f25475b02 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.h +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.h @@ -116,7 +116,6 @@ private slots: private: QByteArray m_device; - bool resuming; int bytesAvailable; QTime timeStamp; qint64 elapsedTimeOffset; @@ -139,8 +138,6 @@ private: WAVEFORMATEXTENSIBLE wfx; HWAVEOUT hWaveOut; - MMRESULT result; - WAVEHDR header; WAVEHDR* waveBlocks; volatile bool finished; volatile int waveFreeBlockCount; diff --git a/src/plugins/windowsaudio/qwindowsaudioplugin.h b/src/plugins/windowsaudio/qwindowsaudioplugin.h index 7b500a39c..a155ae082 100644 --- a/src/plugins/windowsaudio/qwindowsaudioplugin.h +++ b/src/plugins/windowsaudio/qwindowsaudioplugin.h @@ -56,11 +56,11 @@ public: QWindowsAudioPlugin(QObject *parent = 0); ~QWindowsAudioPlugin() {} - QByteArray defaultDevice(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QList<QByteArray> availableDevices(QAudio::Mode mode) const Q_DECL_OVERRIDE; - QAbstractAudioInput *createInput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioOutput *createOutput(const QByteArray &device) Q_DECL_OVERRIDE; - QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) Q_DECL_OVERRIDE; + QByteArray defaultDevice(QAudio::Mode mode) const override; + QList<QByteArray> availableDevices(QAudio::Mode mode) const override; + QAbstractAudioInput *createInput(const QByteArray &device) override; + QAbstractAudioOutput *createOutput(const QByteArray &device) override; + QAbstractAudioDeviceInfo *createDeviceInfo(const QByteArray &device, QAudio::Mode mode) override; }; QT_END_NAMESPACE diff --git a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp index 79545f6ee..3544031a7 100644 --- a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp +++ b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp @@ -150,12 +150,12 @@ public: create(); } - MapMode mapMode() const Q_DECL_OVERRIDE + MapMode mapMode() const override { return NotMapped; } - uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) Q_DECL_OVERRIDE + uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) override { Q_UNUSED(mode); Q_UNUSED(numBytes); @@ -163,11 +163,11 @@ public: return 0; } - void unmap() Q_DECL_OVERRIDE + void unmap() override { } - QVariant handle() const Q_DECL_OVERRIDE + QVariant handle() const override { return QVariant::fromValue(textureId()); } diff --git a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h index 53dcb6b94..e190c8c4a 100644 --- a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h +++ b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h @@ -63,8 +63,8 @@ public: MediaFoundation }; - QAbstractVideoSurface *surface() const Q_DECL_OVERRIDE; - void setSurface(QAbstractVideoSurface *surface) Q_DECL_OVERRIDE; + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; QSize size() const; void setSize(const QSize &size); diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp index 527dd6e8f..4c515bc3d 100644 --- a/src/plugins/winrt/qwinrtcameracontrol.cpp +++ b/src/plugins/winrt/qwinrtcameracontrol.cpp @@ -245,12 +245,12 @@ public: { if (m_pendingSamples.load() < 3) { m_pendingSamples.ref(); - return QueueEvent(MEStreamSinkRequestSample, GUID_NULL, S_OK, Q_NULLPTR); + return QueueEvent(MEStreamSinkRequestSample, GUID_NULL, S_OK, nullptr); } return S_OK; } - HRESULT __stdcall GetEvent(DWORD flags, IMFMediaEvent **event) Q_DECL_OVERRIDE + HRESULT __stdcall GetEvent(DWORD flags, IMFMediaEvent **event) override { QMutexLocker locker(&m_mutex); // Create an extra reference to avoid deadlock @@ -260,43 +260,43 @@ public: return eventQueue->GetEvent(flags, event); } - HRESULT __stdcall BeginGetEvent(IMFAsyncCallback *callback, IUnknown *state) Q_DECL_OVERRIDE + HRESULT __stdcall BeginGetEvent(IMFAsyncCallback *callback, IUnknown *state) override { QMutexLocker locker(&m_mutex); HRESULT hr = m_eventQueue->BeginGetEvent(callback, state); return hr; } - HRESULT __stdcall EndGetEvent(IMFAsyncResult *result, IMFMediaEvent **event) Q_DECL_OVERRIDE + HRESULT __stdcall EndGetEvent(IMFAsyncResult *result, IMFMediaEvent **event) override { QMutexLocker locker(&m_mutex); return m_eventQueue->EndGetEvent(result, event); } - HRESULT __stdcall QueueEvent(MediaEventType eventType, const GUID &extendedType, HRESULT status, const PROPVARIANT *value) Q_DECL_OVERRIDE + HRESULT __stdcall QueueEvent(MediaEventType eventType, const GUID &extendedType, HRESULT status, const PROPVARIANT *value) override { QMutexLocker locker(&m_mutex); return m_eventQueue->QueueEventParamVar(eventType, extendedType, status, value); } - HRESULT __stdcall GetMediaSink(IMFMediaSink **mediaSink) Q_DECL_OVERRIDE + HRESULT __stdcall GetMediaSink(IMFMediaSink **mediaSink) override { *mediaSink = m_sink; return S_OK; } - HRESULT __stdcall GetIdentifier(DWORD *identifier) Q_DECL_OVERRIDE + HRESULT __stdcall GetIdentifier(DWORD *identifier) override { *identifier = 0; return S_OK; } - HRESULT __stdcall GetMediaTypeHandler(IMFMediaTypeHandler **handler) Q_DECL_OVERRIDE + HRESULT __stdcall GetMediaTypeHandler(IMFMediaTypeHandler **handler) override { return QueryInterface(IID_PPV_ARGS(handler)); } - HRESULT __stdcall ProcessSample(IMFSample *sample) Q_DECL_OVERRIDE + HRESULT __stdcall ProcessSample(IMFSample *sample) override { ComPtr<IMFMediaBuffer> buffer; HRESULT hr = sample->GetBufferByIndex(0, &buffer); @@ -311,7 +311,7 @@ public: return hr; } - HRESULT __stdcall PlaceMarker(MFSTREAMSINK_MARKER_TYPE type, const PROPVARIANT *value, const PROPVARIANT *context) Q_DECL_OVERRIDE + HRESULT __stdcall PlaceMarker(MFSTREAMSINK_MARKER_TYPE type, const PROPVARIANT *value, const PROPVARIANT *context) override { Q_UNUSED(type); Q_UNUSED(value); @@ -319,14 +319,14 @@ public: return S_OK; } - HRESULT __stdcall Flush() Q_DECL_OVERRIDE + HRESULT __stdcall Flush() override { m_videoRenderer->discardBuffers(); m_pendingSamples.store(0); return S_OK; } - HRESULT __stdcall IsMediaTypeSupported(IMFMediaType *type, IMFMediaType **) Q_DECL_OVERRIDE + HRESULT __stdcall IsMediaTypeSupported(IMFMediaType *type, IMFMediaType **) override { HRESULT hr; GUID majorType; @@ -337,34 +337,34 @@ public: return S_OK; } - HRESULT __stdcall GetMediaTypeCount(DWORD *typeCount) Q_DECL_OVERRIDE + HRESULT __stdcall GetMediaTypeCount(DWORD *typeCount) override { *typeCount = 1; return S_OK; } - HRESULT __stdcall GetMediaTypeByIndex(DWORD index, IMFMediaType **type) Q_DECL_OVERRIDE + HRESULT __stdcall GetMediaTypeByIndex(DWORD index, IMFMediaType **type) override { if (index == 0) return m_type.CopyTo(type); return E_BOUNDS; } - HRESULT __stdcall SetCurrentMediaType(IMFMediaType *type) Q_DECL_OVERRIDE + HRESULT __stdcall SetCurrentMediaType(IMFMediaType *type) override { - if (FAILED(IsMediaTypeSupported(type, Q_NULLPTR))) + if (FAILED(IsMediaTypeSupported(type, nullptr))) return MF_E_INVALIDREQUEST; m_type = type; return S_OK; } - HRESULT __stdcall GetCurrentMediaType(IMFMediaType **type) Q_DECL_OVERRIDE + HRESULT __stdcall GetCurrentMediaType(IMFMediaType **type) override { return m_type.CopyTo(type); } - HRESULT __stdcall GetMajorType(GUID *majorType) Q_DECL_OVERRIDE + HRESULT __stdcall GetMajorType(GUID *majorType) override { return m_type->GetMajorType(majorType); } @@ -405,19 +405,19 @@ public: return m_stream->RequestSample(); } - HRESULT __stdcall SetProperties(Collections::IPropertySet *configuration) Q_DECL_OVERRIDE + HRESULT __stdcall SetProperties(Collections::IPropertySet *configuration) override { Q_UNUSED(configuration); return E_NOTIMPL; } - HRESULT __stdcall GetCharacteristics(DWORD *characteristics) Q_DECL_OVERRIDE + HRESULT __stdcall GetCharacteristics(DWORD *characteristics) override { *characteristics = MEDIASINK_FIXED_STREAMS | MEDIASINK_RATELESS; return S_OK; } - HRESULT __stdcall AddStreamSink(DWORD streamSinkIdentifier, IMFMediaType *mediaType, IMFStreamSink **streamSink) Q_DECL_OVERRIDE + HRESULT __stdcall AddStreamSink(DWORD streamSinkIdentifier, IMFMediaType *mediaType, IMFStreamSink **streamSink) override { Q_UNUSED(streamSinkIdentifier); Q_UNUSED(mediaType); @@ -425,33 +425,33 @@ public: return E_NOTIMPL; } - HRESULT __stdcall RemoveStreamSink(DWORD streamSinkIdentifier) Q_DECL_OVERRIDE + HRESULT __stdcall RemoveStreamSink(DWORD streamSinkIdentifier) override { Q_UNUSED(streamSinkIdentifier); return E_NOTIMPL; } - HRESULT __stdcall GetStreamSinkCount(DWORD *streamSinkCount) Q_DECL_OVERRIDE + HRESULT __stdcall GetStreamSinkCount(DWORD *streamSinkCount) override { *streamSinkCount = 1; return S_OK; } - HRESULT __stdcall GetStreamSinkByIndex(DWORD index, IMFStreamSink **streamSink) Q_DECL_OVERRIDE + HRESULT __stdcall GetStreamSinkByIndex(DWORD index, IMFStreamSink **streamSink) override { if (index == 0) return m_stream.CopyTo(streamSink); return MF_E_INVALIDINDEX; } - HRESULT __stdcall GetStreamSinkById(DWORD streamSinkIdentifier, IMFStreamSink **streamSink) Q_DECL_OVERRIDE + HRESULT __stdcall GetStreamSinkById(DWORD streamSinkIdentifier, IMFStreamSink **streamSink) override { // ID and index are always 0 HRESULT hr = GetStreamSinkByIndex(streamSinkIdentifier, streamSink); return hr == MF_E_INVALIDINDEX ? MF_E_INVALIDSTREAMNUMBER : hr; } - HRESULT __stdcall SetPresentationClock(IMFPresentationClock *presentationClock) Q_DECL_OVERRIDE + HRESULT __stdcall SetPresentationClock(IMFPresentationClock *presentationClock) override { HRESULT hr = S_OK; m_presentationClock = presentationClock; @@ -460,19 +460,19 @@ public: return hr; } - HRESULT __stdcall GetPresentationClock(IMFPresentationClock **presentationClock) Q_DECL_OVERRIDE + HRESULT __stdcall GetPresentationClock(IMFPresentationClock **presentationClock) override { return m_presentationClock.CopyTo(presentationClock); } - HRESULT __stdcall Shutdown() Q_DECL_OVERRIDE + HRESULT __stdcall Shutdown() override { m_stream->Flush(); scheduleSetActive(false); return m_presentationClock ? m_presentationClock->Stop() : S_OK; } - HRESULT __stdcall OnClockStart(MFTIME systemTime, LONGLONG clockStartOffset) Q_DECL_OVERRIDE + HRESULT __stdcall OnClockStart(MFTIME systemTime, LONGLONG clockStartOffset) override { Q_UNUSED(systemTime); Q_UNUSED(clockStartOffset); @@ -482,34 +482,34 @@ public: return S_OK; } - HRESULT __stdcall OnClockStop(MFTIME systemTime) Q_DECL_OVERRIDE + HRESULT __stdcall OnClockStop(MFTIME systemTime) override { Q_UNUSED(systemTime); scheduleSetActive(false); - return m_stream->QueueEvent(MEStreamSinkStopped, GUID_NULL, S_OK, Q_NULLPTR); + return m_stream->QueueEvent(MEStreamSinkStopped, GUID_NULL, S_OK, nullptr); } - HRESULT __stdcall OnClockPause(MFTIME systemTime) Q_DECL_OVERRIDE + HRESULT __stdcall OnClockPause(MFTIME systemTime) override { Q_UNUSED(systemTime); scheduleSetActive(false); - return m_stream->QueueEvent(MEStreamSinkPaused, GUID_NULL, S_OK, Q_NULLPTR); + return m_stream->QueueEvent(MEStreamSinkPaused, GUID_NULL, S_OK, nullptr); } - HRESULT __stdcall OnClockRestart(MFTIME systemTime) Q_DECL_OVERRIDE + HRESULT __stdcall OnClockRestart(MFTIME systemTime) override { Q_UNUSED(systemTime); scheduleSetActive(true); - return m_stream->QueueEvent(MEStreamSinkStarted, GUID_NULL, S_OK, Q_NULLPTR); + return m_stream->QueueEvent(MEStreamSinkStarted, GUID_NULL, S_OK, nullptr); } - HRESULT __stdcall OnClockSetRate(MFTIME systemTime, float rate) Q_DECL_OVERRIDE + HRESULT __stdcall OnClockSetRate(MFTIME systemTime, float rate) override { Q_UNUSED(systemTime); Q_UNUSED(rate); diff --git a/src/plugins/winrt/qwinrtcameracontrol.h b/src/plugins/winrt/qwinrtcameracontrol.h index 7ef67e957..c46921a9c 100644 --- a/src/plugins/winrt/qwinrtcameracontrol.h +++ b/src/plugins/winrt/qwinrtcameracontrol.h @@ -81,16 +81,16 @@ public: explicit QWinRTCameraControl(QObject *parent = 0); ~QWinRTCameraControl(); - QCamera::State state() const Q_DECL_OVERRIDE; - void setState(QCamera::State state) Q_DECL_OVERRIDE; + QCamera::State state() const override; + void setState(QCamera::State state) override; - QCamera::Status status() const Q_DECL_OVERRIDE; + QCamera::Status status() const override; - QCamera::CaptureModes captureMode() const Q_DECL_OVERRIDE; - void setCaptureMode(QCamera::CaptureModes mode) Q_DECL_OVERRIDE; - bool isCaptureModeSupported(QCamera::CaptureModes mode) const Q_DECL_OVERRIDE; + QCamera::CaptureModes captureMode() const override; + void setCaptureMode(QCamera::CaptureModes mode) override; + bool isCaptureModeSupported(QCamera::CaptureModes mode) const override; - bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const Q_DECL_OVERRIDE; + bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const override; QVideoRendererControl *videoRenderer() const; QVideoDeviceSelectorControl *videoDeviceSelector() const; diff --git a/src/plugins/winrt/qwinrtcameraflashcontrol.h b/src/plugins/winrt/qwinrtcameraflashcontrol.h index 335329037..b9be69230 100644 --- a/src/plugins/winrt/qwinrtcameraflashcontrol.h +++ b/src/plugins/winrt/qwinrtcameraflashcontrol.h @@ -62,11 +62,11 @@ public: void initialize(Microsoft::WRL::ComPtr<ABI::Windows::Media::Devices::IAdvancedVideoCaptureDeviceController2> &controller); - QCameraExposure::FlashModes flashMode() const Q_DECL_OVERRIDE; - void setFlashMode(QCameraExposure::FlashModes mode) Q_DECL_OVERRIDE; - bool isFlashModeSupported(QCameraExposure::FlashModes mode) const Q_DECL_OVERRIDE; + QCameraExposure::FlashModes flashMode() const override; + void setFlashMode(QCameraExposure::FlashModes mode) override; + bool isFlashModeSupported(QCameraExposure::FlashModes mode) const override; - bool isFlashReady() const Q_DECL_OVERRIDE; + bool isFlashReady() const override; private: QScopedPointer<QWinRTCameraFlashControlPrivate> d_ptr; diff --git a/src/plugins/winrt/qwinrtcamerafocuscontrol.h b/src/plugins/winrt/qwinrtcamerafocuscontrol.h index 0a8c0afcf..fcfb84edc 100644 --- a/src/plugins/winrt/qwinrtcamerafocuscontrol.h +++ b/src/plugins/winrt/qwinrtcamerafocuscontrol.h @@ -51,15 +51,15 @@ class QWinRTCameraFocusControl : public QCameraFocusControl public: explicit QWinRTCameraFocusControl(QWinRTCameraControl *parent); - QCameraFocus::FocusModes focusMode() const Q_DECL_OVERRIDE; - void setFocusMode(QCameraFocus::FocusModes mode) Q_DECL_OVERRIDE; - bool isFocusModeSupported(QCameraFocus::FocusModes mode) const Q_DECL_OVERRIDE; - QCameraFocus::FocusPointMode focusPointMode() const Q_DECL_OVERRIDE; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) Q_DECL_OVERRIDE; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const Q_DECL_OVERRIDE; - QPointF customFocusPoint() const Q_DECL_OVERRIDE; - void setCustomFocusPoint(const QPointF &point) Q_DECL_OVERRIDE; - QCameraFocusZoneList focusZones() const Q_DECL_OVERRIDE; + QCameraFocus::FocusModes focusMode() const override; + void setFocusMode(QCameraFocus::FocusModes mode) override; + bool isFocusModeSupported(QCameraFocus::FocusModes mode) const override; + QCameraFocus::FocusPointMode focusPointMode() const override; + void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; + bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; + QPointF customFocusPoint() const override; + void setCustomFocusPoint(const QPointF &point) override; + QCameraFocusZoneList focusZones() const override; void setSupportedFocusMode(QCameraFocus::FocusModes flag); void setSupportedFocusPointMode(const QSet<QCameraFocus::FocusPointMode> &supportedFocusPointModes); diff --git a/src/plugins/winrt/qwinrtcameraimagecapturecontrol.h b/src/plugins/winrt/qwinrtcameraimagecapturecontrol.h index 3820bfaf1..ce1404e1c 100644 --- a/src/plugins/winrt/qwinrtcameraimagecapturecontrol.h +++ b/src/plugins/winrt/qwinrtcameraimagecapturecontrol.h @@ -64,13 +64,13 @@ class QWinRTCameraImageCaptureControl : public QCameraImageCaptureControl public: explicit QWinRTCameraImageCaptureControl(QWinRTCameraControl *parent); - bool isReadyForCapture() const Q_DECL_OVERRIDE; + bool isReadyForCapture() const override; - QCameraImageCapture::DriveMode driveMode() const Q_DECL_OVERRIDE; - void setDriveMode(QCameraImageCapture::DriveMode mode) Q_DECL_OVERRIDE; + QCameraImageCapture::DriveMode driveMode() const override; + void setDriveMode(QCameraImageCapture::DriveMode mode) override; - int capture(const QString &fileName) Q_DECL_OVERRIDE; - void cancelCapture() Q_DECL_OVERRIDE; + int capture(const QString &fileName) override; + void cancelCapture() override; private slots: void onCameraStateChanged(QCamera::State state); diff --git a/src/plugins/winrt/qwinrtcamerainfocontrol.h b/src/plugins/winrt/qwinrtcamerainfocontrol.h index b97025dcb..031ed2720 100644 --- a/src/plugins/winrt/qwinrtcamerainfocontrol.h +++ b/src/plugins/winrt/qwinrtcamerainfocontrol.h @@ -50,8 +50,8 @@ class QWinRTCameraInfoControl : public QCameraInfoControl public: explicit QWinRTCameraInfoControl(QObject *parent = 0); - QCamera::Position cameraPosition(const QString &deviceName) const Q_DECL_OVERRIDE; - int cameraOrientation(const QString &deviceName) const Q_DECL_OVERRIDE; + QCamera::Position cameraPosition(const QString &deviceName) const override; + int cameraOrientation(const QString &deviceName) const override; }; QT_END_NAMESPACE diff --git a/src/plugins/winrt/qwinrtcameralockscontrol.h b/src/plugins/winrt/qwinrtcameralockscontrol.h index 873c355b0..61015fdaa 100644 --- a/src/plugins/winrt/qwinrtcameralockscontrol.h +++ b/src/plugins/winrt/qwinrtcameralockscontrol.h @@ -51,10 +51,10 @@ class QWinRTCameraLocksControl : public QCameraLocksControl public: explicit QWinRTCameraLocksControl(QObject *parent); - QCamera::LockTypes supportedLocks() const Q_DECL_OVERRIDE; - QCamera::LockStatus lockStatus(QCamera::LockType lock) const Q_DECL_OVERRIDE; - void searchAndLock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; - void unlock(QCamera::LockTypes locks) Q_DECL_OVERRIDE; + QCamera::LockTypes supportedLocks() const override; + QCamera::LockStatus lockStatus(QCamera::LockType lock) const override; + void searchAndLock(QCamera::LockTypes locks) override; + void unlock(QCamera::LockTypes locks) override; void initialize(); private: diff --git a/src/plugins/winrt/qwinrtcameraservice.h b/src/plugins/winrt/qwinrtcameraservice.h index beae2a140..6fa4d5fce 100644 --- a/src/plugins/winrt/qwinrtcameraservice.h +++ b/src/plugins/winrt/qwinrtcameraservice.h @@ -51,8 +51,8 @@ class QWinRTCameraService : public QMediaService public: explicit QWinRTCameraService(QObject *parent = 0); - QMediaControl *requestControl(const char *name) Q_DECL_OVERRIDE; - void releaseControl(QMediaControl *control) Q_DECL_OVERRIDE; + QMediaControl *requestControl(const char *name) override; + void releaseControl(QMediaControl *control) override; private: QScopedPointer<QWinRTCameraServicePrivate> d_ptr; diff --git a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp index 5f7810060..0a5ae46fa 100644 --- a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp +++ b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp @@ -89,12 +89,12 @@ public: unmap(); } - MapMode mapMode() const Q_DECL_OVERRIDE + MapMode mapMode() const override { return currentMode; } - uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) Q_DECL_OVERRIDE + uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) override { if (currentMode != NotMapped || mode == NotMapped || control && control->state() != QCamera::ActiveState) return nullptr; @@ -113,7 +113,7 @@ public: return bytes; } - void unmap() Q_DECL_OVERRIDE + void unmap() override { if (currentMode == NotMapped) return; diff --git a/src/plugins/winrt/qwinrtcameravideorenderercontrol.h b/src/plugins/winrt/qwinrtcameravideorenderercontrol.h index ec6e0e0e4..eeda83d52 100644 --- a/src/plugins/winrt/qwinrtcameravideorenderercontrol.h +++ b/src/plugins/winrt/qwinrtcameravideorenderercontrol.h @@ -58,8 +58,8 @@ public: explicit QWinRTCameraVideoRendererControl(const QSize &size, QObject *parent); ~QWinRTCameraVideoRendererControl(); - bool render(ID3D11Texture2D *texture) Q_DECL_OVERRIDE; - bool dequeueFrame(QVideoFrame *frame) Q_DECL_OVERRIDE; + bool render(ID3D11Texture2D *texture) override; + bool dequeueFrame(QVideoFrame *frame) override; void queueBuffer(IMF2DBuffer *buffer); void discardBuffers(); void incrementProbe(); diff --git a/src/plugins/winrt/qwinrtimageencodercontrol.h b/src/plugins/winrt/qwinrtimageencodercontrol.h index 7b0781798..dbeac2384 100644 --- a/src/plugins/winrt/qwinrtimageencodercontrol.h +++ b/src/plugins/winrt/qwinrtimageencodercontrol.h @@ -51,11 +51,11 @@ class QWinRTImageEncoderControl : public QImageEncoderControl public: explicit QWinRTImageEncoderControl(QObject *parent = 0); - QStringList supportedImageCodecs() const Q_DECL_OVERRIDE; - QString imageCodecDescription(const QString &codecName) const Q_DECL_OVERRIDE; - QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const Q_DECL_OVERRIDE; - QImageEncoderSettings imageSettings() const Q_DECL_OVERRIDE; - void setImageSettings(const QImageEncoderSettings &settings) Q_DECL_OVERRIDE; + QStringList supportedImageCodecs() const override; + QString imageCodecDescription(const QString &codecName) const override; + QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const override; + QImageEncoderSettings imageSettings() const override; + void setImageSettings(const QImageEncoderSettings &settings) override; void setSupportedResolutionsList(const QList<QSize> resolution); void applySettings(); diff --git a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp index 9fd48fd76..de6b3418e 100644 --- a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp +++ b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp @@ -541,7 +541,7 @@ QWinRTMediaPlayerControl::QWinRTMediaPlayerControl(IMFMediaEngineClassFactory *f d->seekable = false; d->hasAudio = false; d->hasVideo = false; - d->videoRenderer = Q_NULLPTR; + d->videoRenderer = nullptr; d->notifier = Make<MediaEngineNotify>(this, d); HRESULT hr; @@ -796,7 +796,7 @@ void QWinRTMediaPlayerControl::setMedia(const QMediaContent &media, QIODevice *s } // Let Windows handle all other URLs - hr = d->engine->SetSource(Q_NULLPTR); // Resets the byte stream + hr = d->engine->SetSource(nullptr); // Resets the byte stream Q_ASSERT_SUCCEEDED(hr); hr = d->engine->Load(); if (FAILED(hr)) diff --git a/src/plugins/winrt/qwinrtmediaplayercontrol.h b/src/plugins/winrt/qwinrtmediaplayercontrol.h index 3d4154093..1e854f5bb 100644 --- a/src/plugins/winrt/qwinrtmediaplayercontrol.h +++ b/src/plugins/winrt/qwinrtmediaplayercontrol.h @@ -56,39 +56,39 @@ public: QWinRTMediaPlayerControl(IMFMediaEngineClassFactory *factory, QObject *parent = 0); ~QWinRTMediaPlayerControl(); - QMediaPlayer::State state() const Q_DECL_OVERRIDE; - QMediaPlayer::MediaStatus mediaStatus() const Q_DECL_OVERRIDE; + QMediaPlayer::State state() const override; + QMediaPlayer::MediaStatus mediaStatus() const override; - qint64 duration() const Q_DECL_OVERRIDE; + qint64 duration() const override; - qint64 position() const Q_DECL_OVERRIDE; - void setPosition(qint64 position) Q_DECL_OVERRIDE; + qint64 position() const override; + void setPosition(qint64 position) override; - int volume() const Q_DECL_OVERRIDE; - void setVolume(int volume) Q_DECL_OVERRIDE; + int volume() const override; + void setVolume(int volume) override; - bool isMuted() const Q_DECL_OVERRIDE; - void setMuted(bool muted) Q_DECL_OVERRIDE; + bool isMuted() const override; + void setMuted(bool muted) override; - int bufferStatus() const Q_DECL_OVERRIDE; + int bufferStatus() const override; - bool isAudioAvailable() const Q_DECL_OVERRIDE; - bool isVideoAvailable() const Q_DECL_OVERRIDE; + bool isAudioAvailable() const override; + bool isVideoAvailable() const override; - bool isSeekable() const Q_DECL_OVERRIDE; + bool isSeekable() const override; - QMediaTimeRange availablePlaybackRanges() const Q_DECL_OVERRIDE; + QMediaTimeRange availablePlaybackRanges() const override; - qreal playbackRate() const Q_DECL_OVERRIDE; - void setPlaybackRate(qreal rate) Q_DECL_OVERRIDE; + qreal playbackRate() const override; + void setPlaybackRate(qreal rate) override; - QMediaContent media() const Q_DECL_OVERRIDE; - const QIODevice *mediaStream() const Q_DECL_OVERRIDE; - void setMedia(const QMediaContent &media, QIODevice *stream) Q_DECL_OVERRIDE; + QMediaContent media() const override; + const QIODevice *mediaStream() const override; + void setMedia(const QMediaContent &media, QIODevice *stream) override; - void play() Q_DECL_OVERRIDE; - void pause() Q_DECL_OVERRIDE; - void stop() Q_DECL_OVERRIDE; + void play() override; + void pause() override; + void stop() override; QVideoRendererControl *videoRendererControl(); diff --git a/src/plugins/winrt/qwinrtmediaplayerservice.cpp b/src/plugins/winrt/qwinrtmediaplayerservice.cpp index 58149fd33..3253ed188 100644 --- a/src/plugins/winrt/qwinrtmediaplayerservice.cpp +++ b/src/plugins/winrt/qwinrtmediaplayerservice.cpp @@ -65,7 +65,7 @@ QWinRTMediaPlayerService::QWinRTMediaPlayerService(QObject *parent) { Q_D(QWinRTMediaPlayerService); - d->player = Q_NULLPTR; + d->player = nullptr; HRESULT hr = MFStartup(MF_VERSION); Q_ASSERT(SUCCEEDED(hr)); @@ -94,11 +94,11 @@ QMediaControl *QWinRTMediaPlayerService::requestControl(const char *name) } if (qstrcmp(name, QVideoRendererControl_iid) == 0) { if (!d->player) - return Q_NULLPTR; + return nullptr; return d->player->videoRendererControl(); } - return Q_NULLPTR; + return nullptr; } void QWinRTMediaPlayerService::releaseControl(QMediaControl *control) diff --git a/src/plugins/winrt/qwinrtplayerrenderercontrol.h b/src/plugins/winrt/qwinrtplayerrenderercontrol.h index fb67d0c8c..70f3c4af2 100644 --- a/src/plugins/winrt/qwinrtplayerrenderercontrol.h +++ b/src/plugins/winrt/qwinrtplayerrenderercontrol.h @@ -58,7 +58,7 @@ public: bool ensureReady(); - bool render(ID3D11Texture2D *texture) Q_DECL_OVERRIDE; + bool render(ID3D11Texture2D *texture) override; private: QScopedPointer<QWinRTPlayerRendererControlPrivate> d_ptr; diff --git a/src/plugins/winrt/qwinrtserviceplugin.cpp b/src/plugins/winrt/qwinrtserviceplugin.cpp index d08a39a5e..286789e4c 100644 --- a/src/plugins/winrt/qwinrtserviceplugin.cpp +++ b/src/plugins/winrt/qwinrtserviceplugin.cpp @@ -55,7 +55,7 @@ QMediaService *QWinRTServicePlugin::create(QString const &key) if (key == QLatin1String(Q_MEDIASERVICE_CAMERA)) return new QWinRTCameraService(this); - return Q_NULLPTR; + return nullptr; } void QWinRTServicePlugin::release(QMediaService *service) diff --git a/src/plugins/winrt/qwinrtserviceplugin.h b/src/plugins/winrt/qwinrtserviceplugin.h index d6600aa54..30a76022d 100644 --- a/src/plugins/winrt/qwinrtserviceplugin.h +++ b/src/plugins/winrt/qwinrtserviceplugin.h @@ -62,13 +62,13 @@ public: QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const; - QCamera::Position cameraPosition(const QByteArray &device) const Q_DECL_OVERRIDE; - int cameraOrientation(const QByteArray &device) const Q_DECL_OVERRIDE; + QCamera::Position cameraPosition(const QByteArray &device) const override; + int cameraOrientation(const QByteArray &device) const override; - QList<QByteArray> devices(const QByteArray &service) const Q_DECL_OVERRIDE; - QString deviceDescription(const QByteArray &service, const QByteArray &device) Q_DECL_OVERRIDE; + QList<QByteArray> devices(const QByteArray &service) const override; + QString deviceDescription(const QByteArray &service, const QByteArray &device) override; - QByteArray defaultDevice(const QByteArray &service) const Q_DECL_OVERRIDE; + QByteArray defaultDevice(const QByteArray &service) const override; }; QT_END_NAMESPACE diff --git a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp index abe10f9a4..41d4693cb 100644 --- a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp +++ b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp @@ -124,7 +124,7 @@ struct QWinRTVideoDeviceSelectorControlGlobal IDeviceInformation *device; hr = deviceList->GetAt(i, &device); Q_ASSERT_SUCCEEDED(hr); - onDeviceAdded(Q_NULLPTR, device); + onDeviceAdded(nullptr, device); } // If there is no default device provided by the API, choose the first one diff --git a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.h b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.h index 36f00656c..3beb9782a 100644 --- a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.h +++ b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.h @@ -65,13 +65,13 @@ public: explicit QWinRTVideoDeviceSelectorControl(QObject *parent = 0); ~QWinRTVideoDeviceSelectorControl(); - int deviceCount() const Q_DECL_OVERRIDE; + int deviceCount() const override; - QString deviceName(int index) const Q_DECL_OVERRIDE; - QString deviceDescription(int index) const Q_DECL_OVERRIDE; + QString deviceName(int index) const override; + QString deviceDescription(int index) const override; - int defaultDevice() const Q_DECL_OVERRIDE; - int selectedDevice() const Q_DECL_OVERRIDE; + int defaultDevice() const override; + int selectedDevice() const override; static QCamera::Position cameraPosition(const QString &deviceName); static int cameraOrientation(const QString &deviceName); @@ -80,7 +80,7 @@ public: static QByteArray defaultDeviceName(); public slots: - void setSelectedDevice(int index) Q_DECL_OVERRIDE; + void setSelectedDevice(int index) override; private: QScopedPointer<QWinRTVideoDeviceSelectorControlPrivate> d_ptr; diff --git a/src/plugins/wmf/mfstream.cpp b/src/plugins/wmf/mfstream.cpp index fd95bf20b..a98b5a704 100644 --- a/src/plugins/wmf/mfstream.cpp +++ b/src/plugins/wmf/mfstream.cpp @@ -231,6 +231,8 @@ STDMETHODIMP MFStream::Seek( qint64 pos = qint64(llSeekOffset); switch (SeekOrigin) { + case msoBegin: + break; case msoCurrent: pos += m_stream->pos(); break; diff --git a/src/plugins/wmf/player/mfmetadatacontrol.cpp b/src/plugins/wmf/player/mfmetadatacontrol.cpp index 01be95e84..ac57ccfb5 100644 --- a/src/plugins/wmf/player/mfmetadatacontrol.cpp +++ b/src/plugins/wmf/player/mfmetadatacontrol.cpp @@ -193,6 +193,11 @@ QVariant MFMetaDataControl::metaData(const QString &key) const if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_FrameWidth, &var))) res.setWidth(convertValue(var).toUInt()); value = res; + } else if (key == QMediaMetaData::Orientation) { + uint orientation = 0; + if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_Orientation, &var))) + orientation = convertValue(var).toUInt(); + value = orientation; } else if (key == QMediaMetaData::PixelAspectRatio) { QSize aspectRatio; aspectRatio.setWidth(value.toUInt()); @@ -352,6 +357,8 @@ void MFMetaDataControl::updateSource(IMFPresentationDescriptor* sourcePD, IMFMed m_availableMetaDatas.push_back(QMediaMetaData::ThumbnailImage); } else if (key == PKEY_Video_FrameHeight) { m_availableMetaDatas.push_back(QMediaMetaData::Resolution); + } else if (key == PKEY_Video_Orientation) { + m_availableMetaDatas.push_back(QMediaMetaData::Orientation); } else if (key == PKEY_Video_HorizontalAspectRatio) { m_availableMetaDatas.push_back(QMediaMetaData::PixelAspectRatio); } else if (key == PKEY_Video_FrameRate) { diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp index 0cb6659ca..c51aec088 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp @@ -130,7 +130,7 @@ class FilterRunnableDeleter : public QRunnable { public: FilterRunnableDeleter(const QList<QVideoFilterRunnable *> &runnables) : m_runnables(runnables) { } - void run() Q_DECL_OVERRIDE { + void run() override { for (QVideoFilterRunnable *runnable : qAsConst(m_runnables)) delete runnable; } diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h index c84612960..4f1a90c8b 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h @@ -74,25 +74,25 @@ public: QDeclarativeVideoRendererBackend(QDeclarativeVideoOutput *parent); ~QDeclarativeVideoRendererBackend(); - bool init(QMediaService *service) Q_DECL_OVERRIDE; - void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &changeData) Q_DECL_OVERRIDE; - void releaseSource() Q_DECL_OVERRIDE; - void releaseControl() Q_DECL_OVERRIDE; - QSize nativeSize() const Q_DECL_OVERRIDE; - void updateGeometry() Q_DECL_OVERRIDE; - QSGNode *updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) Q_DECL_OVERRIDE; - QAbstractVideoSurface *videoSurface() const Q_DECL_OVERRIDE; - QRectF adjustedViewport() const Q_DECL_OVERRIDE; + bool init(QMediaService *service) override; + void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &changeData) override; + void releaseSource() override; + void releaseControl() override; + QSize nativeSize() const override; + void updateGeometry() override; + QSGNode *updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) override; + QAbstractVideoSurface *videoSurface() const override; + QRectF adjustedViewport() const override; QOpenGLContext *glContext() const; friend class QSGVideoItemSurface; void present(const QVideoFrame &frame); void stop(); - void appendFilter(QAbstractVideoFilter *filter) Q_DECL_OVERRIDE; - void clearFilters() Q_DECL_OVERRIDE; - void releaseResources() Q_DECL_OVERRIDE; - void invalidateSceneGraph() Q_DECL_OVERRIDE; + void appendFilter(QAbstractVideoFilter *filter) override; + void clearFilters() override; + void releaseResources() override; + void invalidateSceneGraph() override; private: void scheduleDeleteFilterResources(); diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_window_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_window_p.h index 942cc18d9..eb1814b07 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput_window_p.h +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_window_p.h @@ -63,15 +63,15 @@ public: QDeclarativeVideoWindowBackend(QDeclarativeVideoOutput *parent); ~QDeclarativeVideoWindowBackend(); - bool init(QMediaService *service) Q_DECL_OVERRIDE; - void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &changeData) Q_DECL_OVERRIDE; - void releaseSource() Q_DECL_OVERRIDE; - void releaseControl() Q_DECL_OVERRIDE; - QSize nativeSize() const Q_DECL_OVERRIDE; - void updateGeometry() Q_DECL_OVERRIDE; - QSGNode *updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) Q_DECL_OVERRIDE; - QAbstractVideoSurface *videoSurface() const Q_DECL_OVERRIDE; - QRectF adjustedViewport() const Q_DECL_OVERRIDE; + bool init(QMediaService *service) override; + void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &changeData) override; + void releaseSource() override; + void releaseControl() override; + QSize nativeSize() const override; + void updateGeometry() override; + QSGNode *updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) override; + QAbstractVideoSurface *videoSurface() const override; + QRectF adjustedViewport() const override; private: QPointer<QVideoWindowControl> m_videoWindowControl; diff --git a/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp b/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp index 0dfa11ab9..d039e1e0b 100644 --- a/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp @@ -113,11 +113,19 @@ protected: class QSGVideoMaterialShader_RGB_swizzle : public QSGVideoMaterialShader_RGB { public: - QSGVideoMaterialShader_RGB_swizzle() - : QSGVideoMaterialShader_RGB() + QSGVideoMaterialShader_RGB_swizzle(bool hasAlpha) + : m_hasAlpha(hasAlpha) { setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag")); } + +protected: + void initialize() override { + QSGVideoMaterialShader_RGB::initialize(); + program()->setUniformValue(program()->uniformLocation("hasAlpha"), GLboolean(m_hasAlpha)); + } + + bool m_hasAlpha; }; @@ -145,7 +153,8 @@ public: } QSGMaterialShader *createShader() const override { - return needsSwizzling() ? new QSGVideoMaterialShader_RGB_swizzle + const bool hasAlpha = m_format.pixelFormat() == QVideoFrame::Format_ARGB32; + return needsSwizzling() ? new QSGVideoMaterialShader_RGB_swizzle(hasAlpha) : new QSGVideoMaterialShader_RGB; } diff --git a/src/qtmultimediaquicktools/qsgvideonode_texture.cpp b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp index a26d59532..f5545afc7 100644 --- a/src/qtmultimediaquicktools/qsgvideonode_texture.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp @@ -108,11 +108,19 @@ protected: class QSGVideoMaterialShader_Texture_swizzle : public QSGVideoMaterialShader_Texture { public: - QSGVideoMaterialShader_Texture_swizzle() - : QSGVideoMaterialShader_Texture() + QSGVideoMaterialShader_Texture_swizzle(bool hasAlpha) + : m_hasAlpha(hasAlpha) { setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag")); } + +protected: + void initialize() override { + QSGVideoMaterialShader_Texture::initialize(); + program()->setUniformValue(program()->uniformLocation("hasAlpha"), GLboolean(m_hasAlpha)); + } + + int m_hasAlpha; }; @@ -138,7 +146,8 @@ public: } QSGMaterialShader *createShader() const override { - return needsSwizzling() ? new QSGVideoMaterialShader_Texture_swizzle + const bool hasAlpha = m_format.pixelFormat() == QVideoFrame::Format_ARGB32; + return needsSwizzling() ? new QSGVideoMaterialShader_Texture_swizzle(hasAlpha) : new QSGVideoMaterialShader_Texture; } diff --git a/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp b/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp index b04c6b38b..9eff9dbd6 100644 --- a/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp @@ -120,9 +120,9 @@ public: setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/qtmultimediaquicktools/shaders/uyvyvideo.frag")); } - void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) Q_DECL_OVERRIDE; + void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override; - char const *const *attributeNames() const Q_DECL_OVERRIDE { + char const *const *attributeNames() const override { static const char *names[] = { "qt_VertexPosition", "qt_VertexTexCoord", @@ -132,7 +132,7 @@ public: } protected: - void initialize() Q_DECL_OVERRIDE { + void initialize() override { m_id_matrix = program()->uniformLocation("qt_Matrix"); m_id_yTexture = program()->uniformLocation("yTexture"); m_id_uvTexture = program()->uniformLocation("uvTexture"); diff --git a/src/qtmultimediaquicktools/qtmultimediaquicktools.pro b/src/qtmultimediaquicktools/qtmultimediaquicktools.pro index e4e157a54..bffdc6ec2 100644 --- a/src/qtmultimediaquicktools/qtmultimediaquicktools.pro +++ b/src/qtmultimediaquicktools/qtmultimediaquicktools.pro @@ -1,4 +1,4 @@ -TARGET = QtMultimediaQuick_p +TARGET = QtMultimediaQuick QT = core quick multimedia-private CONFIG += internal_module diff --git a/src/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag b/src/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag index f01dc86a0..99caa19fb 100644 --- a/src/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag +++ b/src/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag @@ -1,8 +1,10 @@ uniform sampler2D rgbTexture; uniform lowp float opacity; varying highp vec2 qt_TexCoord; +uniform bool hasAlpha; void main() { - gl_FragColor = vec4(texture2D(rgbTexture, qt_TexCoord).bgr, 1.0) * opacity; + lowp vec4 v = texture2D(rgbTexture, qt_TexCoord); + gl_FragColor = vec4(v.bgr, hasAlpha ? v.a : 1.0) * opacity; } |