summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-01-04 13:22:16 +0100
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-01-04 13:24:12 +0100
commitec316b3b7973efa3f2d2af211b95bc8b45b42a50 (patch)
treeb3f0445661ccddb4d11a6a90cf944400205edfd8 /src/plugins
parentc2736c3a629d944818c44db9ad69beffb872bdd5 (diff)
parent6902c5d770bfa79522d4349215c0b582642c7594 (diff)
Merge remote-tracking branch 'origin/stable' into dev
Conflicts: sync.profile Change-Id: I450b86e3d01498aca12fe11a28527a296f2cbc3f
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/audiocapture/audiocapture.pro1
-rw-r--r--src/plugins/avfoundation/camera/camera.pro1
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfvideowidget.mm10
-rw-r--r--src/plugins/avfoundation/mediaplayer/mediaplayer.pro1
-rw-r--r--src/plugins/blackberry/mediaservice/mediaservice.pro2
-rw-r--r--src/plugins/directshow/camera/camera.pri2
-rw-r--r--src/plugins/directshow/camera/dscameraservice.cpp2
-rw-r--r--src/plugins/directshow/camera/dsvideodevicecontrol.cpp2
-rw-r--r--src/plugins/directshow/camera/dsvideowidgetcontrol.cpp2
-rw-r--r--src/plugins/directshow/camera/dsvideowidgetcontrol.h2
-rw-r--r--src/plugins/directshow/directshow.pro1
-rw-r--r--src/plugins/gstreamer/audiodecoder/audiodecoder.pro1
-rw-r--r--src/plugins/gstreamer/camerabin/camerabin.pro1
-rw-r--r--src/plugins/gstreamer/mediacapture/mediacapture.pro1
-rw-r--r--src/plugins/gstreamer/mediaplayer/mediaplayer.pro1
-rw-r--r--src/plugins/m3u/m3u.pro1
-rw-r--r--src/plugins/pulseaudio/pulseaudio.pro1
-rw-r--r--src/plugins/qt7/qt7.pro1
-rw-r--r--src/plugins/qt7/qt7movierenderer.mm2
-rw-r--r--src/plugins/qt7/qt7movieviewoutput.mm2
-rw-r--r--src/plugins/v4l/v4l.pro1
-rw-r--r--src/plugins/wmf/player/evr9videowindowcontrol.cpp54
-rw-r--r--src/plugins/wmf/player/evr9videowindowcontrol.h6
-rw-r--r--src/plugins/wmf/player/mfaudioendpointcontrol.cpp17
-rw-r--r--src/plugins/wmf/player/mfaudioendpointcontrol.h3
-rw-r--r--src/plugins/wmf/player/mfplayerservice.cpp3
-rw-r--r--src/plugins/wmf/player/mfplayersession.cpp120
-rw-r--r--src/plugins/wmf/player/mfplayersession.h1
-rw-r--r--src/plugins/wmf/player/mfvideorenderercontrol.cpp34
-rw-r--r--src/plugins/wmf/player/mfvideorenderercontrol.h4
-rw-r--r--src/plugins/wmf/sourceresolver.cpp4
-rw-r--r--src/plugins/wmf/wmf.pro2
-rw-r--r--src/plugins/wmf/wmfserviceplugin.cpp2
33 files changed, 200 insertions, 88 deletions
diff --git a/src/plugins/audiocapture/audiocapture.pro b/src/plugins/audiocapture/audiocapture.pro
index f58f43eab..833e4b5fc 100644
--- a/src/plugins/audiocapture/audiocapture.pro
+++ b/src/plugins/audiocapture/audiocapture.pro
@@ -2,6 +2,7 @@ TARGET = qtmedia_audioengine
QT += multimedia-private
PLUGIN_TYPE=mediaservice
+PLUGIN_CLASS_NAME = AudioCaptureServicePlugin
load(qt_plugin)
HEADERS += audioencodercontrol.h \
diff --git a/src/plugins/avfoundation/camera/camera.pro b/src/plugins/avfoundation/camera/camera.pro
index 2eced1819..3c7511715 100644
--- a/src/plugins/avfoundation/camera/camera.pro
+++ b/src/plugins/avfoundation/camera/camera.pro
@@ -5,6 +5,7 @@ TARGET = qavfcamera
QT += multimedia-private network
PLUGIN_TYPE = mediaservice
+PLUGIN_CLASS_NAME = AVFServicePlugin
load(qt_plugin)
LIBS += -framework AppKit -framework AudioUnit \
diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm b/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm
index 307539851..a6a2f4236 100644
--- a/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm
@@ -103,11 +103,11 @@ void AVFVideoWidget::paintGL()
return;
QRect targetRect = displayRect();
- int x1 = targetRect.left();
- int x2 = targetRect.right();
- int y1 = targetRect.bottom();
- int y2 = targetRect.top();
- int zValue = 0;
+ GLfloat x1 = targetRect.left();
+ GLfloat x2 = targetRect.right();
+ GLfloat y1 = targetRect.bottom();
+ GLfloat y2 = targetRect.top();
+ GLfloat zValue = 0;
const GLfloat textureCoordinates[] = {
0, 0,
diff --git a/src/plugins/avfoundation/mediaplayer/mediaplayer.pro b/src/plugins/avfoundation/mediaplayer/mediaplayer.pro
index 45a30acf2..d1957d5f3 100644
--- a/src/plugins/avfoundation/mediaplayer/mediaplayer.pro
+++ b/src/plugins/avfoundation/mediaplayer/mediaplayer.pro
@@ -8,6 +8,7 @@ TARGET = qavfmediaplayer
QT += multimedia-private network
PLUGIN_TYPE = mediaservice
+PLUGIN_CLASS_NAME = AVFMediaPlayerServicePlugin
load(qt_plugin)
LIBS += -framework AVFoundation -framework CoreMedia
diff --git a/src/plugins/blackberry/mediaservice/mediaservice.pro b/src/plugins/blackberry/mediaservice/mediaservice.pro
index 9c658a57b..ffaed4816 100644
--- a/src/plugins/blackberry/mediaservice/mediaservice.pro
+++ b/src/plugins/blackberry/mediaservice/mediaservice.pro
@@ -1,8 +1,8 @@
TARGET = qtmedia_blackberry
QT += multimedia-private gui-private
-CONFIG += no_private_qt_headers_warning
PLUGIN_TYPE=mediaservice
+PLUGIN_CLASS_NAME = BbServicePlugin
load(qt_plugin)
LIBS += -lmmrndclient -lstrm -lscreen
diff --git a/src/plugins/directshow/camera/camera.pri b/src/plugins/directshow/camera/camera.pri
index b576a852f..91111bee0 100644
--- a/src/plugins/directshow/camera/camera.pri
+++ b/src/plugins/directshow/camera/camera.pri
@@ -28,5 +28,5 @@ SOURCES += \
SOURCES += $$PWD/dsvideowidgetcontrol.cpp
}
-*-msvc*:INCLUDEPATH += $(DXSDK_DIR)/include
+*-msvc*:INCLUDEPATH += $$(DXSDK_DIR)/include
LIBS += -lstrmiids -ldmoguids -luuid -lmsdmo -lole32 -loleaut32
diff --git a/src/plugins/directshow/camera/dscameraservice.cpp b/src/plugins/directshow/camera/dscameraservice.cpp
index 6d2974160..fcbd1ef58 100644
--- a/src/plugins/directshow/camera/dscameraservice.cpp
+++ b/src/plugins/directshow/camera/dscameraservice.cpp
@@ -44,7 +44,7 @@
#if defined(HAVE_WIDGETS)
#include <QtWidgets/qwidget.h>
-#include <QVideoWidgetControl.h>
+#include <QVideoWidgetControl>
#endif
#include "dscameraservice.h"
diff --git a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp
index 46865690f..7c33d130d 100644
--- a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp
+++ b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp
@@ -49,7 +49,7 @@
#include <dshow.h>
#include <objbase.h>
#include <initguid.h>
-#include <Ocidl.h>
+#include <ocidl.h>
#include <string.h>
extern const CLSID CLSID_VideoInputDeviceCategory;
diff --git a/src/plugins/directshow/camera/dsvideowidgetcontrol.cpp b/src/plugins/directshow/camera/dsvideowidgetcontrol.cpp
index 843719b8e..d7a913d7b 100644
--- a/src/plugins/directshow/camera/dsvideowidgetcontrol.cpp
+++ b/src/plugins/directshow/camera/dsvideowidgetcontrol.cpp
@@ -42,7 +42,7 @@
#include <QtCore/qcoreevent.h>
#include <QtCore/qtimer.h>
-#include "DSVideoWidgetControl.h"
+#include "dsvideowidgetcontrol.h"
#include "dscamerasession.h"
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/directshow/camera/dsvideowidgetcontrol.h b/src/plugins/directshow/camera/dsvideowidgetcontrol.h
index ac390c82b..9249c3178 100644
--- a/src/plugins/directshow/camera/dsvideowidgetcontrol.h
+++ b/src/plugins/directshow/camera/dsvideowidgetcontrol.h
@@ -49,7 +49,7 @@
#include <QtMultimedia/qvideosurfaceformat.h>
#include <qvideowidgetcontrol.h>
-#include "DsCameraControl.h"
+#include "dscameracontrol.h"
QT_BEGIN_HEADER
diff --git a/src/plugins/directshow/directshow.pro b/src/plugins/directshow/directshow.pro
index 97f28342e..496769890 100644
--- a/src/plugins/directshow/directshow.pro
+++ b/src/plugins/directshow/directshow.pro
@@ -1,6 +1,7 @@
TARGET = dsengine
PLUGIN_TYPE=mediaservice
+PLUGIN_CLASS_NAME = DSServicePlugin
load(qt_plugin)
QT += multimedia
diff --git a/src/plugins/gstreamer/audiodecoder/audiodecoder.pro b/src/plugins/gstreamer/audiodecoder/audiodecoder.pro
index e559f7e02..8cd1d587e 100644
--- a/src/plugins/gstreamer/audiodecoder/audiodecoder.pro
+++ b/src/plugins/gstreamer/audiodecoder/audiodecoder.pro
@@ -1,6 +1,7 @@
TARGET = gstaudiodecoder
PLUGIN_TYPE = mediaservice
+PLUGIN_CLASS_NAME = QGstreamerAudioDecoderServicePlugin
load(qt_plugin)
include(../common.pri)
diff --git a/src/plugins/gstreamer/camerabin/camerabin.pro b/src/plugins/gstreamer/camerabin/camerabin.pro
index 5a2dde161..7f84fe54d 100644
--- a/src/plugins/gstreamer/camerabin/camerabin.pro
+++ b/src/plugins/gstreamer/camerabin/camerabin.pro
@@ -3,6 +3,7 @@ TARGET = gstcamerabin
QT += multimedia-private
PLUGIN_TYPE = mediaservice
+PLUGIN_CLASS_NAME = CameraBinServicePlugin
load(qt_plugin)
include(../common.pri)
diff --git a/src/plugins/gstreamer/mediacapture/mediacapture.pro b/src/plugins/gstreamer/mediacapture/mediacapture.pro
index 9c6cc3c5a..e8d039f8d 100644
--- a/src/plugins/gstreamer/mediacapture/mediacapture.pro
+++ b/src/plugins/gstreamer/mediacapture/mediacapture.pro
@@ -1,6 +1,7 @@
TARGET = gstmediacapture
PLUGIN_TYPE = mediaservice
+PLUGIN_CLASS_NAME = QGstreamerCaptureServicePlugin
load(qt_plugin)
include(../common.pri)
diff --git a/src/plugins/gstreamer/mediaplayer/mediaplayer.pro b/src/plugins/gstreamer/mediaplayer/mediaplayer.pro
index 70e5c8d0b..2ca9377db 100644
--- a/src/plugins/gstreamer/mediaplayer/mediaplayer.pro
+++ b/src/plugins/gstreamer/mediaplayer/mediaplayer.pro
@@ -1,6 +1,7 @@
TARGET = gstmediaplayer
PLUGIN_TYPE = mediaservice
+PLUGIN_CLASS_NAME = QGstreamerPlayerServicePlugin
load(qt_plugin)
include(../common.pri)
diff --git a/src/plugins/m3u/m3u.pro b/src/plugins/m3u/m3u.pro
index 875e815c1..3897e2de8 100644
--- a/src/plugins/m3u/m3u.pro
+++ b/src/plugins/m3u/m3u.pro
@@ -2,6 +2,7 @@ TARGET = qtmultimedia_m3u
QT += multimedia-private
PLUGIN_TYPE=playlistformats
+PLUGIN_CLASS_NAME = QM3uPlaylistPlugin
load(qt_plugin)
HEADERS += qm3uhandler.h
diff --git a/src/plugins/pulseaudio/pulseaudio.pro b/src/plugins/pulseaudio/pulseaudio.pro
index ac049dc21..e8ab9317c 100644
--- a/src/plugins/pulseaudio/pulseaudio.pro
+++ b/src/plugins/pulseaudio/pulseaudio.pro
@@ -2,6 +2,7 @@ TARGET = qtmedia_pulse
QT += multimedia-private
PLUGIN_TYPE = audio
+PLUGIN_CLASS_NAME = QPulseAudioPlugin
load(qt_plugin)
CONFIG += link_pkgconfig
diff --git a/src/plugins/qt7/qt7.pro b/src/plugins/qt7/qt7.pro
index edc3ddde6..ae87bd44a 100644
--- a/src/plugins/qt7/qt7.pro
+++ b/src/plugins/qt7/qt7.pro
@@ -8,6 +8,7 @@ QT += multimedia-private network
}
PLUGIN_TYPE = mediaservice
+PLUGIN_CLASS_NAME = QT7ServicePlugin
load(qt_plugin)
!simulator {
diff --git a/src/plugins/qt7/qt7movierenderer.mm b/src/plugins/qt7/qt7movierenderer.mm
index f1508294a..a55c44b18 100644
--- a/src/plugins/qt7/qt7movierenderer.mm
+++ b/src/plugins/qt7/qt7movierenderer.mm
@@ -55,7 +55,7 @@
#include <qabstractvideosurface.h>
#include <qvideosurfaceformat.h>
-#include <QtOpenGl/QGLContext>
+#include <QtOpenGL/QGLContext>
QT_USE_NAMESPACE
diff --git a/src/plugins/qt7/qt7movieviewoutput.mm b/src/plugins/qt7/qt7movieviewoutput.mm
index 9600872b3..a65fd24ef 100644
--- a/src/plugins/qt7/qt7movieviewoutput.mm
+++ b/src/plugins/qt7/qt7movieviewoutput.mm
@@ -39,7 +39,7 @@
**
****************************************************************************/
-#import <QTKit/QTkit.h>
+#import <QTKit/QTKit.h>
#include "qt7backend.h"
diff --git a/src/plugins/v4l/v4l.pro b/src/plugins/v4l/v4l.pro
index 92c561947..c5e953538 100644
--- a/src/plugins/v4l/v4l.pro
+++ b/src/plugins/v4l/v4l.pro
@@ -2,6 +2,7 @@ TARGET = qtmedia_v4lengine
QT += multimedia-private
PLUGIN_TYPE = mediaservice
+PLUGIN_CLASS_NAME = V4LServicePlugin
load(qt_plugin)
HEADERS += v4lserviceplugin.h
diff --git a/src/plugins/wmf/player/evr9videowindowcontrol.cpp b/src/plugins/wmf/player/evr9videowindowcontrol.cpp
index 0a50114dd..7f1c71332 100644
--- a/src/plugins/wmf/player/evr9videowindowcontrol.cpp
+++ b/src/plugins/wmf/player/evr9videowindowcontrol.cpp
@@ -57,27 +57,17 @@ Evr9VideoWindowControl::Evr9VideoWindowControl(QObject *parent)
, m_currentActivate(0)
, m_evrSink(0)
, m_displayControl(0)
+ , m_processor(0)
{
- if (FAILED(MFCreateVideoRendererActivate(0, &m_currentActivate))) {
- qWarning() << "Failed to create evr video renderer activate!";
- return;
- }
- if (FAILED(m_currentActivate->ActivateObject(IID_IMFMediaSink, (LPVOID*)(&m_evrSink)))) {
- qWarning() << "Failed to activate evr media sink!";
- return;
- }
- if (FAILED(MFGetService(m_evrSink, MR_VIDEO_RENDER_SERVICE, IID_PPV_ARGS(&m_displayControl)))) {
- qWarning() << "Failed to get display control from evr media sink!";
- return;
- }
- if (FAILED(MFGetService(m_evrSink, MR_VIDEO_MIXER_SERVICE, IID_PPV_ARGS(&m_processor)))) {
- qWarning() << "Failed to get video processor from evr media sink!";
- return;
- }
}
Evr9VideoWindowControl::~Evr9VideoWindowControl()
{
+ clear();
+}
+
+void Evr9VideoWindowControl::clear()
+{
if (m_processor)
m_processor->Release();
if (m_displayControl)
@@ -88,8 +78,12 @@ Evr9VideoWindowControl::~Evr9VideoWindowControl()
m_currentActivate->ShutdownObject();
m_currentActivate->Release();
}
-}
+ m_processor = NULL;
+ m_displayControl = NULL;
+ m_evrSink = NULL;
+ m_currentActivate = NULL;
+}
WId Evr9VideoWindowControl::winId() const
{
@@ -307,8 +301,32 @@ void Evr9VideoWindowControl::setSaturation(int saturation)
emit saturationChanged(saturation);
}
-IMFActivate* Evr9VideoWindowControl::currentActivate() const
+IMFActivate* Evr9VideoWindowControl::createActivate()
{
+ clear();
+
+ if (FAILED(MFCreateVideoRendererActivate(0, &m_currentActivate))) {
+ qWarning() << "Failed to create evr video renderer activate!";
+ return 0;
+ }
+ if (FAILED(m_currentActivate->ActivateObject(IID_IMFMediaSink, (LPVOID*)(&m_evrSink)))) {
+ qWarning() << "Failed to activate evr media sink!";
+ return 0;
+ }
+ if (FAILED(MFGetService(m_evrSink, MR_VIDEO_RENDER_SERVICE, IID_PPV_ARGS(&m_displayControl)))) {
+ qWarning() << "Failed to get display control from evr media sink!";
+ return 0;
+ }
+ if (FAILED(MFGetService(m_evrSink, MR_VIDEO_MIXER_SERVICE, IID_PPV_ARGS(&m_processor)))) {
+ qWarning() << "Failed to get video processor from evr media sink!";
+ return 0;
+ }
+
+ setWinId(m_windowId);
+ setDisplayRect(m_displayRect);
+ setAspectRatioMode(m_aspectRatioMode);
+ m_dirtyValues = DXVA2_ProcAmp_Brightness | DXVA2_ProcAmp_Contrast | DXVA2_ProcAmp_Hue | DXVA2_ProcAmp_Saturation;
+
return m_currentActivate;
}
diff --git a/src/plugins/wmf/player/evr9videowindowcontrol.h b/src/plugins/wmf/player/evr9videowindowcontrol.h
index d64447fdb..ea4bae56d 100644
--- a/src/plugins/wmf/player/evr9videowindowcontrol.h
+++ b/src/plugins/wmf/player/evr9videowindowcontrol.h
@@ -85,10 +85,12 @@ public:
int saturation() const;
void setSaturation(int saturation);
- IMFActivate* currentActivate() const;
+ IMFActivate* createActivate();
-private:
void setProcAmpValues();
+
+private:
+ void clear();
DXVA2_Fixed32 scaleProcAmpValue(DWORD prop, int value) const;
WId m_windowId;
diff --git a/src/plugins/wmf/player/mfaudioendpointcontrol.cpp b/src/plugins/wmf/player/mfaudioendpointcontrol.cpp
index 6d421fd06..7639f4f9e 100644
--- a/src/plugins/wmf/player/mfaudioendpointcontrol.cpp
+++ b/src/plugins/wmf/player/mfaudioendpointcontrol.cpp
@@ -46,17 +46,23 @@ MFAudioEndpointControl::MFAudioEndpointControl(QObject *parent)
: QAudioOutputSelectorControl(parent)
, m_currentActivate(0)
{
- updateEndpoints();
- setActiveOutput(m_defaultEndpoint);
}
MFAudioEndpointControl::~MFAudioEndpointControl()
{
+ clear();
+}
+
+void MFAudioEndpointControl::clear()
+{
+ m_activeEndpoint.clear();
+
foreach (LPWSTR wstrID, m_devices)
CoTaskMemFree(wstrID);
if (m_currentActivate)
m_currentActivate->Release();
+ m_currentActivate = NULL;
}
QList<QString> MFAudioEndpointControl::availableOutputs() const
@@ -119,8 +125,13 @@ void MFAudioEndpointControl::setActiveOutput(const QString &name)
m_activeEndpoint = name;
}
-IMFActivate* MFAudioEndpointControl::currentActivate() const
+IMFActivate* MFAudioEndpointControl::createActivate()
{
+ clear();
+
+ updateEndpoints();
+ setActiveOutput(m_defaultEndpoint);
+
return m_currentActivate;
}
diff --git a/src/plugins/wmf/player/mfaudioendpointcontrol.h b/src/plugins/wmf/player/mfaudioendpointcontrol.h
index 1e7fc58be..53c6657cb 100644
--- a/src/plugins/wmf/player/mfaudioendpointcontrol.h
+++ b/src/plugins/wmf/player/mfaudioendpointcontrol.h
@@ -68,9 +68,10 @@ public:
void setActiveOutput(const QString& name);
- IMFActivate* currentActivate() const;
+ IMFActivate* createActivate();
private:
+ void clear();
void updateEndpoints();
QString m_defaultEndpoint;
diff --git a/src/plugins/wmf/player/mfplayerservice.cpp b/src/plugins/wmf/player/mfplayerservice.cpp
index 2ca74ad3e..5bda9f983 100644
--- a/src/plugins/wmf/player/mfplayerservice.cpp
+++ b/src/plugins/wmf/player/mfplayerservice.cpp
@@ -71,6 +71,8 @@ MFPlayerService::MFPlayerService(QObject *parent)
MFPlayerService::~MFPlayerService()
{
+ m_session->close();
+
#ifndef Q_WS_SIMULATOR
if (m_videoWindowControl)
delete m_videoWindowControl;
@@ -79,7 +81,6 @@ MFPlayerService::~MFPlayerService()
if (m_videoRendererControl)
delete m_videoRendererControl;
- m_session->close();
m_session->Release();
}
diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp
index e9c40567c..d9ff0e7cb 100644
--- a/src/plugins/wmf/player/mfplayersession.cpp
+++ b/src/plugins/wmf/player/mfplayersession.cpp
@@ -411,8 +411,9 @@ MFPlayerSession::MFPlayerSession(MFPlayerService *playerService)
, m_volumeControl(0)
, m_netsourceStatistics(0)
, m_hCloseEvent(0)
+ , m_closing(false)
, m_pendingRate(1)
- , m_volume(1)
+ , m_volume(100)
, m_muted(false)
, m_status(QMediaPlayer::NoMedia)
, m_scrubbing(false)
@@ -422,10 +423,6 @@ MFPlayerSession::MFPlayerSession(MFPlayerService *playerService)
, m_audioSampleGrabberNode(0)
, m_videoProbeMFT(0)
{
- m_hCloseEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
- m_sourceResolver = new SourceResolver();
- QObject::connect(m_sourceResolver, SIGNAL(mediaSourceReady()), this, SLOT(handleMediaSourceReady()));
- QObject::connect(m_sourceResolver, SIGNAL(error(long)), this, SLOT(handleSourceError(long)));
QObject::connect(this, SIGNAL(sessionEvent(IMFMediaEvent *)), this, SLOT(handleSessionEvent(IMFMediaEvent *)));
m_pendingState = NoPending;
@@ -438,27 +435,31 @@ MFPlayerSession::MFPlayerSession(MFPlayerService *playerService)
m_request.prevCmd = CmdNone;
m_request.rate = 1.0f;
- createSession();
- PropVariantInit(&m_varStart);
- m_varStart.vt = VT_I8;
- m_varStart.uhVal.QuadPart = 0;
-
m_audioSampleGrabber = new AudioSampleGrabberCallback;
m_videoProbeMFT = new MFTransform;
}
void MFPlayerSession::close()
{
+#ifdef DEBUG_MEDIAFOUNDATION
+ qDebug() << "close";
+#endif
+
clear();
+ if (!m_session)
+ return;
+
HRESULT hr = S_OK;
if (m_session) {
+ m_closing = true;
hr = m_session->Close();
if (SUCCEEDED(hr)) {
- DWORD dwWaitResult = WaitForSingleObject(m_hCloseEvent, 5000);
+ DWORD dwWaitResult = WaitForSingleObject(m_hCloseEvent, 100);
if (dwWaitResult == WAIT_TIMEOUT) {
qWarning() << "session close time out!";
}
}
+ m_closing = false;
}
if (SUCCEEDED(hr)) {
@@ -475,7 +476,9 @@ void MFPlayerSession::close()
if (m_session)
m_session->Release();
m_session = 0;
- CloseHandle(m_hCloseEvent);
+ if (m_hCloseEvent)
+ CloseHandle(m_hCloseEvent);
+ m_hCloseEvent = 0;
}
void MFPlayerSession::addProbe(MFAudioProbeControl *probe)
@@ -522,6 +525,7 @@ void MFPlayerSession::load(const QMediaContent &media, QIODevice *stream)
changeStatus(QMediaPlayer::InvalidMedia);
emit error(QMediaPlayer::ResourceError, tr("Invalid stream source."), true);
} else {
+ createSession();
changeStatus(QMediaPlayer::LoadingMedia);
m_sourceResolver->load(resources, stream);
}
@@ -543,6 +547,10 @@ void MFPlayerSession::handleSourceError(long hr)
case NS_E_SERVER_NOT_FOUND:
errorString = tr("The specified server could not be found.");
break;
+ case MF_E_UNSUPPORTED_BYTESTREAM_TYPE:
+ errorCode = QMediaPlayer::FormatError;
+ errorString = tr("Unsupported media type.");
+ break;
default:
errorString = tr("Failed to load source.");
break;
@@ -638,6 +646,7 @@ void MFPlayerSession::setupPlaybackTopology(IMFMediaSource *source, IMFPresentat
break;
}
}
+ outputNode->Release();
}
sourceNode->Release();
}
@@ -703,14 +712,14 @@ IMFTopologyNode* MFPlayerSession::addOutputNode(IMFStreamDescriptor *streamDesc,
IMFActivate *activate = NULL;
if (MFMediaType_Audio == guidMajorType) {
mediaType = Audio;
- activate = m_playerService->audioEndpointControl()->currentActivate();
+ activate = m_playerService->audioEndpointControl()->createActivate();
} else if (MFMediaType_Video == guidMajorType) {
mediaType = Video;
if (m_playerService->videoRendererControl()) {
- activate = m_playerService->videoRendererControl()->currentActivate();
+ activate = m_playerService->videoRendererControl()->createActivate();
#ifndef Q_WS_SIMULATOR
} else if (m_playerService->videoWindowControl()) {
- activate = m_playerService->videoWindowControl()->currentActivate();
+ activate = m_playerService->videoWindowControl()->createActivate();
#endif
} else {
qWarning() << "no videoWindowControl or videoRendererControl, unable to add output node for video data";
@@ -1136,6 +1145,7 @@ void MFPlayerSession::pause()
} else {
if (m_state.command == CmdPause)
return;
+
if (SUCCEEDED(m_session->Pause())) {
m_state.setCommand(CmdPause);
m_pendingState = CmdPending;
@@ -1163,6 +1173,14 @@ QMediaPlayer::MediaStatus MFPlayerSession::status() const
void MFPlayerSession::createSession()
{
+ close();
+
+ m_hCloseEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+
+ m_sourceResolver = new SourceResolver();
+ QObject::connect(m_sourceResolver, SIGNAL(mediaSourceReady()), this, SLOT(handleMediaSourceReady()));
+ QObject::connect(m_sourceResolver, SIGNAL(error(long)), this, SLOT(handleSourceError(long)));
+
Q_ASSERT(m_session == NULL);
HRESULT hr = MFCreateMediaSession(NULL, &m_session);
if (FAILED(hr)) {
@@ -1176,6 +1194,10 @@ void MFPlayerSession::createSession()
changeStatus(QMediaPlayer::UnknownMediaStatus);
emit error(QMediaPlayer::ResourceError, tr("Unable to pull session events."), false);
}
+
+ PropVariantInit(&m_varStart);
+ m_varStart.vt = VT_I8;
+ m_varStart.hVal.QuadPart = 0;
}
qint64 MFPlayerSession::position()
@@ -1511,7 +1533,8 @@ HRESULT MFPlayerSession::Invoke(IMFAsyncResult *pResult)
}
}
- emit sessionEvent(pEvent);
+ if (!m_closing)
+ emit sessionEvent(pEvent);
return S_OK;
}
@@ -1569,6 +1592,13 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent)
case MESessionStarted:
if (!m_scrubbing)
updatePendingCommands(CmdStart);
+#ifndef Q_WS_SIMULATOR
+ // playback started, we can now set again the procAmpValues if they have been
+ // changed previously (these are lost when loading a new media)
+ if (m_playerService->videoWindowControl()) {
+ m_playerService->videoWindowControl()->setProcAmpValues();
+ }
+#endif
break;
case MESessionStopped:
if (m_status != QMediaPlayer::EndOfMedia) {
@@ -1595,6 +1625,37 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent)
qDebug() << "MEReconnectEnd" << ((hrStatus == S_OK) ? "OK" : "Failed");
#endif
break;
+ case MESessionTopologySet:
+ if (FAILED(hrStatus)) {
+ changeStatus(QMediaPlayer::InvalidMedia);
+ emit error(QMediaPlayer::FormatError, tr("Unsupported media, a codec is missing."), true);
+ } else {
+ if (m_audioSampleGrabberNode) {
+ IMFMediaType *mediaType = 0;
+ hr = MFGetTopoNodeCurrentType(m_audioSampleGrabberNode, 0, FALSE, &mediaType);
+ if (SUCCEEDED(hr)) {
+ m_audioSampleGrabber->setFormat(audioFormatForMFMediaType(mediaType));
+ mediaType->Release();
+ }
+ }
+
+ if (SUCCEEDED(MFGetService(m_session, MR_POLICY_VOLUME_SERVICE, IID_PPV_ARGS(&m_volumeControl)))) {
+ m_volumeControl->SetMasterVolume(m_volume * 0.01f);
+ m_volumeControl->SetMute(m_muted);
+ }
+
+ DWORD dwCharacteristics = 0;
+ m_sourceResolver->mediaSource()->GetCharacteristics(&dwCharacteristics);
+ emit seekableUpdate(MFMEDIASOURCE_CAN_SEEK & dwCharacteristics);
+
+ // Topology is resolved and successfuly set, this happens only after loading a new media.
+ // Make sure we always start the media from the beginning
+ m_varStart.vt = VT_I8;
+ m_varStart.hVal.QuadPart = 0;
+
+ changeStatus(QMediaPlayer::LoadedMedia);
+ }
+ break;
}
if (FAILED(hrStatus)) {
@@ -1631,9 +1692,10 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent)
if (m_volumeControl) {
float currentVolume = 1;
if (SUCCEEDED(m_volumeControl->GetMasterVolume(&currentVolume))) {
- if (currentVolume != m_volume) {
- m_volume = currentVolume;
- emit volumeChanged(int(m_volume * 100));
+ int scaledVolume = currentVolume * 100;
+ if (scaledVolume != m_volume) {
+ m_volume = scaledVolume;
+ emit volumeChanged(scaledVolume);
}
}
BOOL currentMuted = FALSE;
@@ -1645,26 +1707,6 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent)
}
}
break;
- case MESessionTopologySet: {
- if (m_audioSampleGrabberNode) {
- IMFMediaType *mediaType = 0;
- hr = MFGetTopoNodeCurrentType(m_audioSampleGrabberNode, 0, FALSE, &mediaType);
- if (SUCCEEDED(hr)) {
- m_audioSampleGrabber->setFormat(audioFormatForMFMediaType(mediaType));
- mediaType->Release();
- }
- }
-
- if (SUCCEEDED(MFGetService(m_session, MR_POLICY_VOLUME_SERVICE, IID_PPV_ARGS(&m_volumeControl)))) {
- m_volumeControl->SetMasterVolume(m_volume);
- m_volumeControl->SetMute(m_muted);
- }
- DWORD dwCharacteristics = 0;
- m_sourceResolver->mediaSource()->GetCharacteristics(&dwCharacteristics);
- emit seekableUpdate(MFMEDIASOURCE_CAN_SEEK & dwCharacteristics);
- changeStatus(QMediaPlayer::LoadedMedia);
- }
- break;
case MESessionTopologyStatus: {
UINT32 status;
if (SUCCEEDED(sessionEvent->GetUINT32(MF_EVENT_TOPOLOGY_STATUS, &status))) {
diff --git a/src/plugins/wmf/player/mfplayersession.h b/src/plugins/wmf/player/mfplayersession.h
index b050ad09f..b8b6f085e 100644
--- a/src/plugins/wmf/player/mfplayersession.h
+++ b/src/plugins/wmf/player/mfplayersession.h
@@ -178,6 +178,7 @@ private:
SourceResolver *m_sourceResolver;
HANDLE m_hCloseEvent;
+ bool m_closing;
enum MediaType
{
diff --git a/src/plugins/wmf/player/mfvideorenderercontrol.cpp b/src/plugins/wmf/player/mfvideorenderercontrol.cpp
index 8d47b1aac..c3c5c1ae4 100644
--- a/src/plugins/wmf/player/mfvideorenderercontrol.cpp
+++ b/src/plugins/wmf/player/mfvideorenderercontrol.cpp
@@ -2130,17 +2130,23 @@ namespace
MFVideoRendererControl::MFVideoRendererControl(QObject *parent)
: QVideoRendererControl(parent)
, m_surface(0)
+ , m_currentActivate(0)
, m_callback(0)
{
- m_currentActivate = new VideoRendererActivate(this);
}
MFVideoRendererControl::~MFVideoRendererControl()
{
+ clear();
+}
+
+void MFVideoRendererControl::clear()
+{
if (m_currentActivate) {
m_currentActivate->ShutdownObject();
m_currentActivate->Release();
}
+ m_currentActivate = NULL;
}
QAbstractVideoSurface *MFVideoRendererControl::surface() const
@@ -2150,9 +2156,6 @@ QAbstractVideoSurface *MFVideoRendererControl::surface() const
void MFVideoRendererControl::setSurface(QAbstractVideoSurface *surface)
{
- if (m_surface == surface)
- return;
-
if (m_surface)
disconnect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(supportedFormatsChanged()));
m_surface = surface;
@@ -2160,11 +2163,16 @@ void MFVideoRendererControl::setSurface(QAbstractVideoSurface *surface)
if (m_surface) {
connect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(supportedFormatsChanged()));
}
- static_cast<VideoRendererActivate*>(m_currentActivate)->setSurface(m_surface);
+
+ if (m_currentActivate)
+ static_cast<VideoRendererActivate*>(m_currentActivate)->setSurface(m_surface);
}
void MFVideoRendererControl::customEvent(QEvent *event)
{
+ if (!m_currentActivate)
+ return;
+
if (event->type() == MediaStream::PresentSurface) {
MFTIME targetTime = static_cast<MediaStream::PresentEvent*>(event)->targetTime();
MFTIME currentTime = static_cast<VideoRendererActivate*>(m_currentActivate)->getTime();
@@ -2185,16 +2193,26 @@ void MFVideoRendererControl::customEvent(QEvent *event)
void MFVideoRendererControl::supportedFormatsChanged()
{
- static_cast<VideoRendererActivate*>(m_currentActivate)->supportedFormatsChanged();
+ if (m_currentActivate)
+ static_cast<VideoRendererActivate*>(m_currentActivate)->supportedFormatsChanged();
}
void MFVideoRendererControl::present()
{
- static_cast<VideoRendererActivate*>(m_currentActivate)->present();
+ if (m_currentActivate)
+ static_cast<VideoRendererActivate*>(m_currentActivate)->present();
}
-IMFActivate* MFVideoRendererControl::currentActivate() const
+IMFActivate* MFVideoRendererControl::createActivate()
{
+ clear();
+
+ m_currentActivate = new VideoRendererActivate(this);
+ if (m_surface) {
+ setSurface(m_surface);
+ supportedFormatsChanged();
+ }
+
return m_currentActivate;
}
diff --git a/src/plugins/wmf/player/mfvideorenderercontrol.h b/src/plugins/wmf/player/mfvideorenderercontrol.h
index 25adcf269..ba04e73b7 100644
--- a/src/plugins/wmf/player/mfvideorenderercontrol.h
+++ b/src/plugins/wmf/player/mfvideorenderercontrol.h
@@ -58,7 +58,7 @@ public:
QAbstractVideoSurface *surface() const;
void setSurface(QAbstractVideoSurface *surface);
- IMFActivate* currentActivate() const;
+ IMFActivate* createActivate();
protected:
void customEvent(QEvent *event);
@@ -68,6 +68,8 @@ private Q_SLOTS:
void present();
private:
+ void clear();
+
QAbstractVideoSurface *m_surface;
IMFActivate *m_currentActivate;
IMFSampleGrabberSinkCallback *m_callback;
diff --git a/src/plugins/wmf/sourceresolver.cpp b/src/plugins/wmf/sourceresolver.cpp
index c5d99959a..9abe65845 100644
--- a/src/plugins/wmf/sourceresolver.cpp
+++ b/src/plugins/wmf/sourceresolver.cpp
@@ -108,6 +108,10 @@ STDMETHODIMP_(ULONG) SourceResolver::Release(void)
HRESULT STDMETHODCALLTYPE SourceResolver::Invoke(IMFAsyncResult *pAsyncResult)
{
QMutexLocker locker(&m_mutex);
+
+ if (!m_sourceResolver)
+ return S_OK;
+
MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID;
IUnknown* pSource = NULL;
State *state = static_cast<State*>(pAsyncResult->GetStateNoAddRef());
diff --git a/src/plugins/wmf/wmf.pro b/src/plugins/wmf/wmf.pro
index b9c2b4152..fcd2a3268 100644
--- a/src/plugins/wmf/wmf.pro
+++ b/src/plugins/wmf/wmf.pro
@@ -6,9 +6,9 @@ QT += multimedia-private network
}
PLUGIN_TYPE=mediaservice
+PLUGIN_CLASS_NAME = WMFServicePlugin
load(qt_plugin)
-DEPENDPATH += .
INCLUDEPATH += .
HEADERS += \
diff --git a/src/plugins/wmf/wmfserviceplugin.cpp b/src/plugins/wmf/wmfserviceplugin.cpp
index 9d1a359db..8cff66f30 100644
--- a/src/plugins/wmf/wmfserviceplugin.cpp
+++ b/src/plugins/wmf/wmfserviceplugin.cpp
@@ -92,8 +92,8 @@ QMediaService* WMFServicePlugin::create(QString const& key)
void WMFServicePlugin::release(QMediaService *service)
{
- releaseRefCount();
delete service;
+ releaseRefCount();
}
QMediaServiceProviderHint::Features WMFServicePlugin::supportedFeatures(