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; }
WMFAudioOutputSource::WMFAudioOutputSource( const mp4_demuxer::AudioDecoderConfig& aConfig) : mAudioChannels(aConfig.channel_count) , mAudioBytesPerSample(aConfig.bits_per_sample / 8) , mAudioRate(aConfig.samples_per_second) , mAudioFrameOffset(0) , mAudioFrameSum(0) , mMustRecaptureAudioPosition(true) { MOZ_COUNT_CTOR(WMFAudioOutputSource); AACAudioSpecificConfigToUserData(&aConfig.audio_specific_config[0], aConfig.audio_specific_config.length(), mUserData); }
WMFAudioMFTManager::WMFAudioMFTManager( const AudioInfo& aConfig) : mAudioChannels(aConfig.mChannels) , mAudioRate(aConfig.mRate) , mAudioFrameSum(0) , mMustRecaptureAudioPosition(true) { MOZ_COUNT_CTOR(WMFAudioMFTManager); if (aConfig.mMimeType.EqualsLiteral("audio/mpeg")) { mStreamType = MP3; } else if (aConfig.mMimeType.EqualsLiteral("audio/mp4a-latm")) { mStreamType = AAC; AACAudioSpecificConfigToUserData(aConfig.mProfile, aConfig.mCodecSpecificConfig->Elements(), aConfig.mCodecSpecificConfig->Length(), mUserData); } else { mStreamType = Unknown; } }
WMFAudioMFTManager::WMFAudioMFTManager( const mp4_demuxer::AudioDecoderConfig& aConfig) : mAudioChannels(aConfig.channel_count) , mAudioRate(aConfig.samples_per_second) , mAudioFrameOffset(0) , mAudioFrameSum(0) , mMustRecaptureAudioPosition(true) { MOZ_COUNT_CTOR(WMFAudioMFTManager); if (!strcmp(aConfig.mime_type, "audio/mpeg")) { mStreamType = MP3; } else if (!strcmp(aConfig.mime_type, "audio/mp4a-latm")) { mStreamType = AAC; AACAudioSpecificConfigToUserData(aConfig.aac_profile, aConfig.audio_specific_config->Elements(), aConfig.audio_specific_config->Length(), mUserData); } else { mStreamType = Unknown; } }