blob: 19542a97c5dad75e2350f24d239e8cff5aeac895 [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"
Jiawei Ouc2ebe212018-11-08 10:02:56 -080015#include "api/video/builtin_video_bitrate_allocator_factory.h"
Anders Carlssonb3306882018-05-14 10:11:42 +020016#include "api/video_codecs/builtin_video_decoder_factory.h"
17#include "api/video_codecs/builtin_video_encoder_factory.h"
Steve Anton10542f22019-01-11 09:11:00 -080018#include "media/engine/webrtc_media_engine.h"
Anders Carlssonb3306882018-05-14 10:11:42 +020019#include "modules/audio_processing/include/audio_processing.h"
Konrad Hofbauerb0397d62019-01-23 09:46:58 +010020#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "test/gtest.h"
solenberg7e4e01a2015-12-02 08:05:01 -080022
isheriff6f8d6862016-05-26 11:24:55 -070023using webrtc::RtpExtension;
24
solenberg7e4e01a2015-12-02 08:05:01 -080025namespace cricket {
26namespace {
27
isheriff6f8d6862016-05-26 11:24:55 -070028std::vector<RtpExtension> MakeUniqueExtensions() {
29 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080030 char name[] = "a";
31 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070032 result.push_back(RtpExtension(name, 1 + i));
solenberg7e4e01a2015-12-02 08:05:01 -080033 name[0]++;
Johannes Kron07ba2b92018-09-26 13:33:35 +020034 result.push_back(RtpExtension(name, 255 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080035 name[0]++;
36 }
37 return result;
38}
39
isheriff6f8d6862016-05-26 11:24:55 -070040std::vector<RtpExtension> MakeRedundantExtensions() {
41 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080042 char name[] = "a";
43 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070044 result.push_back(RtpExtension(name, 1 + i));
Johannes Kron07ba2b92018-09-26 13:33:35 +020045 result.push_back(RtpExtension(name, 255 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080046 name[0]++;
47 }
48 return result;
49}
50
51bool SupportedExtensions1(const std::string& name) {
52 return name == "c" || name == "i";
53}
54
55bool SupportedExtensions2(const std::string& name) {
56 return name != "a" && name != "n";
57}
58
59bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
60 const std::string* last = nullptr;
61 for (const auto& extension : extensions) {
isheriff6f8d6862016-05-26 11:24:55 -070062 if (last && *last > extension.uri) {
solenberg7e4e01a2015-12-02 08:05:01 -080063 return false;
64 }
isheriff6f8d6862016-05-26 11:24:55 -070065 last = &extension.uri;
solenberg7e4e01a2015-12-02 08:05:01 -080066 }
67 return true;
68}
69} // namespace
70
71TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -070072 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -080073 EXPECT_TRUE(ValidateRtpExtensions(extensions));
74}
75
76TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
isheriff6f8d6862016-05-26 11:24:55 -070077 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -080078 EXPECT_TRUE(ValidateRtpExtensions(extensions));
79}
80
81TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
isheriff6f8d6862016-05-26 11:24:55 -070082 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
83 extensions.push_back(RtpExtension("foo", 0));
solenberg7e4e01a2015-12-02 08:05:01 -080084 EXPECT_FALSE(ValidateRtpExtensions(extensions));
85}
86
87TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
isheriff6f8d6862016-05-26 11:24:55 -070088 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
Johannes Kron07ba2b92018-09-26 13:33:35 +020089 extensions.push_back(RtpExtension("foo", 256));
solenberg7e4e01a2015-12-02 08:05:01 -080090 EXPECT_FALSE(ValidateRtpExtensions(extensions));
91}
92
93TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070094 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
95 extensions.push_back(RtpExtension("foo", 1));
solenberg7e4e01a2015-12-02 08:05:01 -080096 EXPECT_FALSE(ValidateRtpExtensions(extensions));
97}
98
99TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -0700100 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
Johannes Kron07ba2b92018-09-26 13:33:35 +0200101 extensions.push_back(RtpExtension("foo", 255));
solenberg7e4e01a2015-12-02 08:05:01 -0800102 EXPECT_FALSE(ValidateRtpExtensions(extensions));
103}
104
105TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -0700106 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800107 std::vector<webrtc::RtpExtension> filtered =
108 FilterRtpExtensions(extensions, SupportedExtensions1, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200109 EXPECT_EQ(0u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800110}
111
112TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
isheriff6f8d6862016-05-26 11:24:55 -0700113 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800114 std::vector<webrtc::RtpExtension> filtered =
115 FilterRtpExtensions(extensions, SupportedExtensions1, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200116 EXPECT_EQ(2u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700117 EXPECT_EQ("c", filtered[0].uri);
118 EXPECT_EQ("i", filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800119}
120
121TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700122 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800123 std::vector<webrtc::RtpExtension> filtered =
124 FilterRtpExtensions(extensions, SupportedExtensions2, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200125 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800126 EXPECT_TRUE(IsSorted(filtered));
127}
128
129TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700130 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800131 std::vector<webrtc::RtpExtension> filtered =
132 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200133 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800134 EXPECT_TRUE(IsSorted(filtered));
135}
136
137TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700138 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800139 std::vector<webrtc::RtpExtension> filtered =
140 FilterRtpExtensions(extensions, SupportedExtensions2, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200141 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800142 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700143 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800144}
145
146TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700147 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800148 std::vector<webrtc::RtpExtension> filtered =
149 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200150 EXPECT_EQ(6u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800151 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700152 EXPECT_NE(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800153}
154
jbauch5869f502017-06-29 12:31:36 -0700155TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_1) {
156 std::vector<RtpExtension> extensions;
157 extensions.push_back(webrtc::RtpExtension("b", 1));
158 extensions.push_back(webrtc::RtpExtension("b", 2, true));
159 extensions.push_back(webrtc::RtpExtension("c", 3));
160 extensions.push_back(webrtc::RtpExtension("b", 4));
161 std::vector<webrtc::RtpExtension> filtered =
162 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200163 EXPECT_EQ(3u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700164 EXPECT_TRUE(IsSorted(filtered));
165 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
166 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
167 EXPECT_NE(filtered[0].uri, filtered[2].uri);
168 EXPECT_NE(filtered[1].uri, filtered[2].uri);
169}
170
171TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_2) {
172 std::vector<RtpExtension> extensions;
173 extensions.push_back(webrtc::RtpExtension("b", 1, true));
174 extensions.push_back(webrtc::RtpExtension("b", 2));
175 extensions.push_back(webrtc::RtpExtension("c", 3));
176 extensions.push_back(webrtc::RtpExtension("b", 4));
177 std::vector<webrtc::RtpExtension> filtered =
178 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200179 EXPECT_EQ(3u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700180 EXPECT_TRUE(IsSorted(filtered));
181 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
182 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
183 EXPECT_NE(filtered[0].uri, filtered[2].uri);
184 EXPECT_NE(filtered[1].uri, filtered[2].uri);
185}
186
solenberg7e4e01a2015-12-02 08:05:01 -0800187TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700188 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800189 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700190 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
191 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
192 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
solenberg7e4e01a2015-12-02 08:05:01 -0800193 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700194 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
195 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800196 std::vector<webrtc::RtpExtension> filtered =
197 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200198 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700199 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800200}
201
Konrad Hofbauerb0397d62019-01-23 09:46:58 +0100202TEST(WebRtcMediaEngineTest,
203 FilterRtpExtensions_RemoveRedundantBwe_1_KeepAbsSendTime) {
204 std::vector<RtpExtension> extensions;
205 webrtc::test::ScopedFieldTrials override_field_trials_(
206 "WebRTC-KeepAbsSendTimeExtension/Enabled/");
207 extensions.push_back(
208 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
209 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
210 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
211 extensions.push_back(
212 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
213 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
214 std::vector<webrtc::RtpExtension> filtered =
215 FilterRtpExtensions(extensions, SupportedExtensions2, true);
216 EXPECT_EQ(2u, filtered.size());
217 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
218 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[1].uri);
219}
220
jbauch5869f502017-06-29 12:31:36 -0700221TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) {
222 std::vector<RtpExtension> extensions;
223 extensions.push_back(
224 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
225 extensions.push_back(
226 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
227 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
228 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
229 extensions.push_back(
230 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
231 extensions.push_back(
232 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
233 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
234 std::vector<webrtc::RtpExtension> filtered =
235 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200236 EXPECT_EQ(2u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700237 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
238 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
239 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
240}
241
Konrad Hofbauerb0397d62019-01-23 09:46:58 +0100242TEST(WebRtcMediaEngineTest,
243 FilterRtpExtensions_RemoveRedundantBweEncrypted_1_KeepAbsSendTime) {
244 std::vector<RtpExtension> extensions;
245 webrtc::test::ScopedFieldTrials override_field_trials_(
246 "WebRTC-KeepAbsSendTimeExtension/Enabled/");
247 extensions.push_back(
248 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
249 extensions.push_back(
250 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
251 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
252 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
253 extensions.push_back(
254 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
255 extensions.push_back(
256 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
257 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
258 std::vector<webrtc::RtpExtension> filtered =
259 FilterRtpExtensions(extensions, SupportedExtensions2, true);
260 EXPECT_EQ(3u, filtered.size());
261 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
262 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
263 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[2].uri);
264 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
265}
266
solenberg7e4e01a2015-12-02 08:05:01 -0800267TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700268 std::vector<RtpExtension> extensions;
269 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
270 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
271 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
solenberg7e4e01a2015-12-02 08:05:01 -0800272 std::vector<webrtc::RtpExtension> filtered =
273 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200274 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700275 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800276}
277
278TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
isheriff6f8d6862016-05-26 11:24:55 -0700279 std::vector<RtpExtension> extensions;
280 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
281 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800282 std::vector<webrtc::RtpExtension> filtered =
283 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200284 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700285 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800286}
ossu111744e2016-06-15 02:22:32 -0700287
ossu111744e2016-06-15 02:22:32 -0700288TEST(WebRtcMediaEngineFactoryTest, CreateWithBuiltinDecoders) {
289 std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
Anders Carlssonb3306882018-05-14 10:11:42 +0200290 nullptr /* adm */, webrtc::CreateBuiltinAudioEncoderFactory(),
291 webrtc::CreateBuiltinAudioDecoderFactory(),
292 webrtc::CreateBuiltinVideoEncoderFactory(),
Qingsi Wang59844ce2018-11-01 04:45:53 +0000293 webrtc::CreateBuiltinVideoDecoderFactory(), nullptr /* audio_mixer */,
294 webrtc::AudioProcessingBuilder().Create()));
ossu111744e2016-06-15 02:22:32 -0700295 EXPECT_TRUE(engine);
296}
297
Jiawei Ouc2ebe212018-11-08 10:02:56 -0800298TEST(WebRtcMediaEngineFactoryTest, CreateWithVideoBitrateFactory) {
299 std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
300 nullptr /* adm */, webrtc::CreateBuiltinAudioEncoderFactory(),
301 webrtc::CreateBuiltinAudioDecoderFactory(),
302 webrtc::CreateBuiltinVideoEncoderFactory(),
303 webrtc::CreateBuiltinVideoDecoderFactory(),
304 webrtc::CreateBuiltinVideoBitrateAllocatorFactory(),
305 nullptr /* audio_mixer */, webrtc::AudioProcessingBuilder().Create()));
306 EXPECT_TRUE(engine);
307}
308
solenberg7e4e01a2015-12-02 08:05:01 -0800309} // namespace cricket