diff options
author | André de la Rocha <andre.rocha@qt.io> | 2022-04-30 15:38:48 +0200 |
---|---|---|
committer | André de la Rocha <andre.rocha@qt.io> | 2022-05-08 23:37:57 +0200 |
commit | 19c05fb683d7f4d5bae50dbd2bf9f82b936d124a (patch) | |
tree | f4c90a8f5a39fecc810d508aaf8939883449eba7 | |
parent | 91acf71165216b335dde22eb3fe22f5c486a5589 (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.cpp | 24 | ||||
-rw-r--r-- | src/multimedia/platform/windows/player/mfplayersession_p.h | 3 |
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); |