diff options
author | Yoann Lopes <yoann.lopes@digia.com> | 2012-12-11 16:36:53 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-12-11 17:13:02 +0100 |
commit | 3f84142aaa0c63edf6fdc1e144ab29be51a29af9 (patch) | |
tree | fb1b8e0aebebc88dc4c38c29747bb11f5bd08269 /src | |
parent | 4b62c926b7d9c8a7ae1434b1bdac145882512487 (diff) |
WMF: Improved error reporting.
When loading the source fails because the file format is not supported, we
now report a FormatError instead of a ResourceError.
When the file format is supported but the media cannot be played (topology
cannot be resolved), it is most likely caused by a missing codec and we
then report a FormatError.
Change-Id: I101a86c129a0c5dccb543fc1247cb741994684fd
Reviewed-by: Andy Nichols <andy.nichols@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/wmf/player/mfplayersession.cpp | 62 |
1 files changed, 35 insertions, 27 deletions
diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 7b35af43a..1eb91c203 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -547,6 +547,10 @@ void MFPlayerSession::handleSourceError(long hr) case NS_E_SERVER_NOT_FOUND: errorString = tr("The specified server could not be found."); break; + case MF_E_UNSUPPORTED_BYTESTREAM_TYPE: + errorCode = QMediaPlayer::FormatError; + errorString = tr("Unsupported media type."); + break; default: errorString = tr("Failed to load source."); break; @@ -1621,6 +1625,37 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) qDebug() << "MEReconnectEnd" << ((hrStatus == S_OK) ? "OK" : "Failed"); #endif break; + case MESessionTopologySet: + if (FAILED(hrStatus)) { + changeStatus(QMediaPlayer::InvalidMedia); + emit error(QMediaPlayer::FormatError, tr("Unsupported media, a codec is missing."), true); + } else { + if (m_audioSampleGrabberNode) { + IMFMediaType *mediaType = 0; + hr = MFGetTopoNodeCurrentType(m_audioSampleGrabberNode, 0, FALSE, &mediaType); + if (SUCCEEDED(hr)) { + m_audioSampleGrabber->setFormat(audioFormatForMFMediaType(mediaType)); + mediaType->Release(); + } + } + + if (SUCCEEDED(MFGetService(m_session, MR_POLICY_VOLUME_SERVICE, IID_PPV_ARGS(&m_volumeControl)))) { + m_volumeControl->SetMasterVolume(m_volume); + m_volumeControl->SetMute(m_muted); + } + + DWORD dwCharacteristics = 0; + m_sourceResolver->mediaSource()->GetCharacteristics(&dwCharacteristics); + emit seekableUpdate(MFMEDIASOURCE_CAN_SEEK & dwCharacteristics); + + // Topology is resolved and successfuly set, this happens only after loading a new media. + // Make sure we always start the media from the beginning + m_varStart.vt = VT_I8; + m_varStart.hVal.QuadPart = 0; + + changeStatus(QMediaPlayer::LoadedMedia); + } + break; } if (FAILED(hrStatus)) { @@ -1671,33 +1706,6 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) } } break; - case MESessionTopologySet: { - if (m_audioSampleGrabberNode) { - IMFMediaType *mediaType = 0; - hr = MFGetTopoNodeCurrentType(m_audioSampleGrabberNode, 0, FALSE, &mediaType); - if (SUCCEEDED(hr)) { - m_audioSampleGrabber->setFormat(audioFormatForMFMediaType(mediaType)); - mediaType->Release(); - } - } - - if (SUCCEEDED(MFGetService(m_session, MR_POLICY_VOLUME_SERVICE, IID_PPV_ARGS(&m_volumeControl)))) { - m_volumeControl->SetMasterVolume(m_volume); - m_volumeControl->SetMute(m_muted); - } - - DWORD dwCharacteristics = 0; - m_sourceResolver->mediaSource()->GetCharacteristics(&dwCharacteristics); - emit seekableUpdate(MFMEDIASOURCE_CAN_SEEK & dwCharacteristics); - - // Topology is resolved and successfuly set, this happens only after loading a new media. - // Make sure we always start the media from the beginning - m_varStart.vt = VT_I8; - m_varStart.hVal.QuadPart = 0; - - changeStatus(QMediaPlayer::LoadedMedia); - } - break; case MESessionTopologyStatus: { UINT32 status; if (SUCCEEDED(sessionEvent->GetUINT32(MF_EVENT_TOPOLOGY_STATUS, &status))) { |