From 5eec4e2fbfc9134453dae245aff98a6e942172a0 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 25 May 2021 19:14:45 +0200 Subject: Fix crashes in the mediaplayerbackend autotest on windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix crashes on windows. There are still a couple of tests failing for now, those will get fixed in a separate change. Change-Id: Ifca7ae713929e33abbdf58a9952f79ed12333f31 Reviewed-by: André de la Rocha Reviewed-by: Lars Knoll --- .../platform/windows/player/mfplayercontrol.cpp | 1 + .../platform/windows/player/mfplayersession.cpp | 2 -- .../platform/windows/player/mfplayersession_p.h | 27 +++++++++++----------- .../windows/player/mfvideorenderercontrol.cpp | 16 ++++++------- 4 files changed, 23 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/multimedia/platform/windows/player/mfplayercontrol.cpp b/src/multimedia/platform/windows/player/mfplayercontrol.cpp index df481715f..c91d7b023 100644 --- a/src/multimedia/platform/windows/player/mfplayercontrol.cpp +++ b/src/multimedia/platform/windows/player/mfplayercontrol.cpp @@ -58,6 +58,7 @@ MFPlayerControl::MFPlayerControl(QMediaPlayer *player) MFPlayerControl::~MFPlayerControl() { + m_session->clearPlayer(); m_session->Release(); } diff --git a/src/multimedia/platform/windows/player/mfplayersession.cpp b/src/multimedia/platform/windows/player/mfplayersession.cpp index 414016a7b..cfda2a712 100644 --- a/src/multimedia/platform/windows/player/mfplayersession.cpp +++ b/src/multimedia/platform/windows/player/mfplayersession.cpp @@ -427,8 +427,6 @@ IMFTopologyNode* MFPlayerSession::addOutputNode(MediaType mediaType, IMFTopology } else if (mediaType == Video) { activate = m_videoRendererControl->createActivate(); -// } else if (m_playerService->videoWindowControl()) { -// activate = m_playerService->videoWindowControl()->createActivate(); } else { // Unknown stream type. emit error(QMediaPlayer::FormatError, tr("Unknown stream type."), false); diff --git a/src/multimedia/platform/windows/player/mfplayersession_p.h b/src/multimedia/platform/windows/player/mfplayersession_p.h index f3a671443..78ba00879 100644 --- a/src/multimedia/platform/windows/player/mfplayersession_p.h +++ b/src/multimedia/platform/windows/player/mfplayersession_p.h @@ -122,6 +122,7 @@ public: void changeStatus(QMediaPlayer::MediaStatus newStatus); void close(); + void clearPlayer() { m_playerControl = nullptr; } bool setAudioOutput(const QAudioDeviceInfo &device); QAudioDeviceInfo audioOutput() const { return m_audioOutput; } @@ -130,18 +131,18 @@ public: void setVideoSink(QVideoSink *sink); - void statusChanged() { m_playerControl->handleStatusChanged(); } - void audioAvailable() { m_playerControl->handleAudioAvailable(); } - void videoAvailable() { m_playerControl->handleVideoAvailable(); } - void durationUpdate(qint64 duration) { m_playerControl->handleDurationUpdate(duration); } - void seekableUpdate(bool seekable) { m_playerControl->handleSeekableUpdate(seekable); } - void error(QMediaPlayer::Error error, QString errorString, bool isFatal) { m_playerControl->handleError(error, errorString, isFatal); } - void playbackRateChanged(qreal rate) { m_playerControl->playbackRateChanged(rate); } - void volumeChanged(int volume) { m_playerControl->volumeChanged(volume); } - void mutedChanged(bool muted) { m_playerControl->mutedChanged(muted); } - void bufferProgressChanged(float percentFilled) { m_playerControl->bufferProgressChanged(percentFilled); } - void metaDataChanged() { m_playerControl->metaDataChanged(); } - void positionChanged(qint64 position) { m_playerControl->positionChanged(position); } + void statusChanged() { if (m_playerControl) m_playerControl->handleStatusChanged(); } + void audioAvailable() { if (m_playerControl) m_playerControl->handleAudioAvailable(); } + void videoAvailable() { if (m_playerControl) m_playerControl->handleVideoAvailable(); } + void durationUpdate(qint64 duration) { if (m_playerControl) m_playerControl->handleDurationUpdate(duration); } + void seekableUpdate(bool seekable) { if (m_playerControl) m_playerControl->handleSeekableUpdate(seekable); } + void error(QMediaPlayer::Error error, QString errorString, bool isFatal) { if (m_playerControl) m_playerControl->handleError(error, errorString, isFatal); } + void playbackRateChanged(qreal rate) { if (m_playerControl) m_playerControl->playbackRateChanged(rate); } + void volumeChanged(int volume) { if (m_playerControl) m_playerControl->volumeChanged(volume); } + void mutedChanged(bool muted) { if (m_playerControl) m_playerControl->mutedChanged(muted); } + void bufferProgressChanged(float percentFilled) { if (m_playerControl) m_playerControl->bufferProgressChanged(percentFilled); } + void metaDataChanged() { if (m_playerControl) m_playerControl->metaDataChanged(); } + void positionChanged(qint64 position) { if (m_playerControl) m_playerControl->positionChanged(position); } Q_SIGNALS: void sessionEvent(IMFMediaEvent *sessionEvent); @@ -153,7 +154,7 @@ private Q_SLOTS: private: long m_cRef; - MFPlayerControl *m_playerControl; + MFPlayerControl *m_playerControl = nullptr; MFVideoRendererControl *m_videoRendererControl = nullptr; IMFMediaSession *m_session; IMFPresentationClock *m_presentationClock; diff --git a/src/multimedia/platform/windows/player/mfvideorenderercontrol.cpp b/src/multimedia/platform/windows/player/mfvideorenderercontrol.cpp index a0f3e393b..5dae44c28 100644 --- a/src/multimedia/platform/windows/player/mfvideorenderercontrol.cpp +++ b/src/multimedia/platform/windows/player/mfvideorenderercontrol.cpp @@ -2244,16 +2244,16 @@ void MFVideoRendererControl::present() IMFActivate* MFVideoRendererControl::createActivate() { - Q_ASSERT(m_sink); - clear(); - // Create the EVR media sink, but replace the presenter with our own - if (SUCCEEDED(MFCreateVideoRendererActivate(::GetShellWindow(), &m_currentActivate))) { - m_presenterActivate = new EVRCustomPresenterActivate; - m_currentActivate->SetUnknown(MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_ACTIVATE, m_presenterActivate); - } else { - m_currentActivate = new VideoRendererActivate(this); + if (m_sink) { + // Create the EVR media sink, but replace the presenter with our own + if (SUCCEEDED(MFCreateVideoRendererActivate(::GetShellWindow(), &m_currentActivate))) { + m_presenterActivate = new EVRCustomPresenterActivate; + m_currentActivate->SetUnknown(MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_ACTIVATE, m_presenterActivate); + } else { + m_currentActivate = new VideoRendererActivate(this); + } } setSink(m_sink); -- cgit v1.2.3