diff options
Diffstat (limited to 'src/plugins')
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(¤tVolume))) { - 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( |