summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-05-25 19:14:45 +0200
committerLars Knoll <lars.knoll@qt.io>2021-05-26 10:18:55 +0000
commit5eec4e2fbfc9134453dae245aff98a6e942172a0 (patch)
tree377f3e01fe407261f770678fd43991da957ba489 /src
parent23944677fdf465d4bf89bab65059ad1702bc5276 (diff)
Fix crashes in the mediaplayerbackend autotest on windows
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 <andre.rocha@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/multimedia/platform/windows/player/mfplayercontrol.cpp1
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession.cpp2
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession_p.h27
-rw-r--r--src/multimedia/platform/windows/player/mfvideorenderercontrol.cpp16
4 files changed, 23 insertions, 23 deletions
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);