summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Belyavsky <belyavskyv@gmail.com>2022-05-06 16:16:17 +0300
committerVladimir Belyavsky <belyavskyv@gmail.com>2022-05-11 11:09:33 +0300
commit3fe9a114aefdaed6352dba99dd6d3ffa81712075 (patch)
tree3fc149e9cc4df51b8a81cdd7761ecfdb45d02d91
parent087284a166a433583851d24253d4ac8dbd1c39c6 (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.cpp32
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession_p.h2
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,