diff options
Diffstat (limited to 'src/plugins')
91 files changed, 976 insertions, 564 deletions
diff --git a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java index 647cc7fe0..6569a7b8d 100644 --- a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java +++ b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java @@ -46,6 +46,7 @@ import java.io.FileInputStream; // API is level is < 9 unless marked otherwise. import android.content.Context; import android.media.MediaPlayer; +import android.media.AudioAttributes; import android.net.Uri; import android.util.Log; import java.io.FileDescriptor; @@ -65,6 +66,7 @@ public class QtAndroidMediaPlayer native public void onStateChangedNative(int state, long id); private MediaPlayer mMediaPlayer = null; + private AudioAttributes mAudioAttributes = null; private Uri mUri = null; private final long mID; private final Context mContext; @@ -235,6 +237,7 @@ public class QtAndroidMediaPlayer setState(State.Idle); // Make sure the new media player has the volume that was set on the QMediaPlayer setVolumeHelper(mMuted ? 0 : mVolume); + setAudioAttributes(mMediaPlayer, mAudioAttributes); } } @@ -547,4 +550,26 @@ public class QtAndroidMediaPlayer setState(State.Uninitialized); } + + public void setAudioAttributes(int type, int usage) + { + mAudioAttributes = new AudioAttributes.Builder() + .setUsage(usage) + .setContentType(type) + .build(); + + setAudioAttributes(mMediaPlayer, mAudioAttributes); + } + + static private void setAudioAttributes(MediaPlayer player, AudioAttributes attr) + { + if (player == null || attr == null) + return; + + try { + player.setAudioAttributes(attr); + } catch (final IllegalArgumentException e) { + Log.d(TAG, "" + e.getMessage()); + } + } } diff --git a/src/plugins/android/src/common/qandroidvideooutput.cpp b/src/plugins/android/src/common/qandroidvideooutput.cpp index a8351aadb..083ceff24 100644 --- a/src/plugins/android/src/common/qandroidvideooutput.cpp +++ b/src/plugins/android/src/common/qandroidvideooutput.cpp @@ -320,7 +320,7 @@ void QAndroidTextureVideoOutput::onFrameAvailable() return; QAbstractVideoBuffer *buffer = new AndroidTextureVideoBuffer(this, m_nativeSize); - QVideoFrame frame(buffer, m_nativeSize, QVideoFrame::Format_BGR32); + QVideoFrame frame(buffer, m_nativeSize, QVideoFrame::Format_ABGR32); if (m_surface->isActive() && (m_surface->surfaceFormat().pixelFormat() != frame.pixelFormat() || m_surface->surfaceFormat().frameSize() != frame.size())) { diff --git a/src/plugins/android/src/mediaplayer/mediaplayer.pri b/src/plugins/android/src/mediaplayer/mediaplayer.pri index 9f758a993..3a9cef3a1 100644 --- a/src/plugins/android/src/mediaplayer/mediaplayer.pri +++ b/src/plugins/android/src/mediaplayer/mediaplayer.pri @@ -4,10 +4,14 @@ HEADERS += \ $$PWD/qandroidmediaplayercontrol.h \ $$PWD/qandroidmediaservice.h \ $$PWD/qandroidmetadatareadercontrol.h \ + $$PWD/qandroidaudiorolecontrol.h \ + $$PWD/qandroidcustomaudiorolecontrol.h \ $$PWD/qandroidmediaplayervideorenderercontrol.h SOURCES += \ $$PWD/qandroidmediaplayercontrol.cpp \ $$PWD/qandroidmediaservice.cpp \ $$PWD/qandroidmetadatareadercontrol.cpp \ + $$PWD/qandroidaudiorolecontrol.cpp \ + $$PWD/qandroidcustomaudiorolecontrol.cpp \ $$PWD/qandroidmediaplayervideorenderercontrol.cpp diff --git a/src/plugins/android/src/mediaplayer/qandroidaudiorolecontrol.cpp b/src/plugins/android/src/mediaplayer/qandroidaudiorolecontrol.cpp new file mode 100644 index 000000000..5879b0cb9 --- /dev/null +++ b/src/plugins/android/src/mediaplayer/qandroidaudiorolecontrol.cpp @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 "qandroidaudiorolecontrol.h" + +QT_BEGIN_NAMESPACE + +QAndroidAudioRoleControl::QAndroidAudioRoleControl(QObject *parent) + : QAudioRoleControl(parent) +{ +} + +QAudio::Role QAndroidAudioRoleControl::audioRole() const +{ + return m_role; +} + +void QAndroidAudioRoleControl::setAudioRole(QAudio::Role role) +{ + if (m_role == role) + return; + + m_role = role; + emit audioRoleChanged(m_role); +} + +QList<QAudio::Role> QAndroidAudioRoleControl::supportedAudioRoles() const +{ + return QList<QAudio::Role>() + << QAudio::VoiceCommunicationRole + << QAudio::MusicRole + << QAudio::VideoRole + << QAudio::SonificationRole + << QAudio::AlarmRole + << QAudio::NotificationRole + << QAudio::RingtoneRole + << QAudio::AccessibilityRole + << QAudio::GameRole; +} + +QT_END_NAMESPACE diff --git a/src/plugins/android/src/mediaplayer/qandroidaudiorolecontrol.h b/src/plugins/android/src/mediaplayer/qandroidaudiorolecontrol.h new file mode 100644 index 000000000..89219e026 --- /dev/null +++ b/src/plugins/android/src/mediaplayer/qandroidaudiorolecontrol.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 QANDROIDAUDIOROLECONTROL_H +#define QANDROIDAUDIOROLECONTROL_H + +#include <qaudiorolecontrol.h> + +QT_BEGIN_NAMESPACE + +class QAndroidAudioRoleControl : public QAudioRoleControl +{ + Q_OBJECT +public: + explicit QAndroidAudioRoleControl(QObject *parent = nullptr); + + QAudio::Role audioRole() const override; + void setAudioRole(QAudio::Role role) override; + QList<QAudio::Role> supportedAudioRoles() const override; + +private: + QAudio::Role m_role = QAudio::UnknownRole; +}; + +QT_END_NAMESPACE + +#endif // QANDROIDAUDIOROLECONTROL_H diff --git a/src/plugins/android/src/mediaplayer/qandroidcustomaudiorolecontrol.cpp b/src/plugins/android/src/mediaplayer/qandroidcustomaudiorolecontrol.cpp new file mode 100644 index 000000000..cb7b5d0af --- /dev/null +++ b/src/plugins/android/src/mediaplayer/qandroidcustomaudiorolecontrol.cpp @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 "qandroidcustomaudiorolecontrol.h" + +QT_BEGIN_NAMESPACE + +QAndroidCustomAudioRoleControl::QAndroidCustomAudioRoleControl(QObject *parent) + : QCustomAudioRoleControl(parent) +{ +} + +QString QAndroidCustomAudioRoleControl::customAudioRole() const +{ + return m_role; +} + +void QAndroidCustomAudioRoleControl::setCustomAudioRole(const QString &role) +{ + if (m_role == role) + return; + + m_role = role; + emit customAudioRoleChanged(m_role); +} + +QStringList QAndroidCustomAudioRoleControl::supportedCustomAudioRoles() const +{ + return QStringList() + << "CONTENT_TYPE_MOVIE" + << "CONTENT_TYPE_MUSIC" + << "CONTENT_TYPE_SONIFICATION" + << "CONTENT_TYPE_SPEECH" + << "USAGE_ALARM" + << "USAGE_ASSISTANCE_ACCESSIBILITY" + << "USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" + << "USAGE_ASSISTANCE_SONIFICATION" + << "USAGE_ASSISTANT" + << "USAGE_GAME" + << "USAGE_MEDIA" + << "USAGE_NOTIFICATION" + << "USAGE_NOTIFICATION_COMMUNICATION_DELAYED" + << "USAGE_NOTIFICATION_COMMUNICATION_INSTANT" + << "USAGE_NOTIFICATION_COMMUNICATION_REQUEST" + << "USAGE_NOTIFICATION_EVENT" + << "USAGE_NOTIFICATION_RINGTONE" + << "USAGE_VOICE_COMMUNICATION" + << "USAGE_VOICE_COMMUNICATION_SIGNALLING"; +} + +QT_END_NAMESPACE diff --git a/src/plugins/android/src/mediaplayer/qandroidcustomaudiorolecontrol.h b/src/plugins/android/src/mediaplayer/qandroidcustomaudiorolecontrol.h new file mode 100644 index 000000000..4604ebe67 --- /dev/null +++ b/src/plugins/android/src/mediaplayer/qandroidcustomaudiorolecontrol.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2019 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 QANDROIDCUSTOMAUDIOROLECONTROL_H +#define QANDROIDCUSTOMAUDIOROLECONTROL_H + +#include <qcustomaudiorolecontrol.h> + +QT_BEGIN_NAMESPACE + +class QAndroidCustomAudioRoleControl : public QCustomAudioRoleControl +{ + Q_OBJECT +public: + explicit QAndroidCustomAudioRoleControl(QObject *parent = nullptr); + + QString customAudioRole() const override; + void setCustomAudioRole(const QString &role) override; + QStringList supportedCustomAudioRoles() const override; + +private: + QString m_role; +}; + +QT_END_NAMESPACE + +#endif // QANDROIDCUSTOMAUDIOROLECONTROL_H diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp index df1463a87..4bfcce5bc 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp @@ -250,6 +250,16 @@ void QAndroidMediaPlayerControl::setMuted(bool muted) Q_EMIT mutedChanged(muted); } +void QAndroidMediaPlayerControl::setAudioRole(QAudio::Role role) +{ + mMediaPlayer->setAudioRole(role); +} + +void QAndroidMediaPlayerControl::setCustomAudioRole(const QString &role) +{ + mMediaPlayer->setCustomAudioRole(role); +} + int QAndroidMediaPlayerControl::bufferStatus() const { return mBufferFilled ? 100 : 0; diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h index 119add7f8..35f56145f 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h @@ -85,6 +85,8 @@ public Q_SLOTS: void stop() override; void setVolume(int volume) override; void setMuted(bool muted) override; + void setAudioRole(QAudio::Role role); + void setCustomAudioRole(const QString &role); private Q_SLOTS: void onVideoOutputReady(bool ready); diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaservice.cpp b/src/plugins/android/src/mediaplayer/qandroidmediaservice.cpp index 2688f3550..c057f530a 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaservice.cpp +++ b/src/plugins/android/src/mediaplayer/qandroidmediaservice.cpp @@ -41,16 +41,26 @@ #include "qandroidmediaplayercontrol.h" #include "qandroidmetadatareadercontrol.h" +#include "qandroidaudiorolecontrol.h" +#include "qandroidcustomaudiorolecontrol.h" #include "qandroidmediaplayervideorenderercontrol.h" QT_BEGIN_NAMESPACE QAndroidMediaService::QAndroidMediaService(QObject *parent) : QMediaService(parent) + , mAudioRoleControl(nullptr) + , mCustomAudioRoleControl(nullptr) , mVideoRendererControl(0) { mMediaControl = new QAndroidMediaPlayerControl; mMetadataControl = new QAndroidMetaDataReaderControl; + mAudioRoleControl = new QAndroidAudioRoleControl; + mCustomAudioRoleControl = new QAndroidCustomAudioRoleControl; + connect(mAudioRoleControl, &QAndroidAudioRoleControl::audioRoleChanged, + mMediaControl, &QAndroidMediaPlayerControl::setAudioRole); + connect(mCustomAudioRoleControl, &QAndroidCustomAudioRoleControl::customAudioRoleChanged, + mMediaControl, &QAndroidMediaPlayerControl::setCustomAudioRole); connect(mMediaControl, SIGNAL(mediaChanged(QMediaContent)), mMetadataControl, SLOT(onMediaChanged(QMediaContent))); connect(mMediaControl, SIGNAL(metaDataUpdated()), @@ -60,6 +70,8 @@ QAndroidMediaService::QAndroidMediaService(QObject *parent) QAndroidMediaService::~QAndroidMediaService() { delete mVideoRendererControl; + delete mCustomAudioRoleControl; + delete mAudioRoleControl; delete mMetadataControl; delete mMediaControl; } @@ -72,6 +84,12 @@ QMediaControl *QAndroidMediaService::requestControl(const char *name) if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) return mMetadataControl; + if (qstrcmp(name, QAudioRoleControl_iid) == 0) + return mAudioRoleControl; + + if (qstrcmp(name, QCustomAudioRoleControl_iid) == 0) + return mCustomAudioRoleControl; + if (qstrcmp(name, QVideoRendererControl_iid) == 0) { if (!mVideoRendererControl) { mVideoRendererControl = new QAndroidMediaPlayerVideoRendererControl(mMediaControl); diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaservice.h b/src/plugins/android/src/mediaplayer/qandroidmediaservice.h index f78d05ddd..788c11098 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaservice.h +++ b/src/plugins/android/src/mediaplayer/qandroidmediaservice.h @@ -46,6 +46,8 @@ QT_BEGIN_NAMESPACE class QAndroidMediaPlayerControl; class QAndroidMetaDataReaderControl; +class QAndroidAudioRoleControl; +class QAndroidCustomAudioRoleControl; class QAndroidMediaPlayerVideoRendererControl; class QAndroidMediaService : public QMediaService @@ -61,6 +63,8 @@ public: private: QAndroidMediaPlayerControl *mMediaControl; QAndroidMetaDataReaderControl *mMetadataControl; + QAndroidAudioRoleControl *mAudioRoleControl; + QAndroidCustomAudioRoleControl *mCustomAudioRoleControl; QAndroidMediaPlayerVideoRendererControl *mVideoRendererControl; }; diff --git a/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp b/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp index b81f98cbd..79685e16f 100644 --- a/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp +++ b/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp @@ -223,6 +223,95 @@ void AndroidMediaPlayer::setDisplay(AndroidSurfaceTexture *surfaceTexture) surfaceTexture ? surfaceTexture->surfaceHolder() : 0); } +void AndroidMediaPlayer::setAudioRole(QAudio::Role role) +{ + QString str; + switch (role) { + case QAudio::MusicRole: + str = QLatin1String("CONTENT_TYPE_MUSIC"); + break; + case QAudio::VideoRole: + str = QLatin1String("CONTENT_TYPE_MOVIE"); + break; + case QAudio::VoiceCommunicationRole: + str = QLatin1String("USAGE_VOICE_COMMUNICATION"); + break; + case QAudio::AlarmRole: + str = QLatin1String("USAGE_ALARM"); + break; + case QAudio::NotificationRole: + str = QLatin1String("USAGE_NOTIFICATION"); + break; + case QAudio::RingtoneRole: + str = QLatin1String("USAGE_NOTIFICATION_RINGTONE"); + break; + case QAudio::AccessibilityRole: + str = QLatin1String("USAGE_ASSISTANCE_ACCESSIBILITY"); + break; + case QAudio::SonificationRole: + str = QLatin1String("CONTENT_TYPE_SONIFICATION"); + break; + case QAudio::GameRole: + str = QLatin1String("USAGE_GAME"); + break; + default: + break; + } + + setCustomAudioRole(str); +} + +void AndroidMediaPlayer::setCustomAudioRole(const QString &role) +{ + QStringList roles = role.split(",", QString::SkipEmptyParts); + + int type = 0; // CONTENT_TYPE_UNKNOWN + int usage = 0; // USAGE_UNKNOWN + for (int i = 0; i < qMin(2, roles.size()); ++i) { + auto r = roles[i]; + if (r == QLatin1String("CONTENT_TYPE_MOVIE")) + type = 3; + else if (r == QLatin1String("CONTENT_TYPE_MUSIC")) + type = 2; + else if (r == QLatin1String("CONTENT_TYPE_SONIFICATION")) + type = 4; + else if (r == QLatin1String("CONTENT_TYPE_SPEECH")) + type = 1; + else if (r == QLatin1String("USAGE_ALARM")) + usage = 4; + else if (r == QLatin1String("USAGE_ASSISTANCE_ACCESSIBILITY")) + usage = 11; + else if (r == QLatin1String("USAGE_ASSISTANCE_NAVIGATION_GUIDANCE")) + usage = 12; + else if (r == QLatin1String("USAGE_ASSISTANCE_SONIFICATION")) + usage = 13; + else if (r == QLatin1String("USAGE_ASSISTANT")) + usage = 16; + else if (r == QLatin1String("USAGE_GAME")) + usage = 14; + else if (r == QLatin1String("USAGE_MEDIA")) + usage = 1; + else if (r == QLatin1String("USAGE_NOTIFICATION")) + usage = 5; + else if (r == QLatin1String("USAGE_NOTIFICATION_COMMUNICATION_DELAYED")) + usage = 9; + else if (r == QLatin1String("USAGE_NOTIFICATION_COMMUNICATION_INSTANT")) + usage = 8; + else if (r == QLatin1String("USAGE_NOTIFICATION_COMMUNICATION_REQUEST")) + usage = 7; + else if (r == QLatin1String("USAGE_NOTIFICATION_EVENT")) + usage = 10; + else if (r == QLatin1String("USAGE_NOTIFICATION_RINGTONE")) + usage = 6; + else if (r == QLatin1String("USAGE_VOICE_COMMUNICATION")) + usage = 2; + else if (r == QLatin1String("USAGE_VOICE_COMMUNICATION_SIGNALLING")) + usage = 3; + } + + mMediaPlayer.callMethod<void>("setAudioAttributes", "(II)V", jint(type), jint(usage)); +} + static void onErrorNative(JNIEnv *env, jobject thiz, jint what, jint extra, jlong id) { Q_UNUSED(env); diff --git a/src/plugins/android/src/wrappers/jni/androidmediaplayer.h b/src/plugins/android/src/wrappers/jni/androidmediaplayer.h index a7284bb0c..14cbf49bc 100644 --- a/src/plugins/android/src/wrappers/jni/androidmediaplayer.h +++ b/src/plugins/android/src/wrappers/jni/androidmediaplayer.h @@ -42,6 +42,7 @@ #include <QObject> #include <QtCore/private/qjni_p.h> +#include <QAudio> QT_BEGIN_NAMESPACE @@ -116,6 +117,8 @@ public: void setVolume(int volume); bool setPlaybackRate(qreal rate); void setDisplay(AndroidSurfaceTexture *surfaceTexture); + void setAudioRole(QAudio::Role role); + void setCustomAudioRole(const QString &role); static bool initJNI(JNIEnv *env); diff --git a/src/plugins/android/videonode/qandroidsgvideonodeplugin.cpp b/src/plugins/android/videonode/qandroidsgvideonodeplugin.cpp index e69c9c16e..d70c8100b 100644 --- a/src/plugins/android/videonode/qandroidsgvideonodeplugin.cpp +++ b/src/plugins/android/videonode/qandroidsgvideonodeplugin.cpp @@ -48,7 +48,7 @@ QList<QVideoFrame::PixelFormat> QAndroidSGVideoNodeFactoryPlugin::supportedPixel QList<QVideoFrame::PixelFormat> pixelFormats; if (handleType == QAbstractVideoBuffer::GLTextureHandle) - pixelFormats.append(QVideoFrame::Format_BGR32); + pixelFormats.append(QVideoFrame::Format_ABGR32); return pixelFormats; } diff --git a/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h b/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h index 4ba987e53..94aa6a8f0 100644 --- a/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h +++ b/src/plugins/avfoundation/camera/avfaudioencodersettingscontrol.h @@ -56,7 +56,7 @@ public: QStringList supportedAudioCodecs() const override; QString codecDescription(const QString &codecName) const override; - QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = 0) const override; + QList<int> supportedSampleRates(const QAudioEncoderSettings &settings, bool *continuous = nullptr) const override; QAudioEncoderSettings audioSettings() const override; void setAudioSettings(const QAudioEncoderSettings &settings) override; diff --git a/src/plugins/avfoundation/camera/avfaudioinputselectorcontrol.h b/src/plugins/avfoundation/camera/avfaudioinputselectorcontrol.h index 80669d242..a902a71f9 100644 --- a/src/plugins/avfoundation/camera/avfaudioinputselectorcontrol.h +++ b/src/plugins/avfoundation/camera/avfaudioinputselectorcontrol.h @@ -54,16 +54,16 @@ class AVFAudioInputSelectorControl : public QAudioInputSelectorControl { Q_OBJECT public: - AVFAudioInputSelectorControl(AVFCameraService *service, QObject *parent = 0); + AVFAudioInputSelectorControl(AVFCameraService *service, QObject *parent = nullptr); ~AVFAudioInputSelectorControl(); - QList<QString> availableInputs() const; - QString inputDescription(const QString &name) const; - QString defaultInput() const; - QString activeInput() const; + QList<QString> availableInputs() const override; + QString inputDescription(const QString &name) const override; + QString defaultInput() const override; + QString activeInput() const override; public Q_SLOTS: - void setActiveInput(const QString &name); + void setActiveInput(const QString &name) override; public: //device changed since the last createCaptureDevice() diff --git a/src/plugins/avfoundation/camera/avfaudioinputselectorcontrol.mm b/src/plugins/avfoundation/camera/avfaudioinputselectorcontrol.mm index b6228290d..de29fd970 100644 --- a/src/plugins/avfoundation/camera/avfaudioinputselectorcontrol.mm +++ b/src/plugins/avfoundation/camera/avfaudioinputselectorcontrol.mm @@ -102,7 +102,7 @@ void AVFAudioInputSelectorControl::setActiveInput(const QString &name) AVCaptureDevice *AVFAudioInputSelectorControl::createCaptureDevice() { m_dirty = false; - AVCaptureDevice *device = 0; + AVCaptureDevice *device = nullptr; if (!m_activeInput.isEmpty()) { device = [AVCaptureDevice deviceWithUniqueID: diff --git a/src/plugins/avfoundation/camera/avfcameracontrol.h b/src/plugins/avfoundation/camera/avfcameracontrol.h index 7489e6cb3..df371e864 100644 --- a/src/plugins/avfoundation/camera/avfcameracontrol.h +++ b/src/plugins/avfoundation/camera/avfcameracontrol.h @@ -53,19 +53,19 @@ class AVFCameraControl : public QCameraControl { Q_OBJECT public: - AVFCameraControl(AVFCameraService *service, QObject *parent = 0); + AVFCameraControl(AVFCameraService *service, QObject *parent = nullptr); ~AVFCameraControl(); - QCamera::State state() const; - void setState(QCamera::State state); + QCamera::State state() const override; + void setState(QCamera::State state) override; - QCamera::Status status() const; + QCamera::Status status() const override; - QCamera::CaptureModes captureMode() const; - void setCaptureMode(QCamera::CaptureModes); - bool isCaptureModeSupported(QCamera::CaptureModes mode) const; + 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; + bool canChangeProperty(PropertyChangeType changeType, QCamera::Status status) const override; private Q_SLOTS: void updateStatus(); diff --git a/src/plugins/avfoundation/camera/avfcameradevicecontrol.h b/src/plugins/avfoundation/camera/avfcameradevicecontrol.h index ac84b1983..0a16c0408 100644 --- a/src/plugins/avfoundation/camera/avfcameradevicecontrol.h +++ b/src/plugins/avfoundation/camera/avfcameradevicecontrol.h @@ -54,19 +54,19 @@ class AVFCameraDeviceControl : public QVideoDeviceSelectorControl { Q_OBJECT public: - AVFCameraDeviceControl(AVFCameraService *service, QObject *parent = 0); + AVFCameraDeviceControl(AVFCameraService *service, QObject *parent = nullptr); ~AVFCameraDeviceControl(); - int deviceCount() const; + int deviceCount() const override; - QString deviceName(int index) const; - QString deviceDescription(int index) const; + QString deviceName(int index) const override; + QString deviceDescription(int index) const override; - int defaultDevice() const; - int selectedDevice() const; + int defaultDevice() const override; + int selectedDevice() const override; public Q_SLOTS: - void setSelectedDevice(int index); + void setSelectedDevice(int index) override; public: //device changed since the last createCaptureDevice() diff --git a/src/plugins/avfoundation/camera/avfcameradevicecontrol.mm b/src/plugins/avfoundation/camera/avfcameradevicecontrol.mm index 87180859a..907373b61 100644 --- a/src/plugins/avfoundation/camera/avfcameradevicecontrol.mm +++ b/src/plugins/avfoundation/camera/avfcameradevicecontrol.mm @@ -105,7 +105,7 @@ void AVFCameraDeviceControl::setSelectedDevice(int index) AVCaptureDevice *AVFCameraDeviceControl::createCaptureDevice() { m_dirty = false; - AVCaptureDevice *device = 0; + AVCaptureDevice *device = nullptr; QString deviceId = deviceName(m_selectedDevice); if (!deviceId.isEmpty()) { diff --git a/src/plugins/avfoundation/camera/avfcameraflashcontrol.mm b/src/plugins/avfoundation/camera/avfcameraflashcontrol.mm index 134c88e68..42303ce17 100644 --- a/src/plugins/avfoundation/camera/avfcameraflashcontrol.mm +++ b/src/plugins/avfoundation/camera/avfcameraflashcontrol.mm @@ -50,7 +50,7 @@ AVFCameraFlashControl::AVFCameraFlashControl(AVFCameraService *service) : m_service(service) - , m_session(0) + , m_session(nullptr) , m_supportedModes(QCameraExposure::FlashOff) , m_flashMode(QCameraExposure::FlashOff) { diff --git a/src/plugins/avfoundation/camera/avfcamerainfocontrol.h b/src/plugins/avfoundation/camera/avfcamerainfocontrol.h index 806a51cbd..c3aa11918 100644 --- a/src/plugins/avfoundation/camera/avfcamerainfocontrol.h +++ b/src/plugins/avfoundation/camera/avfcamerainfocontrol.h @@ -48,10 +48,10 @@ class AVFCameraInfoControl : public QCameraInfoControl { Q_OBJECT public: - explicit AVFCameraInfoControl(QObject *parent = 0); + explicit AVFCameraInfoControl(QObject *parent = nullptr); - QCamera::Position cameraPosition(const QString &deviceName) const; - int cameraOrientation(const QString &deviceName) const; + QCamera::Position cameraPosition(const QString &deviceName) const override; + int cameraOrientation(const QString &deviceName) const override; }; QT_END_NAMESPACE diff --git a/src/plugins/avfoundation/camera/avfcamerametadatacontrol.h b/src/plugins/avfoundation/camera/avfcamerametadatacontrol.h index 1b00043d0..cba29c394 100644 --- a/src/plugins/avfoundation/camera/avfcamerametadatacontrol.h +++ b/src/plugins/avfoundation/camera/avfcamerametadatacontrol.h @@ -50,15 +50,15 @@ class AVFCameraMetaDataControl : public QMetaDataWriterControl { Q_OBJECT public: - AVFCameraMetaDataControl(AVFCameraService *service, QObject *parent=0); + AVFCameraMetaDataControl(AVFCameraService *service, QObject *parent = nullptr); virtual ~AVFCameraMetaDataControl(); - bool isMetaDataAvailable() const; - bool isWritable() const; + bool isMetaDataAvailable() const override; + bool isWritable() const override; - QVariant metaData(const QString &key) const; - void setMetaData(const QString &key, const QVariant &value); - QStringList availableMetaData() const; + QVariant metaData(const QString &key) const override; + void setMetaData(const QString &key, const QVariant &value) override; + QStringList availableMetaData() const override; private: QMap<QString, QVariant> m_tags; diff --git a/src/plugins/avfoundation/camera/avfcamerarenderercontrol.h b/src/plugins/avfoundation/camera/avfcamerarenderercontrol.h index e0966a027..3ef3d07d4 100644 --- a/src/plugins/avfoundation/camera/avfcamerarenderercontrol.h +++ b/src/plugins/avfoundation/camera/avfcamerarenderercontrol.h @@ -58,11 +58,11 @@ class AVFCameraRendererControl : public QVideoRendererControl { Q_OBJECT public: - AVFCameraRendererControl(QObject *parent = 0); + AVFCameraRendererControl(QObject *parent = nullptr); ~AVFCameraRendererControl(); - QAbstractVideoSurface *surface() const; - void setSurface(QAbstractVideoSurface *surface); + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; void configureAVCaptureSession(AVFCameraSession *cameraSession); void syncHandleViewfinderFrame(const QVideoFrame &frame); diff --git a/src/plugins/avfoundation/camera/avfcamerarenderercontrol.mm b/src/plugins/avfoundation/camera/avfcamerarenderercontrol.mm index e4f234b7e..0359f5d0a 100644 --- a/src/plugins/avfoundation/camera/avfcamerarenderercontrol.mm +++ b/src/plugins/avfoundation/camera/avfcamerarenderercontrol.mm @@ -65,7 +65,7 @@ public: : QAbstractPlanarVideoBuffer(renderer->supportsTextures() && CVPixelBufferGetPixelFormatType(buffer) == kCVPixelFormatType_32BGRA ? GLTextureHandle : NoHandle) - , m_texture(0) + , m_texture(nullptr) , m_renderer(renderer) #endif , m_buffer(buffer) @@ -117,8 +117,8 @@ public: } if (data) { - data[0] = (uchar *)CVPixelBufferGetBaseAddressOfPlane(m_buffer, 0); - data[1] = (uchar *)CVPixelBufferGetBaseAddressOfPlane(m_buffer, 1); + data[0] = static_cast<uchar*>(CVPixelBufferGetBaseAddressOfPlane(m_buffer, 0)); + data[1] = static_cast<uchar*>(CVPixelBufferGetBaseAddressOfPlane(m_buffer, 1)); } m_mode = mode; @@ -140,9 +140,9 @@ public: *bytesPerLine = CVPixelBufferGetBytesPerRow(m_buffer); m_mode = mode; - return (uchar*)CVPixelBufferGetBaseAddress(m_buffer); + return static_cast<uchar*>(CVPixelBufferGetBaseAddress(m_buffer)); } else { - return 0; + return nullptr; } } @@ -163,9 +163,9 @@ public: if (!m_renderer->m_textureCache) { CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, - NULL, + nullptr, [EAGLContext currentContext], - NULL, + nullptr, &m_renderer->m_textureCache); if (err != kCVReturnSuccess) @@ -178,7 +178,7 @@ public: CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, m_renderer->m_textureCache, m_buffer, - NULL, + nullptr, GL_TEXTURE_2D, GL_RGBA, CVPixelBufferGetWidth(m_buffer), @@ -211,10 +211,6 @@ private: @interface AVFCaptureFramesDelegate : NSObject <AVCaptureVideoDataOutputSampleBufferDelegate> -{ -@private - AVFCameraRendererControl *m_renderer; -} - (AVFCaptureFramesDelegate *) initWithRenderer:(AVFCameraRendererControl*)renderer; @@ -225,6 +221,10 @@ private: @end @implementation AVFCaptureFramesDelegate +{ +@private + AVFCameraRendererControl *m_renderer; +} - (AVFCaptureFramesDelegate *) initWithRenderer:(AVFCameraRendererControl*)renderer { @@ -266,11 +266,11 @@ private: AVFCameraRendererControl::AVFCameraRendererControl(QObject *parent) : QVideoRendererControl(parent) - , m_surface(0) + , m_surface(nullptr) , m_supportsTextures(false) , m_needsHorizontalMirroring(false) #ifdef Q_OS_IOS - , m_textureCache(0) + , m_textureCache(nullptr) #endif { m_viewfinderFramesDelegate = [[AVFCaptureFramesDelegate alloc] initWithRenderer:this]; @@ -317,7 +317,7 @@ void AVFCameraRendererControl::configureAVCaptureSession(AVFCameraSession *camer m_videoDataOutput = [[[AVCaptureVideoDataOutput alloc] init] autorelease]; // Configure video output - m_delegateQueue = dispatch_queue_create("vf_queue", NULL); + m_delegateQueue = dispatch_queue_create("vf_queue", nullptr); [m_videoDataOutput setSampleBufferDelegate:m_viewfinderFramesDelegate queue:m_delegateQueue]; diff --git a/src/plugins/avfoundation/camera/avfcameraservice.h b/src/plugins/avfoundation/camera/avfcameraservice.h index 9ce637ee3..2969882b0 100644 --- a/src/plugins/avfoundation/camera/avfcameraservice.h +++ b/src/plugins/avfoundation/camera/avfcameraservice.h @@ -75,7 +75,7 @@ class AVFCameraService : public QMediaService { Q_OBJECT public: - AVFCameraService(QObject *parent = 0); + AVFCameraService(QObject *parent = nullptr); ~AVFCameraService(); QMediaControl* requestControl(const char *name); diff --git a/src/plugins/avfoundation/camera/avfcameraservice.mm b/src/plugins/avfoundation/camera/avfcameraservice.mm index 71ea31e5b..33b4b72aa 100644 --- a/src/plugins/avfoundation/camera/avfcameraservice.mm +++ b/src/plugins/avfoundation/camera/avfcameraservice.mm @@ -74,7 +74,7 @@ QT_USE_NAMESPACE AVFCameraService::AVFCameraService(QObject *parent): QMediaService(parent), - m_videoOutput(0) + m_videoOutput(nullptr) { m_session = new AVFCameraSession(this); m_cameraControl = new AVFCameraControl(this); @@ -93,12 +93,12 @@ AVFCameraService::AVFCameraService(QObject *parent): #endif m_imageCaptureControl = new AVFImageCaptureControl(this); m_cameraFocusControl = new AVFCameraFocusControl(this); - m_cameraExposureControl = 0; + m_cameraExposureControl = nullptr; #ifdef Q_OS_IOS m_cameraExposureControl = new AVFCameraExposureControl(this); #endif - m_cameraZoomControl = 0; + m_cameraZoomControl = nullptr; #ifdef Q_OS_IOS m_cameraZoomControl = new AVFCameraZoomControl(this); #endif @@ -120,9 +120,9 @@ AVFCameraService::~AVFCameraService() #endif if (m_videoOutput) { - m_session->setVideoOutput(0); + m_session->setVideoOutput(nullptr); delete m_videoOutput; - m_videoOutput = 0; + m_videoOutput = nullptr; } //delete controls before session, @@ -199,7 +199,7 @@ QMediaControl *AVFCameraService::requestControl(const char *name) return m_mediaContainerControl; if (qstrcmp(name,QMediaVideoProbeControl_iid) == 0) { - AVFMediaVideoProbeControl *videoProbe = 0; + AVFMediaVideoProbeControl *videoProbe = nullptr; videoProbe = new AVFMediaVideoProbeControl(this); m_session->addProbe(videoProbe); return videoProbe; @@ -220,7 +220,7 @@ QMediaControl *AVFCameraService::requestControl(const char *name) } } - return 0; + return nullptr; } void AVFCameraService::releaseControl(QMediaControl *control) @@ -230,9 +230,9 @@ void AVFCameraService::releaseControl(QMediaControl *control) m_session->removeProbe(videoProbe); delete videoProbe; } else if (m_videoOutput == control) { - m_session->setVideoOutput(0); + m_session->setVideoOutput(nullptr); delete m_videoOutput; - m_videoOutput = 0; + m_videoOutput = nullptr; } } diff --git a/src/plugins/avfoundation/camera/avfcameraserviceplugin.h b/src/plugins/avfoundation/camera/avfcameraserviceplugin.h index aec9767a7..bd5f83249 100644 --- a/src/plugins/avfoundation/camera/avfcameraserviceplugin.h +++ b/src/plugins/avfoundation/camera/avfcameraserviceplugin.h @@ -60,15 +60,15 @@ class AVFServicePlugin : public QMediaServiceProviderPlugin, public: AVFServicePlugin(); - QMediaService* create(QString const& key); - void release(QMediaService *service); + QMediaService* create(QString const &key) override; + void release(QMediaService *service) override; - QByteArray defaultDevice(const QByteArray &service) const; - QList<QByteArray> devices(const QByteArray &service) const; - QString deviceDescription(const QByteArray &service, const QByteArray &device); + 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; - int cameraOrientation(const QByteArray &device) const; + 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/avfcameraserviceplugin.mm b/src/plugins/avfoundation/camera/avfcameraserviceplugin.mm index 434d28683..08bd8c9bd 100644 --- a/src/plugins/avfoundation/camera/avfcameraserviceplugin.mm +++ b/src/plugins/avfoundation/camera/avfcameraserviceplugin.mm @@ -59,7 +59,7 @@ QMediaService* AVFServicePlugin::create(QString const& key) else qWarning() << "unsupported key:" << key; - return 0; + return nullptr; } void AVFServicePlugin::release(QMediaService *service) diff --git a/src/plugins/avfoundation/camera/avfcamerasession.h b/src/plugins/avfoundation/camera/avfcamerasession.h index 3f90f1f7f..103ec0e17 100644 --- a/src/plugins/avfoundation/camera/avfcamerasession.h +++ b/src/plugins/avfoundation/camera/avfcamerasession.h @@ -70,7 +70,7 @@ class AVFCameraSession : public QObject { Q_OBJECT public: - AVFCameraSession(AVFCameraService *service, QObject *parent = 0); + AVFCameraSession(AVFCameraService *service, QObject *parent = nullptr); ~AVFCameraSession(); static int defaultCameraIndex(); diff --git a/src/plugins/avfoundation/camera/avfcamerasession.mm b/src/plugins/avfoundation/camera/avfcamerasession.mm index 8e3436d39..8ed627774 100644 --- a/src/plugins/avfoundation/camera/avfcamerasession.mm +++ b/src/plugins/avfoundation/camera/avfcamerasession.mm @@ -64,11 +64,6 @@ int AVFCameraSession::m_defaultCameraIndex; QList<AVFCameraInfo> AVFCameraSession::m_cameraDevices; @interface AVFCameraSessionObserver : NSObject -{ -@private - AVFCameraSession *m_session; - AVCaptureSession *m_captureSession; -} - (AVFCameraSessionObserver *) initWithCameraSession:(AVFCameraSession*)session; - (void) processRuntimeError:(NSNotification *)notification; @@ -78,6 +73,11 @@ QList<AVFCameraInfo> AVFCameraSession::m_cameraDevices; @end @implementation AVFCameraSessionObserver +{ +@private + AVFCameraSession *m_session; + AVCaptureSession *m_captureSession; +} - (AVFCameraSessionObserver *) initWithCameraSession:(AVFCameraSession*)session { @@ -262,7 +262,7 @@ AVCaptureDevice *AVFCameraSession::videoCaptureDevice() const if (m_videoInput) return m_videoInput.device; - return 0; + return nullptr; } QCamera::State AVFCameraSession::state() const @@ -362,7 +362,7 @@ void AVFCameraSession::attachVideoInputDevice() if (m_videoInput) { [m_captureSession removeInput:m_videoInput]; [m_videoInput release]; - m_videoInput = 0; + m_videoInput = nullptr; m_activeCameraInfo = AVFCameraInfo(); } diff --git a/src/plugins/avfoundation/camera/avfcamerautility.h b/src/plugins/avfoundation/camera/avfcamerautility.h index ba1bd3861..370302b1c 100644 --- a/src/plugins/avfoundation/camera/avfcamerautility.h +++ b/src/plugins/avfoundation/camera/avfcamerautility.h @@ -118,7 +118,7 @@ template<> class AVFScopedPointer<dispatch_queue_t> { public: - AVFScopedPointer() : m_queue(0) {} + AVFScopedPointer() : m_queue(nullptr) {} explicit AVFScopedPointer(dispatch_queue_t q) : m_queue(q) {} ~AVFScopedPointer() @@ -138,7 +138,7 @@ public: return m_queue; } - void reset(dispatch_queue_t q = 0) + void reset(dispatch_queue_t q = nullptr) { if (m_queue) dispatch_release(m_queue); @@ -148,7 +148,7 @@ public: private: dispatch_queue_t m_queue; - Q_DISABLE_COPY(AVFScopedPointer); + Q_DISABLE_COPY(AVFScopedPointer) }; typedef QPair<qreal, qreal> AVFPSRange; diff --git a/src/plugins/avfoundation/camera/avfcamerautility.mm b/src/plugins/avfoundation/camera/avfcamerautility.mm index 8a2254c2e..e68fc703b 100644 --- a/src/plugins/avfoundation/camera/avfcamerautility.mm +++ b/src/plugins/avfoundation/camera/avfcamerautility.mm @@ -240,7 +240,7 @@ AVCaptureDeviceFormat *qt_find_best_resolution_match(AVCaptureDevice *captureDev Q_ASSERT(!request.isNull() && request.isValid()); if (!captureDevice.formats || !captureDevice.formats.count) - return 0; + return nullptr; QVector<AVCaptureDeviceFormat *> formats(qt_unique_device_formats(captureDevice, filter)); @@ -254,7 +254,7 @@ AVCaptureDeviceFormat *qt_find_best_resolution_match(AVCaptureDevice *captureDev } if (!qt_area_sane(request)) - return 0; + return nullptr; typedef QPair<QSize, AVCaptureDeviceFormat *> FormatPair; @@ -272,7 +272,7 @@ AVCaptureDeviceFormat *qt_find_best_resolution_match(AVCaptureDevice *captureDev } if (!pairs.size()) - return 0; + return nullptr; AVCaptureDeviceFormat *best = pairs[0].second; QSize next(pairs[0].first); diff --git a/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm b/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm index 0054a8d01..a77d7de03 100644 --- a/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm +++ b/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm @@ -167,7 +167,7 @@ QCameraViewfinderSettings AVFCameraViewfinderSettingsControl2::viewfinderSetting settings.setMinimumFrameRate(fps.first); settings.setMaximumFrameRate(fps.second); - AVCaptureVideoDataOutput *videoOutput = m_service->videoOutput() ? m_service->videoOutput()->videoDataOutput() : 0; + AVCaptureVideoDataOutput *videoOutput = m_service->videoOutput() ? m_service->videoOutput()->videoDataOutput() : nullptr; if (videoOutput) { NSObject *obj = [videoOutput.videoSettings objectForKey:(id)kCVPixelBufferPixelFormatTypeKey]; if (obj && [obj isKindOfClass:[NSNumber class]]) { @@ -291,7 +291,7 @@ QVector<QVideoFrame::PixelFormat> AVFCameraViewfinderSettingsControl2::viewfinde { QVector<QVideoFrame::PixelFormat> qtFormats; - AVCaptureVideoDataOutput *videoOutput = m_service->videoOutput() ? m_service->videoOutput()->videoDataOutput() : 0; + AVCaptureVideoDataOutput *videoOutput = m_service->videoOutput() ? m_service->videoOutput()->videoDataOutput() : nullptr; if (!videoOutput) { qDebugCamera() << Q_FUNC_INFO << "no video output found"; return qtFormats; @@ -318,7 +318,7 @@ QVector<QVideoFrame::PixelFormat> AVFCameraViewfinderSettingsControl2::viewfinde bool AVFCameraViewfinderSettingsControl2::convertPixelFormatIfSupported(QVideoFrame::PixelFormat qtFormat, unsigned &avfFormat)const { - AVCaptureVideoDataOutput *videoOutput = m_service->videoOutput() ? m_service->videoOutput()->videoDataOutput() : 0; + AVCaptureVideoDataOutput *videoOutput = m_service->videoOutput() ? m_service->videoOutput()->videoDataOutput() : nullptr; if (!videoOutput) return false; @@ -372,7 +372,7 @@ bool AVFCameraViewfinderSettingsControl2::applySettings(const QCameraViewfinderS // We still can update the pixel format at least. } - AVCaptureVideoDataOutput *videoOutput = m_service->videoOutput() ? m_service->videoOutput()->videoDataOutput() : 0; + AVCaptureVideoDataOutput *videoOutput = m_service->videoOutput() ? m_service->videoOutput()->videoDataOutput() : nullptr; if (videoOutput) { unsigned avfPixelFormat = 0; if (!convertPixelFormatIfSupported(settings.pixelFormat(), avfPixelFormat)) { diff --git a/src/plugins/avfoundation/camera/avfimagecapturecontrol.h b/src/plugins/avfoundation/camera/avfimagecapturecontrol.h index 2cdf0e5f3..314e867e7 100644 --- a/src/plugins/avfoundation/camera/avfimagecapturecontrol.h +++ b/src/plugins/avfoundation/camera/avfimagecapturecontrol.h @@ -60,17 +60,17 @@ public: QSharedPointer<QSemaphore> previewReady; }; - AVFImageCaptureControl(AVFCameraService *service, QObject *parent = 0); + AVFImageCaptureControl(AVFCameraService *service, QObject *parent = nullptr); ~AVFImageCaptureControl(); - bool isReadyForCapture() const; + bool isReadyForCapture() const override; - QCameraImageCapture::DriveMode driveMode() const { return QCameraImageCapture::SingleImageCapture; } - void setDriveMode(QCameraImageCapture::DriveMode ) {} + QCameraImageCapture::DriveMode driveMode() const override { return QCameraImageCapture::SingleImageCapture; } + void setDriveMode(QCameraImageCapture::DriveMode ) override {} AVCaptureStillImageOutput *stillImageOutput() const {return m_stillImageOutput;} - int capture(const QString &fileName); - void cancelCapture(); + int capture(const QString &fileName) override; + void cancelCapture() override; private Q_SLOTS: void updateCaptureConnection(); diff --git a/src/plugins/avfoundation/camera/avfmediaassetwriter.h b/src/plugins/avfoundation/camera/avfmediaassetwriter.h index 624906c85..9d61d5089 100644 --- a/src/plugins/avfoundation/camera/avfmediaassetwriter.h +++ b/src/plugins/avfoundation/camera/avfmediaassetwriter.h @@ -59,37 +59,8 @@ QT_END_NAMESPACE @interface QT_MANGLE_NAMESPACE(AVFMediaAssetWriter) : NSObject<AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate> { -@private - AVFCameraService *m_service; - - QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVAssetWriterInput> m_cameraWriterInput; - QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVCaptureDeviceInput> m_audioInput; - QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVCaptureAudioDataOutput> m_audioOutput; - QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVAssetWriterInput> m_audioWriterInput; - AVCaptureDevice *m_audioCaptureDevice; - - // Queue to write sample buffers: - QT_PREPEND_NAMESPACE(AVFScopedPointer)<dispatch_queue_t> m_writerQueue; - // High priority serial queue for video output: - QT_PREPEND_NAMESPACE(AVFScopedPointer)<dispatch_queue_t> m_videoQueue; - // Serial queue for audio output: - QT_PREPEND_NAMESPACE(AVFScopedPointer)<dispatch_queue_t> m_audioQueue; - - QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVAssetWriter> m_assetWriter; - - QT_PREPEND_NAMESPACE(AVFMediaRecorderControlIOS) *m_delegate; - - bool m_setStartTime; - - QT_PREPEND_NAMESPACE(QAtomicInt) m_state; @public QT_PREPEND_NAMESPACE(AVFAtomicInt64) m_durationInMs; -@private - CMTime m_startTime; - CMTime m_lastTimeStamp; - - NSDictionary *m_audioSettings; - NSDictionary *m_videoSettings; } - (id)initWithDelegate:(QT_PREPEND_NAMESPACE(AVFMediaRecorderControlIOS) *)delegate; diff --git a/src/plugins/avfoundation/camera/avfmediaassetwriter.mm b/src/plugins/avfoundation/camera/avfmediaassetwriter.mm index 5a1257f6c..318d66117 100644 --- a/src/plugins/avfoundation/camera/avfmediaassetwriter.mm +++ b/src/plugins/avfoundation/camera/avfmediaassetwriter.mm @@ -89,6 +89,37 @@ enum WriterState @end @implementation QT_MANGLE_NAMESPACE(AVFMediaAssetWriter) +{ +@private + AVFCameraService *m_service; + + QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVAssetWriterInput> m_cameraWriterInput; + QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVCaptureDeviceInput> m_audioInput; + QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVCaptureAudioDataOutput> m_audioOutput; + QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVAssetWriterInput> m_audioWriterInput; + AVCaptureDevice *m_audioCaptureDevice; + + // Queue to write sample buffers: + QT_PREPEND_NAMESPACE(AVFScopedPointer)<dispatch_queue_t> m_writerQueue; + // High priority serial queue for video output: + QT_PREPEND_NAMESPACE(AVFScopedPointer)<dispatch_queue_t> m_videoQueue; + // Serial queue for audio output: + QT_PREPEND_NAMESPACE(AVFScopedPointer)<dispatch_queue_t> m_audioQueue; + + QT_PREPEND_NAMESPACE(AVFScopedPointer)<AVAssetWriter> m_assetWriter; + + QT_PREPEND_NAMESPACE(AVFMediaRecorderControlIOS) *m_delegate; + + bool m_setStartTime; + + QT_PREPEND_NAMESPACE(QAtomicInt) m_state; +@private + CMTime m_startTime; + CMTime m_lastTimeStamp; + + NSDictionary *m_audioSettings; + NSDictionary *m_videoSettings; +} - (id)initWithDelegate:(AVFMediaRecorderControlIOS *)delegate { diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol.h b/src/plugins/avfoundation/camera/avfmediarecordercontrol.h index a4894b3da..fbba5eca4 100644 --- a/src/plugins/avfoundation/camera/avfmediarecordercontrol.h +++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol.h @@ -60,27 +60,27 @@ class AVFMediaRecorderControl : public QMediaRecorderControl { Q_OBJECT public: - AVFMediaRecorderControl(AVFCameraService *service, QObject *parent = 0); + AVFMediaRecorderControl(AVFCameraService *service, QObject *parent = nullptr); ~AVFMediaRecorderControl(); - QUrl outputLocation() const; - bool setOutputLocation(const QUrl &location); + QUrl outputLocation() const override; + bool setOutputLocation(const QUrl &location) override; - QMediaRecorder::State state() const; - QMediaRecorder::Status status() const; + QMediaRecorder::State state() const override; + QMediaRecorder::Status status() const override; - qint64 duration() const; + qint64 duration() const override; - bool isMuted() const; - qreal volume() const; + bool isMuted() const override; + qreal volume() const override; - void applySettings(); + void applySettings() override; void unapplySettings(); public Q_SLOTS: - void setState(QMediaRecorder::State state); - void setMuted(bool muted); - void setVolume(qreal volume); + void setState(QMediaRecorder::State state) override; + void setMuted(bool muted) override; + void setVolume(qreal volume) override; void handleRecordingStarted(); void handleRecordingFinished(); diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm b/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm index 546eabf89..9a6057e6b 100644 --- a/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm +++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm @@ -394,7 +394,7 @@ void AVFMediaRecorderControl::setupSessionForCapture() qWarning() << "Failed to create audio device input"; } else if (![captureSession canAddInput:m_audioInput]) { qWarning() << "Could not connect the audio input"; - m_audioInput = 0; + m_audioInput = nullptr; } else { [m_audioInput retain]; [captureSession addInput:m_audioInput]; diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h index 8e049a595..9afb1068d 100644 --- a/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h +++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol_ios.h @@ -62,8 +62,8 @@ class AVFMediaRecorderControlIOS : public QMediaRecorderControl { Q_OBJECT public: - AVFMediaRecorderControlIOS(AVFCameraService *service, QObject *parent = 0); - ~AVFMediaRecorderControlIOS(); + AVFMediaRecorderControlIOS(AVFCameraService *service, QObject *parent = nullptr); + ~AVFMediaRecorderControlIOS() override; QUrl outputLocation() const override; bool setOutputLocation(const QUrl &location) override; diff --git a/src/plugins/avfoundation/camera/avfmediavideoprobecontrol.h b/src/plugins/avfoundation/camera/avfmediavideoprobecontrol.h index ce9ef4dbe..69a452a97 100644 --- a/src/plugins/avfoundation/camera/avfmediavideoprobecontrol.h +++ b/src/plugins/avfoundation/camera/avfmediavideoprobecontrol.h @@ -48,7 +48,7 @@ class AVFMediaVideoProbeControl : public QMediaVideoProbeControl { Q_OBJECT public: - explicit AVFMediaVideoProbeControl(QObject *parent = 0); + explicit AVFMediaVideoProbeControl(QObject *parent = nullptr); ~AVFMediaVideoProbeControl(); void newFrameProbed(const QVideoFrame& frame); diff --git a/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h b/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h index 9bdf5a788..7c9574f3d 100644 --- a/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h +++ b/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.h @@ -59,10 +59,10 @@ public: explicit AVFVideoEncoderSettingsControl(AVFCameraService *service); QList<QSize> supportedResolutions(const QVideoEncoderSettings &requestedVideoSettings, - bool *continuous = 0) const override; + bool *continuous = nullptr) const override; QList<qreal> supportedFrameRates(const QVideoEncoderSettings &requestedVideoSettings, - bool *continuous = 0) const override; + bool *continuous = nullptr) const override; QStringList supportedVideoCodecs() const override; QString videoCodecDescription(const QString &codecName) const override; diff --git a/src/plugins/avfoundation/mediaplayer/avfdisplaylink.h b/src/plugins/avfoundation/mediaplayer/avfdisplaylink.h index 45db7aef7..ba0803807 100644 --- a/src/plugins/avfoundation/mediaplayer/avfdisplaylink.h +++ b/src/plugins/avfoundation/mediaplayer/avfdisplaylink.h @@ -55,7 +55,7 @@ class AVFDisplayLink : public QObject { Q_OBJECT public: - explicit AVFDisplayLink(QObject *parent = 0); + explicit AVFDisplayLink(QObject *parent = nullptr); virtual ~AVFDisplayLink(); bool isValid() const; bool isActive() const; @@ -71,7 +71,7 @@ public: void displayLinkEvent(const CVTimeStamp *); protected: - virtual bool event(QEvent *); + virtual bool event(QEvent *) override; private: #if defined(Q_OS_IOS) || defined(Q_OS_TVOS) diff --git a/src/plugins/avfoundation/mediaplayer/avfdisplaylink.mm b/src/plugins/avfoundation/mediaplayer/avfdisplaylink.mm index 63747e486..bae18bc0a 100644 --- a/src/plugins/avfoundation/mediaplayer/avfdisplaylink.mm +++ b/src/plugins/avfoundation/mediaplayer/avfdisplaylink.mm @@ -55,10 +55,6 @@ QT_USE_NAMESPACE #if defined(Q_OS_IOS) || defined(Q_OS_TVOS) @interface DisplayLinkObserver : NSObject -{ - AVFDisplayLink *m_avfDisplayLink; - CADisplayLink *m_displayLink; -} - (void)start; - (void)stop; @@ -67,6 +63,10 @@ QT_USE_NAMESPACE @end @implementation DisplayLinkObserver +{ + AVFDisplayLink *m_avfDisplayLink; + CADisplayLink *m_displayLink; +} - (id)initWithAVFDisplayLink:(AVFDisplayLink *)link { @@ -84,7 +84,7 @@ QT_USE_NAMESPACE { if (m_displayLink) { [m_displayLink release]; - m_displayLink = NULL; + m_displayLink = nullptr; } [super dealloc]; @@ -129,7 +129,7 @@ static CVReturn CVDisplayLinkCallback(CVDisplayLinkRef displayLink, AVFDisplayLink::AVFDisplayLink(QObject *parent) : QObject(parent) - , m_displayLink(0) + , m_displayLink(nullptr) , m_pendingDisplayLinkEvent(false) , m_isActive(false) { @@ -161,13 +161,13 @@ AVFDisplayLink::~AVFDisplayLink() #else CVDisplayLinkRelease(m_displayLink); #endif - m_displayLink = NULL; + m_displayLink = nullptr; } } bool AVFDisplayLink::isValid() const { - return m_displayLink != 0; + return m_displayLink != nullptr; } bool AVFDisplayLink::isActive() const diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.h index a65ee8529..ac0ba0ab2 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.h +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.h @@ -51,44 +51,44 @@ class AVFMediaPlayerControl : public QMediaPlayerControl { Q_OBJECT public: - explicit AVFMediaPlayerControl(QObject *parent = 0); + explicit AVFMediaPlayerControl(QObject *parent = nullptr); ~AVFMediaPlayerControl(); void setSession(AVFMediaPlayerSession *session); - QMediaPlayer::State state() const; - QMediaPlayer::MediaStatus mediaStatus() const; + QMediaPlayer::State state() const override; + QMediaPlayer::MediaStatus mediaStatus() const override; - QMediaContent media() const; - const QIODevice *mediaStream() const; - void setMedia(const QMediaContent &content, QIODevice *stream); + QMediaContent media() const override; + const QIODevice *mediaStream() const override; + void setMedia(const QMediaContent &content, QIODevice *stream) override; - qint64 position() const; - qint64 duration() const; + qint64 position() const override; + qint64 duration() const override; - int bufferStatus() const; + int bufferStatus() const override; - int volume() const; - bool isMuted() const; + int volume() const override; + bool isMuted() const override; - bool isAudioAvailable() const; - bool isVideoAvailable() const; + bool isAudioAvailable() const override; + bool isVideoAvailable() const override; - bool isSeekable() const; - QMediaTimeRange availablePlaybackRanges() const; + bool isSeekable() const override; + QMediaTimeRange availablePlaybackRanges() const override; - qreal playbackRate() const; - void setPlaybackRate(qreal rate); + qreal playbackRate() const override; + void setPlaybackRate(qreal rate) override; public Q_SLOTS: - void setPosition(qint64 pos); + void setPosition(qint64 pos) override; - void play(); - void pause(); - void stop(); + void play() override; + void pause() override; + void stop() override; - void setVolume(int volume); - void setMuted(bool muted); + void setVolume(int volume) override; + void setMuted(bool muted) override; private: AVFMediaPlayerSession *m_session; diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayermetadatacontrol.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayermetadatacontrol.h index 396550047..ae99c7eda 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayermetadatacontrol.h +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayermetadatacontrol.h @@ -50,14 +50,14 @@ class AVFMediaPlayerMetaDataControl : public QMetaDataReaderControl { Q_OBJECT public: - explicit AVFMediaPlayerMetaDataControl(AVFMediaPlayerSession *session, QObject *parent = 0); + explicit AVFMediaPlayerMetaDataControl(AVFMediaPlayerSession *session, QObject *parent = nullptr); virtual ~AVFMediaPlayerMetaDataControl(); - bool isMetaDataAvailable() const; + bool isMetaDataAvailable() const override; bool isWritable() const; - QVariant metaData(const QString &key) const; - QStringList availableMetaData() const; + QVariant metaData(const QString &key) const override; + QStringList availableMetaData() const override; private Q_SLOTS: void updateTags(); diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayermetadatacontrol.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayermetadatacontrol.mm index 39783680b..b9ec38c0f 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayermetadatacontrol.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayermetadatacontrol.mm @@ -49,7 +49,7 @@ QT_USE_NAMESPACE AVFMediaPlayerMetaDataControl::AVFMediaPlayerMetaDataControl(AVFMediaPlayerSession *session, QObject *parent) : QMetaDataReaderControl(parent) , m_session(session) - , m_asset(0) + , m_asset(nullptr) { QObject::connect(m_session, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(updateTags())); } @@ -121,7 +121,7 @@ void AVFMediaPlayerMetaDataControl::updateTags() #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif - AVAsset *currentAsset = (AVAsset*)m_session->currentAssetHandle(); + AVAsset *currentAsset = static_cast<AVAsset*>(m_session->currentAssetHandle()); //Don't read the tags from the same asset more than once if (currentAsset == m_asset) diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayerservice.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayerservice.h index 4460a4867..6a4b915cf 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayerservice.h +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayerservice.h @@ -52,11 +52,11 @@ class AVFVideoOutput; class AVFMediaPlayerService : public QMediaService { public: - explicit AVFMediaPlayerService(QObject *parent = 0); + explicit AVFMediaPlayerService(QObject *parent = nullptr); ~AVFMediaPlayerService(); - QMediaControl* requestControl(const char *name); - void releaseControl(QMediaControl *control); + QMediaControl* requestControl(const char *name) override; + void releaseControl(QMediaControl *control) override; private: AVFMediaPlayerSession *m_session; diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayerservice.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayerservice.mm index 91def6b3b..bc59fa921 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayerservice.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayerservice.mm @@ -56,7 +56,7 @@ QT_USE_NAMESPACE AVFMediaPlayerService::AVFMediaPlayerService(QObject *parent) : QMediaService(parent) - , m_videoOutput(0) + , m_videoOutput(nullptr) { m_session = new AVFMediaPlayerSession(this); m_control = new AVFMediaPlayerControl(this); @@ -111,7 +111,7 @@ QMediaControl *AVFMediaPlayerService::requestControl(const char *name) m_session->setVideoOutput(qobject_cast<AVFVideoOutput*>(m_videoOutput)); return m_videoOutput; } - return 0; + return nullptr; } void AVFMediaPlayerService::releaseControl(QMediaControl *control) @@ -124,10 +124,10 @@ void AVFMediaPlayerService::releaseControl(QMediaControl *control) AVFVideoRendererControl *renderControl = qobject_cast<AVFVideoRendererControl*>(m_videoOutput); if (renderControl) - renderControl->setSurface(0); + renderControl->setSurface(nullptr); #endif - m_videoOutput = 0; - m_session->setVideoOutput(0); + m_videoOutput = nullptr; + m_session->setVideoOutput(nullptr); delete control; } diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayerserviceplugin.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayerserviceplugin.h index eae9b9a05..e08f0f46e 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayerserviceplugin.h +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayerserviceplugin.h @@ -59,12 +59,12 @@ class AVFMediaPlayerServicePlugin public: explicit AVFMediaPlayerServicePlugin(); - QMediaService* create(QString const& key); - void release(QMediaService *service); + QMediaService* create(QString const& key) override; + void release(QMediaService *service) override; - QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const; - QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs) const; - QStringList supportedMimeTypes() const; + QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const override; + QMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs) const override; + QStringList supportedMimeTypes() const override; private: void buildSupportedTypes(); diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayerserviceplugin.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayerserviceplugin.mm index dcdd9efed..59b29a3d2 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayerserviceplugin.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayerserviceplugin.mm @@ -60,7 +60,7 @@ QMediaService *AVFMediaPlayerServicePlugin::create(const QString &key) return new AVFMediaPlayerService; qWarning() << "unsupported key: " << key; - return 0; + return nullptr; } void AVFMediaPlayerServicePlugin::release(QMediaService *service) diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h index e20f4a1ec..f6e0ef3bf 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h @@ -57,7 +57,7 @@ class AVFMediaPlayerSession : public QObject { Q_OBJECT public: - AVFMediaPlayerSession(AVFMediaPlayerService *service, QObject *parent = 0); + AVFMediaPlayerSession(AVFMediaPlayerService *service, QObject *parent = nullptr); virtual ~AVFMediaPlayerSession(); void setVideoOutput(AVFVideoOutput *output); @@ -127,7 +127,7 @@ Q_SIGNALS: private: class ResourceHandler { public: - ResourceHandler():resource(0) {} + ResourceHandler() : resource(nullptr) {} ~ResourceHandler() { clear(); } void setResourceFile(const QString &file) { if (resource) { @@ -138,10 +138,10 @@ private: } resource = new QResource(file); } - bool isValid() const { return resource && resource->isValid() && resource->data() != 0; } + bool isValid() const { return resource && resource->isValid() && resource->data() != nullptr; } const uchar *data() { if (!isValid()) - return 0; + return nullptr; if (resource->isCompressed()) { if (rawData.size() == 0) rawData = qUncompress(resource->data(), resource->size()); @@ -150,7 +150,7 @@ private: return resource->data(); } qint64 size() { - if (data() == 0) + if (data() == nullptr) return 0; return resource->isCompressed() ? rawData.size() : resource->size(); } diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm index 06fb71ef8..2309221c2 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm @@ -67,15 +67,6 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext = &AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext; @interface AVFMediaPlayerSessionObserver : NSObject -{ -@private - AVFMediaPlayerSession *m_session; - AVPlayer *m_player; - AVPlayerItem *m_playerItem; - AVPlayerLayer *m_playerLayer; - NSURL *m_URL; - BOOL m_bufferIsLikelyToKeepUp; -} @property (readonly, getter=player) AVPlayer* m_player; @property (readonly, getter=playerItem) AVPlayerItem* m_playerItem; @@ -96,6 +87,15 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext @end @implementation AVFMediaPlayerSessionObserver +{ +@private + AVFMediaPlayerSession *m_session; + AVPlayer *m_player; + AVPlayerItem *m_playerItem; + AVPlayerLayer *m_playerLayer; + NSURL *m_URL; + BOOL m_bufferIsLikelyToKeepUp; +} @synthesize m_player, m_playerItem, m_playerLayer, m_session; @@ -339,7 +339,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext case AVPlayerStatusFailed: { - AVPlayerItem *playerItem = (AVPlayerItem *)object; + AVPlayerItem *playerItem = static_cast<AVPlayerItem*>(object); [self assetFailedToPrepareForPlayback:playerItem.error]; if (self.session) @@ -411,10 +411,10 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext AVFMediaPlayerSession::AVFMediaPlayerSession(AVFMediaPlayerService *service, QObject *parent) : QObject(parent) , m_service(service) - , m_videoOutput(0) + , m_videoOutput(nullptr) , m_state(QMediaPlayer::StoppedState) , m_mediaStatus(QMediaPlayer::NoMedia) - , m_mediaStream(0) + , m_mediaStream(nullptr) , m_muted(false) , m_tryingAsync(false) , m_volume(100) @@ -435,8 +435,8 @@ AVFMediaPlayerSession::~AVFMediaPlayerSession() qDebug() << Q_FUNC_INFO; #endif //Detatch the session from the sessionObserver (which could still be alive trying to communicate with this session). - [(AVFMediaPlayerSessionObserver*)m_observer detatchSession]; - [(AVFMediaPlayerSessionObserver*)m_observer release]; + [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) detatchSession]; + [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) release]; } void AVFMediaPlayerSession::setVideoOutput(AVFVideoOutput *output) @@ -450,13 +450,13 @@ void AVFMediaPlayerSession::setVideoOutput(AVFVideoOutput *output) //Set the current output layer to null to stop rendering if (m_videoOutput) { - m_videoOutput->setLayer(0); + m_videoOutput->setLayer(nullptr); } m_videoOutput = output; if (m_videoOutput && m_state != QMediaPlayer::StoppedState) - m_videoOutput->setLayer([(AVFMediaPlayerSessionObserver*)m_observer playerLayer]); + m_videoOutput->setLayer([static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerLayer]); } void *AVFMediaPlayerSession::currentAssetHandle() @@ -464,7 +464,7 @@ void *AVFMediaPlayerSession::currentAssetHandle() #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif - AVAsset *currentAsset = [[(AVFMediaPlayerSessionObserver*)m_observer playerItem] asset]; + AVAsset *currentAsset = [[static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerItem] asset]; return currentAsset; } @@ -494,7 +494,7 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st qDebug() << Q_FUNC_INFO << content.canonicalUrl(); #endif - [(AVFMediaPlayerSessionObserver*)m_observer unloadMedia]; + [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) unloadMedia]; m_resources = content; m_mediaStream = stream; @@ -528,7 +528,7 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st //initialize asset using content's URL NSString *urlString = [NSString stringWithUTF8String:content.canonicalUrl().toEncoded().constData()]; NSURL *url = [NSURL URLWithString:urlString]; - [(AVFMediaPlayerSessionObserver*)m_observer setURL:url]; + [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) setURL:url]; m_state = QMediaPlayer::StoppedState; if (m_state != oldState) @@ -537,7 +537,7 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st qint64 AVFMediaPlayerSession::position() const { - AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; + AVPlayerItem *playerItem = [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerItem]; if (!playerItem) return m_requestedPosition != -1 ? m_requestedPosition : 0; @@ -616,7 +616,7 @@ void AVFMediaPlayerSession::setSeekable(bool seekable) QMediaTimeRange AVFMediaPlayerSession::availablePlaybackRanges() const { - AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; + AVPlayerItem *playerItem = [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerItem]; if (playerItem) { QMediaTimeRange timeRanges; @@ -649,7 +649,7 @@ void AVFMediaPlayerSession::setPlaybackRate(qreal rate) m_rate = rate; - AVPlayer *player = [(AVFMediaPlayerSessionObserver*)m_observer player]; + AVPlayer *player = [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player]; if (player && m_state == QMediaPlayer::PlayingState) [player setRate:m_rate]; @@ -665,7 +665,7 @@ void AVFMediaPlayerSession::setPosition(qint64 pos) if (pos == position()) return; - AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; + AVPlayerItem *playerItem = [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerItem]; if (!playerItem) { m_requestedPosition = pos; Q_EMIT positionChanged(m_requestedPosition); @@ -711,7 +711,7 @@ void AVFMediaPlayerSession::play() return; if (m_videoOutput) { - m_videoOutput->setLayer([(AVFMediaPlayerSessionObserver*)m_observer playerLayer]); + m_videoOutput->setLayer([static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerLayer]); } // Reset media status if the current status is EndOfMedia @@ -720,7 +720,7 @@ void AVFMediaPlayerSession::play() if (m_mediaStatus == QMediaPlayer::LoadedMedia || m_mediaStatus == QMediaPlayer::BufferedMedia) { // Setting the rate starts playback - [[(AVFMediaPlayerSessionObserver*)m_observer player] setRate:m_rate]; + [[static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player] setRate:m_rate]; } m_state = QMediaPlayer::PlayingState; @@ -744,10 +744,10 @@ void AVFMediaPlayerSession::pause() m_state = QMediaPlayer::PausedState; if (m_videoOutput) { - m_videoOutput->setLayer([(AVFMediaPlayerSessionObserver*)m_observer playerLayer]); + m_videoOutput->setLayer([static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerLayer]); } - [[(AVFMediaPlayerSessionObserver*)m_observer player] pause]; + [[static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player] pause]; // Reset media status if the current status is EndOfMedia if (m_mediaStatus == QMediaPlayer::EndOfMedia) @@ -767,11 +767,11 @@ void AVFMediaPlayerSession::stop() return; // AVPlayer doesn't have stop(), only pause() and play(). - [[(AVFMediaPlayerSessionObserver*)m_observer player] pause]; + [[static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player] pause]; setPosition(0); if (m_videoOutput) { - m_videoOutput->setLayer(0); + m_videoOutput->setLayer(nullptr); } if (m_mediaStatus == QMediaPlayer::BufferedMedia) @@ -792,7 +792,7 @@ void AVFMediaPlayerSession::setVolume(int volume) m_volume = volume; - AVPlayer *player = [(AVFMediaPlayerSessionObserver*)m_observer player]; + AVPlayer *player = [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player]; if (player) [player setVolume:volume / 100.0f]; @@ -810,7 +810,7 @@ void AVFMediaPlayerSession::setMuted(bool muted) m_muted = muted; - AVPlayer *player = [(AVFMediaPlayerSessionObserver*)m_observer player]; + AVPlayer *player = [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player]; if (player) [player setMuted:muted]; @@ -832,14 +832,14 @@ void AVFMediaPlayerSession::processEOS() // At this point, frames should not be rendered anymore. // Clear the output layer to make sure of that. if (m_videoOutput) - m_videoOutput->setLayer(0); + m_videoOutput->setLayer(nullptr); Q_EMIT stateChanged(m_state); } void AVFMediaPlayerSession::processLoadStateChange(QMediaPlayer::State newState) { - AVPlayerStatus currentStatus = [[(AVFMediaPlayerSessionObserver*)m_observer player] status]; + AVPlayerStatus currentStatus = [[static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player] status]; #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO << currentStatus << ", " << m_mediaStatus << ", " << newState; @@ -852,7 +852,7 @@ void AVFMediaPlayerSession::processLoadStateChange(QMediaPlayer::State newState) QMediaPlayer::MediaStatus newStatus = m_mediaStatus; - AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; + AVPlayerItem *playerItem = [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerItem]; if (playerItem) { // Check each track for audio and video content @@ -874,7 +874,7 @@ void AVFMediaPlayerSession::processLoadStateChange(QMediaPlayer::State newState) setSeekable([[playerItem seekableTimeRanges] count] > 0); // Get the native size of the video, and reset the bounds of the player layer - AVPlayerLayer *playerLayer = [(AVFMediaPlayerSessionObserver*)m_observer playerLayer]; + AVPlayerLayer *playerLayer = [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerLayer]; if (videoTrack && playerLayer) { playerLayer.bounds = CGRectMake(0.0f, 0.0f, videoTrack.naturalSize.width, @@ -899,9 +899,9 @@ void AVFMediaPlayerSession::processLoadStateChange(QMediaPlayer::State newState) } - if (newState == QMediaPlayer::PlayingState && [(AVFMediaPlayerSessionObserver*)m_observer player]) { + if (newState == QMediaPlayer::PlayingState && [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player]) { // Setting the rate is enough to start playback, no need to call play() - [[(AVFMediaPlayerSessionObserver*)m_observer player] setRate:m_rate]; + [[static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player] setRate:m_rate]; } } diff --git a/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer.h b/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer.h index 054bce166..99b6bb0b5 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer.h +++ b/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer.h @@ -58,7 +58,7 @@ class QAbstractVideoSurface; class AVFVideoFrameRenderer : public QObject { public: - AVFVideoFrameRenderer(QAbstractVideoSurface *surface, QObject *parent = 0); + AVFVideoFrameRenderer(QAbstractVideoSurface *surface, QObject *parent = nullptr); virtual ~AVFVideoFrameRenderer(); diff --git a/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer.mm b/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer.mm index 0759702e8..b2c6638cc 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer.mm +++ b/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer.mm @@ -54,15 +54,15 @@ QT_USE_NAMESPACE AVFVideoFrameRenderer::AVFVideoFrameRenderer(QAbstractVideoSurface *surface, QObject *parent) : QObject(parent) - , m_videoLayerRenderer(0) + , m_videoLayerRenderer(nullptr) , m_surface(surface) - , m_offscreenSurface(0) - , m_glContext(0) + , m_offscreenSurface(nullptr) + , m_glContext(nullptr) , m_currentBuffer(1) , m_isContextShared(true) { - m_fbo[0] = 0; - m_fbo[1] = 0; + m_fbo[0] = nullptr; + m_fbo[1] = nullptr; } AVFVideoFrameRenderer::~AVFVideoFrameRenderer() @@ -155,7 +155,7 @@ QOpenGLFramebufferObject *AVFVideoFrameRenderer::initRenderer(AVPlayerLayer *lay } if (!m_glContext->create()) { qWarning("failed to create QOpenGLContext"); - return 0; + return nullptr; } } diff --git a/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer_ios.h b/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer_ios.h index 3def186ef..d9f6baa7e 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer_ios.h +++ b/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer_ios.h @@ -86,7 +86,7 @@ typedef CVOpenGLTextureRef CVOGLTextureRef; class AVFVideoFrameRenderer : public QObject { public: - AVFVideoFrameRenderer(QAbstractVideoSurface *surface, QObject *parent = 0); + AVFVideoFrameRenderer(QAbstractVideoSurface *surface, QObject *parent = nullptr); virtual ~AVFVideoFrameRenderer(); diff --git a/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer_ios.mm b/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer_ios.mm index f84718c55..70e402e6c 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer_ios.mm +++ b/src/plugins/avfoundation/mediaplayer/avfvideoframerenderer_ios.mm @@ -54,11 +54,11 @@ QT_USE_NAMESPACE AVFVideoFrameRenderer::AVFVideoFrameRenderer(QAbstractVideoSurface *surface, QObject *parent) : QObject(parent) - , m_glContext(0) - , m_offscreenSurface(0) + , m_glContext(nullptr) + , m_offscreenSurface(nullptr) , m_surface(surface) - , m_textureCache(0) - , m_videoOutput(0) + , m_textureCache(nullptr) + , m_videoOutput(nullptr) , m_isContextShared(true) { } @@ -81,7 +81,7 @@ void AVFVideoFrameRenderer::setPlayerLayer(AVPlayerLayer *layer) Q_UNUSED(layer) if (m_videoOutput) { [m_videoOutput release]; - m_videoOutput = 0; + m_videoOutput = nullptr; // will be re-created in first call to copyPixelBufferFromLayer } } @@ -92,7 +92,7 @@ CVOGLTextureRef AVFVideoFrameRenderer::renderLayerToTexture(AVPlayerLayer *layer // If the glContext isn't shared, it doesn't make sense to return a texture for us if (!m_isContextShared) - return 0; + return nullptr; size_t dummyWidth = 0, dummyHeight = 0; return createCacheTextureFromLayer(layer, dummyWidth, dummyHeight); @@ -111,7 +111,7 @@ CVPixelBufferRef AVFVideoFrameRenderer::copyPixelBufferFromLayer(AVPlayerLayer * #ifdef QT_DEBUG_AVF qWarning("copyPixelBufferFromLayer: invalid layer"); #endif - return 0; + return nullptr; } if (!m_videoOutput) { @@ -125,7 +125,7 @@ CVPixelBufferRef AVFVideoFrameRenderer::copyPixelBufferFromLayer(AVPlayerLayer * CMTime currentCMFrameTime = [m_videoOutput itemTimeForHostTime:currentCAFrameTime]; // happens when buffering / loading if (CMTimeCompare(currentCMFrameTime, kCMTimeZero) < 0) { - return 0; + return nullptr; } CVPixelBufferRef pixelBuffer = [m_videoOutput copyPixelBufferForItemTime:currentCMFrameTime @@ -135,7 +135,7 @@ CVPixelBufferRef AVFVideoFrameRenderer::copyPixelBufferFromLayer(AVPlayerLayer * qWarning("copyPixelBufferForItemTime returned nil"); CMTimeShow(currentCMFrameTime); #endif - return 0; + return nullptr; } width = CVPixelBufferGetWidth(pixelBuffer); @@ -149,12 +149,12 @@ CVOGLTextureRef AVFVideoFrameRenderer::createCacheTextureFromLayer(AVPlayerLayer CVPixelBufferRef pixelBuffer = copyPixelBufferFromLayer(layer, width, height); if (!pixelBuffer) - return 0; + return nullptr; CVOGLTextureCacheFlush(m_textureCache, 0); - CVOGLTextureRef texture = 0; - CVReturn err = CVOGLTextureCacheCreateTextureFromImage(kCFAllocatorDefault, m_textureCache, pixelBuffer, NULL, + CVOGLTextureRef texture = nullptr; + CVReturn err = CVOGLTextureCacheCreateTextureFromImage(kCFAllocatorDefault, m_textureCache, pixelBuffer, nullptr, GL_TEXTURE_2D, GL_RGBA, (GLsizei) width, (GLsizei) height, GL_BGRA, GL_UNSIGNED_BYTE, 0, @@ -214,7 +214,7 @@ void AVFVideoFrameRenderer::initRenderer() //Make sure we have an OpenGL context to make current if (!m_glContext) { //Create OpenGL context and set share context from surface - QOpenGLContext *shareContext = 0; + QOpenGLContext *shareContext = nullptr; if (m_surface) { shareContext = qobject_cast<QOpenGLContext*>(m_surface->property("GLContext").value<QObject*>()); } @@ -248,9 +248,9 @@ void AVFVideoFrameRenderer::initRenderer() if (!m_textureCache) { // Create a new open gl texture cache - CVReturn err = CVOGLTextureCacheCreate(kCFAllocatorDefault, NULL, + CVReturn err = CVOGLTextureCacheCreate(kCFAllocatorDefault, nullptr, [EAGLContext currentContext], - NULL, &m_textureCache); + nullptr, &m_textureCache); if (err) { #ifdef QT_DEBUG_AVF qWarning("Error at CVOGLTextureCacheCreate %d", err); diff --git a/src/plugins/avfoundation/mediaplayer/avfvideorenderercontrol.h b/src/plugins/avfoundation/mediaplayer/avfvideorenderercontrol.h index 26032f0be..85dc19d31 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideorenderercontrol.h +++ b/src/plugins/avfoundation/mediaplayer/avfvideorenderercontrol.h @@ -58,13 +58,13 @@ class AVFVideoRendererControl : public QVideoRendererControl, public AVFVideoOut Q_OBJECT Q_INTERFACES(AVFVideoOutput) public: - explicit AVFVideoRendererControl(QObject *parent = 0); + explicit AVFVideoRendererControl(QObject *parent = nullptr); virtual ~AVFVideoRendererControl(); - QAbstractVideoSurface *surface() const; - void setSurface(QAbstractVideoSurface *surface); + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; - void setLayer(void *playerLayer); + void setLayer(void *playerLayer) override; private Q_SLOTS: void updateVideoFrame(const CVTimeStamp &ts); diff --git a/src/plugins/avfoundation/mediaplayer/avfvideorenderercontrol.mm b/src/plugins/avfoundation/mediaplayer/avfvideorenderercontrol.mm index e40b7eb17..e06ddc4b0 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideorenderercontrol.mm +++ b/src/plugins/avfoundation/mediaplayer/avfvideorenderercontrol.mm @@ -75,7 +75,7 @@ public: } MapMode mapMode() const { return NotMapped; } - uchar *map(MapMode, int*, int*) { return 0; } + uchar *map(MapMode, int*, int*) { return nullptr; } void unmap() {} QVariant handle() const @@ -116,9 +116,9 @@ private: AVFVideoRendererControl::AVFVideoRendererControl(QObject *parent) : QVideoRendererControl(parent) - , m_surface(0) - , m_playerLayer(0) - , m_frameRenderer(0) + , m_surface(nullptr) + , m_playerLayer(nullptr) + , m_frameRenderer(nullptr) , m_enableOpenGL(false) { @@ -132,7 +132,7 @@ AVFVideoRendererControl::~AVFVideoRendererControl() qDebug() << Q_FUNC_INFO; #endif m_displayLink->stop(); - [(AVPlayerLayer*)m_playerLayer release]; + [static_cast<AVPlayerLayer*>(m_playerLayer) release]; } QAbstractVideoSurface *AVFVideoRendererControl::surface() const @@ -160,10 +160,10 @@ void AVFVideoRendererControl::setSurface(QAbstractVideoSurface *surface) //If the surface changed, then the current frame renderer is no longer valid delete m_frameRenderer; - m_frameRenderer = 0; + m_frameRenderer = nullptr; //If there is now no surface to render too - if (m_surface == 0) { + if (m_surface == nullptr) { m_displayLink->stop(); return; } @@ -191,10 +191,9 @@ void AVFVideoRendererControl::setLayer(void *playerLayer) if (m_playerLayer == playerLayer) return; - [(AVPlayerLayer*)playerLayer retain]; - [(AVPlayerLayer*)m_playerLayer release]; + [static_cast<AVPlayerLayer*>(m_playerLayer) release]; - m_playerLayer = playerLayer; + m_playerLayer = [static_cast<AVPlayerLayer*>(playerLayer) retain]; //If there is an active surface, make sure it has been stopped so that //we can update it's state with the new content. @@ -208,7 +207,7 @@ void AVFVideoRendererControl::setLayer(void *playerLayer) #endif //If there is no layer to render, stop scheduling updates - if (m_playerLayer == 0) { + if (m_playerLayer == nullptr) { m_displayLink->stop(); return; } @@ -225,7 +224,7 @@ void AVFVideoRendererControl::updateVideoFrame(const CVTimeStamp &ts) { Q_UNUSED(ts) - AVPlayerLayer *playerLayer = (AVPlayerLayer*)m_playerLayer; + AVPlayerLayer *playerLayer = static_cast<AVPlayerLayer*>(m_playerLayer); if (!playerLayer) { qWarning("updateVideoFrame called without AVPlayerLayer (which shouldn't happen"); @@ -240,7 +239,7 @@ void AVFVideoRendererControl::updateVideoFrame(const CVTimeStamp &ts) CVOGLTextureRef tex = m_frameRenderer->renderLayerToTexture(playerLayer); //Make sure we got a valid texture - if (tex == 0) + if (tex == nullptr) return; QAbstractVideoBuffer *buffer = new TextureCacheVideoBuffer(tex); @@ -305,7 +304,7 @@ void AVFVideoRendererControl::updateVideoFrame(const CVTimeStamp &ts) void AVFVideoRendererControl::setupVideoOutput() { - AVPlayerLayer *playerLayer = (AVPlayerLayer*)m_playerLayer; + AVPlayerLayer *playerLayer = static_cast<AVPlayerLayer*>(m_playerLayer); if (playerLayer) m_nativeSize = QSize(playerLayer.bounds.size.width, playerLayer.bounds.size.height); } diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowidget.h b/src/plugins/avfoundation/mediaplayer/avfvideowidget.h index be6f16e64..faf71f1a4 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideowidget.h +++ b/src/plugins/avfoundation/mediaplayer/avfvideowidget.h @@ -57,14 +57,14 @@ public: AVFVideoWidget(QWidget *parent); virtual ~AVFVideoWidget(); - QSize sizeHint() const; + QSize sizeHint() const override; Qt::AspectRatioMode aspectRatioMode() const; void setAspectRatioMode(Qt::AspectRatioMode mode); void setPlayerLayer(AVPlayerLayer *layer); protected: - void resizeEvent(QResizeEvent *); - void paintEvent(QPaintEvent *); + void resizeEvent(QResizeEvent *) override; + void paintEvent(QPaintEvent *) override; private: void updateAspectRatio(); diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm b/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm index 7eb5a71cf..be349710c 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm +++ b/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm @@ -56,8 +56,8 @@ QT_USE_NAMESPACE AVFVideoWidget::AVFVideoWidget(QWidget *parent) : QWidget(parent) , m_aspectRatioMode(Qt::KeepAspectRatio) - , m_playerLayer(0) - , m_nativeView(0) + , m_playerLayer(nullptr) + , m_nativeView(nullptr) { setAutoFillBackground(false); } diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.h b/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.h index f442d666a..22379d273 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.h +++ b/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.h @@ -54,30 +54,30 @@ class AVFVideoWidgetControl : public QVideoWidgetControl, public AVFVideoOutput Q_OBJECT Q_INTERFACES(AVFVideoOutput) public: - AVFVideoWidgetControl(QObject *parent = 0); + AVFVideoWidgetControl(QObject *parent = nullptr); virtual ~AVFVideoWidgetControl(); - void setLayer(void *playerLayer); + void setLayer(void *playerLayer) override; - QWidget *videoWidget(); + QWidget *videoWidget() override; - bool isFullScreen() const; - void setFullScreen(bool fullScreen); + bool isFullScreen() const override; + void setFullScreen(bool fullScreen) override; - Qt::AspectRatioMode aspectRatioMode() const; - void setAspectRatioMode(Qt::AspectRatioMode mode); + Qt::AspectRatioMode aspectRatioMode() const override; + void setAspectRatioMode(Qt::AspectRatioMode mode) override; - int brightness() const; - void setBrightness(int brightness); + int brightness() const override; + void setBrightness(int brightness) override; - int contrast() const; - void setContrast(int contrast); + int contrast() const override; + void setContrast(int contrast) override; - int hue() const; - void setHue(int hue); + int hue() const override; + void setHue(int hue) override; - int saturation() const; - void setSaturation(int saturation); + int saturation() const override; + void setSaturation(int saturation) override; private: AVFVideoWidget *m_videoWidget; diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.mm b/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.mm index 287dd3add..91ece817e 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.mm +++ b/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.mm @@ -56,7 +56,7 @@ AVFVideoWidgetControl::AVFVideoWidgetControl(QObject *parent) , m_hue(0) , m_saturation(0) { - m_videoWidget = new AVFVideoWidget(0); + m_videoWidget = new AVFVideoWidget(nullptr); } AVFVideoWidgetControl::~AVFVideoWidgetControl() @@ -73,7 +73,7 @@ void AVFVideoWidgetControl::setLayer(void *playerLayer) qDebug() << Q_FUNC_INFO << playerLayer; #endif - m_videoWidget->setPlayerLayer((AVPlayerLayer*)playerLayer); + m_videoWidget->setPlayerLayer(static_cast<AVPlayerLayer*>(playerLayer)); } diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.h b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.h index 18bf3fa71..763656c6c 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.h +++ b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.h @@ -61,40 +61,40 @@ class AVFVideoWindowControl : public QVideoWindowControl, public AVFVideoOutput Q_INTERFACES(AVFVideoOutput) public: - AVFVideoWindowControl(QObject *parent = 0); + AVFVideoWindowControl(QObject *parent = nullptr); virtual ~AVFVideoWindowControl(); // QVideoWindowControl interface public: - WId winId() const; - void setWinId(WId id); + WId winId() const override; + void setWinId(WId id) override; - QRect displayRect() const; - void setDisplayRect(const QRect &rect); + QRect displayRect() const override; + void setDisplayRect(const QRect &rect) override; - bool isFullScreen() const; - void setFullScreen(bool fullScreen); + bool isFullScreen() const override; + void setFullScreen(bool fullScreen) override; - void repaint(); - QSize nativeSize() const; + void repaint() override; + QSize nativeSize() const override; - Qt::AspectRatioMode aspectRatioMode() const; - void setAspectRatioMode(Qt::AspectRatioMode mode); + Qt::AspectRatioMode aspectRatioMode() const override; + void setAspectRatioMode(Qt::AspectRatioMode mode) override; - int brightness() const; - void setBrightness(int brightness); + int brightness() const override; + void setBrightness(int brightness) override; - int contrast() const; - void setContrast(int contrast); + int contrast() const override; + void setContrast(int contrast) override; - int hue() const; - void setHue(int hue); + int hue() const override; + void setHue(int hue) override; - int saturation() const; - void setSaturation(int saturation); + int saturation() const override; + void setSaturation(int saturation) override; // AVFVideoOutput interface - void setLayer(void *playerLayer); + void setLayer(void *playerLayer) override; private: void updateAspectRatio(); diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm index 5727cb0f4..7fa41fdc2 100644 --- a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm +++ b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm @@ -60,8 +60,8 @@ AVFVideoWindowControl::AVFVideoWindowControl(QObject *parent) , m_hue(0) , m_saturation(0) , m_aspectRatioMode(Qt::IgnoreAspectRatio) - , m_playerLayer(0) - , m_nativeView(0) + , m_playerLayer(nullptr) + , m_nativeView(nullptr) { } @@ -188,7 +188,7 @@ void AVFVideoWindowControl::setSaturation(int saturation) void AVFVideoWindowControl::setLayer(void *playerLayer) { - AVPlayerLayer *layer = (AVPlayerLayer*)playerLayer; + AVPlayerLayer *layer = static_cast<AVPlayerLayer*>(playerLayer); if (m_playerLayer == layer) return; diff --git a/src/plugins/common/evr/evrcustompresenter.cpp b/src/plugins/common/evr/evrcustompresenter.cpp index 872b97bcc..fdaedea7a 100644 --- a/src/plugins/common/evr/evrcustompresenter.cpp +++ b/src/plugins/common/evr/evrcustompresenter.cpp @@ -1208,6 +1208,8 @@ HRESULT EVRCustomPresenter::checkEndOfStream() // Everything is complete. Now we can tell the EVR that we are done. notifyEvent(EC_COMPLETE, (LONG_PTR)S_OK, 0); m_endStreaming = false; + + stopSurface(); return S_OK; } diff --git a/src/plugins/directshow/common/directshowutils.cpp b/src/plugins/directshow/common/directshowutils.cpp index 8f3f321e7..d1c1d42ab 100644 --- a/src/plugins/directshow/common/directshowutils.cpp +++ b/src/plugins/directshow/common/directshowutils.cpp @@ -56,8 +56,10 @@ bool DirectShowUtils::isPinConnected(IPin *pin, HRESULT *hrOut) hrOut = &hr; *hrOut = pin->ConnectedTo(&connectedPin); - if (*hrOut == VFW_E_NOT_CONNECTED) // Not an error in this case + if (*hrOut == VFW_E_NOT_CONNECTED) { // Not an error in this case *hrOut = S_OK; + return false; + } if (FAILED(*hrOut)) { qCDebug(qtDirectShowPlugin, "Querying pin connection failed!"); @@ -282,7 +284,7 @@ bool DirectShowUtils::connectFilters(IGraphBuilder *graph, // Try to connect to the upstream filter first. if (findAndConnect(upstreamFilter)) - return false; + return true; const auto getFilters = [graph, hrOut]() -> IEnumFilters * { IEnumFilters *f = nullptr; diff --git a/src/plugins/directshow/directshow.pro b/src/plugins/directshow/directshow.pro index 54d617166..e531efc53 100644 --- a/src/plugins/directshow/directshow.pro +++ b/src/plugins/directshow/directshow.pro @@ -17,12 +17,11 @@ mingw { } include(common/common.pri) -qtConfig(directshow-player): include(player/player.pri) +include(player/player.pri) include(camera/camera.pri) OTHER_FILES += \ - directshow.json \ - directshow_camera.json + directshow.json PLUGIN_TYPE = mediaservice PLUGIN_CLASS_NAME = DSServicePlugin diff --git a/src/plugins/directshow/directshow_camera.json b/src/plugins/directshow/directshow_camera.json deleted file mode 100644 index c37ce2c9a..000000000 --- a/src/plugins/directshow/directshow_camera.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "Keys": ["directshow"], - "Services": ["org.qt-project.qt.camera"] -} diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp index 64b30f561..727a11b55 100644 --- a/src/plugins/directshow/dsserviceplugin.cpp +++ b/src/plugins/directshow/dsserviceplugin.cpp @@ -51,9 +51,7 @@ #include <dshow.h> #include "dscameraservice.h" -#if QT_CONFIG(directshow_player) #include "directshowplayerservice.h" -#endif #include <qmediaserviceproviderplugin.h> @@ -95,12 +93,11 @@ QMediaService* DSServicePlugin::create(QString const& key) addRefCount(); return new DSCameraService; } -#if QT_CONFIG(directshow_player) + if (key == QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER)) { addRefCount(); return new DirectShowPlayerService; } -#endif return 0; } diff --git a/src/plugins/directshow/dsserviceplugin.h b/src/plugins/directshow/dsserviceplugin.h index 2e87058c3..55db9310c 100644 --- a/src/plugins/directshow/dsserviceplugin.h +++ b/src/plugins/directshow/dsserviceplugin.h @@ -55,13 +55,7 @@ class DSServicePlugin Q_INTERFACES(QMediaServiceSupportedDevicesInterface) Q_INTERFACES(QMediaServiceDefaultDeviceInterface) Q_INTERFACES(QMediaServiceFeaturesInterface) - // The player service provided by the WMF-plugin should preferably be used. - // DirectShow should then only provide the camera (see QTBUG-29172, QTBUG-29175). -#if QT_CONFIG(directshow_player) Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "directshow.json") -#else - Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "directshow_camera.json") -#endif public: QMediaService* create(QString const& key) override; diff --git a/src/plugins/directshow/player/directshowmetadatacontrol.cpp b/src/plugins/directshow/player/directshowmetadatacontrol.cpp index 90d2b3e7d..52b73a7df 100644 --- a/src/plugins/directshow/player/directshowmetadatacontrol.cpp +++ b/src/plugins/directshow/player/directshowmetadatacontrol.cpp @@ -477,21 +477,14 @@ static QString convertBSTR(BSTR *string) return value; } -void DirectShowMetaDataControl::reset() +void DirectShowMetaDataControl::setMetadata(const QVariantMap &metadata) { - bool hadMetadata = !m_metadata.isEmpty(); - m_metadata.clear(); - - setMetadataAvailable(false); - - if (hadMetadata) - emit metaDataChanged(); + m_metadata = metadata; + setMetadataAvailable(!m_metadata.isEmpty()); } -void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter *source, const QString &fileSrc) +void DirectShowMetaDataControl::updateMetadata(const QString &fileSrc, QVariantMap &metadata) { - m_metadata.clear(); - #if QT_CONFIG(wshellitem) if (!sHCreateItemFromParsingName) { QSystemLibrary lib(QStringLiteral("shell32")); @@ -518,90 +511,90 @@ void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter continue; if (IsEqualPropertyKey(key, PKEY_Author)) { - m_metadata.insert(QMediaMetaData::Author, convertValue(var)); + metadata.insert(QMediaMetaData::Author, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Title)) { - m_metadata.insert(QMediaMetaData::Title, convertValue(var)); + metadata.insert(QMediaMetaData::Title, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Media_SubTitle)) { - m_metadata.insert(QMediaMetaData::SubTitle, convertValue(var)); + metadata.insert(QMediaMetaData::SubTitle, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_ParentalRating)) { - m_metadata.insert(QMediaMetaData::ParentalRating, convertValue(var)); + metadata.insert(QMediaMetaData::ParentalRating, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Comment)) { - m_metadata.insert(QMediaMetaData::Description, convertValue(var)); + metadata.insert(QMediaMetaData::Description, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Copyright)) { - m_metadata.insert(QMediaMetaData::Copyright, convertValue(var)); + metadata.insert(QMediaMetaData::Copyright, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Media_ProviderStyle)) { - m_metadata.insert(QMediaMetaData::Genre, convertValue(var)); + metadata.insert(QMediaMetaData::Genre, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Media_Year)) { - m_metadata.insert(QMediaMetaData::Year, convertValue(var)); + metadata.insert(QMediaMetaData::Year, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Media_DateEncoded)) { - m_metadata.insert(QMediaMetaData::Date, convertValue(var)); + metadata.insert(QMediaMetaData::Date, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Rating)) { - m_metadata.insert(QMediaMetaData::UserRating, + metadata.insert(QMediaMetaData::UserRating, int((convertValue(var).toUInt() - 1) / qreal(98) * 100)); } else if (IsEqualPropertyKey(key, PKEY_Keywords)) { - m_metadata.insert(QMediaMetaData::Keywords, convertValue(var)); + metadata.insert(QMediaMetaData::Keywords, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Language)) { - m_metadata.insert(QMediaMetaData::Language, convertValue(var)); + metadata.insert(QMediaMetaData::Language, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Media_Publisher)) { - m_metadata.insert(QMediaMetaData::Publisher, convertValue(var)); + metadata.insert(QMediaMetaData::Publisher, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Media_Duration)) { - m_metadata.insert(QMediaMetaData::Duration, + metadata.insert(QMediaMetaData::Duration, (convertValue(var).toLongLong() + 10000) / 10000); } else if (IsEqualPropertyKey(key, PKEY_Audio_EncodingBitrate)) { - m_metadata.insert(QMediaMetaData::AudioBitRate, convertValue(var)); + metadata.insert(QMediaMetaData::AudioBitRate, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Media_AverageLevel)) { - m_metadata.insert(QMediaMetaData::AverageLevel, convertValue(var)); + metadata.insert(QMediaMetaData::AverageLevel, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Audio_ChannelCount)) { - m_metadata.insert(QMediaMetaData::ChannelCount, convertValue(var)); + metadata.insert(QMediaMetaData::ChannelCount, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Audio_PeakValue)) { - m_metadata.insert(QMediaMetaData::PeakValue, convertValue(var)); + metadata.insert(QMediaMetaData::PeakValue, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Audio_SampleRate)) { - m_metadata.insert(QMediaMetaData::SampleRate, convertValue(var)); + metadata.insert(QMediaMetaData::SampleRate, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Music_AlbumTitle)) { - m_metadata.insert(QMediaMetaData::AlbumTitle, convertValue(var)); + metadata.insert(QMediaMetaData::AlbumTitle, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Music_AlbumArtist)) { - m_metadata.insert(QMediaMetaData::AlbumArtist, convertValue(var)); + metadata.insert(QMediaMetaData::AlbumArtist, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Music_Artist)) { - m_metadata.insert(QMediaMetaData::ContributingArtist, convertValue(var)); + metadata.insert(QMediaMetaData::ContributingArtist, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Music_Composer)) { - m_metadata.insert(QMediaMetaData::Composer, convertValue(var)); + metadata.insert(QMediaMetaData::Composer, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Music_Conductor)) { - m_metadata.insert(QMediaMetaData::Conductor, convertValue(var)); + metadata.insert(QMediaMetaData::Conductor, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Music_Lyrics)) { - m_metadata.insert(QMediaMetaData::Lyrics, convertValue(var)); + metadata.insert(QMediaMetaData::Lyrics, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Music_Mood)) { - m_metadata.insert(QMediaMetaData::Mood, convertValue(var)); + metadata.insert(QMediaMetaData::Mood, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Music_TrackNumber)) { - m_metadata.insert(QMediaMetaData::TrackNumber, convertValue(var)); + metadata.insert(QMediaMetaData::TrackNumber, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Music_Genre)) { - m_metadata.insert(QMediaMetaData::Genre, convertValue(var)); + metadata.insert(QMediaMetaData::Genre, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_ThumbnailStream)) { - m_metadata.insert(QMediaMetaData::ThumbnailImage, convertValue(var)); + metadata.insert(QMediaMetaData::ThumbnailImage, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Video_FrameHeight)) { QSize res; res.setHeight(convertValue(var).toUInt()); if (SUCCEEDED(pStore->GetValue(PKEY_Video_FrameWidth, &var))) res.setWidth(convertValue(var).toUInt()); - m_metadata.insert(QMediaMetaData::Resolution, res); + metadata.insert(QMediaMetaData::Resolution, res); } else if (IsEqualPropertyKey(key, PKEY_Video_HorizontalAspectRatio)) { QSize aspectRatio; aspectRatio.setWidth(convertValue(var).toUInt()); if (SUCCEEDED(pStore->GetValue(PKEY_Video_VerticalAspectRatio, &var))) aspectRatio.setHeight(convertValue(var).toUInt()); - m_metadata.insert(QMediaMetaData::PixelAspectRatio, aspectRatio); + metadata.insert(QMediaMetaData::PixelAspectRatio, aspectRatio); } else if (IsEqualPropertyKey(key, PKEY_Video_FrameRate)) { - m_metadata.insert(QMediaMetaData::VideoFrameRate, + metadata.insert(QMediaMetaData::VideoFrameRate, convertValue(var).toReal() / 1000); } else if (IsEqualPropertyKey(key, PKEY_Video_EncodingBitrate)) { - m_metadata.insert(QMediaMetaData::VideoBitRate, convertValue(var)); + metadata.insert(QMediaMetaData::VideoBitRate, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Video_Director)) { - m_metadata.insert(QMediaMetaData::Director, convertValue(var)); + metadata.insert(QMediaMetaData::Director, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Media_Writer)) { - m_metadata.insert(QMediaMetaData::Writer, convertValue(var)); + metadata.insert(QMediaMetaData::Writer, convertValue(var)); } else if (IsEqualPropertyKey(key, PKEY_Video_Compression)) { - m_metadata.insert(QMediaMetaData::VideoCodec, nameForGUIDString(convertValue(var).toString())); + metadata.insert(QMediaMetaData::VideoCodec, nameForGUIDString(convertValue(var).toString())); } else if (IsEqualPropertyKey(key, PKEY_Audio_Format)) { - m_metadata.insert(QMediaMetaData::AudioCodec, nameForGUIDString(convertValue(var).toString())); + metadata.insert(QMediaMetaData::AudioCodec, nameForGUIDString(convertValue(var).toString())); } PropVariantClear(&var); @@ -614,11 +607,14 @@ void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter shellItem->Release(); } } - - if (!m_metadata.isEmpty()) - goto send_event; +#else + Q_UNUSED(fileSrc); + Q_UNUSED(metadata); #endif +} +void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter *source, QVariantMap &metadata) +{ #if QT_CONFIG(wmsdk) if (IWMHeaderInfo *info = com_cast<IWMHeaderInfo>(source, IID_IWMHeaderInfo)) { const auto keys = *qt_wmMetaDataKeys(); @@ -644,15 +640,15 @@ void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter var = (var.toUInt() - 1) / qreal(98) * 100; } - m_metadata.insert(key.qtName, var); + metadata.insert(key.qtName, var); } } info->Release(); } - if (!m_metadata.isEmpty()) - goto send_event; + if (!metadata.isEmpty()) + return; #endif { IAMMediaContent *content = 0; @@ -668,41 +664,23 @@ void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter BSTR string = 0; if (content->get_AuthorName(&string) == S_OK) - m_metadata.insert(QMediaMetaData::Author, convertBSTR(&string)); + metadata.insert(QMediaMetaData::Author, convertBSTR(&string)); if (content->get_Title(&string) == S_OK) - m_metadata.insert(QMediaMetaData::Title, convertBSTR(&string)); + metadata.insert(QMediaMetaData::Title, convertBSTR(&string)); if (content->get_Description(&string) == S_OK) - m_metadata.insert(QMediaMetaData::Description, convertBSTR(&string)); + metadata.insert(QMediaMetaData::Description, convertBSTR(&string)); if (content->get_Rating(&string) == S_OK) - m_metadata.insert(QMediaMetaData::UserRating, convertBSTR(&string)); + metadata.insert(QMediaMetaData::UserRating, convertBSTR(&string)); if (content->get_Copyright(&string) == S_OK) - m_metadata.insert(QMediaMetaData::Copyright, convertBSTR(&string)); + metadata.insert(QMediaMetaData::Copyright, convertBSTR(&string)); content->Release(); } } - -send_event: - // DirectShowMediaPlayerService holds a lock at this point so defer emitting signals to a later - // time. - QCoreApplication::postEvent(this, new QEvent(QEvent::Type(MetaDataChanged))); -} - -void DirectShowMetaDataControl::customEvent(QEvent *event) -{ - if (event->type() == QEvent::Type(MetaDataChanged)) { - event->accept(); - - setMetadataAvailable(!m_metadata.isEmpty()); - - emit metaDataChanged(); - } else { - QMetaDataReaderControl::customEvent(event); - } } void DirectShowMetaDataControl::setMetadataAvailable(bool available) @@ -711,5 +689,10 @@ void DirectShowMetaDataControl::setMetadataAvailable(bool available) return; m_available = available; - emit metaDataAvailableChanged(m_available); + + // If the metadata is not available, notify about it immediately. + Qt::ConnectionType type = m_available ? Qt::QueuedConnection : Qt::AutoConnection; + QMetaObject::invokeMethod(this, "metaDataAvailableChanged", type, Q_ARG(bool, m_available)); + // Currently the metadata is changed only with its availability. + QMetaObject::invokeMethod(this, "metaDataChanged", type); } diff --git a/src/plugins/directshow/player/directshowmetadatacontrol.h b/src/plugins/directshow/player/directshowmetadatacontrol.h index ea20bf0c5..4196a7950 100644 --- a/src/plugins/directshow/player/directshowmetadatacontrol.h +++ b/src/plugins/directshow/player/directshowmetadatacontrol.h @@ -62,12 +62,10 @@ public: QVariant metaData(const QString &key) const override; QStringList availableMetaData() const override; - void reset(); - void updateMetadata(IFilterGraph2 *graph, IBaseFilter *source, - const QString &fileSrc = QString()); + void setMetadata(const QVariantMap &metadata); -protected: - void customEvent(QEvent *event) override; + static void updateMetadata(const QString &fileSrc, QVariantMap &metadata); + static void updateMetadata(IFilterGraph2 *graph, IBaseFilter *source, QVariantMap &metadata); private: void setMetadataAvailable(bool available); diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index 08d99d735..d48350fa2 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -142,6 +142,7 @@ DirectShowPlayerService::DirectShowPlayerService(QObject *parent) , m_graphStatus(NoMedia) , m_stream(0) , m_graph(0) + , m_graphBuilder(nullptr) , m_source(0) , m_audioOutput(0) , m_videoOutput(0) @@ -297,7 +298,7 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream if (m_graph) releaseGraph(); - m_resources = media.resources(); + m_url = media.canonicalUrl(); m_stream = stream; m_error = QMediaPlayer::NoError; m_errorString = QString(); @@ -310,13 +311,11 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream m_seekable = false; m_atEnd = false; m_dontCacheNextSeekResult = false; - m_metaDataControl->reset(); + m_metaDataControl->setMetadata(QVariantMap()); - if (m_resources.isEmpty() && !stream) { + if (m_url.isEmpty() && !stream) { m_pendingTasks = 0; m_graphStatus = NoMedia; - - m_url.clear(); } else if (stream && (!stream->isReadable() || stream->isSequential())) { m_pendingTasks = 0; m_graphStatus = InvalidMedia; @@ -328,6 +327,15 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream m_graphStatus = Loading; m_graph = com_new<IFilterGraph2>(CLSID_FilterGraph, iid_IFilterGraph2); + m_graphBuilder = com_new<ICaptureGraphBuilder2>(CLSID_CaptureGraphBuilder2, IID_ICaptureGraphBuilder2); + + // Attach the filter graph to the capture graph. + HRESULT hr = m_graphBuilder->SetFiltergraph(m_graph); + if (FAILED(hr)) { + qCWarning(qtDirectShowPlugin, "[0x%x] Failed to attach filter to capture graph", hr); + m_graphBuilder->Release(); + m_graphBuilder = nullptr; + } if (stream) m_pendingTasks = SetStreamSource; @@ -348,9 +356,6 @@ void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker) { IBaseFilter *source = 0; - QMediaResource resource = m_resources.takeFirst(); - m_url = resource.url(); - HRESULT hr = E_FAIL; if (m_url.scheme() == QLatin1String("http") || m_url.scheme() == QLatin1String("https")) { static const GUID clsid_WMAsfReader = { @@ -403,7 +408,7 @@ void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker) m_pendingTasks |= SetRate; m_source = source; - } else if (!m_resources.isEmpty()) { + } else if (!m_url.isEmpty()) { m_pendingTasks |= SetUrlSource; } else { m_graphStatus = InvalidMedia; @@ -596,7 +601,6 @@ void DirectShowPlayerService::doRender(QMutexLocker *locker) void DirectShowPlayerService::doFinalizeLoad(QMutexLocker *locker) { - Q_UNUSED(locker) if (m_graphStatus != Loaded) { if (IMediaEvent *event = com_cast<IMediaEvent>(m_graph, IID_IMediaEvent)) { event->GetEventHandle(reinterpret_cast<OAEVENT *>(&m_eventHandle)); @@ -625,6 +629,11 @@ void DirectShowPlayerService::doFinalizeLoad(QMutexLocker *locker) m_graphStatus = Loaded; + // Do not block gui thread while updating metadata from file. + locker->unlock(); + DirectShowMetaDataControl::updateMetadata(m_url.toString(), m_metadata); + locker->relock(); + QCoreApplication::postEvent(this, new QEvent(QEvent::Type(FinalizedLoad))); } @@ -674,6 +683,11 @@ void DirectShowPlayerService::doReleaseGraph(QMutexLocker *locker) m_graph->Release(); m_graph = 0; + if (m_graphBuilder) { + m_graphBuilder->Release(); + m_graphBuilder = nullptr; + } + m_loop->wake(); } @@ -684,7 +698,7 @@ void DirectShowPlayerService::doSetVideoProbe(QMutexLocker *locker) { Q_UNUSED(locker); - if (!m_graph) { + if (!m_graph || !m_graphBuilder) { qCWarning(qtDirectShowPlugin, "Attempting to set a video probe without a valid graph!"); return; } @@ -700,41 +714,14 @@ void DirectShowPlayerService::doSetVideoProbe(QMutexLocker *locker) return; } - // TODO: Make util function for getting this, so it's easy to keep it in sync. - static const GUID subtypes[] = { MEDIASUBTYPE_ARGB32, - MEDIASUBTYPE_RGB32, - MEDIASUBTYPE_RGB24, - MEDIASUBTYPE_RGB565, - MEDIASUBTYPE_RGB555, - MEDIASUBTYPE_AYUV, - MEDIASUBTYPE_I420, - MEDIASUBTYPE_IYUV, - MEDIASUBTYPE_YV12, - MEDIASUBTYPE_UYVY, - MEDIASUBTYPE_YUYV, - MEDIASUBTYPE_YUY2, - MEDIASUBTYPE_NV12, - MEDIASUBTYPE_MJPG, - MEDIASUBTYPE_IMC1, - MEDIASUBTYPE_IMC2, - MEDIASUBTYPE_IMC3, - MEDIASUBTYPE_IMC4 }; - - // Negotiate the subtype - DirectShowMediaType mediaType(AM_MEDIA_TYPE { MEDIATYPE_Video }); - const int items = (sizeof subtypes / sizeof(GUID)); - bool connected = false; - for (int i = 0; i != items; ++i) { - mediaType->subtype = subtypes[i]; - m_videoSampleGrabber->setMediaType(&mediaType); - if (DirectShowUtils::connectFilters(m_graph, m_source, m_videoSampleGrabber->filter(), true)) { - connected = true; - break; - } - } + DirectShowMediaType mediaType({ MEDIATYPE_Video, MEDIASUBTYPE_ARGB32 }); + m_videoSampleGrabber->setMediaType(&mediaType); - if (!connected) { - qCWarning(qtDirectShowPlugin, "Unable to connect the video probe!"); + // Connect source filter to sample grabber filter. + HRESULT hr = m_graphBuilder->RenderStream(nullptr, &MEDIATYPE_Video, + m_source, nullptr, m_videoSampleGrabber->filter()); + if (FAILED(hr)) { + qCWarning(qtDirectShowPlugin, "[0x%x] Failed to connect the video sample grabber", hr); return; } @@ -765,8 +752,15 @@ void DirectShowPlayerService::doSetAudioProbe(QMutexLocker *locker) } if (!DirectShowUtils::connectFilters(m_graph, m_source, m_audioSampleGrabber->filter(), true)) { - qCWarning(qtDirectShowPlugin, "Failed to connect the audio sample grabber"); - return; + // Connect source filter to sample grabber filter. + HRESULT hr = m_graphBuilder + ? m_graphBuilder->RenderStream(nullptr, &MEDIATYPE_Audio, + m_source, nullptr, m_audioSampleGrabber->filter()) + : E_FAIL; + if (FAILED(hr)) { + qCWarning(qtDirectShowPlugin, "[0x%x] Failed to connect the audio sample grabber", hr); + return; + } } m_audioSampleGrabber->start(DirectShowSampleGrabber::CallbackMethod::BufferCB); @@ -1406,7 +1400,11 @@ void DirectShowPlayerService::customEvent(QEvent *event) QMutexLocker locker(&m_mutex); m_playerControl->updateMediaInfo(m_duration, m_streamTypes, m_seekable); - m_metaDataControl->updateMetadata(m_graph, m_source, m_url.toString()); + if (m_metadata.isEmpty()) + DirectShowMetaDataControl::updateMetadata(m_graph, m_source, m_metadata); + + m_metaDataControl->setMetadata(m_metadata); + m_metadata.clear(); updateStatus(); } else if (event->type() == QEvent::Type(Error)) { diff --git a/src/plugins/directshow/player/directshowplayerservice.h b/src/plugins/directshow/player/directshowplayerservice.h index 4a9e25678..a6eeb8a77 100644 --- a/src/plugins/directshow/player/directshowplayerservice.h +++ b/src/plugins/directshow/player/directshowplayerservice.h @@ -215,6 +215,7 @@ private: QMediaPlayer::Error m_error; QIODevice *m_stream; IFilterGraph2 *m_graph; + ICaptureGraphBuilder2 *m_graphBuilder; IBaseFilter *m_source; IBaseFilter *m_audioOutput; IBaseFilter *m_videoOutput; @@ -224,13 +225,13 @@ private: qint64 m_duration; QMediaTimeRange m_playbackRange; QUrl m_url; - QMediaResourceList m_resources; QString m_errorString; QMutex m_mutex; bool m_buffering; bool m_seekable; bool m_atEnd; bool m_dontCacheNextSeekResult; + QVariantMap m_metadata; friend class DirectShowPlayerServiceThread; }; diff --git a/src/plugins/directshow/player/videosurfacefilter.cpp b/src/plugins/directshow/player/videosurfacefilter.cpp index 826d26bdb..74d59231c 100644 --- a/src/plugins/directshow/player/videosurfacefilter.cpp +++ b/src/plugins/directshow/player/videosurfacefilter.cpp @@ -462,6 +462,7 @@ HRESULT VideoSurfaceFilter::EndOfStream() if (!m_pendingSample && m_running) checkEOS(); + stopSurface(); return S_OK; } diff --git a/src/plugins/gstreamer/camerabin/camerabinmetadata.cpp b/src/plugins/gstreamer/camerabin/camerabinmetadata.cpp index 6ae41de0e..afda2346d 100644 --- a/src/plugins/gstreamer/camerabin/camerabinmetadata.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinmetadata.cpp @@ -43,45 +43,12 @@ #include <gst/gst.h> #include <gst/gstversion.h> +#include <private/qgstutils_p.h> #include <QDebug> QT_BEGIN_NAMESPACE -#if GST_CHECK_VERSION(0,10,30) - -static QVariant fromGStreamerOrientation(const QVariant &value) -{ - // Note gstreamer tokens either describe the counter clockwise rotation of the - // image or the clockwise transform to apply to correct the image. The orientation - // value returned is the clockwise rotation of the image. - const QString token = value.toString(); - if (token == QStringLiteral("rotate-90")) - return 270; - else if (token == QStringLiteral("rotate-180")) - return 180; - else if (token == QStringLiteral("rotate-270")) - return 90; - else - return 0; -} - -#endif - -static QVariant toGStreamerOrientation(const QVariant &value) -{ - switch (value.toInt()) { - case 90: - return QStringLiteral("rotate-270"); - case 180: - return QStringLiteral("rotate-180"); - case 270: - return QStringLiteral("rotate-90"); - default: - return QStringLiteral("rotate-0"); - } -} - namespace { struct QGStreamerMetaDataKey { @@ -196,7 +163,7 @@ QVariant CameraBinMetaData::metaData(const QString &key) const { #if GST_CHECK_VERSION(0,10,30) if (key == QMediaMetaData::Orientation) { - return fromGStreamerOrientation(m_values.value(QByteArray(GST_TAG_IMAGE_ORIENTATION))); + return QGstUtils::fromGStreamerOrientation(m_values.value(QByteArray(GST_TAG_IMAGE_ORIENTATION))); } else if (key == QMediaMetaData::GPSSpeed) { const double metersPerSec = m_values.value(QByteArray(GST_TAG_GEO_LOCATION_MOVEMENT_SPEED)).toDouble(); return (metersPerSec * 3600) / 1000; @@ -214,14 +181,16 @@ QVariant CameraBinMetaData::metaData(const QString &key) const void CameraBinMetaData::setMetaData(const QString &key, const QVariant &value) { QVariant correctedValue = value; +#if GST_CHECK_VERSION(0,10,30) if (value.isValid()) { if (key == QMediaMetaData::Orientation) { - correctedValue = toGStreamerOrientation(value); + correctedValue = QGstUtils::toGStreamerOrientation(value); } else if (key == QMediaMetaData::GPSSpeed) { // kilometers per hour to meters per second. correctedValue = (value.toDouble() * 1000) / 3600; } } +#endif const auto keys = *qt_gstreamerMetaDataKeys(); for (const QGStreamerMetaDataKey &metadataKey : keys) { diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index 23cbd6082..f064c7c92 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -541,13 +541,26 @@ GstElement *CameraBinSession::buildCameraSource() if (!m_videoSrc) m_videoSrc = gst_element_factory_make("v4l2src", "camera_source"); + if (!m_videoSrc) + m_videoSrc = gst_element_factory_make("ksvideosrc", "camera_source"); + + if (!m_videoSrc) + m_videoSrc = gst_element_factory_make("avfvideosrc", "camera_source"); + if (m_videoSrc) g_object_set(G_OBJECT(m_cameraSrc), "video-source", m_videoSrc, NULL); } - if (m_videoSrc) - g_object_set(G_OBJECT(m_videoSrc), "device", m_inputDevice.toUtf8().constData(), NULL); + if (m_videoSrc) { + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "device")) + g_object_set(G_OBJECT(m_videoSrc), "device", m_inputDevice.toUtf8().constData(), NULL); + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "device-path")) + g_object_set(G_OBJECT(m_videoSrc), "device-path", m_inputDevice.toUtf8().constData(), NULL); + + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "device-index")) + g_object_set(G_OBJECT(m_videoSrc), "device-index", m_inputDevice.toInt(), NULL); + } } else if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_cameraSrc), "camera-device")) { if (m_inputDevice == QLatin1String("secondary")) { g_object_set(G_OBJECT(m_cameraSrc), "camera-device", 1, NULL); @@ -1177,11 +1190,16 @@ void CameraBinSession::recordVideo() if (format.isEmpty()) format = m_mediaContainerControl->actualContainerFormat(); - const QString actualFileName = m_mediaStorageLocation.generateFileName(m_sink.isLocalFile() ? m_sink.toLocalFile() - : m_sink.toString(), + const QString fileName = m_sink.isLocalFile() ? m_sink.toLocalFile() : m_sink.toString(); + const QFileInfo fileInfo(fileName); + const QString extension = fileInfo.suffix().isEmpty() + ? QGstUtils::fileExtensionForMimeType(format) + : fileInfo.suffix(); + + const QString actualFileName = m_mediaStorageLocation.generateFileName(fileName, QMediaStorageLocation::Movies, QLatin1String("clip_"), - QGstUtils::fileExtensionForMimeType(format)); + extension); m_recordingActive = true; m_actualSink = QUrl::fromLocalFile(actualFileName); diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp index 50ab0256b..8f2f6643c 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp @@ -43,6 +43,7 @@ #include <QtMultimedia/qmediametadata.h> #include <gst/gstversion.h> +#include <private/qgstutils_p.h> QT_BEGIN_NAMESPACE @@ -99,6 +100,9 @@ static const QGstreamerMetaDataKeyLookup *qt_gstreamerMetaDataKeys() // Image/Video metadataKeys->insert("resolution", QMediaMetaData::Resolution); metadataKeys->insert("pixel-aspect-ratio", QMediaMetaData::PixelAspectRatio); +#if GST_CHECK_VERSION(0,10,30) + metadataKeys->insert(GST_TAG_IMAGE_ORIENTATION, QMediaMetaData::Orientation); +#endif // Video //metadataKeys->insert(0, QMediaMetaData::VideoFrameRate); @@ -145,6 +149,10 @@ bool QGstreamerMetaDataProvider::isWritable() const QVariant QGstreamerMetaDataProvider::metaData(const QString &key) const { +#if GST_CHECK_VERSION(0,10,30) + if (key == QMediaMetaData::Orientation) + return QGstUtils::fromGStreamerOrientation(m_tags.value(key)); +#endif return m_tags.value(key); } diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 71b9ec6e1..95c004125 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -44,12 +44,10 @@ winrt { audiocapture } +qtConfig(gstreamer): SUBDIRS += gstreamer + unix:!mac:!android { - qtConfig(gstreamer) { - SUBDIRS += gstreamer - } else { - SUBDIRS += audiocapture - } + !qtConfig(gstreamer): SUBDIRS += audiocapture qtConfig(pulseaudio): SUBDIRS += pulseaudio qtConfig(alsa): SUBDIRS += alsa diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp index ea7a2be0c..19ddac1e5 100644 --- a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp +++ b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp @@ -310,7 +310,34 @@ bool QPulseAudioOutput::open() if (!m_category.isNull()) pa_proplist_sets(propList, PA_PROP_MEDIA_ROLE, m_category.toLatin1().constData()); - m_stream = pa_stream_new_with_proplist(pulseEngine->context(), m_streamName.constData(), &m_spec, 0, propList); + static const auto mapName = qEnvironmentVariable("QT_PA_CHANNEL_MAP"); + pa_channel_map_def_t mapDef = PA_CHANNEL_MAP_DEFAULT; + if (mapName == QLatin1String("ALSA")) + mapDef = PA_CHANNEL_MAP_ALSA; + else if (mapName == QLatin1String("AUX")) + mapDef = PA_CHANNEL_MAP_AUX; + else if (mapName == QLatin1String("WAVEEX")) + mapDef = PA_CHANNEL_MAP_WAVEEX; + else if (mapName == QLatin1String("OSS")) + mapDef = PA_CHANNEL_MAP_OSS; + else if (!mapName.isEmpty()) + qWarning() << "Unknown pulse audio channel mapping definition:" << mapName; + + pa_channel_map m; + auto channelMap = pa_channel_map_init_extend(&m, m_spec.channels, mapDef); + if (!channelMap) + qWarning() << "QAudioOutput: pa_channel_map_init_extend() Could not initialize channel map"; + + m_stream = pa_stream_new_with_proplist(pulseEngine->context(), m_streamName.constData(), &m_spec, channelMap, propList); + if (!m_stream) { + qWarning() << "QAudioOutput: pa_stream_new_with_proplist() failed!"; + pulseEngine->unlock(); + setError(QAudio::OpenError); + setState(QAudio::StoppedState); + emit stateChanged(m_deviceState); + return false; + } + pa_proplist_free(propList); pa_stream_set_state_callback(m_stream, outputStreamStateCallback, this); @@ -469,8 +496,7 @@ void QPulseAudioOutput::userFeed() if (m_notifyInterval && (m_timeStamp.elapsed() + m_elapsedTimeOffset) > m_notifyInterval) { emit notify(); - m_elapsedTimeOffset = m_timeStamp.elapsed() + m_elapsedTimeOffset - m_notifyInterval; - m_timeStamp.restart(); + m_elapsedTimeOffset = m_timeStamp.restart() + m_elapsedTimeOffset - m_notifyInterval; } } diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.h b/src/plugins/pulseaudio/qaudiooutput_pulse.h index 58f175e18..40d052681 100644 --- a/src/plugins/pulseaudio/qaudiooutput_pulse.h +++ b/src/plugins/pulseaudio/qaudiooutput_pulse.h @@ -55,7 +55,7 @@ #include <QtCore/qtimer.h> #include <QtCore/qstring.h> #include <QtCore/qstringlist.h> -#include <QtCore/qdatetime.h> +#include <QtCore/qelapsedtimer.h> #include <QtCore/qiodevice.h> #include "qaudio.h" @@ -131,11 +131,11 @@ private: int m_periodSize; int m_bufferSize; int m_maxBufferSize; - QTime m_clockStamp; + QElapsedTimer m_clockStamp; qint64 m_totalTimeValue; QTimer *m_tickTimer; char *m_audioBuffer; - QTime m_timeStamp; + QElapsedTimer m_timeStamp; qint64 m_elapsedTimeOffset; bool m_resuming; QString m_category; diff --git a/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp b/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp index 438c2aae0..c0eada324 100644 --- a/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp +++ b/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp @@ -124,14 +124,12 @@ void MFAudioDecoderControl::setSourceFilename(const QString &fileName) m_sourceFilename = fileName; if (!m_sourceFilename.isEmpty()) { m_sourceResolver->shutdown(); - QMediaResourceList rl; QUrl url; if (m_sourceFilename.startsWith(':')) url = QUrl(QStringLiteral("qrc%1").arg(m_sourceFilename)); else url = QUrl::fromLocalFile(m_sourceFilename); - rl.push_back(QMediaResource(url)); - m_sourceResolver->load(rl, 0); + m_sourceResolver->load(url, 0); m_loadingSource = true; } else { onSourceCleared(); @@ -155,7 +153,7 @@ void MFAudioDecoderControl::setSourceDevice(QIODevice *device) m_device = device; if (m_device) { m_sourceResolver->shutdown(); - m_sourceResolver->load(QMediaResourceList(), m_device); + m_sourceResolver->load(QUrl(), m_device); m_loadingSource = true; } else { onSourceCleared(); diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 3219936a7..9f909252d 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -197,12 +197,12 @@ void MFPlayerSession::load(const QMediaContent &media, QIODevice *stream) qDebug() << "load"; #endif clear(); - QMediaResourceList resources = media.resources(); + QUrl url = media.canonicalUrl(); if (m_status == QMediaPlayer::LoadingMedia && m_sourceResolver) m_sourceResolver->cancel(); - if (resources.isEmpty() && !stream) { + if (url.isEmpty() && !stream) { changeStatus(QMediaPlayer::NoMedia); } else if (stream && (!stream->isReadable())) { changeStatus(QMediaPlayer::InvalidMedia); @@ -210,7 +210,7 @@ void MFPlayerSession::load(const QMediaContent &media, QIODevice *stream) } else { createSession(); changeStatus(QMediaPlayer::LoadingMedia); - m_sourceResolver->load(resources, stream); + m_sourceResolver->load(url, stream); } emit positionChanged(position()); } diff --git a/src/plugins/wmf/player/mfplayersession.h b/src/plugins/wmf/player/mfplayersession.h index 72dc99d02..21fabbd92 100644 --- a/src/plugins/wmf/player/mfplayersession.h +++ b/src/plugins/wmf/player/mfplayersession.h @@ -62,9 +62,6 @@ QT_END_NAMESPACE QT_USE_NAMESPACE class SourceResolver; -#ifndef Q_WS_SIMULATOR -class EvrVideoWindowControl; -#endif class MFAudioEndpointControl; class MFVideoRendererControl; class MFPlayerControl; diff --git a/src/plugins/wmf/sourceresolver.cpp b/src/plugins/wmf/sourceresolver.cpp index 83949c976..c6f4e8566 100644 --- a/src/plugins/wmf/sourceresolver.cpp +++ b/src/plugins/wmf/sourceresolver.cpp @@ -158,7 +158,7 @@ HRESULT STDMETHODCALLTYPE SourceResolver::GetParameters(DWORD*, DWORD*) return E_NOTIMPL; } -void SourceResolver::load(const QMediaResourceList &resources, QIODevice* stream) +void SourceResolver::load(const QUrl &url, QIODevice* stream) { QMutexLocker locker(&m_mutex); HRESULT hr = S_OK; @@ -174,12 +174,10 @@ void SourceResolver::load(const QMediaResourceList &resources, QIODevice* stream qWarning() << "Failed to create Source Resolver!"; emit error(hr); } else if (stream) { - QString url; - if (!resources.isEmpty()) - url = resources.constFirst().url().toString(); + QString urlString = url.toString(); m_stream = new MFStream(stream, false); hr = m_sourceResolver->BeginCreateObjectFromByteStream( - m_stream, url.isEmpty() ? 0 : reinterpret_cast<LPCWSTR>(url.utf16()), + m_stream, urlString.isEmpty() ? 0 : reinterpret_cast<LPCWSTR>(urlString.utf16()), MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE , NULL, &m_cancelCookie, this, new State(m_sourceResolver, true)); if (FAILED(hr)) { @@ -187,8 +185,6 @@ void SourceResolver::load(const QMediaResourceList &resources, QIODevice* stream emit error(hr); } } else { - QMediaResource resource = resources.constFirst(); - QUrl url = resource.url(); #ifdef DEBUG_MEDIAFOUNDATION qDebug() << "loading :" << url; qDebug() << "url path =" << url.path().mid(1); diff --git a/src/plugins/wmf/sourceresolver.h b/src/plugins/wmf/sourceresolver.h index 387f59739..aa104a60e 100644 --- a/src/plugins/wmf/sourceresolver.h +++ b/src/plugins/wmf/sourceresolver.h @@ -59,7 +59,7 @@ public: HRESULT STDMETHODCALLTYPE GetParameters(DWORD*, DWORD*); - void load(const QMediaResourceList &resources, QIODevice* stream); + void load(const QUrl &url, QIODevice* stream); void cancel(); diff --git a/src/plugins/wmf/wmf.pro b/src/plugins/wmf/wmf.pro index b202ff2a1..7c712233d 100644 --- a/src/plugins/wmf/wmf.pro +++ b/src/plugins/wmf/wmf.pro @@ -17,12 +17,11 @@ SOURCES += \ mfstream.cpp \ sourceresolver.cpp -qtConfig(wmf-player): include (player/player.pri) +include (player/player.pri) include (decoder/decoder.pri) OTHER_FILES += \ - wmf.json \ - wmf_audiodecode.json + wmf.json PLUGIN_TYPE = mediaservice PLUGIN_CLASS_NAME = WMFServicePlugin diff --git a/src/plugins/wmf/wmf_audiodecode.json b/src/plugins/wmf/wmf_audiodecode.json deleted file mode 100644 index 2a65dd758..000000000 --- a/src/plugins/wmf/wmf_audiodecode.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "Keys": ["windowsmediafoundation"], - "Services": ["org.qt-project.qt.audiodecode"] -} diff --git a/src/plugins/wmf/wmfserviceplugin.cpp b/src/plugins/wmf/wmfserviceplugin.cpp index 1eeb22428..740067600 100644 --- a/src/plugins/wmf/wmfserviceplugin.cpp +++ b/src/plugins/wmf/wmfserviceplugin.cpp @@ -42,9 +42,7 @@ #include <QtCore/QFile> #include "wmfserviceplugin.h" -#if QT_CONFIG(wmf_player) #include "mfplayerservice.h" -#endif #include "mfdecoderservice.h" #include <mfapi.h> @@ -74,12 +72,11 @@ void releaseRefCount() QMediaService* WMFServicePlugin::create(QString const& key) { -#if QT_CONFIG(wmf_player) if (key == QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER)) { addRefCount(); return new MFPlayerService; } -#endif + if (key == QLatin1String(Q_MEDIASERVICE_AUDIODECODER)) { addRefCount(); return new MFAudioDecoderService; @@ -97,13 +94,9 @@ void WMFServicePlugin::release(QMediaService *service) QMediaServiceProviderHint::Features WMFServicePlugin::supportedFeatures( const QByteArray &service) const { -#if QT_CONFIG(wmf_player) if (service == Q_MEDIASERVICE_MEDIAPLAYER) return QMediaServiceProviderHint::StreamPlayback; else -#else - Q_UNUSED(service); -#endif return QMediaServiceProviderHint::Features(); } diff --git a/src/plugins/wmf/wmfserviceplugin.h b/src/plugins/wmf/wmfserviceplugin.h index 826ca1d26..493a0b08c 100644 --- a/src/plugins/wmf/wmfserviceplugin.h +++ b/src/plugins/wmf/wmfserviceplugin.h @@ -55,11 +55,8 @@ class WMFServicePlugin Q_INTERFACES(QMediaServiceSupportedDevicesInterface) Q_INTERFACES(QMediaServiceDefaultDeviceInterface) Q_INTERFACES(QMediaServiceFeaturesInterface) -#if QT_CONFIG(wmf_player) Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "wmf.json") -#else - Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "wmf_audiodecode.json") -#endif + public: QMediaService* create(QString const& key); void release(QMediaService *service); |