blob: 446ad24e77c7c89cf169f164eca3e2e73c14940c [file] [log] [blame]
solenberg7e4e01a2015-12-02 08:05:01 -08001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
solenberg7e4e01a2015-12-02 08:05:01 -08003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
solenberg7e4e01a2015-12-02 08:05:01 -08009 */
10
Steve Antone78bcb92017-10-31 09:53:08 -070011#include <memory>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "api/audio_codecs/builtin_audio_decoder_factory.h"
14#include "api/audio_codecs/builtin_audio_encoder_factory.h"
Anders Carlssonb3306882018-05-14 10:11:42 +020015#include "api/video_codecs/builtin_video_decoder_factory.h"
16#include "api/video_codecs/builtin_video_encoder_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "media/engine/webrtcmediaengine.h"
Anders Carlssonb3306882018-05-14 10:11:42 +020018#include "modules/audio_processing/include/audio_processing.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "test/gtest.h"
solenberg7e4e01a2015-12-02 08:05:01 -080020
isheriff6f8d6862016-05-26 11:24:55 -070021using webrtc::RtpExtension;
22
solenberg7e4e01a2015-12-02 08:05:01 -080023namespace cricket {
24namespace {
25
isheriff6f8d6862016-05-26 11:24:55 -070026std::vector<RtpExtension> MakeUniqueExtensions() {
27 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080028 char name[] = "a";
29 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070030 result.push_back(RtpExtension(name, 1 + i));
solenberg7e4e01a2015-12-02 08:05:01 -080031 name[0]++;
isheriff6f8d6862016-05-26 11:24:55 -070032 result.push_back(RtpExtension(name, 14 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080033 name[0]++;
34 }
35 return result;
36}
37
isheriff6f8d6862016-05-26 11:24:55 -070038std::vector<RtpExtension> MakeRedundantExtensions() {
39 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080040 char name[] = "a";
41 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070042 result.push_back(RtpExtension(name, 1 + i));
43 result.push_back(RtpExtension(name, 14 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080044 name[0]++;
45 }
46 return result;
47}
48
49bool SupportedExtensions1(const std::string& name) {
50 return name == "c" || name == "i";
51}
52
53bool SupportedExtensions2(const std::string& name) {
54 return name != "a" && name != "n";
55}
56
57bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
58 const std::string* last = nullptr;
59 for (const auto& extension : extensions) {
isheriff6f8d6862016-05-26 11:24:55 -070060 if (last && *last > extension.uri) {
solenberg7e4e01a2015-12-02 08:05:01 -080061 return false;
62 }
isheriff6f8d6862016-05-26 11:24:55 -070063 last = &extension.uri;
solenberg7e4e01a2015-12-02 08:05:01 -080064 }
65 return true;
66}
67} // namespace
68
69TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -070070 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -080071 EXPECT_TRUE(ValidateRtpExtensions(extensions));
72}
73
74TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
isheriff6f8d6862016-05-26 11:24:55 -070075 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -080076 EXPECT_TRUE(ValidateRtpExtensions(extensions));
77}
78
79TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
isheriff6f8d6862016-05-26 11:24:55 -070080 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
81 extensions.push_back(RtpExtension("foo", 0));
solenberg7e4e01a2015-12-02 08:05:01 -080082 EXPECT_FALSE(ValidateRtpExtensions(extensions));
83}
84
85TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
isheriff6f8d6862016-05-26 11:24:55 -070086 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
87 extensions.push_back(RtpExtension("foo", 15));
solenberg7e4e01a2015-12-02 08:05:01 -080088 EXPECT_FALSE(ValidateRtpExtensions(extensions));
89}
90
91TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070092 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
93 extensions.push_back(RtpExtension("foo", 1));
solenberg7e4e01a2015-12-02 08:05:01 -080094 EXPECT_FALSE(ValidateRtpExtensions(extensions));
95}
96
97TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070098 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
99 extensions.push_back(RtpExtension("foo", 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800100 EXPECT_FALSE(ValidateRtpExtensions(extensions));
101}
102
103TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -0700104 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800105 std::vector<webrtc::RtpExtension> filtered =
106 FilterRtpExtensions(extensions, SupportedExtensions1, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200107 EXPECT_EQ(0u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800108}
109
110TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
isheriff6f8d6862016-05-26 11:24:55 -0700111 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800112 std::vector<webrtc::RtpExtension> filtered =
113 FilterRtpExtensions(extensions, SupportedExtensions1, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200114 EXPECT_EQ(2u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700115 EXPECT_EQ("c", filtered[0].uri);
116 EXPECT_EQ("i", filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800117}
118
119TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700120 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800121 std::vector<webrtc::RtpExtension> filtered =
122 FilterRtpExtensions(extensions, SupportedExtensions2, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200123 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800124 EXPECT_TRUE(IsSorted(filtered));
125}
126
127TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700128 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800129 std::vector<webrtc::RtpExtension> filtered =
130 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200131 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800132 EXPECT_TRUE(IsSorted(filtered));
133}
134
135TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700136 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800137 std::vector<webrtc::RtpExtension> filtered =
138 FilterRtpExtensions(extensions, SupportedExtensions2, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200139 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800140 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700141 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800142}
143
144TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700145 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800146 std::vector<webrtc::RtpExtension> filtered =
147 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200148 EXPECT_EQ(6u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800149 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700150 EXPECT_NE(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800151}
152
jbauch5869f502017-06-29 12:31:36 -0700153TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_1) {
154 std::vector<RtpExtension> extensions;
155 extensions.push_back(webrtc::RtpExtension("b", 1));
156 extensions.push_back(webrtc::RtpExtension("b", 2, true));
157 extensions.push_back(webrtc::RtpExtension("c", 3));
158 extensions.push_back(webrtc::RtpExtension("b", 4));
159 std::vector<webrtc::RtpExtension> filtered =
160 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200161 EXPECT_EQ(3u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700162 EXPECT_TRUE(IsSorted(filtered));
163 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
164 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
165 EXPECT_NE(filtered[0].uri, filtered[2].uri);
166 EXPECT_NE(filtered[1].uri, filtered[2].uri);
167}
168
169TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_2) {
170 std::vector<RtpExtension> extensions;
171 extensions.push_back(webrtc::RtpExtension("b", 1, true));
172 extensions.push_back(webrtc::RtpExtension("b", 2));
173 extensions.push_back(webrtc::RtpExtension("c", 3));
174 extensions.push_back(webrtc::RtpExtension("b", 4));
175 std::vector<webrtc::RtpExtension> filtered =
176 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200177 EXPECT_EQ(3u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700178 EXPECT_TRUE(IsSorted(filtered));
179 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
180 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
181 EXPECT_NE(filtered[0].uri, filtered[2].uri);
182 EXPECT_NE(filtered[1].uri, filtered[2].uri);
183}
184
solenberg7e4e01a2015-12-02 08:05:01 -0800185TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700186 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800187 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700188 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
189 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
190 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
solenberg7e4e01a2015-12-02 08:05:01 -0800191 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700192 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
193 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800194 std::vector<webrtc::RtpExtension> filtered =
195 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200196 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700197 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800198}
199
jbauch5869f502017-06-29 12:31:36 -0700200TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) {
201 std::vector<RtpExtension> extensions;
202 extensions.push_back(
203 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
204 extensions.push_back(
205 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
206 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
207 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
208 extensions.push_back(
209 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
210 extensions.push_back(
211 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
212 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
213 std::vector<webrtc::RtpExtension> filtered =
214 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200215 EXPECT_EQ(2u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700216 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
217 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
218 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
219}
220
solenberg7e4e01a2015-12-02 08:05:01 -0800221TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700222 std::vector<RtpExtension> extensions;
223 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
224 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
225 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
solenberg7e4e01a2015-12-02 08:05:01 -0800226 std::vector<webrtc::RtpExtension> filtered =
227 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200228 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700229 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800230}
231
232TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
isheriff6f8d6862016-05-26 11:24:55 -0700233 std::vector<RtpExtension> extensions;
234 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
235 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800236 std::vector<webrtc::RtpExtension> filtered =
237 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200238 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700239 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800240}
ossu111744e2016-06-15 02:22:32 -0700241
ossu111744e2016-06-15 02:22:32 -0700242TEST(WebRtcMediaEngineFactoryTest, CreateWithBuiltinDecoders) {
243 std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
Anders Carlssonb3306882018-05-14 10:11:42 +0200244 nullptr /* adm */, webrtc::CreateBuiltinAudioEncoderFactory(),
245 webrtc::CreateBuiltinAudioDecoderFactory(),
246 webrtc::CreateBuiltinVideoEncoderFactory(),
247 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
248 webrtc::AudioProcessingBuilder().Create()));
ossu111744e2016-06-15 02:22:32 -0700249 EXPECT_TRUE(engine);
250}
251
solenberg7e4e01a2015-12-02 08:05:01 -0800252} // namespace cricket