diff options
26 files changed, 91 insertions, 72 deletions
diff --git a/.qmake.conf b/.qmake.conf index 76c202ab9..097d8b948 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,3 @@ load(qt_build_config) -MODULE_VERSION = 5.11.2 +MODULE_VERSION = 5.12.0 diff --git a/config_help.txt b/config_help.txt index 7dd6b772f..341f53506 100644 --- a/config_help.txt +++ b/config_help.txt @@ -7,3 +7,4 @@ Multimedia options: With no parameter, 1.0 is tried first, then 0.10. -mediaplayer-backend <name> ... Select media player backend (Windows only) Supported backends: directshow (default), wmf + -evr ................. Enables EVR in DirectShow and WMF [auto] diff --git a/examples/multimedia/audiodevices/audiodevices.pro b/examples/multimedia/audiodevices/audiodevices.pro index b5bcf844a..55657202b 100644 --- a/examples/multimedia/audiodevices/audiodevices.pro +++ b/examples/multimedia/audiodevices/audiodevices.pro @@ -14,4 +14,4 @@ target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audiodevices INSTALLS += target QT+=widgets -include(../../shared/shared.pri) +include(../shared/shared.pri) diff --git a/examples/multimedia/audioinput/audioinput.pro b/examples/multimedia/audioinput/audioinput.pro index 029ca7e0f..708d40d93 100644 --- a/examples/multimedia/audioinput/audioinput.pro +++ b/examples/multimedia/audioinput/audioinput.pro @@ -10,4 +10,4 @@ SOURCES = audioinput.cpp \ target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audioinput INSTALLS += target -include(../../shared/shared.pri) +include(../shared/shared.pri) diff --git a/examples/multimedia/audiorecorder/audiorecorder.pro b/examples/multimedia/audiorecorder/audiorecorder.pro index 65eecc7b4..dfd0364a4 100644 --- a/examples/multimedia/audiorecorder/audiorecorder.pro +++ b/examples/multimedia/audiorecorder/audiorecorder.pro @@ -20,4 +20,4 @@ target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/audiorecorder INSTALLS += target QT+=widgets -include(../../shared/shared.pri) +include(../shared/shared.pri) diff --git a/examples/multimedia/declarative-camera/declarative-camera.pro b/examples/multimedia/declarative-camera/declarative-camera.pro index 6dcf42a40..2d6e2e759 100644 --- a/examples/multimedia/declarative-camera/declarative-camera.pro +++ b/examples/multimedia/declarative-camera/declarative-camera.pro @@ -8,4 +8,4 @@ RESOURCES += declarative-camera.qrc target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/declarative-camera INSTALLS += target -include(../../shared/shared.pri) +include(../shared/shared.pri) diff --git a/examples/shared/shared.pri b/examples/multimedia/shared/shared.pri index 26bdf73cf..26bdf73cf 100644 --- a/examples/shared/shared.pri +++ b/examples/multimedia/shared/shared.pri diff --git a/examples/multimedia/spectrum/app/app.pro b/examples/multimedia/spectrum/app/app.pro index 17c850255..726ce2d3f 100644 --- a/examples/multimedia/spectrum/app/app.pro +++ b/examples/multimedia/spectrum/app/app.pro @@ -83,4 +83,4 @@ macx { QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN } } -include(../../../shared/shared.pri) +include(../../shared/shared.pri) diff --git a/examples/multimediawidgets/camera/camera.pro b/examples/multimediawidgets/camera/camera.pro index d4f8df5c4..52c511acb 100644 --- a/examples/multimediawidgets/camera/camera.pro +++ b/examples/multimediawidgets/camera/camera.pro @@ -25,4 +25,4 @@ target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/camera INSTALLS += target QT+=widgets -include(../../shared/shared.pri) +include(../../multimedia/shared/shared.pri) diff --git a/src/gsttools/gsttools.pro b/src/gsttools/gsttools.pro index f5e3fd96f..ca111b3f2 100644 --- a/src/gsttools/gsttools.pro +++ b/src/gsttools/gsttools.pro @@ -36,7 +36,9 @@ PRIVATE_HEADERS += \ qgstreameraudioprobecontrol_p.h \ qgstreamervideowindow_p.h \ qgstreamervideooverlay_p.h \ - qgsttools_global_p.h + qgsttools_global_p.h \ + qgstreamerplayersession_p.h \ + qgstreamerplayercontrol_p.h SOURCES += \ qgstreamerbushelper.cpp \ @@ -52,7 +54,9 @@ SOURCES += \ qgstreamervideoprobecontrol.cpp \ qgstreameraudioprobecontrol.cpp \ qgstreamervideowindow.cpp \ - qgstreamervideooverlay.cpp + qgstreamervideooverlay.cpp \ + qgstreamerplayersession.cpp \ + qgstreamerplayercontrol.cpp qtHaveModule(widgets) { QT += multimediawidgets diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp b/src/gsttools/qgstreamerplayercontrol.cpp index 0bfe76f2f..91ba39ad9 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp +++ b/src/gsttools/qgstreamerplayercontrol.cpp @@ -37,8 +37,8 @@ ** ****************************************************************************/ -#include "qgstreamerplayercontrol.h" -#include "qgstreamerplayersession.h" +#include <private/qgstreamerplayercontrol_p.h> +#include <private/qgstreamerplayersession_p.h> #include <private/qmediaplaylistnavigator_p.h> #include <private/qmediaresourcepolicy_p.h> diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp b/src/gsttools/qgstreamerplayersession.cpp index a96da66f8..8ee099590 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp +++ b/src/gsttools/qgstreamerplayersession.cpp @@ -37,7 +37,7 @@ ** ****************************************************************************/ -#include "qgstreamerplayersession.h" +#include <private/qgstreamerplayersession_p.h> #include <private/qgstreamerbushelper_p.h> #include <private/qgstreameraudioprobecontrol_p.h> diff --git a/src/imports/audioengine/audioengine.cpp b/src/imports/audioengine/audioengine.cpp index f97928f9d..1d3379b91 100644 --- a/src/imports/audioengine/audioengine.cpp +++ b/src/imports/audioengine/audioengine.cpp @@ -51,13 +51,6 @@ #include "qdeclarative_audiosample_p.h" #include "qdeclarative_attenuationmodel_p.h" -static void initResources() -{ -#ifdef QT_STATIC - Q_INIT_RESOURCE(qmake_QtAudioEngine); -#endif -} - QT_BEGIN_NAMESPACE class QAudioEngineDeclarativeModule : public QQmlExtensionPlugin @@ -66,7 +59,7 @@ class QAudioEngineDeclarativeModule : public QQmlExtensionPlugin Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) public: - QAudioEngineDeclarativeModule(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); } + QAudioEngineDeclarativeModule(QObject *parent = 0) : QQmlExtensionPlugin(parent) { } void registerTypes(const char *uri) override { Q_ASSERT(QLatin1String(uri) == QLatin1String("QtAudioEngine")); diff --git a/src/imports/multimedia/multimedia.cpp b/src/imports/multimedia/multimedia.cpp index 6d9292221..113e67bfa 100644 --- a/src/imports/multimedia/multimedia.cpp +++ b/src/imports/multimedia/multimedia.cpp @@ -63,13 +63,6 @@ QML_DECLARE_TYPE(QSoundEffect) -static void initResources() -{ -#ifdef QT_STATIC - Q_INIT_RESOURCE(qmake_QtMultimedia); -#endif -} - QT_BEGIN_NAMESPACE static QObject *multimedia_global_object(QQmlEngine *qmlEngine, QJSEngine *jsEngine) @@ -84,7 +77,7 @@ class QMultimediaDeclarativeModule : public QQmlExtensionPlugin Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) public: - QMultimediaDeclarativeModule(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); } + QMultimediaDeclarativeModule(QObject *parent = 0) : QQmlExtensionPlugin(parent) { } void registerTypes(const char *uri) override { Q_ASSERT(QLatin1String(uri) == QLatin1String("QtMultimedia")); diff --git a/src/multimedia/configure.json b/src/multimedia/configure.json index e250f2b9a..9980b0664 100644 --- a/src/multimedia/configure.json +++ b/src/multimedia/configure.json @@ -8,6 +8,7 @@ "commandline": { "options": { "alsa": "boolean", + "evr": { "type": "boolean" }, "gstreamer": { "type": "optionalString", "values": [ "no", "yes", "0.10", "1.0" ] }, "pulseaudio": "boolean", "mediaplayer-backend": { "type": "string", "values": [ "directshow", "wmf" ] }, diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h b/src/multimedia/gsttools_headers/qgstreamerplayercontrol_p.h index 6067a68fc..e2252ea52 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h +++ b/src/multimedia/gsttools_headers/qgstreamerplayercontrol_p.h @@ -37,29 +37,29 @@ ** ****************************************************************************/ -#ifndef QGSTREAMERPLAYERCONTROL_H -#define QGSTREAMERPLAYERCONTROL_H +#ifndef QGSTREAMERPLAYERCONTROL_P_H +#define QGSTREAMERPLAYERCONTROL_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// -#include <QtCore/qobject.h> #include <QtCore/qstack.h> - #include <qmediaplayercontrol.h> -#include <qmediaplayer.h> - -#include <limits.h> +#include <private/qgsttools_global_p.h> QT_BEGIN_NAMESPACE class QMediaPlayerResourceSetInterface; - -class QMediaPlaylist; -class QMediaPlaylistNavigator; -class QSocketNotifier; - class QGstreamerPlayerSession; -class QGstreamerPlayerService; - -class QGstreamerPlayerControl : public QMediaPlayerControl +class Q_GSTTOOLS_EXPORT QGstreamerPlayerControl : public QMediaPlayerControl { Q_OBJECT @@ -67,6 +67,8 @@ public: QGstreamerPlayerControl(QGstreamerPlayerSession *session, QObject *parent = 0); ~QGstreamerPlayerControl(); + QGstreamerPlayerSession *session() { return m_session; } + QMediaPlayer::State state() const override; QMediaPlayer::MediaStatus mediaStatus() const override; diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h b/src/multimedia/gsttools_headers/qgstreamerplayersession_p.h index 7f46e8f41..81c385600 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h +++ b/src/multimedia/gsttools_headers/qgstreamerplayersession_p.h @@ -37,14 +37,25 @@ ** ****************************************************************************/ -#ifndef QGSTREAMERPLAYERSESSION_H -#define QGSTREAMERPLAYERSESSION_H +#ifndef QGSTREAMERPLAYERSESSION_P_H +#define QGSTREAMERPLAYERSESSION_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// #include <QtMultimedia/private/qtmultimediaglobal_p.h> #include <QObject> #include <QtCore/qmutex.h> #include <QtNetwork/qnetworkrequest.h> -#include "qgstreamerplayercontrol.h" +#include <private/qgstreamerplayercontrol_p.h> #include <private/qgstreamerbushelper_p.h> #include <qmediaplayer.h> #include <qmediastreamscontrol.h> @@ -71,8 +82,9 @@ typedef enum { GST_AUTOPLUG_SELECT_SKIP } GstAutoplugSelectResult; -class QGstreamerPlayerSession : public QObject, - public QGstreamerBusMessageFilter +class Q_GSTTOOLS_EXPORT QGstreamerPlayerSession + : public QObject + , public QGstreamerBusMessageFilter { Q_OBJECT Q_INTERFACES(QGstreamerBusMessageFilter) diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index b975677a6..63635b059 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -61,6 +61,8 @@ #if QT_CONFIG(evr) #include "directshowevrvideowindowcontrol.h" +#else +#include <mmreg.h> #endif #include "qmediacontent.h" @@ -217,11 +219,13 @@ QMediaControl *DirectShowPlayerService::requestControl(const char *name) IBaseFilter *filter; #if QT_CONFIG(evr) - DirectShowEvrVideoWindowControl *evrControl = new DirectShowEvrVideoWindowControl; - if ((filter = evrControl->filter())) - m_videoWindowControl = evrControl; - else - delete evrControl; + if (!qgetenv("QT_DIRECTSHOW_NO_EVR").toInt()) { + DirectShowEvrVideoWindowControl *evrControl = new DirectShowEvrVideoWindowControl; + if ((filter = evrControl->filter())) + m_videoWindowControl = evrControl; + else + delete evrControl; + } #endif // Fall back to the VMR9 if the EVR is not available if (!m_videoWindowControl) { diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp index ee7f5ec9e..88b5a51eb 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp @@ -98,13 +98,15 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface) if (m_surface) { #if QT_CONFIG(evr) - m_filter = com_new<IBaseFilter>(clsid_EnhancedVideoRenderer); - m_evrPresenter = new EVRCustomPresenter(m_surface); - if (!m_evrPresenter->isValid() || !qt_evr_setCustomPresenter(m_filter, m_evrPresenter)) { - m_filter->Release(); - m_filter = 0; - m_evrPresenter->Release(); - m_evrPresenter = 0; + if (!qgetenv("QT_DIRECTSHOW_NO_EVR").toInt()) { + m_filter = com_new<IBaseFilter>(clsid_EnhancedVideoRenderer); + m_evrPresenter = new EVRCustomPresenter(m_surface); + if (!m_evrPresenter->isValid() || !qt_evr_setCustomPresenter(m_filter, m_evrPresenter)) { + m_filter->Release(); + m_filter = 0; + m_evrPresenter->Release(); + m_evrPresenter = 0; + } } if (!m_filter) diff --git a/src/plugins/directshow/player/player.pri b/src/plugins/directshow/player/player.pri index 9111cc545..ec1066db7 100644 --- a/src/plugins/directshow/player/player.pri +++ b/src/plugins/directshow/player/player.pri @@ -37,6 +37,8 @@ qtConfig(evr) { SOURCES += \ $$PWD/directshowevrvideowindowcontrol.cpp +} else { + LIBS += -lwinmm } qtConfig(wshellitem): \ diff --git a/src/plugins/gstreamer/mediaplayer/mediaplayer.pro b/src/plugins/gstreamer/mediaplayer/mediaplayer.pro index 5ccf89bfd..8150d8f5b 100644 --- a/src/plugins/gstreamer/mediaplayer/mediaplayer.pro +++ b/src/plugins/gstreamer/mediaplayer/mediaplayer.pro @@ -5,18 +5,14 @@ include(../common.pri) INCLUDEPATH += $$PWD HEADERS += \ - $$PWD/qgstreamerplayercontrol.h \ $$PWD/qgstreamerplayerservice.h \ - $$PWD/qgstreamerplayersession.h \ $$PWD/qgstreamerstreamscontrol.h \ $$PWD/qgstreamermetadataprovider.h \ $$PWD/qgstreameravailabilitycontrol.h \ $$PWD/qgstreamerplayerserviceplugin.h SOURCES += \ - $$PWD/qgstreamerplayercontrol.cpp \ $$PWD/qgstreamerplayerservice.cpp \ - $$PWD/qgstreamerplayersession.cpp \ $$PWD/qgstreamerstreamscontrol.cpp \ $$PWD/qgstreamermetadataprovider.cpp \ $$PWD/qgstreameravailabilitycontrol.cpp \ diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp index b9e29245f..50ab0256b 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp @@ -38,7 +38,7 @@ ****************************************************************************/ #include "qgstreamermetadataprovider.h" -#include "qgstreamerplayersession.h" +#include <private/qgstreamerplayersession_p.h> #include <QDebug> #include <QtMultimedia/qmediametadata.h> diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp index 2c2de1bbc..0712f6e6c 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp @@ -46,8 +46,6 @@ #endif #include "qgstreamerplayerservice.h" -#include "qgstreamerplayercontrol.h" -#include "qgstreamerplayersession.h" #include "qgstreamermetadataprovider.h" #include "qgstreameravailabilitycontrol.h" @@ -64,6 +62,8 @@ #include "qgstreamerstreamscontrol.h" #include <private/qgstreameraudioprobecontrol_p.h> #include <private/qgstreamervideoprobecontrol_p.h> +#include <private/qgstreamerplayersession_p.h> +#include <private/qgstreamerplayercontrol_p.h> #include <private/qmediaplaylistnavigator_p.h> #include <qmediaplaylist.h> diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp index 99caa2ae0..4f5c3f0b2 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerstreamscontrol.cpp @@ -38,7 +38,7 @@ ****************************************************************************/ #include "qgstreamerstreamscontrol.h" -#include "qgstreamerplayersession.h" +#include <private/qgstreamerplayersession_p.h> QGstreamerStreamsControl::QGstreamerStreamsControl(QGstreamerPlayerSession *session, QObject *parent) :QMediaStreamsControl(parent), m_session(session) diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp index d1c0b475f..26eecb768 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp @@ -295,11 +295,22 @@ bool QWindowsAudioOutput::open() return true; } +void QWindowsAudioOutput::pauseAndSleep() +{ + waveOutPause(hWaveOut); + int bitrate = settings.sampleRate() * settings.channelCount() * settings.sampleSize() / 8; + // Time of written data. + int delay = (buffer_size - bytesFree()) * 1000 / bitrate; + Sleep(delay + 10); +} + void QWindowsAudioOutput::close() { if(deviceState == QAudio::StoppedState) return; + // Pause playback before reset to avoid uneeded crackling at the end. + pauseAndSleep(); deviceState = QAudio::StoppedState; errorState = QAudio::NoError; waveOutReset(hWaveOut); @@ -455,10 +466,7 @@ void QWindowsAudioOutput::resume() void QWindowsAudioOutput::suspend() { if(deviceState == QAudio::ActiveState || deviceState == QAudio::IdleState) { - int delay = (buffer_size-bytesFree())*1000/(settings.sampleRate() - *settings.channelCount()*(settings.sampleSize()/8)); - waveOutPause(hWaveOut); - Sleep(delay+10); + pauseAndSleep(); deviceState = QAudio::SuspendedState; errorState = QAudio::NoError; emit stateChanged(deviceState); diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.h b/src/plugins/windowsaudio/qwindowsaudiooutput.h index f25475b02..b71f00e98 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.h +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.h @@ -115,6 +115,7 @@ private slots: bool deviceReady(); private: + void pauseAndSleep(); QByteArray m_device; int bytesAvailable; QTime timeStamp; |