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

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

Issue 2405183002: Moving WebRtcVoiceMediaChannel::SendSetCodec to AudioSendStream. (Closed)
Patch Set: final change Created 4 years, 2 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
« no previous file with comments | « webrtc/audio/audio_send_stream.cc ('k') | webrtc/media/engine/webrtcvoiceengine.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
(...skipping 26 matching lines...) Expand all
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
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
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
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
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, _, _))
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
OLDNEW
« no previous file with comments | « webrtc/audio/audio_send_stream.cc ('k') | webrtc/media/engine/webrtcvoiceengine.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698