nsresult AppleATDecoder::GetImplicitAACMagicCookie(const MediaRawData* aSample) { MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn()); // Prepend ADTS header to AAC audio. RefPtr<MediaRawData> adtssample(aSample->Clone()); if (!adtssample) { return NS_ERROR_OUT_OF_MEMORY; } int8_t frequency_index = mp4_demuxer::Adts::GetFrequencyIndex(mConfig.mRate); bool rv = mp4_demuxer::Adts::ConvertSample(mConfig.mChannels, frequency_index, mConfig.mProfile, adtssample); if (!rv) { NS_WARNING("Failed to apply ADTS header"); return NS_ERROR_FAILURE; } if (!mStream) { OSStatus rv = AudioFileStreamOpen(this, _MetadataCallback, _SampleCallback, kAudioFileAAC_ADTSType, &mStream); if (rv) { NS_WARNING("Couldn't open AudioFileStream"); return NS_ERROR_FAILURE; } } OSStatus status = AudioFileStreamParseBytes(mStream, adtssample->Size(), adtssample->Data(), 0 /* discontinuity */); if (status) { NS_WARNING("Couldn't parse sample"); } if (status || mFileStreamError || mMagicCookie.Length()) { // We have decoded a magic cookie or an error occurred as such // we won't need the stream any longer. AudioFileStreamClose(mStream); mStream = nullptr; } return (mFileStreamError || status) ? NS_ERROR_FAILURE : NS_OK; }
nsresult AppleATDecoder::GetImplicitAACMagicCookie(const mp4_demuxer::MP4Sample* aSample) { // Prepend ADTS header to AAC audio. nsAutoPtr<mp4_demuxer::MP4Sample> adtssample(aSample->Clone()); if (!adtssample) { return NS_ERROR_OUT_OF_MEMORY; } bool rv = mp4_demuxer::Adts::ConvertSample(mConfig.channel_count, mConfig.frequency_index, mConfig.aac_profile, adtssample); if (!rv) { NS_WARNING("Failed to apply ADTS header"); return NS_ERROR_FAILURE; } if (!mStream) { OSStatus rv = AudioFileStreamOpen(this, _MetadataCallback, _SampleCallback, kAudioFileAAC_ADTSType, &mStream); if (rv) { NS_WARNING("Couldn't open AudioFileStream"); return NS_ERROR_FAILURE; } } OSStatus status = AudioFileStreamParseBytes(mStream, adtssample->size, adtssample->data, 0 /* discontinuity */); if (status) { NS_WARNING("Couldn't parse sample"); } if (status || mFileStreamError || mMagicCookie.Length()) { // We have decoded a magic cookie or an error occurred as such // we won't need the stream any longer. AudioFileStreamClose(mStream); mStream = nullptr; } return (mFileStreamError || status) ? NS_ERROR_FAILURE : NS_OK; }