summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndré de la Rocha <andre.rocha@qt.io>2022-04-30 15:38:48 +0200
committerAndré de la Rocha <andre.rocha@qt.io>2022-05-08 23:37:57 +0200
commit19c05fb683d7f4d5bae50dbd2bf9f82b936d124a (patch)
treef4c90a8f5a39fecc810d508aaf8939883449eba7
parent91acf71165216b335dde22eb3fe22f5c486a5589 (diff)
Windows: Avoid changing the player topology for HEVC
Changing the topology after a HEVC stream is loaded fails, while it works as expected for other codecs. This causes other issues as the player enters an error state. Ignoring the track change for HEVC streams as a workaround. Also giving more time for closing the session. Fixes: QTBUG-102707 Change-Id: Ie02951130df5fc809f89d564a7442ea0e4d16b6b Reviewed-by: Lars Knoll <lars.knoll@qt.io> (cherry picked from commit 7105c492621fc618799e57d06c94a6b816561770) Reviewed-by: Piotr Srebrny <piotr.srebrny@qt.io>
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession.cpp24
-rw-r--r--src/multimedia/platform/windows/player/mfplayersession_p.h3
2 files changed, 22 insertions, 5 deletions
diff --git a/src/multimedia/platform/windows/player/mfplayersession.cpp b/src/multimedia/platform/windows/player/mfplayersession.cpp
index 75a5e4466..84b71a8e9 100644
--- a/src/multimedia/platform/windows/player/mfplayersession.cpp
+++ b/src/multimedia/platform/windows/player/mfplayersession.cpp
@@ -152,7 +152,7 @@ void MFPlayerSession::close()
m_closing = true;
hr = m_session->Close();
if (SUCCEEDED(hr)) {
- DWORD dwWaitResult = WaitForSingleObject(m_hCloseEvent, 100);
+ DWORD dwWaitResult = WaitForSingleObject(m_hCloseEvent, 2000);
if (dwWaitResult == WAIT_TIMEOUT) {
qWarning() << "session close time out!";
}
@@ -283,9 +283,10 @@ void MFPlayerSession::handleMediaSourceReady()
bool MFPlayerSession::getStreamInfo(IMFStreamDescriptor *stream,
MFPlayerSession::MediaType *type,
QString *name,
- QString *language) const
+ QString *language,
+ GUID *format) const
{
- if (!stream || !type || !name || !language)
+ if (!stream || !type || !name || !language || !format)
return false;
*type = Unknown;
@@ -319,6 +320,13 @@ bool MFPlayerSession::getStreamInfo(IMFStreamDescriptor *stream,
else if (guidMajorType == MFMediaType_Video)
*type = Video;
}
+
+ IMFMediaType *mediaType = nullptr;
+ if (SUCCEEDED(typeHandler->GetCurrentMediaType(&mediaType))) {
+ mediaType->GetGUID(MF_MT_SUBTYPE, format);
+ mediaType->Release();
+ }
+
typeHandler->Release();
}
@@ -359,8 +367,9 @@ void MFPlayerSession::setupPlaybackTopology(IMFMediaSource *source, IMFPresentat
MediaType mediaType = Unknown;
QString streamName;
QString streamLanguage;
+ GUID format = GUID_NULL;
- if (getStreamInfo(streamDesc, &mediaType, &streamName, &streamLanguage)) {
+ if (getStreamInfo(streamDesc, &mediaType, &streamName, &streamLanguage, &format)) {
QPlatformMediaPlayer::TrackType trackType = (mediaType == Audio) ?
QPlatformMediaPlayer::AudioStream : QPlatformMediaPlayer::VideoStream;
@@ -374,6 +383,7 @@ void MFPlayerSession::setupPlaybackTopology(IMFMediaSource *source, IMFPresentat
m_trackInfo[trackType].metaData.append(metaData);
m_trackInfo[trackType].nativeIndexes.append(i);
+ m_trackInfo[trackType].format = format;
if (((m_mediaTypes & mediaType) == 0) && selected) { // Check if this type isn't already added
IMFTopologyNode *sourceNode = addSourceNode(topology, source, sourcePD, streamDesc);
@@ -1904,6 +1914,7 @@ void MFPlayerSession::clear()
m_trackInfo[i].currentIndex = -1;
m_trackInfo[i].sourceNodeId = TOPOID(-1);
m_trackInfo[i].outputNodeId = TOPOID(-1);
+ m_trackInfo[i].format = GUID_NULL;
}
if (!m_metaData.isEmpty()) {
@@ -1982,6 +1993,11 @@ void MFPlayerSession::setActiveTrack(QPlatformMediaPlayer::TrackType type, int i
if (index < -1 || index >= nativeIndexes.count())
return;
+ // Updating the topology fails if there is a HEVC video stream,
+ // which causes other issues. Ignoring the change, for now.
+ if (m_trackInfo[QPlatformMediaPlayer::VideoStream].format == MFVideoFormat_HEVC)
+ return;
+
IMFTopology *topology = nullptr;
if (SUCCEEDED(m_session->GetFullTopology(QMM_MFSESSION_GETFULLTOPOLOGY_CURRENT, 0, &topology))) {
diff --git a/src/multimedia/platform/windows/player/mfplayersession_p.h b/src/multimedia/platform/windows/player/mfplayersession_p.h
index 8f1af9f8b..cb5e48a6c 100644
--- a/src/multimedia/platform/windows/player/mfplayersession_p.h
+++ b/src/multimedia/platform/windows/player/mfplayersession_p.h
@@ -243,6 +243,7 @@ private:
int currentIndex = -1;
TOPOID sourceNodeId = -1;
TOPOID outputNodeId = -1;
+ GUID format = GUID_NULL;
};
TrackInfo m_trackInfo[QPlatformMediaPlayer::NTrackTypes];
@@ -258,7 +259,7 @@ private:
void createSession();
void setupPlaybackTopology(IMFMediaSource *source, IMFPresentationDescriptor *sourcePD);
- bool getStreamInfo(IMFStreamDescriptor *stream, MFPlayerSession::MediaType *type, QString *name, QString *language) const;
+ bool getStreamInfo(IMFStreamDescriptor *stream, MFPlayerSession::MediaType *type, QString *name, QString *language, GUID *format) const;
IMFTopologyNode* addSourceNode(IMFTopology* topology, IMFMediaSource* source,
IMFPresentationDescriptor* presentationDesc, IMFStreamDescriptor *streamDesc);
IMFTopologyNode* addOutputNode(MediaType mediaType, IMFTopology* topology, DWORD sinkID);