775 lines
31 KiB
C++
775 lines
31 KiB
C++
/* -*- 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.
|