From 4c1d0136c904413d0709dc6b481fc8b88f645a0e Mon Sep 17 00:00:00 2001 From: Alex Chronopoulos Date: Thu, 18 Jun 2020 15:50:03 +0000 Subject: [PATCH] Bug 1584959 - Avoid calling the converter if the conversion is not possible. r=bryce Differential Revision: https://phabricator.services.mozilla.com/D56736 --- dom/media/AudioConverter.cpp | 29 +++++++++++++++++++++-------- dom/media/AudioConverter.h | 1 + dom/media/mediasink/AudioSink.cpp | 12 +++++++++--- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/dom/media/AudioConverter.cpp b/dom/media/AudioConverter.cpp index bf03d8c79a00..d2eb7335a997 100644 --- a/dom/media/AudioConverter.cpp +++ b/dom/media/AudioConverter.cpp @@ -21,14 +21,8 @@ namespace mozilla { AudioConverter::AudioConverter(const AudioConfig& aIn, const AudioConfig& aOut) : mIn(aIn), mOut(aOut), mResampler(nullptr) { - MOZ_DIAGNOSTIC_ASSERT( - aIn.Format() == aOut.Format() && aIn.Interleaved() == aOut.Interleaved(), - "No format or rate conversion is supported at this stage"); - MOZ_DIAGNOSTIC_ASSERT( - aOut.Channels() <= 2 || aIn.Channels() == aOut.Channels(), - "Only down/upmixing to mono or stereo is supported at this stage"); - MOZ_DIAGNOSTIC_ASSERT(aOut.Interleaved(), - "planar audio format not supported"); + MOZ_DIAGNOSTIC_ASSERT(CanConvert(aIn, aOut), + "The conversion is not supported"); mIn.Layout().MappingTable(mOut.Layout(), &mChannelOrderMap); if (aIn.Rate() != aOut.Rate()) { RecreateResampler(); @@ -42,6 +36,25 @@ AudioConverter::~AudioConverter() { } } +bool AudioConverter::CanConvert(const AudioConfig& aIn, + const AudioConfig& aOut) { + if (aIn.Format() != aOut.Format() || + aIn.Interleaved() != aOut.Interleaved()) { + NS_WARNING("No format conversion is supported at this stage"); + return false; + } + if (aIn.Channels() != aOut.Channels() && aOut.Channels() > 2) { + NS_WARNING( + "Only down/upmixing to mono or stereo is supported at this stage"); + return false; + } + if (!aOut.Interleaved()) { + NS_WARNING("planar audio format not supported"); + return false; + } + return true; +} + bool AudioConverter::CanWorkInPlace() const { bool needDownmix = mIn.Channels() > mOut.Channels(); bool needUpmix = mIn.Channels() < mOut.Channels(); diff --git a/dom/media/AudioConverter.h b/dom/media/AudioConverter.h index 40e88b664b01..0ace580b26e9 100644 --- a/dom/media/AudioConverter.h +++ b/dom/media/AudioConverter.h @@ -233,6 +233,7 @@ class AudioConverter { bool CanReorderAudio() const { return mIn.Layout().MappingTable(mOut.Layout()); } + static bool CanConvert(const AudioConfig& aIn, const AudioConfig& aOut); const AudioConfig& InputConfig() const { return mIn; } const AudioConfig& OutputConfig() const { return mOut; } diff --git a/dom/media/mediasink/AudioSink.cpp b/dom/media/mediasink/AudioSink.cpp index 9097d7b485af..45ee052c3b09 100644 --- a/dom/media/mediasink/AudioSink.cpp +++ b/dom/media/mediasink/AudioSink.cpp @@ -398,9 +398,15 @@ void AudioSink::NotifyAudioNeeded() { mOutputChannels == data->mChannels ? inputLayout : AudioConfig::ChannelLayout(mOutputChannels); - mConverter = MakeUnique( - AudioConfig(inputLayout, data->mChannels, data->mRate), - AudioConfig(outputLayout, mOutputChannels, mOutputRate)); + AudioConfig inConfig = + AudioConfig(inputLayout, data->mChannels, data->mRate); + AudioConfig outConfig = + AudioConfig(outputLayout, mOutputChannels, mOutputRate); + if (!AudioConverter::CanConvert(inConfig, outConfig)) { + mErrored = true; + return; + } + mConverter = MakeUnique(inConfig, outConfig); } // See if there's a gap in the audio. If there is, push silence into the