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 constexpr CodecInst kOpusCodec = {111, "opus", 48000, 960, 2, 64000}; |
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 stream_config_.send_codec_spec.codec_inst = kOpusCodec; |
124 } | 126 } |
125 | 127 |
126 AudioSendStream::Config& config() { return stream_config_; } | 128 AudioSendStream::Config& config() { return stream_config_; } |
127 rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; } | 129 rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; } |
128 MockVoEChannelProxy* channel_proxy() { return channel_proxy_; } | 130 MockVoEChannelProxy* channel_proxy() { return channel_proxy_; } |
129 CongestionController* congestion_controller() { | 131 CongestionController* congestion_controller() { |
130 return &congestion_controller_; | 132 return &congestion_controller_; |
131 } | 133 } |
132 BitrateAllocator* bitrate_allocator() { return &bitrate_allocator_; } | 134 BitrateAllocator* bitrate_allocator() { return &bitrate_allocator_; } |
133 rtc::TaskQueue* worker_queue() { return &worker_queue_; } | 135 rtc::TaskQueue* worker_queue() { return &worker_queue_; } |
134 RtcEventLog* event_log() { return &event_log_; } | 136 RtcEventLog* event_log() { return &event_log_; } |
135 | 137 |
| 138 void SetupMockForSetupSendCodec() { |
| 139 EXPECT_CALL(voice_engine_, SetVADStatus(kChannelId, _, _, _)) |
| 140 .WillRepeatedly(Return(0)); |
| 141 EXPECT_CALL(voice_engine_, SetFECStatus(kChannelId, _)) |
| 142 .WillRepeatedly(Return(0)); |
| 143 EXPECT_CALL(voice_engine_, SetSendCodec(kChannelId, _)) |
| 144 .WillRepeatedly(Return(0)); |
| 145 // Let |GetSendCodec| return -1 for the first time to indicate that no send |
| 146 // codec has been set. |
| 147 EXPECT_CALL(voice_engine_, GetSendCodec(kChannelId, _)) |
| 148 .WillOnce(Return(-1)); |
| 149 } |
| 150 |
136 void SetupMockForSendTelephoneEvent() { | 151 void SetupMockForSendTelephoneEvent() { |
137 EXPECT_TRUE(channel_proxy_); | 152 EXPECT_TRUE(channel_proxy_); |
138 EXPECT_CALL(*channel_proxy_, | 153 EXPECT_CALL(*channel_proxy_, |
139 SetSendTelephoneEventPayloadType(kTelephoneEventPayloadType)) | 154 SetSendTelephoneEventPayloadType(kTelephoneEventPayloadType)) |
140 .WillOnce(Return(true)); | 155 .WillOnce(Return(true)); |
141 EXPECT_CALL(*channel_proxy_, | 156 EXPECT_CALL(*channel_proxy_, |
142 SendTelephoneEventOutband(kTelephoneEventCode, kTelephoneEventDuration)) | 157 SendTelephoneEventOutband(kTelephoneEventCode, kTelephoneEventDuration)) |
143 .WillOnce(Return(true)); | 158 .WillOnce(Return(true)); |
144 } | 159 } |
145 | 160 |
146 void SetupMockForGetStats() { | 161 void SetupMockForGetStats() { |
147 using testing::DoAll; | 162 using testing::DoAll; |
148 using testing::SetArgReferee; | 163 using testing::SetArgReferee; |
149 | 164 |
150 std::vector<ReportBlock> report_blocks; | 165 std::vector<ReportBlock> report_blocks; |
151 webrtc::ReportBlock block = kReportBlock; | 166 webrtc::ReportBlock block = kReportBlock; |
152 report_blocks.push_back(block); // Has wrong SSRC. | 167 report_blocks.push_back(block); // Has wrong SSRC. |
153 block.source_SSRC = kSsrc; | 168 block.source_SSRC = kSsrc; |
154 report_blocks.push_back(block); // Correct block. | 169 report_blocks.push_back(block); // Correct block. |
155 block.fraction_lost = 0; | 170 block.fraction_lost = 0; |
156 report_blocks.push_back(block); // Duplicate SSRC, bad fraction_lost. | 171 report_blocks.push_back(block); // Duplicate SSRC, bad fraction_lost. |
157 | 172 |
158 EXPECT_TRUE(channel_proxy_); | 173 EXPECT_TRUE(channel_proxy_); |
159 EXPECT_CALL(*channel_proxy_, GetRTCPStatistics()) | 174 EXPECT_CALL(*channel_proxy_, GetRTCPStatistics()) |
160 .WillRepeatedly(Return(kCallStats)); | 175 .WillRepeatedly(Return(kCallStats)); |
161 EXPECT_CALL(*channel_proxy_, GetRemoteRTCPReportBlocks()) | 176 EXPECT_CALL(*channel_proxy_, GetRemoteRTCPReportBlocks()) |
162 .WillRepeatedly(Return(report_blocks)); | 177 .WillRepeatedly(Return(report_blocks)); |
163 | 178 |
164 EXPECT_CALL(voice_engine_, GetSendCodec(kChannelId, _)) | 179 EXPECT_CALL(voice_engine_, GetSendCodec(kChannelId, _)) |
165 .WillRepeatedly(DoAll(SetArgReferee<1>(kCodecInst), Return(0))); | 180 .WillRepeatedly(DoAll(SetArgReferee<1>(kOpusCodec), Return(0))); |
166 EXPECT_CALL(voice_engine_, GetSpeechInputLevelFullRange(_)) | 181 EXPECT_CALL(voice_engine_, GetSpeechInputLevelFullRange(_)) |
167 .WillRepeatedly(DoAll(SetArgReferee<0>(kSpeechInputLevel), Return(0))); | 182 .WillRepeatedly(DoAll(SetArgReferee<0>(kSpeechInputLevel), Return(0))); |
168 EXPECT_CALL(voice_engine_, GetEcMetricsStatus(_)) | 183 EXPECT_CALL(voice_engine_, GetEcMetricsStatus(_)) |
169 .WillRepeatedly(DoAll(SetArgReferee<0>(true), Return(0))); | 184 .WillRepeatedly(DoAll(SetArgReferee<0>(true), Return(0))); |
170 EXPECT_CALL(voice_engine_, GetEchoMetrics(_, _, _, _)) | 185 EXPECT_CALL(voice_engine_, GetEchoMetrics(_, _, _, _)) |
171 .WillRepeatedly(DoAll(SetArgReferee<0>(kEchoReturnLoss), | 186 .WillRepeatedly(DoAll(SetArgReferee<0>(kEchoReturnLoss), |
172 SetArgReferee<1>(kEchoReturnLossEnhancement), | 187 SetArgReferee<1>(kEchoReturnLossEnhancement), |
173 Return(0))); | 188 Return(0))); |
174 EXPECT_CALL(voice_engine_, GetEcDelayMetrics(_, _, _)) | 189 EXPECT_CALL(voice_engine_, GetEcDelayMetrics(_, _, _)) |
175 .WillRepeatedly(DoAll(SetArgReferee<0>(kEchoDelayMedian), | 190 .WillRepeatedly(DoAll(SetArgReferee<0>(kEchoDelayMedian), |
(...skipping 18 matching lines...) Expand all Loading... |
194 }; | 209 }; |
195 } // namespace | 210 } // namespace |
196 | 211 |
197 TEST(AudioSendStreamTest, ConfigToString) { | 212 TEST(AudioSendStreamTest, ConfigToString) { |
198 AudioSendStream::Config config(nullptr); | 213 AudioSendStream::Config config(nullptr); |
199 config.rtp.ssrc = kSsrc; | 214 config.rtp.ssrc = kSsrc; |
200 config.rtp.extensions.push_back( | 215 config.rtp.extensions.push_back( |
201 RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId)); | 216 RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId)); |
202 config.rtp.c_name = kCName; | 217 config.rtp.c_name = kCName; |
203 config.voe_channel_id = kChannelId; | 218 config.voe_channel_id = kChannelId; |
204 config.cng_payload_type = 42; | 219 config.send_codec_spec.cng_payload_type = 42; |
205 EXPECT_EQ( | 220 EXPECT_EQ( |
206 "{rtp: {ssrc: 1234, extensions: [{uri: " | 221 "{rtp: {ssrc: 1234, extensions: [{uri: " |
207 "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 3}], " | 222 "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, " | 223 "nack: {rtp_history_ms: 0}, c_name: foo_name}, voe_channel_id: 1, " |
209 "cng_payload_type: 42}", | 224 "cng_payload_type: 42}", |
210 config.ToString()); | 225 config.ToString()); |
211 } | 226 } |
212 | 227 |
213 TEST(AudioSendStreamTest, ConstructDestruct) { | 228 TEST(AudioSendStreamTest, ConstructDestruct) { |
214 ConfigHelper helper; | 229 ConfigHelper helper; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 helper.congestion_controller(), helper.bitrate_allocator(), | 261 helper.congestion_controller(), helper.bitrate_allocator(), |
247 helper.event_log()); | 262 helper.event_log()); |
248 helper.SetupMockForGetStats(); | 263 helper.SetupMockForGetStats(); |
249 AudioSendStream::Stats stats = send_stream.GetStats(); | 264 AudioSendStream::Stats stats = send_stream.GetStats(); |
250 EXPECT_EQ(kSsrc, stats.local_ssrc); | 265 EXPECT_EQ(kSsrc, stats.local_ssrc); |
251 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesSent), stats.bytes_sent); | 266 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesSent), stats.bytes_sent); |
252 EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent); | 267 EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent); |
253 EXPECT_EQ(static_cast<int32_t>(kReportBlock.cumulative_num_packets_lost), | 268 EXPECT_EQ(static_cast<int32_t>(kReportBlock.cumulative_num_packets_lost), |
254 stats.packets_lost); | 269 stats.packets_lost); |
255 EXPECT_EQ(Q8ToFloat(kReportBlock.fraction_lost), stats.fraction_lost); | 270 EXPECT_EQ(Q8ToFloat(kReportBlock.fraction_lost), stats.fraction_lost); |
256 EXPECT_EQ(std::string(kCodecInst.plname), stats.codec_name); | 271 EXPECT_EQ(std::string(kOpusCodec.plname), stats.codec_name); |
257 EXPECT_EQ(static_cast<int32_t>(kReportBlock.extended_highest_sequence_number), | 272 EXPECT_EQ(static_cast<int32_t>(kReportBlock.extended_highest_sequence_number), |
258 stats.ext_seqnum); | 273 stats.ext_seqnum); |
259 EXPECT_EQ(static_cast<int32_t>(kReportBlock.interarrival_jitter / | 274 EXPECT_EQ(static_cast<int32_t>(kReportBlock.interarrival_jitter / |
260 (kCodecInst.plfreq / 1000)), | 275 (kOpusCodec.plfreq / 1000)), |
261 stats.jitter_ms); | 276 stats.jitter_ms); |
262 EXPECT_EQ(kCallStats.rttMs, stats.rtt_ms); | 277 EXPECT_EQ(kCallStats.rttMs, stats.rtt_ms); |
263 EXPECT_EQ(static_cast<int32_t>(kSpeechInputLevel), stats.audio_level); | 278 EXPECT_EQ(static_cast<int32_t>(kSpeechInputLevel), stats.audio_level); |
264 EXPECT_EQ(-1, stats.aec_quality_min); | 279 EXPECT_EQ(-1, stats.aec_quality_min); |
265 EXPECT_EQ(kEchoDelayMedian, stats.echo_delay_median_ms); | 280 EXPECT_EQ(kEchoDelayMedian, stats.echo_delay_median_ms); |
266 EXPECT_EQ(kEchoDelayStdDev, stats.echo_delay_std_ms); | 281 EXPECT_EQ(kEchoDelayStdDev, stats.echo_delay_std_ms); |
267 EXPECT_EQ(kEchoReturnLoss, stats.echo_return_loss); | 282 EXPECT_EQ(kEchoReturnLoss, stats.echo_return_loss); |
268 EXPECT_EQ(kEchoReturnLossEnhancement, stats.echo_return_loss_enhancement); | 283 EXPECT_EQ(kEchoReturnLossEnhancement, stats.echo_return_loss_enhancement); |
269 EXPECT_FALSE(stats.typing_noise_detected); | 284 EXPECT_FALSE(stats.typing_noise_detected); |
270 } | 285 } |
271 | 286 |
272 TEST(AudioSendStreamTest, GetStatsTypingNoiseDetected) { | 287 TEST(AudioSendStreamTest, GetStatsTypingNoiseDetected) { |
273 ConfigHelper helper; | 288 ConfigHelper helper; |
274 internal::AudioSendStream send_stream( | 289 internal::AudioSendStream send_stream( |
275 helper.config(), helper.audio_state(), helper.worker_queue(), | 290 helper.config(), helper.audio_state(), helper.worker_queue(), |
276 helper.congestion_controller(), helper.bitrate_allocator(), | 291 helper.congestion_controller(), helper.bitrate_allocator(), |
277 helper.event_log()); | 292 helper.event_log()); |
278 helper.SetupMockForGetStats(); | 293 helper.SetupMockForGetStats(); |
279 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); | 294 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); |
280 | 295 |
281 internal::AudioState* internal_audio_state = | 296 internal::AudioState* internal_audio_state = |
282 static_cast<internal::AudioState*>(helper.audio_state().get()); | 297 static_cast<internal::AudioState*>(helper.audio_state().get()); |
283 VoiceEngineObserver* voe_observer = | 298 VoiceEngineObserver* voe_observer = |
284 static_cast<VoiceEngineObserver*>(internal_audio_state); | 299 static_cast<VoiceEngineObserver*>(internal_audio_state); |
285 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_WARNING); | 300 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_WARNING); |
286 EXPECT_TRUE(send_stream.GetStats().typing_noise_detected); | 301 EXPECT_TRUE(send_stream.GetStats().typing_noise_detected); |
287 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_OFF_WARNING); | 302 voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_OFF_WARNING); |
288 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); | 303 EXPECT_FALSE(send_stream.GetStats().typing_noise_detected); |
289 } | 304 } |
| 305 |
| 306 // TODO(minyue): Add tests on logics involved in SetSendCodecs. |
| 307 |
290 } // namespace test | 308 } // namespace test |
291 } // namespace webrtc | 309 } // namespace webrtc |
OLD | NEW |