blob: 9a6a3722a69363fbc24e004c808b49b56026f13c [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 Oube142172018-10-10 01:16:20 -070015#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"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "media/engine/webrtcmediaengine.h"
Anders Carlssonb3306882018-05-14 10:11:42 +020019#include "modules/audio_processing/include/audio_processing.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "test/gtest.h"
solenberg7e4e01a2015-12-02 08:05:01 -080021
isheriff6f8d6862016-05-26 11:24:55 -070022using webrtc::RtpExtension;
23
solenberg7e4e01a2015-12-02 08:05:01 -080024namespace cricket {
25namespace {
26
isheriff6f8d6862016-05-26 11:24:55 -070027std::vector<RtpExtension> MakeUniqueExtensions() {
28 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080029 char name[] = "a";
30 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070031 result.push_back(RtpExtension(name, 1 + i));
solenberg7e4e01a2015-12-02 08:05:01 -080032 name[0]++;
Johannes Kron07ba2b92018-09-26 13:33:35 +020033 result.push_back(RtpExtension(name, 255 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080034 name[0]++;
35 }
36 return result;
37}
38
isheriff6f8d6862016-05-26 11:24:55 -070039std::vector<RtpExtension> MakeRedundantExtensions() {
40 std::vector<RtpExtension> result;
solenberg7e4e01a2015-12-02 08:05:01 -080041 char name[] = "a";
42 for (int i = 0; i < 7; ++i) {
isheriff6f8d6862016-05-26 11:24:55 -070043 result.push_back(RtpExtension(name, 1 + i));
Johannes Kron07ba2b92018-09-26 13:33:35 +020044 result.push_back(RtpExtension(name, 255 - i));
solenberg7e4e01a2015-12-02 08:05:01 -080045 name[0]++;
46 }
47 return result;
48}
49
50bool SupportedExtensions1(const std::string& name) {
51 return name == "c" || name == "i";
52}
53
54bool SupportedExtensions2(const std::string& name) {
55 return name != "a" && name != "n";
56}
57
58bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
59 const std::string* last = nullptr;
60 for (const auto& extension : extensions) {
isheriff6f8d6862016-05-26 11:24:55 -070061 if (last && *last > extension.uri) {
solenberg7e4e01a2015-12-02 08:05:01 -080062 return false;
63 }
isheriff6f8d6862016-05-26 11:24:55 -070064 last = &extension.uri;
solenberg7e4e01a2015-12-02 08:05:01 -080065 }
66 return true;
67}
68} // namespace
69
70TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -070071 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -080072 EXPECT_TRUE(ValidateRtpExtensions(extensions));
73}
74
75TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
isheriff6f8d6862016-05-26 11:24:55 -070076 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -080077 EXPECT_TRUE(ValidateRtpExtensions(extensions));
78}
79
80TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
isheriff6f8d6862016-05-26 11:24:55 -070081 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
82 extensions.push_back(RtpExtension("foo", 0));
solenberg7e4e01a2015-12-02 08:05:01 -080083 EXPECT_FALSE(ValidateRtpExtensions(extensions));
84}
85
86TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
isheriff6f8d6862016-05-26 11:24:55 -070087 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
Johannes Kron07ba2b92018-09-26 13:33:35 +020088 extensions.push_back(RtpExtension("foo", 256));
solenberg7e4e01a2015-12-02 08:05:01 -080089 EXPECT_FALSE(ValidateRtpExtensions(extensions));
90}
91
92TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070093 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
94 extensions.push_back(RtpExtension("foo", 1));
solenberg7e4e01a2015-12-02 08:05:01 -080095 EXPECT_FALSE(ValidateRtpExtensions(extensions));
96}
97
98TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
isheriff6f8d6862016-05-26 11:24:55 -070099 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
Johannes Kron07ba2b92018-09-26 13:33:35 +0200100 extensions.push_back(RtpExtension("foo", 255));
solenberg7e4e01a2015-12-02 08:05:01 -0800101 EXPECT_FALSE(ValidateRtpExtensions(extensions));
102}
103
104TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
isheriff6f8d6862016-05-26 11:24:55 -0700105 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800106 std::vector<webrtc::RtpExtension> filtered =
107 FilterRtpExtensions(extensions, SupportedExtensions1, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200108 EXPECT_EQ(0u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800109}
110
111TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
isheriff6f8d6862016-05-26 11:24:55 -0700112 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800113 std::vector<webrtc::RtpExtension> filtered =
114 FilterRtpExtensions(extensions, SupportedExtensions1, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200115 EXPECT_EQ(2u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700116 EXPECT_EQ("c", filtered[0].uri);
117 EXPECT_EQ("i", filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800118}
119
120TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700121 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800122 std::vector<webrtc::RtpExtension> filtered =
123 FilterRtpExtensions(extensions, SupportedExtensions2, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200124 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800125 EXPECT_TRUE(IsSorted(filtered));
126}
127
128TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700129 std::vector<RtpExtension> extensions = MakeUniqueExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800130 std::vector<webrtc::RtpExtension> filtered =
131 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200132 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800133 EXPECT_TRUE(IsSorted(filtered));
134}
135
136TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700137 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800138 std::vector<webrtc::RtpExtension> filtered =
139 FilterRtpExtensions(extensions, SupportedExtensions2, false);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200140 EXPECT_EQ(12u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800141 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700142 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800143}
144
145TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
isheriff6f8d6862016-05-26 11:24:55 -0700146 std::vector<RtpExtension> extensions = MakeRedundantExtensions();
solenberg7e4e01a2015-12-02 08:05:01 -0800147 std::vector<webrtc::RtpExtension> filtered =
148 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200149 EXPECT_EQ(6u, filtered.size());
solenberg7e4e01a2015-12-02 08:05:01 -0800150 EXPECT_TRUE(IsSorted(filtered));
isheriff6f8d6862016-05-26 11:24:55 -0700151 EXPECT_NE(filtered[0].uri, filtered[1].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800152}
153
jbauch5869f502017-06-29 12:31:36 -0700154TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_1) {
155 std::vector<RtpExtension> extensions;
156 extensions.push_back(webrtc::RtpExtension("b", 1));
157 extensions.push_back(webrtc::RtpExtension("b", 2, true));
158 extensions.push_back(webrtc::RtpExtension("c", 3));
159 extensions.push_back(webrtc::RtpExtension("b", 4));
160 std::vector<webrtc::RtpExtension> filtered =
161 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200162 EXPECT_EQ(3u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700163 EXPECT_TRUE(IsSorted(filtered));
164 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
165 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
166 EXPECT_NE(filtered[0].uri, filtered[2].uri);
167 EXPECT_NE(filtered[1].uri, filtered[2].uri);
168}
169
170TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_2) {
171 std::vector<RtpExtension> extensions;
172 extensions.push_back(webrtc::RtpExtension("b", 1, true));
173 extensions.push_back(webrtc::RtpExtension("b", 2));
174 extensions.push_back(webrtc::RtpExtension("c", 3));
175 extensions.push_back(webrtc::RtpExtension("b", 4));
176 std::vector<webrtc::RtpExtension> filtered =
177 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200178 EXPECT_EQ(3u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700179 EXPECT_TRUE(IsSorted(filtered));
180 EXPECT_EQ(filtered[0].uri, filtered[1].uri);
181 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
182 EXPECT_NE(filtered[0].uri, filtered[2].uri);
183 EXPECT_NE(filtered[1].uri, filtered[2].uri);
184}
185
solenberg7e4e01a2015-12-02 08:05:01 -0800186TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
isheriff6f8d6862016-05-26 11:24:55 -0700187 std::vector<RtpExtension> extensions;
solenberg7e4e01a2015-12-02 08:05:01 -0800188 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700189 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
190 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
191 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
solenberg7e4e01a2015-12-02 08:05:01 -0800192 extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -0700193 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
194 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800195 std::vector<webrtc::RtpExtension> filtered =
196 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200197 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700198 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800199}
200
jbauch5869f502017-06-29 12:31:36 -0700201TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) {
202 std::vector<RtpExtension> extensions;
203 extensions.push_back(
204 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
205 extensions.push_back(
206 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
207 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
208 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
209 extensions.push_back(
210 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
211 extensions.push_back(
212 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
213 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
214 std::vector<webrtc::RtpExtension> filtered =
215 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200216 EXPECT_EQ(2u, filtered.size());
jbauch5869f502017-06-29 12:31:36 -0700217 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
218 EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
219 EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
220}
221
solenberg7e4e01a2015-12-02 08:05:01 -0800222TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
isheriff6f8d6862016-05-26 11:24:55 -0700223 std::vector<RtpExtension> extensions;
224 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
225 extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
226 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
solenberg7e4e01a2015-12-02 08:05:01 -0800227 std::vector<webrtc::RtpExtension> filtered =
228 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200229 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700230 EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800231}
232
233TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
isheriff6f8d6862016-05-26 11:24:55 -0700234 std::vector<RtpExtension> extensions;
235 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
236 extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
solenberg7e4e01a2015-12-02 08:05:01 -0800237 std::vector<webrtc::RtpExtension> filtered =
238 FilterRtpExtensions(extensions, SupportedExtensions2, true);
Mirko Bonadeif859e552018-05-30 15:31:29 +0200239 EXPECT_EQ(1u, filtered.size());
isheriff6f8d6862016-05-26 11:24:55 -0700240 EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
solenberg7e4e01a2015-12-02 08:05:01 -0800241}
ossu111744e2016-06-15 02:22:32 -0700242
ossu111744e2016-06-15 02:22:32 -0700243TEST(WebRtcMediaEngineFactoryTest, CreateWithBuiltinDecoders) {
244 std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
Anders Carlssonb3306882018-05-14 10:11:42 +0200245 nullptr /* adm */, webrtc::CreateBuiltinAudioEncoderFactory(),
246 webrtc::CreateBuiltinAudioDecoderFactory(),
247 webrtc::CreateBuiltinVideoEncoderFactory(),
Jiawei Oube142172018-10-10 01:16:20 -0700248 webrtc::CreateBuiltinVideoDecoderFactory(),
249 webrtc::CreateBuiltinVideoBitrateAllocatorFactory(),
250 nullptr /* audio_mixer */, webrtc::AudioProcessingBuilder().Create()));
ossu111744e2016-06-15 02:22:32 -0700251 EXPECT_TRUE(engine);
252}
253
solenberg7e4e01a2015-12-02 08:05:01 -0800254} // namespace cricket