14ComPtr<IMFMediaType> MFDecoderSourceReader::setSource(IMFMediaSource *source, QAudioFormat::SampleFormat sampleFormat)
16 ComPtr<IMFMediaType> mediaType;
17 m_sourceReader.Reset();
19 if (m_sourceReaderCallback) {
20 disconnect(m_sourceReaderCallback.Get());
22 m_sourceReaderCallback.Reset();
28 m_sourceReaderCallback = makeComObject<MFSourceReaderCallback>();
30 connect(m_sourceReaderCallback.Get(), &MFSourceReaderCallback::finished,
this,
31 &MFDecoderSourceReader::finished);
32 connect(m_sourceReaderCallback.Get(), &MFSourceReaderCallback::newSample,
this,
33 &MFDecoderSourceReader::newSample);
35 ComPtr<IMFAttributes> attr;
36 MFCreateAttributes(attr.GetAddressOf(), 1);
37 if (FAILED(attr->SetUnknown(MF_SOURCE_READER_ASYNC_CALLBACK, m_sourceReaderCallback.Get())))
39 if (FAILED(attr->SetUINT32(MF_SOURCE_READER_DISCONNECT_MEDIASOURCE_ON_SHUTDOWN, TRUE)))
42 HRESULT hr = MFCreateSourceReaderFromMediaSource(source, attr.Get(), m_sourceReader.GetAddressOf());
44 qWarning() <<
"MFDecoderSourceReader: failed to set up source reader: "
45 << std::system_category().message(hr).c_str();
49 m_sourceReader->SetStreamSelection(DWORD(MF_SOURCE_READER_ALL_STREAMS), FALSE);
50 m_sourceReader->SetStreamSelection(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), TRUE);
52 ComPtr<IMFMediaType> pPartialType;
53 MFCreateMediaType(pPartialType.GetAddressOf());
54 pPartialType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
55 pPartialType->SetGUID(MF_MT_SUBTYPE, sampleFormat == QAudioFormat::Float ? MFAudioFormat_Float : MFAudioFormat_PCM);
56 m_sourceReader->SetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM),
nullptr, pPartialType.Get());
57 m_sourceReader->GetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), mediaType.GetAddressOf());
59 m_sourceReader->SetStreamSelection(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), TRUE);