OLD | NEW |
---|---|
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 |
(...skipping 26 matching lines...) Expand all Loading... | |
37 const int kAudioLevelId = 2; | 37 const int kAudioLevelId = 2; |
38 const int kAbsSendTimeId = 3; | 38 const int kAbsSendTimeId = 3; |
39 const int kTransportSequenceNumberId = 4; | 39 const int kTransportSequenceNumberId = 4; |
40 const int kEchoDelayMedian = 254; | 40 const int kEchoDelayMedian = 254; |
41 const int kEchoDelayStdDev = -3; | 41 const int kEchoDelayStdDev = -3; |
42 const int kEchoReturnLoss = -65; | 42 const int kEchoReturnLoss = -65; |
43 const int kEchoReturnLossEnhancement = 101; | 43 const int kEchoReturnLossEnhancement = 101; |
44 const unsigned int kSpeechInputLevel = 96; | 44 const unsigned int kSpeechInputLevel = 96; |
45 const CallStatistics kCallStats = { | 45 const CallStatistics kCallStats = { |
46 1345, 1678, 1901, 1234, 112, 13456, 17890, 1567, -1890, -1123}; | 46 1345, 1678, 1901, 1234, 112, 13456, 17890, 1567, -1890, -1123}; |
47 const CodecInst kCodecInst = {-121, "codec_name_send", 48000, -231, 0, -671}; | |
48 const ReportBlock kReportBlock = {456, 780, 123, 567, 890, 132, 143, 13354}; | 47 const ReportBlock kReportBlock = {456, 780, 123, 567, 890, 132, 143, 13354}; |
49 const int kTelephoneEventPayloadType = 123; | 48 const int kTelephoneEventPayloadType = 123; |
50 const int kTelephoneEventCode = 45; | 49 const int kTelephoneEventCode = 45; |
51 const int kTelephoneEventDuration = 6789; | 50 const int kTelephoneEventDuration = 6789; |
51 const CodecInst kIsacCodec = {103, "isac", 16000, 320, 1, 32000}; | |
52 | 52 |
53 class MockLimitObserver : public BitrateAllocator::LimitObserver { | 53 class MockLimitObserver : public BitrateAllocator::LimitObserver { |
54 public: | 54 public: |
55 MOCK_METHOD2(OnAllocationLimitsChanged, | 55 MOCK_METHOD2(OnAllocationLimitsChanged, |
56 void(uint32_t min_send_bitrate_bps, | 56 void(uint32_t min_send_bitrate_bps, |
57 uint32_t max_padding_bitrate_bps)); | 57 uint32_t max_padding_bitrate_bps)); |
58 }; | 58 }; |
59 | 59 |
60 struct ConfigHelper { | 60 struct ConfigHelper { |
61 ConfigHelper() | 61 ConfigHelper() |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
104 EXPECT_CALL(*channel_proxy_, RegisterExternalTransport(nullptr)) | 104 EXPECT_CALL(*channel_proxy_, RegisterExternalTransport(nullptr)) |
105 .Times(1); | 105 .Times(1); |
106 EXPECT_CALL(*channel_proxy_, DeRegisterExternalTransport()) | 106 EXPECT_CALL(*channel_proxy_, DeRegisterExternalTransport()) |
107 .Times(1); | 107 .Times(1); |
108 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::NotNull())) | 108 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::NotNull())) |
109 .Times(1); | 109 .Times(1); |
110 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::IsNull())) | 110 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::IsNull())) |
111 .Times(1); // Destructor resets the event log | 111 .Times(1); // Destructor resets the event log |
112 return channel_proxy_; | 112 return channel_proxy_; |
113 })); | 113 })); |
114 SetupMockForSetupSendCodec(); | |
114 stream_config_.voe_channel_id = kChannelId; | 115 stream_config_.voe_channel_id = kChannelId; |
115 stream_config_.rtp.ssrc = kSsrc; | 116 stream_config_.rtp.ssrc = kSsrc; |
116 stream_config_.rtp.nack.rtp_history_ms = 200; | 117 stream_config_.rtp.nack.rtp_history_ms = 200; |
117 stream_config_.rtp.c_name = kCName; | 118 stream_config_.rtp.c_name = kCName; |
118 stream_config_.rtp.extensions.push_back( | 119 stream_config_.rtp.extensions.push_back( |
119 RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId)); | 120 RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId)); |
120 stream_config_.rtp.extensions.push_back( | 121 stream_config_.rtp.extensions.push_back( |
121 RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId)); | 122 RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId)); |
122 stream_config_.rtp.extensions.push_back(RtpExtension( | 123 stream_config_.rtp.extensions.push_back(RtpExtension( |
123 RtpExtension::kTransportSequenceNumberUri, kTransportSequenceNumberId)); | 124 RtpExtension::kTransportSequenceNumberUri, kTransportSequenceNumberId)); |
125 // Use ISAC as default codec so as to prevent unnecessary |voice_engine_| | |
126 // calls from the default ctor behavior. | |
127 stream_config_.send_codec_spec.codec_inst = kIsacCodec; | |
124 } | 128 } |
125 | 129 |
126 AudioSendStream::Config& config() { return stream_config_; } | 130 AudioSendStream::Config& config() { return stream_config_; } |
127 rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; } | 131 rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; } |
128 MockVoEChannelProxy* channel_proxy() { return channel_proxy_; } | 132 MockVoEChannelProxy* channel_proxy() { return channel_proxy_; } |
129 CongestionController* congestion_controller() { | 133 CongestionController* congestion_controller() { |
130 return &congestion_controller_; | 134 return &congestion_controller_; |
131 } | 135 } |
132 BitrateAllocator* bitrate_allocator() { return &bitrate_allocator_; } | 136 BitrateAllocator* bitrate_allocator() { return &bitrate_allocator_; } |
133 rtc::TaskQueue* worker_queue() { return &worker_queue_; } | 137 rtc::TaskQueue* worker_queue() { return &worker_queue_; } |
134 RtcEventLog* event_log() { return &event_log_; } | 138 RtcEventLog* event_log() { return &event_log_; } |
139 MockVoiceEngine* voice_engine() { return &voice_engine_; } | |
140 | |
141 void SetupMockForSetupSendCodec() { | |
142 EXPECT_CALL(voice_engine_, SetVADStatus(kChannelId, false, _, _)) | |
143 .WillOnce(Return(0)); | |
144 EXPECT_CALL(voice_engine_, SetFECStatus(kChannelId, false)) | |
145 .WillOnce(Return(0)); | |
146 // Let |GetSendCodec| return -1 for the first time to indicate that no send | |
147 // codec has been set. | |
148 EXPECT_CALL(voice_engine_, GetSendCodec(kChannelId, _)) | |
149 .WillOnce(Return(-1)); | |
150 EXPECT_CALL(voice_engine_, SetSendCodec(kChannelId, _)).WillOnce(Return(0)); | |
151 } | |
135 | 152 |
136 void SetupMockForSendTelephoneEvent() { | 153 void SetupMockForSendTelephoneEvent() { |
137 EXPECT_TRUE(channel_proxy_); | 154 EXPECT_TRUE(channel_proxy_); |
138 EXPECT_CALL(*channel_proxy_, | 155 EXPECT_CALL(*channel_proxy_, |
139 SetSendTelephoneEventPayloadType(kTelephoneEventPayloadType)) | 156 SetSendTelephoneEventPayloadType(kTelephoneEventPayloadType)) |
140 .WillOnce(Return(true)); | 157 .WillOnce(Return(true)); |
141 EXPECT_CALL(*channel_proxy_, | 158 EXPECT_CALL(*channel_proxy_, |
142 SendTelephoneEventOutband(kTelephoneEventCode, kTelephoneEventDuration)) | 159 SendTelephoneEventOutband(kTelephoneEventCode, kTelephoneEventDuration)) |
143 .WillOnce(Return(true)); | 160 .WillOnce(Return(true)); |
144 } | 161 } |
(...skipping 10 matching lines...) Expand all Loading... | |
155 block.fraction_lost = 0; | 172 block.fraction_lost = 0; |
156 report_blocks.push_back(block); // Duplicate SSRC, bad fraction_lost. | 173 report_blocks.push_back(block); // Duplicate SSRC, bad fraction_lost. |
157 | 174 |
158 EXPECT_TRUE(channel_proxy_); | 175 EXPECT_TRUE(channel_proxy_); |
159 EXPECT_CALL(*channel_proxy_, GetRTCPStatistics()) | 176 EXPECT_CALL(*channel_proxy_, GetRTCPStatistics()) |
160 .WillRepeatedly(Return(kCallStats)); | 177 .WillRepeatedly(Return(kCallStats)); |
161 EXPECT_CALL(*channel_proxy_, GetRemoteRTCPReportBlocks()) | 178 EXPECT_CALL(*channel_proxy_, GetRemoteRTCPReportBlocks()) |
162 .WillRepeatedly(Return(report_blocks)); | 179 .WillRepeatedly(Return(report_blocks)); |
163 | 180 |
164 EXPECT_CALL(voice_engine_, GetSendCodec(kChannelId, _)) | 181 EXPECT_CALL(voice_engine_, GetSendCodec(kChannelId, _)) |
165 .WillRepeatedly(DoAll(SetArgReferee<1>(kCodecInst), Return(0))); | 182 .WillRepeatedly(DoAll(SetArgReferee<1>(kIsacCodec), Return(0))); |
166 EXPECT_CALL(voice_engine_, GetSpeechInputLevelFullRange(_)) | 183 EXPECT_CALL(voice_engine_, GetSpeechInputLevelFullRange(_)) |
167 .WillRepeatedly(DoAll(SetArgReferee<0>(kSpeechInputLevel), Return(0))); | 184 .WillRepeatedly(DoAll(SetArgReferee<0>(kSpeechInputLevel), Return(0))); |
168 EXPECT_CALL(voice_engine_, GetEcMetricsStatus(_)) | 185 EXPECT_CALL(voice_engine_, GetEcMetricsStatus(_)) |
169 .WillRepeatedly(DoAll(SetArgReferee<0>(true), Return(0))); | 186 .WillRepeatedly(DoAll(SetArgReferee<0>(true), Return(0))); |
170 EXPECT_CALL(voice_engine_, GetEchoMetrics(_, _, _, _)) | 187 EXPECT_CALL(voice_engine_, GetEchoMetrics(_, _, _, _)) |
171 .WillRepeatedly(DoAll(SetArgReferee<0>(kEchoReturnLoss), | 188 .WillRepeatedly(DoAll(SetArgReferee<0>(kEchoReturnLoss), |
172 SetArgReferee<1>(kEchoReturnLossEnhancement), | 189 SetArgReferee<1>(kEchoReturnLossEnhancement), |
173 Return(0))); | 190 Return(0))); |
174 EXPECT_CALL(voice_engine_, GetEcDelayMetrics(_, _, _)) | 191 EXPECT_CALL(voice_engine_, GetEcDelayMetrics(_, _, _)) |
175 .WillRepeatedly(DoAll(SetArgReferee<0>(kEchoDelayMedian), | 192 .WillRepeatedly(DoAll(SetArgReferee<0>(kEchoDelayMedian), |
(...skipping 18 matching lines...) Expand all Loading... | |
194 }; | 211 }; |
195 } // namespace | 212 } // namespace |
196 | 213 |
197 TEST(AudioSendStreamTest, ConfigToString) { | 214 TEST(AudioSendStreamTest, ConfigToString) { |
198 AudioSendStream::Config config(nullptr); | 215 AudioSendStream::Config config(nullptr); |
199 config.rtp.ssrc = kSsrc; | 216 config.rtp.ssrc = kSsrc; |
200 config.rtp.extensions.push_back( | 217 config.rtp.extensions.push_back( |
201 RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId)); | 218 RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId)); |
202 config.rtp.c_name = kCName; | 219 config.rtp.c_name = kCName; |
203 config.voe_channel_id = kChannelId; | 220 config.voe_channel_id = kChannelId; |
204 config.cng_payload_type = 42; | 221 config.send_codec_spec.cng_payload_type = 42; |
205 EXPECT_EQ( | 222 EXPECT_EQ( |
206 "{rtp: {ssrc: 1234, extensions: [{uri: " | 223 "{rtp: {ssrc: 1234, extensions: [{uri: " |
207 "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 3}], " | 224 "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 3}], " |
208 "nack: {rtp_history_ms: 0}, c_name: foo_name}, voe_channel_id: 1, " | 225 "nack: {rtp_history_ms: 0}, c_name: foo_name}, voe_channel_id: 1, " |
209 "cng_payload_type: 42}", | 226 "cng_payload_type: 42}", |
210 config.ToString()); | 227 config.ToString()); |
211 } | 228 } |
212 | 229 |
213 TEST(AudioSendStreamTest, ConstructDestruct) { | 230 TEST(AudioSendStreamTest, ConstructDestruct) { |
214 ConfigHelper helper; | 231 ConfigHelper helper; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
246 helper.congestion_controller(), helper.bitrate_allocator(), | 263 helper.congestion_controller(), helper.bitrate_allocator(), |
247 helper.event_log()); | 264 helper.event_log()); |
248 helper.SetupMockForGetStats(); | 265 helper.SetupMockForGetStats(); |
249 AudioSendStream::Stats stats = send_stream.GetStats(); | 266 AudioSendStream::Stats stats = send_stream.GetStats(); |
250 EXPECT_EQ(kSsrc, stats.local_ssrc); | 267 EXPECT_EQ(kSsrc, stats.local_ssrc); |
251 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesSent), stats.bytes_sent); | 268 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesSent), stats.bytes_sent); |
252 EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent); | 269 EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent); |
253 EXPECT_EQ(static_cast<int32_t>(kReportBlock.cumulative_num_packets_lost), | 270 EXPECT_EQ(static_cast<int32_t>(kReportBlock.cumulative_num_packets_lost), |
254 stats.packets_lost); | 271 stats.packets_lost); |
255 EXPECT_EQ(Q8ToFloat(kReportBlock.fraction_lost), stats.fraction_lost); | 272 EXPECT_EQ(Q8ToFloat(kReportBlock.fraction_lost), stats.fraction_lost); |
256 EXPECT_EQ(std::string(kCodecInst.plname), stats.codec_name); | 273 EXPECT_EQ(std::string(kIsacCodec.plname), stats.codec_name); |
257 EXPECT_EQ(static_cast<int32_t>(kReportBlock.extended_highest_sequence_number), | 274 EXPECT_EQ(static_cast<int32_t>(kReportBlock.extended_highest_sequence_number), |
258 stats.ext_seqnum); | 275 stats.ext_seqnum); |
259 EXPECT_EQ(static_cast<int32_t>(kReportBlock.interarrival_jitter / | 276 EXPECT_EQ(static_cast<int32_t>(kReportBlock.interarrival_jitter / |
260 (kCodecInst.plfreq / 1000)), | 277 (kIsacCodec.plfreq / 1000)), |
261 stats.jitter_ms); | 278 stats.jitter_ms); |
262 EXPECT_EQ(kCallStats.rttMs, stats.rtt_ms); | 279 EXPECT_EQ(kCallStats.rttMs, stats.rtt_ms); |
263 EXPECT_EQ(static_cast<int32_t>(kSpeechInputLevel), stats.audio_level); | 280 EXPECT_EQ(static_cast<int32_t>(kSpeechInputLevel), stats.audio_level); |
264 EXPECT_EQ(-1, stats.aec_quality_min); | 281 EXPECT_EQ(-1, stats.aec_quality_min); |
265 EXPECT_EQ(kEchoDelayMedian, stats.echo_delay_median_ms); | 282 EXPECT_EQ(kEchoDelayMedian, stats.echo_delay_median_ms); |
266 EXPECT_EQ(kEchoDelayStdDev, stats.echo_delay_std_ms); | 283 EXPECT_EQ(kEchoDelayStdDev, stats.echo_delay_std_ms); |
267 EXPECT_EQ(kEchoReturnLoss, stats.echo_return_loss); | 284 EXPECT_EQ(kEchoReturnLoss, stats.echo_return_loss); |
268 EXPECT_EQ(kEchoReturnLossEnhancement, stats.echo_return_loss_enhancement); | 285 EXPECT_EQ(kEchoReturnLossEnhancement, stats.echo_return_loss_enhancement); |
269 EXPECT_FALSE(stats.typing_noise_detected); | 286 EXPECT_FALSE(stats.typing_noise_detected); |
270 } | 287 } |
271 | 288 |
272 TEST(AudioSendStreamTest, GetStatsTypingNoiseDetected) { | 289 TEST(AudioSendStreamTest, GetStatsTypingNoiseDetected) { |
273 ConfigHelper helper; | 290 ConfigHelper helper; |
274 internal::AudioSendStream send_stream( | 291 internal::AudioSendStream send_stream( |
275 helper.config(), helper.audio_state(), helper.worker_queue(), | 292 helper.config(), helper.audio_state(), helper.worker_queue(), |
276 helper.congestion_controller(), helper.bitrate_allocator(), | 293 helper.congestion_controller(), helper.bitrate_allocator(), |
277 helper.event_log()); | 294 helper.event_log()); |
278 helper.SetupMockForGetStats(); | 295 helper.SetupMockForGetStats(); |
279 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); | 296 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); |
280 | 297 |
281 internal::AudioState* internal_audio_state = | 298 internal::AudioState* internal_audio_state = |
282 static_cast<internal::AudioState*>(helper.audio_state().get()); | 299 static_cast<internal::AudioState*>(helper.audio_state().get()); |
283 VoiceEngineObserver* voe_observer = | 300 VoiceEngineObserver* voe_observer = |
284 static_cast<VoiceEngineObserver*>(internal_audio_state); | 301 static_cast<VoiceEngineObserver*>(internal_audio_state); |
285 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_WARNING); | 302 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_WARNING); |
286 EXPECT_TRUE(send_stream.GetStats().typing_noise_detected); | 303 EXPECT_TRUE(send_stream.GetStats().typing_noise_detected); |
287 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_OFF_WARNING); | 304 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_OFF_WARNING); |
288 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); | 305 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); |
289 } | 306 } |
307 | |
308 TEST(AudioSendStreamTest, SendCodecAppliesConfigParams) { | |
309 ConfigHelper helper; | |
310 auto stream_config = helper.config(); | |
311 const CodecInst kOpusCodec = {111, "opus", 48000, 960, 2, 64000}; | |
312 stream_config.send_codec_spec.codec_inst = kOpusCodec; | |
313 stream_config.send_codec_spec.enable_codec_fec = true; | |
314 stream_config.send_codec_spec.enable_opus_dtx = true; | |
315 stream_config.send_codec_spec.opus_max_playback_rate = 12345; | |
316 stream_config.send_codec_spec.cng_plfreq = 16000; | |
317 stream_config.send_codec_spec.cng_payload_type = 105; | |
318 EXPECT_CALL(*helper.voice_engine(), SetFECStatus(kChannelId, true)) | |
319 .WillOnce(Return(0)); | |
320 EXPECT_CALL( | |
321 *helper.voice_engine(), | |
322 SetOpusDtx(kChannelId, stream_config.send_codec_spec.enable_opus_dtx)) | |
323 .WillOnce(Return(0)); | |
324 EXPECT_CALL( | |
325 *helper.voice_engine(), | |
326 SetOpusMaxPlaybackRate( | |
327 kChannelId, stream_config.send_codec_spec.opus_max_playback_rate)) | |
328 .WillOnce(Return(0)); | |
329 EXPECT_CALL(*helper.voice_engine(), | |
330 SetSendCNPayloadType( | |
331 kChannelId, stream_config.send_codec_spec.cng_payload_type, | |
332 webrtc::kFreq16000Hz)) | |
333 .WillOnce(Return(0)); | |
334 internal::AudioSendStream send_stream( | |
335 stream_config, helper.audio_state(), helper.worker_queue(), | |
336 helper.congestion_controller(), helper.bitrate_allocator(), | |
337 helper.event_log()); | |
338 } | |
339 | |
340 // VAD is applied when codec is mono and the CNG frequency matches the codec | |
341 // sample rate. | |
342 TEST(AudioSendStreamTest, SendCodecCanApplyVad) { | |
343 ConfigHelper helper; | |
344 auto stream_config = helper.config(); | |
345 const CodecInst kG722Codec = {9, "g722", 8000, 160, 1, 16000}; | |
346 stream_config.send_codec_spec.codec_inst = kG722Codec; | |
347 stream_config.send_codec_spec.cng_plfreq = 8000; | |
348 stream_config.send_codec_spec.cng_payload_type = 105; | |
349 EXPECT_CALL(*helper.voice_engine(), SetVADStatus(kChannelId, true, _, _)) | |
the sun
2016/10/19 19:37:52
The voice engine mock is strict - don't you get a
minyue-webrtc
2016/10/20 08:47:12
no. Since I used G722 and many opus specific calls
| |
350 .WillOnce(Return(0)); | |
351 internal::AudioSendStream send_stream( | |
352 stream_config, helper.audio_state(), helper.worker_queue(), | |
353 helper.congestion_controller(), helper.bitrate_allocator(), | |
354 helper.event_log()); | |
355 } | |
356 | |
290 } // namespace test | 357 } // namespace test |
291 } // namespace webrtc | 358 } // namespace webrtc |
OLD | NEW |