blob: 722b227703a13f7e6a9ddbf487f50187a0b62d84 [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>
Danil Chapovalov4844c5f2019-04-10 14:10:10 +020012#include <utility>
Steve Antone78bcb92017-10-31 09:53:08 -070013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "api/audio_codecs/builtin_audio_decoder_factory.h"
15#include "api/audio_codecs/builtin_audio_encoder_factory.h"
Jiawei Ouc2ebe212018-11-08 10:02:56 -080016#include "api/video/builtin_video_bitrate_allocator_factory.h"
Anders Carlssonb3306882018-05-14 10:11:42 +020017#include "api/video_codecs/builtin_video_decoder_factory.h"
18#include "api/video_codecs/builtin_video_encoder_factory.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "media/engine/webrtc_media_engine.h"
Danil Chapovalov4844c5f2019-04-10 14:10:10 +020020#include "media/engine/webrtc_media_engine_defaults.h"
Anders Carlssonb3306882018-05-14 10:11:42 +020021#include "modules/audio_processing/include/audio_processing.h"
Konrad Hofbauerb0397d62019-01-23 09:46:58 +010022#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "test/gtest.h"
solenberg7e4e01a2015-12-02 08:05:01 -080024
isheriff6f8d6862016-05-26 11:24:55 -070025using webrtc::RtpExtension;
26
solenberg7e4e01a2015-12-02 08:05:01 -080027namespace cricket {
28namespace {
29
isheriff6f8d6862016-05-26 11:24:55 -070030std::vector<RtpExtension> MakeUniqueExtensions() {
31 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080032 char name[] = "a";
33 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070034 result.push_back(RtpExtension(name, 1 + i));
solenberg7e4e01a2015-12-02 08:05:01 -080035 name[0]++;
Johannes Kron07ba2b92018-09-26 13:33:35 +020036 result.push_back(RtpExtension(name, 255 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080037 name[0]++;
38 }
39 return result;
40}
41
isheriff6f8d6862016-05-26 11:24:55 -070042std::vector<RtpExtension> MakeRedundantExtensions() {
43 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080044 char name[] = "a";
45 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070046 result.push_back(RtpExtension(name, 1 + i));
Johannes Kron07ba2b92018-09-26 13:33:35 +020047 result.push_back(RtpExtension(name, 255 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080048 name[0]++;
49 }
50 return result;
51}
52
53bool SupportedExtensions1(const std::string& name) {
54 return name == "c" || name == "i";
55}
56
57bool SupportedExtensions2(const std::string& name) {
58 return name != "a" && name != "n";
59}
60
61bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
62 const std::string* last = nullptr;
63 for (const auto& extension : extensions) {
isheriff6f8d6862016-05-26 11:24:55 -070064 if (last && *last > extension.uri) {
solenberg7e4e01a2015-12-02 08:05:01 -080065 return false;
66 }
isheriff6f8d6862016-05-26 11:24:55 -070067 last = &extension.uri;
solenberg7e4e01a2015-12-02 08:05:01 -080068 }
69 return true;
70}
71} // namespace
72
73TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -070074 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -080075 EXPECT_TRUE(ValidateRtpExtensions(extensions));
76}
77
78TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
isheriff6f8d6862016-05-26 11:24:55 -070079 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -080080 EXPECT_TRUE(ValidateRtpExtensions(extensions));
81}
82
83TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
isheriff6f8d6862016-05-26 11:24:55 -070084 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
85 extensions.push_back(RtpExtension("foo", 0));
solenberg7e4e01a2015-12-02 08:05:01 -080086 EXPECT_FALSE(ValidateRtpExtensions(extensions));
87}
88
89TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
isheriff6f8d6862016-05-26 11:24:55 -070090 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
Johannes Kron07ba2b92018-09-26 13:33:35 +020091 extensions.push_back(RtpExtension("foo", 256));
solenberg7e4e01a2015-12-02 08:05:01 -080092 EXPECT_FALSE(ValidateRtpExtensions(extensions));
93}
94
95TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070096 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
97 extensions.push_back(RtpExtension("foo", 1));
solenberg7e4e01a2015-12-02 08:05:01 -080098 EXPECT_FALSE(ValidateRtpExtensions(extensions));
99}
100
101TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -0700102 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
Johannes Kron07ba2b92018-09-26 13:33:35 +0200103 extensions.push_back(RtpExtension("foo", 255));
solenberg7e4e01a2015-12-02 08:05:01 -0800104 EXPECT_FALSE(ValidateRtpExtensions(extensions));
105}
106
107TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -0700108 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800109 std::vector<webrtc::RtpExtension> filtered =
110 FilterRtpExtensions(extensions, SupportedExtensions1, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200111 EXPECT_EQ(0u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800112}
113
114TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
isheriff6f8d6862016-05-26 11:24:55 -0700115 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800116 std::vector<webrtc::RtpExtension> filtered =
117 FilterRtpExtensions(extensions, SupportedExtensions1, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200118 EXPECT_EQ(2u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700119 EXPECT_EQ("c", filtered[0].uri);
120 EXPECT_EQ("i", filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800121}
122
123TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700124 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800125 std::vector<webrtc::RtpExtension> filtered =
126 FilterRtpExtensions(extensions, SupportedExtensions2, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200127 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800128 EXPECT_TRUE(IsSorted(filtered));
129}
130
131TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700132 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800133 std::vector<webrtc::RtpExtension> filtered =
134 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200135 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800136 EXPECT_TRUE(IsSorted(filtered));
137}
138
139TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700140 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800141 std::vector<webrtc::RtpExtension> filtered =
142 FilterRtpExtensions(extensions, SupportedExtensions2, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200143 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800144 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700145 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800146}
147
148TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700149 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800150 std::vector<webrtc::RtpExtension> filtered =
151 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200152 EXPECT_EQ(6u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800153 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700154 EXPECT_NE(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800155}
156
jbauch5869f502017-06-29 12:31:36 -0700157TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_1) {
158 std::vector<RtpExtension> extensions;
159 extensions.push_back(webrtc::RtpExtension("b", 1));
160 extensions.push_back(webrtc::RtpExtension("b", 2, true));
161 extensions.push_back(webrtc::RtpExtension("c", 3));
162 extensions.push_back(webrtc::RtpExtension("b", 4));
163 std::vector<webrtc::RtpExtension> filtered =
164 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200165 EXPECT_EQ(3u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700166 EXPECT_TRUE(IsSorted(filtered));
167 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
168 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
169 EXPECT_NE(filtered[0].uri, filtered[2].uri);
170 EXPECT_NE(filtered[1].uri, filtered[2].uri);
171}
172
173TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_2) {
174 std::vector<RtpExtension> extensions;
175 extensions.push_back(webrtc::RtpExtension("b", 1, true));
176 extensions.push_back(webrtc::RtpExtension("b", 2));
177 extensions.push_back(webrtc::RtpExtension("c", 3));
178 extensions.push_back(webrtc::RtpExtension("b", 4));
179 std::vector<webrtc::RtpExtension> filtered =
180 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200181 EXPECT_EQ(3u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700182 EXPECT_TRUE(IsSorted(filtered));
183 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
184 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
185 EXPECT_NE(filtered[0].uri, filtered[2].uri);
186 EXPECT_NE(filtered[1].uri, filtered[2].uri);
187}
188
solenberg7e4e01a2015-12-02 08:05:01 -0800189TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700190 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800191 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700192 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
193 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
194 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
solenberg7e4e01a2015-12-02 08:05:01 -0800195 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700196 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
197 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800198 std::vector<webrtc::RtpExtension> filtered =
199 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200200 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700201 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800202}
203
Konrad Hofbauerb0397d62019-01-23 09:46:58 +0100204TEST(WebRtcMediaEngineTest,
205 FilterRtpExtensions_RemoveRedundantBwe_1_KeepAbsSendTime) {
206 std::vector<RtpExtension> extensions;
207 webrtc::test::ScopedFieldTrials override_field_trials_(
208 "WebRTC-KeepAbsSendTimeExtension/Enabled/");
209 extensions.push_back(
210 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
211 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
212 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
213 extensions.push_back(
214 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
215 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
216 std::vector<webrtc::RtpExtension> filtered =
217 FilterRtpExtensions(extensions, SupportedExtensions2, true);
218 EXPECT_EQ(2u, filtered.size());
219 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
220 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[1].uri);
221}
222
jbauch5869f502017-06-29 12:31:36 -0700223TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) {
224 std::vector<RtpExtension> extensions;
225 extensions.push_back(
226 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
227 extensions.push_back(
228 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
229 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
230 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
231 extensions.push_back(
232 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
233 extensions.push_back(
234 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
235 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
236 std::vector<webrtc::RtpExtension> filtered =
237 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200238 EXPECT_EQ(2u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700239 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
240 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
241 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
242}
243
Konrad Hofbauerb0397d62019-01-23 09:46:58 +0100244TEST(WebRtcMediaEngineTest,
245 FilterRtpExtensions_RemoveRedundantBweEncrypted_1_KeepAbsSendTime) {
246 std::vector<RtpExtension> extensions;
247 webrtc::test::ScopedFieldTrials override_field_trials_(
248 "WebRTC-KeepAbsSendTimeExtension/Enabled/");
249 extensions.push_back(
250 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
251 extensions.push_back(
252 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
253 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
254 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
255 extensions.push_back(
256 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
257 extensions.push_back(
258 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
259 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
260 std::vector<webrtc::RtpExtension> filtered =
261 FilterRtpExtensions(extensions, SupportedExtensions2, true);
262 EXPECT_EQ(3u, filtered.size());
263 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
264 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
265 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[2].uri);
266 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
267}
268
solenberg7e4e01a2015-12-02 08:05:01 -0800269TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700270 std::vector<RtpExtension> extensions;
271 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
272 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
273 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
solenberg7e4e01a2015-12-02 08:05:01 -0800274 std::vector<webrtc::RtpExtension> filtered =
275 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200276 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700277 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800278}
279
280TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
isheriff6f8d6862016-05-26 11:24:55 -0700281 std::vector<RtpExtension> extensions;
282 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
283 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800284 std::vector<webrtc::RtpExtension> filtered =
285 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200286 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700287 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800288}
ossu111744e2016-06-15 02:22:32 -0700289
ossu111744e2016-06-15 02:22:32 -0700290TEST(WebRtcMediaEngineFactoryTest, CreateWithBuiltinDecoders) {
291 std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
Anders Carlssonb3306882018-05-14 10:11:42 +0200292 nullptr /* adm */, webrtc::CreateBuiltinAudioEncoderFactory(),
293 webrtc::CreateBuiltinAudioDecoderFactory(),
294 webrtc::CreateBuiltinVideoEncoderFactory(),
Qingsi Wang59844ce2018-11-01 04:45:53 +0000295 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
296 webrtc::AudioProcessingBuilder().Create()));
ossu111744e2016-06-15 02:22:32 -0700297 EXPECT_TRUE(engine);
298}
299
Jiawei Ouc2ebe212018-11-08 10:02:56 -0800300TEST(WebRtcMediaEngineFactoryTest, CreateWithVideoBitrateFactory) {
301 std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
302 nullptr /* adm */, webrtc::CreateBuiltinAudioEncoderFactory(),
303 webrtc::CreateBuiltinAudioDecoderFactory(),
304 webrtc::CreateBuiltinVideoEncoderFactory(),
305 webrtc::CreateBuiltinVideoDecoderFactory(),
306 webrtc::CreateBuiltinVideoBitrateAllocatorFactory(),
307 nullptr /* audio_mixer */, webrtc::AudioProcessingBuilder().Create()));
308 EXPECT_TRUE(engine);
309}
310
Danil Chapovalov4844c5f2019-04-10 14:10:10 +0200311TEST(WebRtcMediaEngineFactoryTest, Create) {
312 MediaEngineDependencies deps;
313 webrtc::SetMediaEngineDefaults(&deps);
314
315 std::unique_ptr<MediaEngineInterface> engine =
316 CreateMediaEngine(std::move(deps));
317
318 EXPECT_TRUE(engine);
319}
320
solenberg7e4e01a2015-12-02 08:05:01 -0800321} // namespace cricket