summaryrefslogtreecommitdiffstats
path: root/media/webrtc/signaling/gtest/audioconduit_unittests.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /media/webrtc/signaling/gtest/audioconduit_unittests.cpp
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'media/webrtc/signaling/gtest/audioconduit_unittests.cpp')
-rw-r--r--media/webrtc/signaling/gtest/audioconduit_unittests.cpp775
1 files changed, 775 insertions, 0 deletions
diff --git a/media/webrtc/signaling/gtest/audioconduit_unittests.cpp b/media/webrtc/signaling/gtest/audioconduit_unittests.cpp
new file mode 100644
index 0000000000..4068a988f4
--- /dev/null
+++ b/media/webrtc/signaling/gtest/audioconduit_unittests.cpp
@@ -0,0 +1,775 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#define GTEST_HAS_RTTI 0
+#include "gtest/gtest.h"
+
+#include "AudioConduit.h"
+#include "Canonicals.h"
+
+#include "MockCall.h"
+
+using namespace mozilla;
+using namespace testing;
+using namespace webrtc;
+
+namespace test {
+
+class AudioConduitTest : public ::testing::Test {
+ public:
+ AudioConduitTest()
+ : mCallWrapper(MockCallWrapper::Create()),
+ mAudioConduit(MakeRefPtr<WebrtcAudioConduit>(
+ mCallWrapper, GetCurrentSerialEventTarget())),
+ mControl(GetCurrentSerialEventTarget()) {
+ mControl.Update(
+ [&](auto& aControl) { mAudioConduit->InitControl(&mControl); });
+ }
+
+ ~AudioConduitTest() override {
+ mozilla::Unused << WaitFor(mAudioConduit->Shutdown());
+ mCallWrapper->Destroy();
+ }
+
+ MockCall* Call() { return mCallWrapper->GetMockCall(); }
+
+ const RefPtr<MockCallWrapper> mCallWrapper;
+ const RefPtr<WebrtcAudioConduit> mAudioConduit;
+ ConcreteControl mControl;
+};
+
+TEST_F(AudioConduitTest, TestConfigureSendMediaCodec) {
+ mControl.Update([&](auto& aControl) {
+ // defaults
+ aControl.mAudioSendCodec =
+ Some(AudioCodecConfig(114, "opus", 48000, 2, false));
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+
+ mControl.Update([&](auto& aControl) {
+ // empty codec name
+ aControl.mAudioSendCodec = Some(AudioCodecConfig(114, "", 48000, 2, false));
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ // Invalid codec was ignored.
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusMono) {
+ mControl.Update([&](auto& aControl) {
+ // opus mono
+ aControl.mAudioSendCodec =
+ Some(AudioCodecConfig(114, "opus", 48000, 1, false));
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 1UL);
+ ASSERT_EQ(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusFEC) {
+ mControl.Update([&](auto& aControl) {
+ // opus with inband Forward Error Correction
+ AudioCodecConfig codecConfig =
+ AudioCodecConfig(114, "opus", 48000, 2, true);
+ aControl.mAudioSendCodec = Some(codecConfig);
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_NE(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("useinbandfec"), "1");
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusMaxPlaybackRate) {
+ mControl.Update([&](auto& aControl) {
+ AudioCodecConfig codecConfig =
+ AudioCodecConfig(114, "opus", 48000, 2, false);
+ codecConfig.mMaxPlaybackRate = 1234;
+ aControl.mAudioSendCodec = Some(codecConfig);
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_NE(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("maxplaybackrate"), "1234");
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusMaxAverageBitrate) {
+ mControl.Update([&](auto& aControl) {
+ AudioCodecConfig codecConfig =
+ AudioCodecConfig(114, "opus", 48000, 2, false);
+ codecConfig.mMaxAverageBitrate = 12345;
+ aControl.mAudioSendCodec = Some(codecConfig);
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_NE(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("maxaveragebitrate"), "12345");
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusDtx) {
+ mControl.Update([&](auto& aControl) {
+ AudioCodecConfig codecConfig =
+ AudioCodecConfig(114, "opus", 48000, 2, false);
+ codecConfig.mDTXEnabled = true;
+ aControl.mAudioSendCodec = Some(codecConfig);
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_NE(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("usedtx"), "1");
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusCbr) {
+ mControl.Update([&](auto& aControl) {
+ AudioCodecConfig codecConfig =
+ AudioCodecConfig(114, "opus", 48000, 2, false);
+ codecConfig.mCbrEnabled = true;
+ aControl.mAudioSendCodec = Some(codecConfig);
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_NE(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("cbr"), "1");
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusPtime) {
+ mControl.Update([&](auto& aControl) {
+ AudioCodecConfig codecConfig =
+ AudioCodecConfig(114, "opus", 48000, 2, false);
+ codecConfig.mFrameSizeMs = 100;
+ aControl.mAudioSendCodec = Some(codecConfig);
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_NE(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("ptime"), "100");
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusMinPtime) {
+ mControl.Update([&](auto& aControl) {
+ AudioCodecConfig codecConfig =
+ AudioCodecConfig(114, "opus", 48000, 2, false);
+ codecConfig.mMinFrameSizeMs = 201;
+ aControl.mAudioSendCodec = Some(codecConfig);
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_NE(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("minptime"), "201");
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusMaxPtime) {
+ mControl.Update([&](auto& aControl) {
+ AudioCodecConfig codecConfig =
+ AudioCodecConfig(114, "opus", 48000, 2, false);
+ codecConfig.mMaxFrameSizeMs = 321;
+ aControl.mAudioSendCodec = Some(codecConfig);
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_NE(f.parameters.find("maxptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("maxptime"), "321");
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusAllParams) {
+ mControl.Update([&](auto& aControl) {
+ AudioCodecConfig codecConfig =
+ AudioCodecConfig(114, "opus", 48000, 2, true);
+ codecConfig.mMaxPlaybackRate = 5432;
+ codecConfig.mMaxAverageBitrate = 54321;
+ codecConfig.mDTXEnabled = true;
+ codecConfig.mCbrEnabled = true;
+ codecConfig.mFrameSizeMs = 999;
+ codecConfig.mMinFrameSizeMs = 123;
+ codecConfig.mMaxFrameSizeMs = 789;
+ aControl.mAudioSendCodec = Some(codecConfig);
+ aControl.mTransmitting = true;
+ });
+
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioSendConfig->send_codec_spec->format;
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_NE(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("useinbandfec"), "1");
+ ASSERT_NE(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("maxplaybackrate"), "5432");
+ ASSERT_NE(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("maxaveragebitrate"), "54321");
+ ASSERT_NE(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("usedtx"), "1");
+ ASSERT_NE(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("cbr"), "1");
+ ASSERT_NE(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("ptime"), "999");
+ ASSERT_NE(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("minptime"), "123");
+ ASSERT_NE(f.parameters.find("maxptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("maxptime"), "789");
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureReceiveMediaCodecs) {
+ mControl.Update([&](auto& aControl) {
+ // just default opus stereo
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ codecs.emplace_back(AudioCodecConfig(114, "opus", 48000, 2, false));
+ aControl.mAudioRecvCodecs = codecs;
+ aControl.mReceiving = true;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->sync_group, "");
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 1U);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(114);
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+
+ mControl.Update([&](auto& aControl) {
+ // multiple codecs
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ codecs.emplace_back(AudioCodecConfig(9, "g722", 16000, 2, false));
+ codecs.emplace_back(AudioCodecConfig(114, "opus", 48000, 2, false));
+ aControl.mAudioRecvCodecs = codecs;
+ aControl.mReceiving = true;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->sync_group, "");
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 2U);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(9);
+ ASSERT_EQ(f.name, "g722");
+ ASSERT_EQ(f.clockrate_hz, 16000);
+ ASSERT_EQ(f.num_channels, 2U);
+ ASSERT_EQ(f.parameters.size(), 0U);
+ }
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(114);
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2U);
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ }
+
+ mControl.Update([&](auto& aControl) {
+ // no codecs
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ aControl.mAudioRecvCodecs = codecs;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 0U);
+
+ mControl.Update([&](auto& aControl) {
+ // invalid codec name
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ codecs.emplace_back(AudioCodecConfig(114, "", 48000, 2, false));
+ aControl.mAudioRecvCodecs = codecs;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 0U);
+
+ mControl.Update([&](auto& aControl) {
+ // invalid number of channels
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ codecs.emplace_back(AudioCodecConfig(114, "opus", 48000, 42, false));
+ aControl.mAudioRecvCodecs = codecs;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 0U);
+}
+
+TEST_F(AudioConduitTest, TestConfigureReceiveOpusMono) {
+ mControl.Update([&](auto& aControl) {
+ // opus mono
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ codecs.emplace_back(AudioCodecConfig(114, "opus", 48000, 1, false));
+ aControl.mAudioRecvCodecs = codecs;
+ aControl.mReceiving = true;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->sync_group, "");
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 1U);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(114);
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 1UL);
+ ASSERT_EQ(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureReceiveOpusDtx) {
+ mControl.Update([&](auto& aControl) {
+ // opus mono
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ codecs.emplace_back(AudioCodecConfig(114, "opus", 48000, 2, false));
+ codecs[0].mDTXEnabled = true;
+ aControl.mAudioRecvCodecs = codecs;
+ aControl.mReceiving = true;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->sync_group, "");
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 1U);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(114);
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_NE(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("usedtx"), "1");
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureReceiveOpusFEC) {
+ mControl.Update([&](auto& aControl) {
+ // opus with inband Forward Error Correction
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ codecs.emplace_back(AudioCodecConfig(114, "opus", 48000, 2, true));
+ aControl.mAudioRecvCodecs = codecs;
+ aControl.mReceiving = true;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->sync_group, "");
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 1U);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(114);
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_NE(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("useinbandfec"), "1");
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureReceiveOpusMaxPlaybackRate) {
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ codecs.emplace_back(AudioCodecConfig(114, "opus", 48000, 2, false));
+
+ mControl.Update([&](auto& aControl) {
+ codecs[0].mMaxPlaybackRate = 0;
+ aControl.mAudioRecvCodecs = codecs;
+ aControl.mReceiving = true;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 1U);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(114);
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.count("maxplaybackrate"), 0U);
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+
+ mControl.Update([&](auto& aControl) {
+ codecs[0].mMaxPlaybackRate = 8000;
+ aControl.mAudioRecvCodecs = codecs;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 1U);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(114);
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.at("maxplaybackrate"), "8000");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxaveragebitrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureReceiveOpusMaxAverageBitrate) {
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ codecs.emplace_back(AudioCodecConfig(114, "opus", 48000, 2, false));
+ mControl.Update([&](auto& aControl) {
+ codecs[0].mMaxAverageBitrate = 0;
+ aControl.mAudioRecvCodecs = codecs;
+ aControl.mReceiving = true;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 1U);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(114);
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.count("maxaveragebitrate"), 0U);
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+
+ mControl.Update([&](auto& aControl) {
+ codecs[0].mMaxAverageBitrate = 8000;
+ aControl.mAudioRecvCodecs = codecs;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 1U);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(114);
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+ ASSERT_EQ(f.parameters.at("maxaveragebitrate"), "8000");
+ ASSERT_EQ(f.parameters.find("usedtx"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("cbr"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("ptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("minptime"), f.parameters.end());
+ ASSERT_EQ(f.parameters.find("maxptime"), f.parameters.end());
+ }
+}
+
+TEST_F(AudioConduitTest, TestConfigureReceiveOpusAllParameters) {
+ std::vector<mozilla::AudioCodecConfig> codecs;
+ codecs.emplace_back(AudioCodecConfig(114, "opus", 48000, 2, true));
+
+ mControl.Update([&](auto& aControl) {
+ codecs[0].mMaxPlaybackRate = 8000;
+ codecs[0].mMaxAverageBitrate = 9000;
+ codecs[0].mDTXEnabled = true;
+ codecs[0].mCbrEnabled = true;
+ codecs[0].mFrameSizeMs = 10;
+ codecs[0].mMinFrameSizeMs = 20;
+ codecs[0].mMaxFrameSizeMs = 30;
+
+ aControl.mAudioRecvCodecs = codecs;
+ aControl.mReceiving = true;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->decoder_map.size(), 1U);
+ {
+ const webrtc::SdpAudioFormat& f =
+ Call()->mAudioReceiveConfig->decoder_map.at(114);
+ ASSERT_EQ(f.name, "opus");
+ ASSERT_EQ(f.clockrate_hz, 48000);
+ ASSERT_EQ(f.num_channels, 2UL);
+ ASSERT_EQ(f.parameters.at("stereo"), "1");
+ ASSERT_EQ(f.parameters.at("useinbandfec"), "1");
+ ASSERT_EQ(f.parameters.at("maxplaybackrate"), "8000");
+ ASSERT_EQ(f.parameters.at("maxaveragebitrate"), "9000");
+ ASSERT_EQ(f.parameters.at("usedtx"), "1");
+ ASSERT_EQ(f.parameters.at("cbr"), "1");
+ ASSERT_EQ(f.parameters.at("ptime"), "10");
+ ASSERT_EQ(f.parameters.at("minptime"), "20");
+ ASSERT_EQ(f.parameters.at("maxptime"), "30");
+ }
+}
+
+TEST_F(AudioConduitTest, TestSetLocalRTPExtensions) {
+ // Empty extensions
+ mControl.Update([&](auto& aControl) {
+ RtpExtList extensions;
+ aControl.mLocalRecvRtpExtensions = extensions;
+ aControl.mReceiving = true;
+ aControl.mLocalSendRtpExtensions = extensions;
+ aControl.mTransmitting = true;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ ASSERT_TRUE(Call()->mAudioSendConfig->rtp.extensions.empty());
+
+ // Audio level
+ mControl.Update([&](auto& aControl) {
+ RtpExtList extensions;
+ webrtc::RtpExtension extension;
+ extension.uri = webrtc::RtpExtension::kAudioLevelUri;
+ extensions.emplace_back(extension);
+ aControl.mLocalRecvRtpExtensions = extensions;
+ aControl.mLocalSendRtpExtensions = extensions;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ ASSERT_EQ(Call()->mAudioSendConfig->rtp.extensions.back().uri,
+ webrtc::RtpExtension::kAudioLevelUri);
+
+ // Contributing sources audio level
+ mControl.Update([&](auto& aControl) {
+ // We do not support configuring sending csrc-audio-level. It will be
+ // ignored.
+ RtpExtList extensions;
+ webrtc::RtpExtension extension;
+ extension.uri = webrtc::RtpExtension::kCsrcAudioLevelsUri;
+ extensions.emplace_back(extension);
+ aControl.mLocalRecvRtpExtensions = extensions;
+ aControl.mLocalSendRtpExtensions = extensions;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_TRUE(Call()->mAudioSendConfig);
+ ASSERT_TRUE(Call()->mAudioSendConfig->rtp.extensions.empty());
+
+ // Mid
+ mControl.Update([&](auto& aControl) {
+ // We do not support configuring receiving MId. It will be ignored.
+ RtpExtList extensions;
+ webrtc::RtpExtension extension;
+ extension.uri = webrtc::RtpExtension::kMidUri;
+ extensions.emplace_back(extension);
+ aControl.mLocalRecvRtpExtensions = extensions;
+ aControl.mLocalSendRtpExtensions = extensions;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioSendConfig->rtp.extensions.back().uri,
+ webrtc::RtpExtension::kMidUri);
+}
+
+TEST_F(AudioConduitTest, TestSyncGroup) {
+ mControl.Update([&](auto& aControl) {
+ aControl.mSyncGroup = "test";
+ aControl.mReceiving = true;
+ });
+ ASSERT_TRUE(Call()->mAudioReceiveConfig);
+ ASSERT_EQ(Call()->mAudioReceiveConfig->sync_group, "test");
+}
+
+} // End namespace test.