diff --git a/dom/media/wave/WaveDemuxer.cpp b/dom/media/wave/WaveDemuxer.cpp index a84a410f5841..198834f5e5ff 100644 --- a/dom/media/wave/WaveDemuxer.cpp +++ b/dom/media/wave/WaveDemuxer.cpp @@ -10,7 +10,6 @@ #include #include "mozilla/Assertions.h" -#include "mozilla/EndianUtils.h" #include "mozilla/Utf8.h" #include "BufferReader.h" #include "VideoUtils.h" @@ -166,6 +165,19 @@ bool WAVTrackDemuxer::Init() { mInfo->mDuration = Duration(); mInfo->mChannelMap = mFmtChunk.ChannelMap(); + if (AudioConfig::ChannelLayout::Channels(mInfo->mChannelMap) != + mInfo->mChannels) { + AudioConfig::ChannelLayout::ChannelMap defaultForChannelCount = + AudioConfig::ChannelLayout(mInfo->mChannels).Map(); + LOG(("Channel count of %" PRIu32 + " and channel layout disagree, overriding channel map from %s to %s", + mInfo->mChannels, + AudioConfig::ChannelLayout::ChannelMapToString(mInfo->mChannelMap) + .get(), + AudioConfig::ChannelLayout::ChannelMapToString(defaultForChannelCount) + .get())); + mInfo->mChannelMap = defaultForChannelCount; + } LOG(("WavDemuxer initialized: %s", mInfo->ToString().get())); return mInfo->mDuration.IsPositive(); @@ -270,6 +282,8 @@ bool WAVTrackDemuxer::ListChunkParserInit(uint32_t aChunkSize) { case 0x494e414d: // INAM mInfo->mTags.AppendElement(MetadataTag("name"_ns, val)); break; + default: + LOG(("Metadata key %08x not handled", id)); } mHeaderParser.Reset(); diff --git a/dom/media/webaudio/test/mochitest.toml b/dom/media/webaudio/test/mochitest.toml index 418c52bd96dd..74d17d4fc94b 100644 --- a/dom/media/webaudio/test/mochitest.toml +++ b/dom/media/webaudio/test/mochitest.toml @@ -78,6 +78,7 @@ support-files = [ "half-a-second-2ch-48000.wav", "half-a-second-1ch-44100-aac-afconvert.mp4", "waveformatextensible.wav", + "waveformatextensiblebadmask.wav", "sixteen-frames.mp3", # only 16 frames of valid audio "../../webrtc/tests/mochitests/mediaStreamPlayback.js", "../../webrtc/tests/mochitests/head.js", diff --git a/dom/media/webaudio/test/test_mediaDecoding.html b/dom/media/webaudio/test/test_mediaDecoding.html index a6b4f3c4bec6..e76a533e4acb 100644 --- a/dom/media/webaudio/test/test_mediaDecoding.html +++ b/dom/media/webaudio/test/test_mediaDecoding.html @@ -247,6 +247,16 @@ sampleRate: 44100, frames: 472, duration: 0.01 + }, + { + // A wav file that has 8 channel, but has a channel mask that doesn't + // match the channel count. + url: "waveformatextensiblebadmask.wav", + valid: true, + numberOfChannels: 8, + sampleRate: 8000, + frames: 80, + duration: 0.01 } ]; @@ -290,7 +300,7 @@ is(buffer.numberOfChannels, test.numberOfChannels, "Correct number of channels"); return; } - ok(Math.abs(buffer.duration - test.duration) < 1e-3, "Correct duration"); + ok(Math.abs(buffer.duration - test.duration) < 1e-3, `Correct duration expected ${test.duration} got ${buffer.duration}`); if (Math.abs(buffer.duration - test.duration) >= 1e-3) { ok(false, "got: " + buffer.duration + ", expected: " + test.duration); } diff --git a/dom/media/webaudio/test/waveformatextensiblebadmask.wav b/dom/media/webaudio/test/waveformatextensiblebadmask.wav new file mode 100644 index 000000000000..3aa55df98ebe Binary files /dev/null and b/dom/media/webaudio/test/waveformatextensiblebadmask.wav differ