Source code
Revision control
Copy as Markdown
Other Tools
/* -*- 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,
#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.