diff options
author | Vladimir Belyavsky <belyavskyv@gmail.com> | 2022-05-06 16:16:17 +0300 |
---|---|---|
committer | Vladimir Belyavsky <belyavskyv@gmail.com> | 2022-05-11 11:09:33 +0300 |
commit | 3fe9a114aefdaed6352dba99dd6d3ffa81712075 (patch) | |
tree | 3fc149e9cc4df51b8a81cdd7761ecfdb45d02d91 | |
parent | 087284a166a433583851d24253d4ac8dbd1c39c6 (diff) |
WMF: improve errors handling in session creation logic
Additional changes to 44349054855e484cdd479a9b54d4183dfc51c654:
- Don't create extra objects in case when MFCreateMediaSession() or
IMFMediaSession::BeginGetEvent() fail.
- Avoid loading a source when MFPlayerSession::createSession()
failed for some reason.
Plus replace old connect syntax with new one in the affected code.
Fixes: QTBUG-103272
Change-Id: I9472ea81a9a59809e3a5956e9a7b4005ee8a8199
Reviewed-by: André de la Rocha <andre.rocha@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit 99d41ce066eadce99da5cc61dbd76a2e661986ee)
-rw-r--r-- | src/multimedia/platform/windows/player/mfplayersession.cpp | 32 | ||||
-rw-r--r-- | src/multimedia/platform/windows/player/mfplayersession_p.h | 2 |
2 files changed, 18 insertions, 16 deletions
diff --git a/src/multimedia/platform/windows/player/mfplayersession.cpp b/src/multimedia/platform/windows/player/mfplayersession.cpp index 84b71a8e9..04fcf6e7b 100644 --- a/src/multimedia/platform/windows/player/mfplayersession.cpp +++ b/src/multimedia/platform/windows/player/mfplayersession.cpp @@ -212,8 +212,7 @@ void MFPlayerSession::load(const QUrl &url, QIODevice *stream) close(); changeStatus(QMediaPlayer::InvalidMedia); emit error(QMediaPlayer::ResourceError, tr("Invalid stream source."), true); - } else { - createSession(); + } else if (createSession()) { changeStatus(QMediaPlayer::LoadingMedia); m_sourceResolver->load(url, stream); m_updateRoutingOnStart = true; @@ -1166,36 +1165,39 @@ QMediaPlayer::MediaStatus MFPlayerSession::status() const return m_status; } -void MFPlayerSession::createSession() +bool 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))); - - m_videoProbeMFT = new MFTransform; -// for (int i = 0; i < m_videoProbes.size(); ++i) -// m_videoProbeMFT->addProbe(m_videoProbes.at(i)); - Q_ASSERT(m_session == NULL); + HRESULT hr = MFCreateMediaSession(NULL, &m_session); if (FAILED(hr)) { changeStatus(QMediaPlayer::InvalidMedia); emit error(QMediaPlayer::ResourceError, tr("Unable to create mediasession."), true); - return; + return false; } - hr = m_session->BeginGetEvent(this, m_session); + m_hCloseEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + hr = m_session->BeginGetEvent(this, m_session); if (FAILED(hr)) { changeStatus(QMediaPlayer::InvalidMedia); emit error(QMediaPlayer::ResourceError, tr("Unable to pull session events."), false); + close(); + return false; } + m_sourceResolver = new SourceResolver(); + QObject::connect(m_sourceResolver, &SourceResolver::mediaSourceReady, this, &MFPlayerSession::handleMediaSourceReady); + QObject::connect(m_sourceResolver, &SourceResolver::error, this, &MFPlayerSession::handleSourceError); + + m_videoProbeMFT = new MFTransform; +// for (int i = 0; i < m_videoProbes.size(); ++i) +// m_videoProbeMFT->addProbe(m_videoProbes.at(i)); + m_position = 0; + return true; } qint64 MFPlayerSession::position() diff --git a/src/multimedia/platform/windows/player/mfplayersession_p.h b/src/multimedia/platform/windows/player/mfplayersession_p.h index cb5e48a6c..1f3555ba8 100644 --- a/src/multimedia/platform/windows/player/mfplayersession_p.h +++ b/src/multimedia/platform/windows/player/mfplayersession_p.h @@ -257,7 +257,7 @@ private: void setVolumeInternal(float volume); - void createSession(); + bool createSession(); void setupPlaybackTopology(IMFMediaSource *source, IMFPresentationDescriptor *sourcePD); bool getStreamInfo(IMFStreamDescriptor *stream, MFPlayerSession::MediaType *type, QString *name, QString *language, GUID *format) const; IMFTopologyNode* addSourceNode(IMFTopology* topology, IMFMediaSource* source, |