Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(112)

Side by Side Diff: webrtc/audio/audio_send_stream_unittest.cc

Issue 2705093002: Injectable audio encoders: WebRtcVoiceEngine and company (Closed)
Patch Set: Moved encoder creation up into AudioSendStream, bypassing most of Channel. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <string> 11 #include <string>
12 #include <utility>
12 #include <vector> 13 #include <vector>
13 14
14 #include "webrtc/audio/audio_send_stream.h" 15 #include "webrtc/audio/audio_send_stream.h"
15 #include "webrtc/audio/audio_state.h" 16 #include "webrtc/audio/audio_state.h"
16 #include "webrtc/audio/conversion.h" 17 #include "webrtc/audio/conversion.h"
17 #include "webrtc/base/task_queue.h" 18 #include "webrtc/base/task_queue.h"
18 #include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h" 19 #include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
20 #include "webrtc/modules/audio_coding/codecs/builtin_audio_encoder_factory.h"
19 #include "webrtc/modules/audio_mixer/audio_mixer_impl.h" 21 #include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
20 #include "webrtc/modules/audio_processing/include/mock_audio_processing.h" 22 #include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
21 #include "webrtc/modules/congestion_controller/include/congestion_controller.h" 23 #include "webrtc/modules/congestion_controller/include/congestion_controller.h"
22 #include "webrtc/modules/congestion_controller/include/mock/mock_congestion_cont roller.h" 24 #include "webrtc/modules/congestion_controller/include/mock/mock_congestion_cont roller.h"
23 #include "webrtc/modules/pacing/paced_sender.h" 25 #include "webrtc/modules/pacing/paced_sender.h"
24 #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitra te_estimator.h" 26 #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitra te_estimator.h"
25 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h" 27 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h"
26 #include "webrtc/test/gtest.h" 28 #include "webrtc/test/gtest.h"
27 #include "webrtc/test/mock_voe_channel_proxy.h" 29 #include "webrtc/test/mock_voe_channel_proxy.h"
28 #include "webrtc/test/mock_voice_engine.h" 30 #include "webrtc/test/mock_voice_engine.h"
(...skipping 19 matching lines...) Expand all
48 const float kResidualEchoLikelihood = -1.0f; 50 const float kResidualEchoLikelihood = -1.0f;
49 const unsigned int kSpeechInputLevel = 96; 51 const unsigned int kSpeechInputLevel = 96;
50 const CallStatistics kCallStats = { 52 const CallStatistics kCallStats = {
51 1345, 1678, 1901, 1234, 112, 13456, 17890, 1567, -1890, -1123}; 53 1345, 1678, 1901, 1234, 112, 13456, 17890, 1567, -1890, -1123};
52 const ReportBlock kReportBlock = {456, 780, 123, 567, 890, 132, 143, 13354}; 54 const ReportBlock kReportBlock = {456, 780, 123, 567, 890, 132, 143, 13354};
53 const int kTelephoneEventPayloadType = 123; 55 const int kTelephoneEventPayloadType = 123;
54 const int kTelephoneEventPayloadFrequency = 65432; 56 const int kTelephoneEventPayloadFrequency = 65432;
55 const int kTelephoneEventCode = 45; 57 const int kTelephoneEventCode = 45;
56 const int kTelephoneEventDuration = 6789; 58 const int kTelephoneEventDuration = 6789;
57 const CodecInst kIsacCodec = {103, "isac", 16000, 320, 1, 32000}; 59 const CodecInst kIsacCodec = {103, "isac", 16000, 320, 1, 32000};
60 const int kIsacPayloadType = 103;
61 const SdpAudioFormat kIsacFormat = {"isac", 16000, 1};
kwiberg-webrtc 2017/03/01 12:26:47 The first one can be constexpr. It makes me sad t
ossu 2017/03/20 18:19:48 Acknowledged.
58 62
59 class MockLimitObserver : public BitrateAllocator::LimitObserver { 63 class MockLimitObserver : public BitrateAllocator::LimitObserver {
60 public: 64 public:
61 MOCK_METHOD2(OnAllocationLimitsChanged, 65 MOCK_METHOD2(OnAllocationLimitsChanged,
62 void(uint32_t min_send_bitrate_bps, 66 void(uint32_t min_send_bitrate_bps,
63 uint32_t max_padding_bitrate_bps)); 67 uint32_t max_padding_bitrate_bps));
64 }; 68 };
65 69
66 struct ConfigHelper { 70 struct ConfigHelper {
67 explicit ConfigHelper(bool audio_bwe_enabled) 71 explicit ConfigHelper(bool audio_bwe_enabled, bool expect_set_encoder_call)
kwiberg-webrtc 2017/03/01 12:26:47 Drop "explicit".
ossu 2017/03/02 01:30:28 Sure. Was in a rush!
68 : simulated_clock_(123456), 72 : simulated_clock_(123456),
69 stream_config_(nullptr), 73 stream_config_(nullptr),
70 congestion_controller_(&simulated_clock_, 74 congestion_controller_(&simulated_clock_,
71 &bitrate_observer_, 75 &bitrate_observer_,
72 &remote_bitrate_observer_, 76 &remote_bitrate_observer_,
73 &event_log_, 77 &event_log_,
74 &packet_router_), 78 &packet_router_),
75 bitrate_allocator_(&limit_observer_), 79 bitrate_allocator_(&limit_observer_),
76 worker_queue_("ConfigHelper_worker_queue") { 80 worker_queue_("ConfigHelper_worker_queue") {
77 using testing::Invoke; 81 using testing::Invoke;
(...skipping 11 matching lines...) Expand all
89 config.audio_mixer = AudioMixerImpl::Create(); 93 config.audio_mixer = AudioMixerImpl::Create();
90 audio_state_ = AudioState::Create(config); 94 audio_state_ = AudioState::Create(config);
91 95
92 SetupDefaultChannelProxy(audio_bwe_enabled); 96 SetupDefaultChannelProxy(audio_bwe_enabled);
93 97
94 EXPECT_CALL(voice_engine_, ChannelProxyFactory(kChannelId)) 98 EXPECT_CALL(voice_engine_, ChannelProxyFactory(kChannelId))
95 .WillOnce(Invoke([this](int channel_id) { 99 .WillOnce(Invoke([this](int channel_id) {
96 return channel_proxy_; 100 return channel_proxy_;
97 })); 101 }));
98 102
99 SetupMockForSetupSendCodec(); 103 SetupMockForSetupSendCodec(expect_set_encoder_call);
100 104
101 stream_config_.voe_channel_id = kChannelId; 105 stream_config_.voe_channel_id = kChannelId;
102 stream_config_.rtp.ssrc = kSsrc; 106 stream_config_.rtp.ssrc = kSsrc;
103 stream_config_.rtp.nack.rtp_history_ms = 200; 107 stream_config_.rtp.nack.rtp_history_ms = 200;
104 stream_config_.rtp.c_name = kCName; 108 stream_config_.rtp.c_name = kCName;
105 stream_config_.rtp.extensions.push_back( 109 stream_config_.rtp.extensions.push_back(
106 RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId)); 110 RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId));
107 if (audio_bwe_enabled) { 111 if (audio_bwe_enabled) {
108 stream_config_.rtp.extensions.push_back( 112 stream_config_.rtp.extensions.push_back(
109 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 113 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
110 kTransportSequenceNumberId)); 114 kTransportSequenceNumberId));
111 stream_config_.send_codec_spec.transport_cc_enabled = true; 115 stream_config_.send_codec_spec.transport_cc_enabled = true;
112 } 116 }
113 // Use ISAC as default codec so as to prevent unnecessary |voice_engine_| 117 // Use ISAC as default codec so as to prevent unnecessary |voice_engine_|
114 // calls from the default ctor behavior. 118 // calls from the default ctor behavior.
115 stream_config_.send_codec_spec.codec_inst = kIsacCodec; 119 stream_config_.send_codec_spec.payload_type = kIsacPayloadType;
120 stream_config_.send_codec_spec.format = kIsacFormat;
121 // TODO(ossu): Mock this factory.
122 stream_config_.encoder_factory = CreateBuiltinAudioEncoderFactory();
116 stream_config_.min_bitrate_bps = 10000; 123 stream_config_.min_bitrate_bps = 10000;
117 stream_config_.max_bitrate_bps = 65000; 124 stream_config_.max_bitrate_bps = 65000;
118 } 125 }
119 126
120 AudioSendStream::Config& config() { return stream_config_; } 127 AudioSendStream::Config& config() { return stream_config_; }
121 rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; } 128 rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; }
122 MockVoEChannelProxy* channel_proxy() { return channel_proxy_; } 129 MockVoEChannelProxy* channel_proxy() { return channel_proxy_; }
123 PacketRouter* packet_router() { return &packet_router_; } 130 PacketRouter* packet_router() { return &packet_router_; }
124 CongestionController* congestion_controller() { 131 CongestionController* congestion_controller() {
125 return &congestion_controller_; 132 return &congestion_controller_;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 EXPECT_CALL(*channel_proxy_, RegisterExternalTransport(nullptr)).Times(1); 169 EXPECT_CALL(*channel_proxy_, RegisterExternalTransport(nullptr)).Times(1);
163 EXPECT_CALL(*channel_proxy_, DeRegisterExternalTransport()).Times(1); 170 EXPECT_CALL(*channel_proxy_, DeRegisterExternalTransport()).Times(1);
164 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::NotNull())).Times(1); 171 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::NotNull())).Times(1);
165 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::IsNull())) 172 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::IsNull()))
166 .Times(1); // Destructor resets the event log 173 .Times(1); // Destructor resets the event log
167 EXPECT_CALL(*channel_proxy_, SetRtcpRttStats(&rtcp_rtt_stats_)).Times(1); 174 EXPECT_CALL(*channel_proxy_, SetRtcpRttStats(&rtcp_rtt_stats_)).Times(1);
168 EXPECT_CALL(*channel_proxy_, SetRtcpRttStats(testing::IsNull())) 175 EXPECT_CALL(*channel_proxy_, SetRtcpRttStats(testing::IsNull()))
169 .Times(1); // Destructor resets the rtt stats. 176 .Times(1); // Destructor resets the rtt stats.
170 } 177 }
171 178
172 void SetupMockForSetupSendCodec() { 179 void SetupMockForSetupSendCodec(bool expect_set_encoder_call) {
173 EXPECT_CALL(*channel_proxy_, SetVADStatus(false)) 180 if (expect_set_encoder_call) {
174 .WillOnce(Return(true)); 181 EXPECT_CALL(*channel_proxy_, SetEncoderForMock(_, _))
175 EXPECT_CALL(*channel_proxy_, SetCodecFECStatus(false)) 182 .WillOnce(Return(true));
176 .WillOnce(Return(true)); 183 }
177 EXPECT_CALL(*channel_proxy_, DisableAudioNetworkAdaptor()); 184 // These should no longer be called.
178 // Let |GetSendCodec| return false for the first time to indicate that no 185 EXPECT_CALL(*channel_proxy_, SetVADStatus(_)).Times(0);
the sun 2017/03/16 08:48:19 Well, or you could just remove those methods right
ossu 2017/03/20 18:19:48 Cleaned up these, and probably a few other, unused
179 // send codec has been set. 186 EXPECT_CALL(*channel_proxy_, GetSendCodec(_)).Times(0);
180 EXPECT_CALL(*channel_proxy_, GetSendCodec(_)).WillOnce(Return(false)); 187 EXPECT_CALL(*channel_proxy_, SetSendCodec(_)).Times(0);
181 EXPECT_CALL(*channel_proxy_, SetSendCodec(_)).WillOnce(Return(true)); 188 EXPECT_CALL(*channel_proxy_, SetCodecFECStatus(false)).Times(0);
189 EXPECT_CALL(*channel_proxy_, DisableAudioNetworkAdaptor()).Times(0);
182 } 190 }
191
183 RtcpRttStats* rtcp_rtt_stats() { return &rtcp_rtt_stats_; } 192 RtcpRttStats* rtcp_rtt_stats() { return &rtcp_rtt_stats_; }
184 193
185 void SetupMockForSendTelephoneEvent() { 194 void SetupMockForSendTelephoneEvent() {
186 EXPECT_TRUE(channel_proxy_); 195 EXPECT_TRUE(channel_proxy_);
187 EXPECT_CALL(*channel_proxy_, 196 EXPECT_CALL(*channel_proxy_,
188 SetSendTelephoneEventPayloadType(kTelephoneEventPayloadType, 197 SetSendTelephoneEventPayloadType(kTelephoneEventPayloadType,
189 kTelephoneEventPayloadFrequency)) 198 kTelephoneEventPayloadFrequency))
190 .WillOnce(Return(true)); 199 .WillOnce(Return(true));
191 EXPECT_CALL(*channel_proxy_, 200 EXPECT_CALL(*channel_proxy_,
192 SendTelephoneEventOutband(kTelephoneEventCode, kTelephoneEventDuration)) 201 SendTelephoneEventOutband(kTelephoneEventCode, kTelephoneEventDuration))
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 265
257 TEST(AudioSendStreamTest, ConfigToString) { 266 TEST(AudioSendStreamTest, ConfigToString) {
258 AudioSendStream::Config config(nullptr); 267 AudioSendStream::Config config(nullptr);
259 config.rtp.ssrc = kSsrc; 268 config.rtp.ssrc = kSsrc;
260 config.rtp.c_name = kCName; 269 config.rtp.c_name = kCName;
261 config.voe_channel_id = kChannelId; 270 config.voe_channel_id = kChannelId;
262 config.min_bitrate_bps = 12000; 271 config.min_bitrate_bps = 12000;
263 config.max_bitrate_bps = 34000; 272 config.max_bitrate_bps = 34000;
264 config.send_codec_spec.nack_enabled = true; 273 config.send_codec_spec.nack_enabled = true;
265 config.send_codec_spec.transport_cc_enabled = false; 274 config.send_codec_spec.transport_cc_enabled = false;
266 config.send_codec_spec.enable_codec_fec = true;
267 config.send_codec_spec.enable_opus_dtx = false;
268 config.send_codec_spec.opus_max_playback_rate = 32000;
269 config.send_codec_spec.cng_payload_type = 42; 275 config.send_codec_spec.cng_payload_type = 42;
270 config.send_codec_spec.cng_plfreq = 56; 276 config.send_codec_spec.payload_type = kIsacPayloadType;
271 config.send_codec_spec.min_ptime_ms = 20; 277 config.send_codec_spec.format = kIsacFormat;
272 config.send_codec_spec.max_ptime_ms = 60; 278 // TODO(ossu): Maybe mock this?
273 config.send_codec_spec.codec_inst = kIsacCodec; 279 config.encoder_factory = CreateBuiltinAudioEncoderFactory();
274 config.rtp.extensions.push_back( 280 config.rtp.extensions.push_back(
275 RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId)); 281 RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId));
276 EXPECT_EQ( 282 EXPECT_EQ(
277 "{rtp: {ssrc: 1234, extensions: [{uri: " 283 "{rtp: {ssrc: 1234, extensions: [{uri: "
278 "urn:ietf:params:rtp-hdrext:ssrc-audio-level, id: 2}], nack: " 284 "urn:ietf:params:rtp-hdrext:ssrc-audio-level, id: 2}], nack: "
279 "{rtp_history_ms: 0}, c_name: foo_name}, send_transport: nullptr, " 285 "{rtp_history_ms: 0}, c_name: foo_name}, send_transport: nullptr, "
280 "voe_channel_id: 1, min_bitrate_bps: 12000, max_bitrate_bps: 34000, " 286 "voe_channel_id: 1, min_bitrate_bps: 12000, max_bitrate_bps: 34000, "
281 "send_codec_spec: {nack_enabled: true, transport_cc_enabled: false, " 287 "send_codec_spec: {nack_enabled: true, transport_cc_enabled: false, "
282 "enable_codec_fec: true, enable_opus_dtx: false, opus_max_playback_rate: " 288 "cng_payload_type: 42, payload_type: 103, "
283 "32000, cng_payload_type: 42, cng_plfreq: 56, min_ptime: 20, max_ptime: " 289 "format: {name: isac, clockrate_hz: 16000, num_channels: 1, "
284 "60, codec_inst: {pltype: 103, plname: \"isac\", plfreq: 16000, pacsize: " 290 "parameters: {}}}}",
285 "320, channels: 1, rate: 32000}}}",
286 config.ToString()); 291 config.ToString());
287 } 292 }
288 293
289 TEST(AudioSendStreamTest, ConstructDestruct) { 294 TEST(AudioSendStreamTest, ConstructDestruct) {
290 ConfigHelper helper(false); 295 ConfigHelper helper(false, true);
291 internal::AudioSendStream send_stream( 296 internal::AudioSendStream send_stream(
292 helper.config(), helper.audio_state(), helper.worker_queue(), 297 helper.config(), helper.audio_state(), helper.worker_queue(),
293 helper.packet_router(), helper.congestion_controller(), 298 helper.packet_router(), helper.congestion_controller(),
294 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 299 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
295 } 300 }
296 301
297 TEST(AudioSendStreamTest, SendTelephoneEvent) { 302 TEST(AudioSendStreamTest, SendTelephoneEvent) {
298 ConfigHelper helper(false); 303 ConfigHelper helper(false, true);
299 internal::AudioSendStream send_stream( 304 internal::AudioSendStream send_stream(
300 helper.config(), helper.audio_state(), helper.worker_queue(), 305 helper.config(), helper.audio_state(), helper.worker_queue(),
301 helper.packet_router(), helper.congestion_controller(), 306 helper.packet_router(), helper.congestion_controller(),
302 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 307 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
303 helper.SetupMockForSendTelephoneEvent(); 308 helper.SetupMockForSendTelephoneEvent();
304 EXPECT_TRUE(send_stream.SendTelephoneEvent(kTelephoneEventPayloadType, 309 EXPECT_TRUE(send_stream.SendTelephoneEvent(kTelephoneEventPayloadType,
305 kTelephoneEventPayloadFrequency, kTelephoneEventCode, 310 kTelephoneEventPayloadFrequency, kTelephoneEventCode,
306 kTelephoneEventDuration)); 311 kTelephoneEventDuration));
307 } 312 }
308 313
309 TEST(AudioSendStreamTest, SetMuted) { 314 TEST(AudioSendStreamTest, SetMuted) {
310 ConfigHelper helper(false); 315 ConfigHelper helper(false, true);
311 internal::AudioSendStream send_stream( 316 internal::AudioSendStream send_stream(
312 helper.config(), helper.audio_state(), helper.worker_queue(), 317 helper.config(), helper.audio_state(), helper.worker_queue(),
313 helper.packet_router(), helper.congestion_controller(), 318 helper.packet_router(), helper.congestion_controller(),
314 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 319 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
315 EXPECT_CALL(*helper.channel_proxy(), SetInputMute(true)); 320 EXPECT_CALL(*helper.channel_proxy(), SetInputMute(true));
316 send_stream.SetMuted(true); 321 send_stream.SetMuted(true);
317 } 322 }
318 323
319 TEST(AudioSendStreamTest, AudioBweCorrectObjectsOnChannelProxy) { 324 TEST(AudioSendStreamTest, AudioBweCorrectObjectsOnChannelProxy) {
320 ConfigHelper helper(true); 325 ConfigHelper helper(true, true);
321 internal::AudioSendStream send_stream( 326 internal::AudioSendStream send_stream(
322 helper.config(), helper.audio_state(), helper.worker_queue(), 327 helper.config(), helper.audio_state(), helper.worker_queue(),
323 helper.packet_router(), helper.congestion_controller(), 328 helper.packet_router(), helper.congestion_controller(),
324 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 329 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
325 } 330 }
326 331
327 TEST(AudioSendStreamTest, NoAudioBweCorrectObjectsOnChannelProxy) { 332 TEST(AudioSendStreamTest, NoAudioBweCorrectObjectsOnChannelProxy) {
328 ConfigHelper helper(false); 333 ConfigHelper helper(false, true);
329 internal::AudioSendStream send_stream( 334 internal::AudioSendStream send_stream(
330 helper.config(), helper.audio_state(), helper.worker_queue(), 335 helper.config(), helper.audio_state(), helper.worker_queue(),
331 helper.packet_router(), helper.congestion_controller(), 336 helper.packet_router(), helper.congestion_controller(),
332 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 337 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
333 } 338 }
334 339
335 TEST(AudioSendStreamTest, GetStats) { 340 TEST(AudioSendStreamTest, GetStats) {
336 ConfigHelper helper(false); 341 ConfigHelper helper(false, true);
337 internal::AudioSendStream send_stream( 342 internal::AudioSendStream send_stream(
338 helper.config(), helper.audio_state(), helper.worker_queue(), 343 helper.config(), helper.audio_state(), helper.worker_queue(),
339 helper.packet_router(), helper.congestion_controller(), 344 helper.packet_router(), helper.congestion_controller(),
340 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 345 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
341 helper.SetupMockForGetStats(); 346 helper.SetupMockForGetStats();
342 AudioSendStream::Stats stats = send_stream.GetStats(); 347 AudioSendStream::Stats stats = send_stream.GetStats();
343 EXPECT_EQ(kSsrc, stats.local_ssrc); 348 EXPECT_EQ(kSsrc, stats.local_ssrc);
344 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesSent), stats.bytes_sent); 349 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesSent), stats.bytes_sent);
345 EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent); 350 EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent);
346 EXPECT_EQ(static_cast<int32_t>(kReportBlock.cumulative_num_packets_lost), 351 EXPECT_EQ(static_cast<int32_t>(kReportBlock.cumulative_num_packets_lost),
(...skipping 10 matching lines...) Expand all
357 EXPECT_EQ(-1, stats.aec_quality_min); 362 EXPECT_EQ(-1, stats.aec_quality_min);
358 EXPECT_EQ(kEchoDelayMedian, stats.echo_delay_median_ms); 363 EXPECT_EQ(kEchoDelayMedian, stats.echo_delay_median_ms);
359 EXPECT_EQ(kEchoDelayStdDev, stats.echo_delay_std_ms); 364 EXPECT_EQ(kEchoDelayStdDev, stats.echo_delay_std_ms);
360 EXPECT_EQ(kEchoReturnLoss, stats.echo_return_loss); 365 EXPECT_EQ(kEchoReturnLoss, stats.echo_return_loss);
361 EXPECT_EQ(kEchoReturnLossEnhancement, stats.echo_return_loss_enhancement); 366 EXPECT_EQ(kEchoReturnLossEnhancement, stats.echo_return_loss_enhancement);
362 EXPECT_EQ(kResidualEchoLikelihood, stats.residual_echo_likelihood); 367 EXPECT_EQ(kResidualEchoLikelihood, stats.residual_echo_likelihood);
363 EXPECT_FALSE(stats.typing_noise_detected); 368 EXPECT_FALSE(stats.typing_noise_detected);
364 } 369 }
365 370
366 TEST(AudioSendStreamTest, GetStatsTypingNoiseDetected) { 371 TEST(AudioSendStreamTest, GetStatsTypingNoiseDetected) {
367 ConfigHelper helper(false); 372 ConfigHelper helper(false, true);
368 internal::AudioSendStream send_stream( 373 internal::AudioSendStream send_stream(
369 helper.config(), helper.audio_state(), helper.worker_queue(), 374 helper.config(), helper.audio_state(), helper.worker_queue(),
370 helper.packet_router(), helper.congestion_controller(), 375 helper.packet_router(), helper.congestion_controller(),
371 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 376 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
372 helper.SetupMockForGetStats(); 377 helper.SetupMockForGetStats();
373 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); 378 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected);
374 379
375 internal::AudioState* internal_audio_state = 380 internal::AudioState* internal_audio_state =
376 static_cast<internal::AudioState*>(helper.audio_state().get()); 381 static_cast<internal::AudioState*>(helper.audio_state().get());
377 VoiceEngineObserver* voe_observer = 382 VoiceEngineObserver* voe_observer =
378 static_cast<VoiceEngineObserver*>(internal_audio_state); 383 static_cast<VoiceEngineObserver*>(internal_audio_state);
379 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_WARNING); 384 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_WARNING);
380 EXPECT_TRUE(send_stream.GetStats().typing_noise_detected); 385 EXPECT_TRUE(send_stream.GetStats().typing_noise_detected);
381 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_OFF_WARNING); 386 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_OFF_WARNING);
382 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); 387 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected);
383 } 388 }
384 389
385 TEST(AudioSendStreamTest, SendCodecAppliesConfigParams) { 390 TEST(AudioSendStreamTest, SendCodecAppliesNetworkAdaptor) {
386 ConfigHelper helper(false); 391 ConfigHelper helper(false, true);
387 auto stream_config = helper.config(); 392 auto stream_config = helper.config();
388 const CodecInst kOpusCodec = {111, "opus", 48000, 960, 2, 64000}; 393 const webrtc::SdpAudioFormat kOpusFormat = {"opus", 48000, 2};
389 stream_config.send_codec_spec.codec_inst = kOpusCodec; 394 stream_config.send_codec_spec.format = kOpusFormat;
390 stream_config.send_codec_spec.enable_codec_fec = true;
391 stream_config.send_codec_spec.enable_opus_dtx = true;
392 stream_config.send_codec_spec.opus_max_playback_rate = 12345;
393 stream_config.send_codec_spec.cng_plfreq = 16000;
394 stream_config.send_codec_spec.cng_payload_type = 105;
395 stream_config.send_codec_spec.min_ptime_ms = 10;
396 stream_config.send_codec_spec.max_ptime_ms = 60;
397 stream_config.audio_network_adaptor_config = 395 stream_config.audio_network_adaptor_config =
398 rtc::Optional<std::string>("abced"); 396 rtc::Optional<std::string>("abced");
399 EXPECT_CALL(*helper.channel_proxy(), SetCodecFECStatus(true))
400 .WillOnce(Return(true));
401 EXPECT_CALL(
402 *helper.channel_proxy(),
403 SetOpusDtx(stream_config.send_codec_spec.enable_opus_dtx))
404 .WillOnce(Return(true));
405 EXPECT_CALL(
406 *helper.channel_proxy(),
407 SetOpusMaxPlaybackRate(
408 stream_config.send_codec_spec.opus_max_playback_rate))
409 .WillOnce(Return(true));
410 EXPECT_CALL(*helper.channel_proxy(),
411 SetSendCNPayloadType(
412 stream_config.send_codec_spec.cng_payload_type,
413 webrtc::kFreq16000Hz))
414 .WillOnce(Return(true));
415 EXPECT_CALL(
416 *helper.channel_proxy(),
417 SetReceiverFrameLengthRange(stream_config.send_codec_spec.min_ptime_ms,
418 stream_config.send_codec_spec.max_ptime_ms));
419 EXPECT_CALL( 397 EXPECT_CALL(
420 *helper.channel_proxy(), 398 *helper.channel_proxy(),
421 EnableAudioNetworkAdaptor(*stream_config.audio_network_adaptor_config)); 399 EnableAudioNetworkAdaptor(*stream_config.audio_network_adaptor_config));
422 internal::AudioSendStream send_stream( 400 internal::AudioSendStream send_stream(
423 stream_config, helper.audio_state(), helper.worker_queue(), 401 stream_config, helper.audio_state(), helper.worker_queue(),
424 helper.packet_router(), helper.congestion_controller(), 402 helper.packet_router(), helper.congestion_controller(),
425 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 403 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
426 } 404 }
427 405
428 // VAD is applied when codec is mono and the CNG frequency matches the codec 406 // VAD is applied when codec is mono and the CNG frequency matches the codec
429 // sample rate. 407 // clock rate.
430 TEST(AudioSendStreamTest, SendCodecCanApplyVad) { 408 TEST(AudioSendStreamTest, SendCodecCanApplyVad) {
431 ConfigHelper helper(false); 409 ConfigHelper helper(false, false);
432 auto stream_config = helper.config(); 410 auto stream_config = helper.config();
433 const CodecInst kG722Codec = {9, "g722", 8000, 160, 1, 16000}; 411 stream_config.send_codec_spec.payload_type = 9;
434 stream_config.send_codec_spec.codec_inst = kG722Codec; 412 stream_config.send_codec_spec.format = {"g722", 8000, 1};
435 stream_config.send_codec_spec.cng_plfreq = 8000;
436 stream_config.send_codec_spec.cng_payload_type = 105; 413 stream_config.send_codec_spec.cng_payload_type = 105;
437 EXPECT_CALL(*helper.channel_proxy(), SetVADStatus(true)) 414
438 .WillOnce(Return(true)); 415 using ::testing::Invoke;
416 std::unique_ptr<AudioEncoder> stolen_encoder;
417 EXPECT_CALL(*helper.channel_proxy(), SetEncoderForMock(_, _))
418 .WillOnce(Invoke([&stolen_encoder](
419 int payload_type, std::unique_ptr<AudioEncoder>& encoder) {
420 stolen_encoder = std::move(encoder);
421 return true;
422 }));
423
439 internal::AudioSendStream send_stream( 424 internal::AudioSendStream send_stream(
440 stream_config, helper.audio_state(), helper.worker_queue(), 425 stream_config, helper.audio_state(), helper.worker_queue(),
441 helper.packet_router(), helper.congestion_controller(), 426 helper.packet_router(), helper.congestion_controller(),
442 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 427 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
428
429 // We cannot truly determine if the encoder created is an AudioEncoderCng. It
430 // is the only reasonable implementation that will return something from
431 // ReclaimContainedEncoders, though.
432 ASSERT_TRUE(stolen_encoder);
433 EXPECT_FALSE(stolen_encoder->ReclaimContainedEncoders().empty());
443 } 434 }
444 435
445 TEST(AudioSendStreamTest, DoesNotPassHigherBitrateThanMaxBitrate) { 436 TEST(AudioSendStreamTest, DoesNotPassHigherBitrateThanMaxBitrate) {
446 ConfigHelper helper(false); 437 ConfigHelper helper(false, true);
447 internal::AudioSendStream send_stream( 438 internal::AudioSendStream send_stream(
448 helper.config(), helper.audio_state(), helper.worker_queue(), 439 helper.config(), helper.audio_state(), helper.worker_queue(),
449 helper.packet_router(), helper.congestion_controller(), 440 helper.packet_router(), helper.congestion_controller(),
450 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 441 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
451 EXPECT_CALL(*helper.channel_proxy(), 442 EXPECT_CALL(*helper.channel_proxy(),
452 SetBitrate(helper.config().max_bitrate_bps, _)); 443 SetBitrate(helper.config().max_bitrate_bps, _));
453 send_stream.OnBitrateUpdated(helper.config().max_bitrate_bps + 5000, 0.0, 50, 444 send_stream.OnBitrateUpdated(helper.config().max_bitrate_bps + 5000, 0.0, 50,
454 6000); 445 6000);
455 } 446 }
456 447
457 TEST(AudioSendStreamTest, ProbingIntervalOnBitrateUpdated) { 448 TEST(AudioSendStreamTest, ProbingIntervalOnBitrateUpdated) {
458 ConfigHelper helper(false); 449 ConfigHelper helper(false, true);
459 internal::AudioSendStream send_stream( 450 internal::AudioSendStream send_stream(
460 helper.config(), helper.audio_state(), helper.worker_queue(), 451 helper.config(), helper.audio_state(), helper.worker_queue(),
461 helper.packet_router(), helper.congestion_controller(), 452 helper.packet_router(), helper.congestion_controller(),
462 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats()); 453 helper.bitrate_allocator(), helper.event_log(), helper.rtcp_rtt_stats());
463 EXPECT_CALL(*helper.channel_proxy(), SetBitrate(_, 5000)); 454 EXPECT_CALL(*helper.channel_proxy(), SetBitrate(_, 5000));
464 send_stream.OnBitrateUpdated(50000, 0.0, 50, 5000); 455 send_stream.OnBitrateUpdated(50000, 0.0, 50, 5000);
465 } 456 }
466 457
467 } // namespace test 458 } // namespace test
468 } // namespace webrtc 459 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698