18ComPtr<IMFMediaType> MFDecoderSourceReader::setSource(
const ComPtr<IMFMediaSource> &source, QAudioFormat::SampleFormat sampleFormat)
20 ComPtr<IMFMediaType> mediaType;
21 m_sourceReader.Reset();
23 if (m_sourceReaderCallback) {
24 disconnect(m_sourceReaderCallback.Get());
26 m_sourceReaderCallback.Reset();
32 m_sourceReaderCallback = makeComObject<MFSourceReaderCallback>();
34 connect(m_sourceReaderCallback.Get(), &MFSourceReaderCallback::finished,
this,
35 &MFDecoderSourceReader::finished);
36 connect(m_sourceReaderCallback.Get(), &MFSourceReaderCallback::newSample,
this,
37 &MFDecoderSourceReader::newSample);
39 ComPtr<IMFAttributes> attr;
40 MFCreateAttributes(attr.GetAddressOf(), 1);
41 if (FAILED(attr->SetUnknown(MF_SOURCE_READER_ASYNC_CALLBACK, m_sourceReaderCallback.Get())))
43 if (FAILED(attr->SetUINT32(MF_SOURCE_READER_DISCONNECT_MEDIASOURCE_ON_SHUTDOWN, TRUE)))
46 HRESULT hr = MFCreateSourceReaderFromMediaSource(source.Get(), attr.Get(), m_sourceReader.GetAddressOf());
48 qWarning() <<
"MFDecoderSourceReader: failed to set up source reader: "
49 << std::system_category().message(hr).c_str();
53 m_sourceReader->SetStreamSelection(DWORD(MF_SOURCE_READER_ALL_STREAMS), FALSE);
54 m_sourceReader->SetStreamSelection(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), TRUE);
56 ComPtr<IMFMediaType> pPartialType;
57 MFCreateMediaType(pPartialType.GetAddressOf());
58 pPartialType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
59 pPartialType->SetGUID(MF_MT_SUBTYPE, sampleFormat == QAudioFormat::Float ? MFAudioFormat_Float : MFAudioFormat_PCM);
60 m_sourceReader->SetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM),
nullptr, pPartialType.Get());
61 m_sourceReader->GetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), mediaType.GetAddressOf());
63 m_sourceReader->SetStreamSelection(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), TRUE);