HRESULT MFTDecoder::SetMediaTypes(IMFMediaType* aInputType, const GUID& aOutputSubType) { mOutputSubtype = aOutputSubType; // Set the input type to the one the caller gave us... HRESULT hr = mDecoder->SetInputType(0, aInputType, 0); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); hr = SetDecoderOutputType(); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); hr = mDecoder->GetInputStreamInfo(0, &mInputStreamInfo); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); hr = mDecoder->GetOutputStreamInfo(0, &mOutputStreamInfo); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); mMFTProvidesOutputSamples = IsFlagSet(mOutputStreamInfo.dwFlags, MFT_OUTPUT_STREAM_PROVIDES_SAMPLES); hr = SendMFTMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, 0); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); hr = SendMFTMessage(MFT_MESSAGE_NOTIFY_START_OF_STREAM, 0); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); return S_OK; }
HRESULT MFTDecoder::SetMediaTypes(IMFMediaType* aInputType, IMFMediaType* aOutputType, ConfigureOutputCallback aCallback, void* aData) { mOutputType = aOutputType; // Set the input type to the one the caller gave us... HRESULT hr = mDecoder->SetInputType(0, aInputType, 0); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); hr = SetDecoderOutputType(aCallback, aData); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); hr = mDecoder->GetInputStreamInfo(0, &mInputStreamInfo); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); hr = SendMFTMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, 0); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); hr = SendMFTMessage(MFT_MESSAGE_NOTIFY_START_OF_STREAM, 0); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); return S_OK; }
HRESULT WMFAACDecoder::Init(int32_t aChannelCount, int32_t aSampleRate, BYTE* aAACAudioSpecificConfig, UINT32 aAudioConfigLength) { HRESULT hr; // AAC decoder is in msauddecmft on Win8, and msmpeg2adec in earlier versions. hr = CreateMFT(CLSID_CMSAACDecMFT, WMFDecoderDllNameFor(AAC), mDecoder); if (FAILED(hr)) { hr = CreateMFT(CLSID_CMSAACDecMFT, WMFDecoderDllNameFor(AAC), mDecoder); if (FAILED(hr)) { LOG("Failed to create AAC decoder\n"); return E_FAIL; } } BYTE* userData = nullptr; UINT32 userDataLength; hr = AACAudioSpecificConfigToUserData(aAACAudioSpecificConfig, aAudioConfigLength, &userData, &userDataLength); ENSURE(SUCCEEDED(hr), hr); hr = SetDecoderInputType(aChannelCount, aSampleRate, userData, userDataLength); delete userData; ENSURE(SUCCEEDED(hr), hr); hr = SetDecoderOutputType(); ENSURE(SUCCEEDED(hr), hr); hr = SendMFTMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, 0); ENSURE(SUCCEEDED(hr), hr); hr = SendMFTMessage(MFT_MESSAGE_NOTIFY_START_OF_STREAM, 0); ENSURE(SUCCEEDED(hr), hr); hr = mDecoder->GetInputStreamInfo(0, &mInputStreamInfo); ENSURE(SUCCEEDED(hr), hr); hr = mDecoder->GetOutputStreamInfo(0, &mOutputStreamInfo); ENSURE(SUCCEEDED(hr), hr); return S_OK; }
HRESULT WMFAACDecoder::Drain() { HRESULT hr = SendMFTMessage(MFT_MESSAGE_COMMAND_DRAIN, 0); ENSURE(SUCCEEDED(hr), hr); return S_OK; }
HRESULT WMFAACDecoder::Reset() { HRESULT hr = SendMFTMessage(MFT_MESSAGE_COMMAND_FLUSH, 0); ENSURE(SUCCEEDED(hr), hr); return S_OK; }
HRESULT MFTDecoder::Flush() { HRESULT hr = SendMFTMessage(MFT_MESSAGE_COMMAND_FLUSH, 0); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); mDiscontinuity = true; return S_OK; }