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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 123, 456, false, 0, 0, 789, 12, 345, 678, 901, -1, -1, -1, -1, -1, 0}; | 65 123, 456, false, 0, 0, 789, 12, 345, 678, 901, -1, -1, -1, -1, -1, 0}; |
66 const AudioDecodingCallStats kAudioDecodeStats = MakeAudioDecodeStatsForTest(); | 66 const AudioDecodingCallStats kAudioDecodeStats = MakeAudioDecodeStatsForTest(); |
67 | 67 |
68 struct ConfigHelper { | 68 struct ConfigHelper { |
69 ConfigHelper() | 69 ConfigHelper() |
70 : simulated_clock_(123456), | 70 : simulated_clock_(123456), |
71 decoder_factory_(new rtc::RefCountedObject<MockAudioDecoderFactory>), | 71 decoder_factory_(new rtc::RefCountedObject<MockAudioDecoderFactory>), |
72 congestion_controller_(&simulated_clock_, | 72 congestion_controller_(&simulated_clock_, |
73 &bitrate_observer_, | 73 &bitrate_observer_, |
74 &remote_bitrate_observer_, | 74 &remote_bitrate_observer_, |
75 &event_log_), | 75 &event_log_, |
| 76 &packet_router_), |
76 audio_mixer_(new rtc::RefCountedObject<MockAudioMixer>()) { | 77 audio_mixer_(new rtc::RefCountedObject<MockAudioMixer>()) { |
77 using testing::Invoke; | 78 using testing::Invoke; |
78 | 79 |
79 EXPECT_CALL(voice_engine_, | 80 EXPECT_CALL(voice_engine_, |
80 RegisterVoiceEngineObserver(_)).WillOnce(Return(0)); | 81 RegisterVoiceEngineObserver(_)).WillOnce(Return(0)); |
81 EXPECT_CALL(voice_engine_, | 82 EXPECT_CALL(voice_engine_, |
82 DeRegisterVoiceEngineObserver()).WillOnce(Return(0)); | 83 DeRegisterVoiceEngineObserver()).WillOnce(Return(0)); |
83 EXPECT_CALL(voice_engine_, audio_processing()); | 84 EXPECT_CALL(voice_engine_, audio_processing()); |
84 EXPECT_CALL(voice_engine_, audio_device_module()); | 85 EXPECT_CALL(voice_engine_, audio_device_module()); |
85 EXPECT_CALL(voice_engine_, audio_transport()); | 86 EXPECT_CALL(voice_engine_, audio_transport()); |
(...skipping 11 matching lines...) Expand all Loading... |
97 EXPECT_CALL(*channel_proxy_, SetNACKStatus(true, 15)).Times(1); | 98 EXPECT_CALL(*channel_proxy_, SetNACKStatus(true, 15)).Times(1); |
98 EXPECT_CALL(*channel_proxy_, | 99 EXPECT_CALL(*channel_proxy_, |
99 SetReceiveAudioLevelIndicationStatus(true, kAudioLevelId)) | 100 SetReceiveAudioLevelIndicationStatus(true, kAudioLevelId)) |
100 .Times(1); | 101 .Times(1); |
101 EXPECT_CALL(*channel_proxy_, | 102 EXPECT_CALL(*channel_proxy_, |
102 EnableReceiveTransportSequenceNumber(kTransportSequenceNumberId)) | 103 EnableReceiveTransportSequenceNumber(kTransportSequenceNumberId)) |
103 .Times(1); | 104 .Times(1); |
104 EXPECT_CALL(*channel_proxy_, | 105 EXPECT_CALL(*channel_proxy_, |
105 RegisterReceiverCongestionControlObjects(&packet_router_)) | 106 RegisterReceiverCongestionControlObjects(&packet_router_)) |
106 .Times(1); | 107 .Times(1); |
107 EXPECT_CALL(congestion_controller_, packet_router()) | |
108 .WillOnce(Return(&packet_router_)); | |
109 EXPECT_CALL(*channel_proxy_, ResetCongestionControlObjects()) | 108 EXPECT_CALL(*channel_proxy_, ResetCongestionControlObjects()) |
110 .Times(1); | 109 .Times(1); |
111 EXPECT_CALL(*channel_proxy_, RegisterExternalTransport(nullptr)) | 110 EXPECT_CALL(*channel_proxy_, RegisterExternalTransport(nullptr)) |
112 .Times(1); | 111 .Times(1); |
113 EXPECT_CALL(*channel_proxy_, DeRegisterExternalTransport()) | 112 EXPECT_CALL(*channel_proxy_, DeRegisterExternalTransport()) |
114 .Times(1); | 113 .Times(1); |
115 EXPECT_CALL(*channel_proxy_, GetAudioDecoderFactory()) | 114 EXPECT_CALL(*channel_proxy_, GetAudioDecoderFactory()) |
116 .WillOnce(ReturnRef(decoder_factory_)); | 115 .WillOnce(ReturnRef(decoder_factory_)); |
117 testing::Expectation expect_set = | 116 testing::Expectation expect_set = |
118 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(&event_log_)) | 117 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(&event_log_)) |
119 .Times(1); | 118 .Times(1); |
120 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::IsNull())) | 119 EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::IsNull())) |
121 .Times(1) | 120 .Times(1) |
122 .After(expect_set); | 121 .After(expect_set); |
123 EXPECT_CALL(*channel_proxy_, DisassociateSendChannel()).Times(1); | 122 EXPECT_CALL(*channel_proxy_, DisassociateSendChannel()).Times(1); |
124 return channel_proxy_; | 123 return channel_proxy_; |
125 })); | 124 })); |
126 stream_config_.voe_channel_id = kChannelId; | 125 stream_config_.voe_channel_id = kChannelId; |
127 stream_config_.rtp.local_ssrc = kLocalSsrc; | 126 stream_config_.rtp.local_ssrc = kLocalSsrc; |
128 stream_config_.rtp.remote_ssrc = kRemoteSsrc; | 127 stream_config_.rtp.remote_ssrc = kRemoteSsrc; |
129 stream_config_.rtp.nack.rtp_history_ms = 300; | 128 stream_config_.rtp.nack.rtp_history_ms = 300; |
130 stream_config_.rtp.extensions.push_back( | 129 stream_config_.rtp.extensions.push_back( |
131 RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId)); | 130 RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId)); |
132 stream_config_.rtp.extensions.push_back(RtpExtension( | 131 stream_config_.rtp.extensions.push_back(RtpExtension( |
133 RtpExtension::kTransportSequenceNumberUri, kTransportSequenceNumberId)); | 132 RtpExtension::kTransportSequenceNumberUri, kTransportSequenceNumberId)); |
134 stream_config_.decoder_factory = decoder_factory_; | 133 stream_config_.decoder_factory = decoder_factory_; |
135 } | 134 } |
136 | 135 |
| 136 PacketRouter* packet_router() { return &packet_router_; } |
137 MockCongestionController* congestion_controller() { | 137 MockCongestionController* congestion_controller() { |
138 return &congestion_controller_; | 138 return &congestion_controller_; |
139 } | 139 } |
140 MockRemoteBitrateEstimator* remote_bitrate_estimator() { | 140 MockRemoteBitrateEstimator* remote_bitrate_estimator() { |
141 return &remote_bitrate_estimator_; | 141 return &remote_bitrate_estimator_; |
142 } | 142 } |
143 MockRtcEventLog* event_log() { return &event_log_; } | 143 MockRtcEventLog* event_log() { return &event_log_; } |
144 AudioReceiveStream::Config& config() { return stream_config_; } | 144 AudioReceiveStream::Config& config() { return stream_config_; } |
145 rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; } | 145 rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; } |
146 rtc::scoped_refptr<MockAudioMixer> audio_mixer() { return audio_mixer_; } | 146 rtc::scoped_refptr<MockAudioMixer> audio_mixer() { return audio_mixer_; } |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 "{rtp: {remote_ssrc: 1234, local_ssrc: 5678, transport_cc: off, nack: " | 254 "{rtp: {remote_ssrc: 1234, local_ssrc: 5678, transport_cc: off, nack: " |
255 "{rtp_history_ms: 0}, extensions: [{uri: " | 255 "{rtp_history_ms: 0}, extensions: [{uri: " |
256 "urn:ietf:params:rtp-hdrext:ssrc-audio-level, id: 3}]}, " | 256 "urn:ietf:params:rtp-hdrext:ssrc-audio-level, id: 3}]}, " |
257 "rtcp_send_transport: nullptr, voe_channel_id: 2}", | 257 "rtcp_send_transport: nullptr, voe_channel_id: 2}", |
258 config.ToString()); | 258 config.ToString()); |
259 } | 259 } |
260 | 260 |
261 TEST(AudioReceiveStreamTest, ConstructDestruct) { | 261 TEST(AudioReceiveStreamTest, ConstructDestruct) { |
262 ConfigHelper helper; | 262 ConfigHelper helper; |
263 internal::AudioReceiveStream recv_stream( | 263 internal::AudioReceiveStream recv_stream( |
264 helper.congestion_controller(), helper.config(), helper.audio_state(), | 264 helper.packet_router(), |
265 helper.event_log()); | 265 helper.congestion_controller()->GetRemoteBitrateEstimator(true), |
| 266 helper.config(), helper.audio_state(), helper.event_log()); |
266 } | 267 } |
267 | 268 |
268 MATCHER_P(VerifyHeaderExtension, expected_extension, "") { | 269 MATCHER_P(VerifyHeaderExtension, expected_extension, "") { |
269 return arg.extension.hasTransportSequenceNumber == | 270 return arg.extension.hasTransportSequenceNumber == |
270 expected_extension.hasTransportSequenceNumber && | 271 expected_extension.hasTransportSequenceNumber && |
271 arg.extension.transportSequenceNumber == | 272 arg.extension.transportSequenceNumber == |
272 expected_extension.transportSequenceNumber; | 273 expected_extension.transportSequenceNumber; |
273 } | 274 } |
274 | 275 |
275 TEST(AudioReceiveStreamTest, ReceiveRtpPacket) { | 276 TEST(AudioReceiveStreamTest, ReceiveRtpPacket) { |
276 ConfigHelper helper; | 277 ConfigHelper helper; |
277 helper.config().rtp.transport_cc = true; | 278 helper.config().rtp.transport_cc = true; |
278 helper.SetupMockForBweFeedback(true); | 279 helper.SetupMockForBweFeedback(true); |
279 internal::AudioReceiveStream recv_stream( | 280 internal::AudioReceiveStream recv_stream( |
280 helper.congestion_controller(), helper.config(), helper.audio_state(), | 281 helper.packet_router(), |
281 helper.event_log()); | 282 helper.congestion_controller()->GetRemoteBitrateEstimator(true), |
| 283 helper.config(), helper.audio_state(), helper.event_log()); |
282 const int kTransportSequenceNumberValue = 1234; | 284 const int kTransportSequenceNumberValue = 1234; |
283 std::vector<uint8_t> rtp_packet = CreateRtpHeaderWithOneByteExtension( | 285 std::vector<uint8_t> rtp_packet = CreateRtpHeaderWithOneByteExtension( |
284 kTransportSequenceNumberId, kTransportSequenceNumberValue, 2); | 286 kTransportSequenceNumberId, kTransportSequenceNumberValue, 2); |
285 PacketTime packet_time(5678000, 0); | 287 PacketTime packet_time(5678000, 0); |
286 const size_t kExpectedHeaderLength = 20; | 288 const size_t kExpectedHeaderLength = 20; |
287 RTPHeaderExtension expected_extension; | 289 RTPHeaderExtension expected_extension; |
288 expected_extension.hasTransportSequenceNumber = true; | 290 expected_extension.hasTransportSequenceNumber = true; |
289 expected_extension.transportSequenceNumber = kTransportSequenceNumberValue; | 291 expected_extension.transportSequenceNumber = kTransportSequenceNumberValue; |
290 EXPECT_CALL(*helper.remote_bitrate_estimator(), | 292 EXPECT_CALL(*helper.remote_bitrate_estimator(), |
291 IncomingPacket(packet_time.timestamp / 1000, | 293 IncomingPacket(packet_time.timestamp / 1000, |
292 rtp_packet.size() - kExpectedHeaderLength, | 294 rtp_packet.size() - kExpectedHeaderLength, |
293 VerifyHeaderExtension(expected_extension))) | 295 VerifyHeaderExtension(expected_extension))) |
294 .Times(1); | 296 .Times(1); |
295 EXPECT_CALL(*helper.channel_proxy(), | 297 EXPECT_CALL(*helper.channel_proxy(), |
296 ReceivedRTPPacket(&rtp_packet[0], | 298 ReceivedRTPPacket(&rtp_packet[0], |
297 rtp_packet.size(), | 299 rtp_packet.size(), |
298 _)) | 300 _)) |
299 .WillOnce(Return(true)); | 301 .WillOnce(Return(true)); |
300 EXPECT_TRUE( | 302 EXPECT_TRUE( |
301 recv_stream.DeliverRtp(&rtp_packet[0], rtp_packet.size(), packet_time)); | 303 recv_stream.DeliverRtp(&rtp_packet[0], rtp_packet.size(), packet_time)); |
302 } | 304 } |
303 | 305 |
304 TEST(AudioReceiveStreamTest, ReceiveRtcpPacket) { | 306 TEST(AudioReceiveStreamTest, ReceiveRtcpPacket) { |
305 ConfigHelper helper; | 307 ConfigHelper helper; |
306 helper.config().rtp.transport_cc = true; | 308 helper.config().rtp.transport_cc = true; |
307 helper.SetupMockForBweFeedback(true); | 309 helper.SetupMockForBweFeedback(true); |
308 internal::AudioReceiveStream recv_stream( | 310 internal::AudioReceiveStream recv_stream( |
309 helper.congestion_controller(), helper.config(), helper.audio_state(), | 311 helper.packet_router(), |
310 helper.event_log()); | 312 helper.congestion_controller()->GetRemoteBitrateEstimator(true), |
| 313 helper.config(), helper.audio_state(), helper.event_log()); |
311 | 314 |
312 std::vector<uint8_t> rtcp_packet = CreateRtcpSenderReport(); | 315 std::vector<uint8_t> rtcp_packet = CreateRtcpSenderReport(); |
313 EXPECT_CALL(*helper.channel_proxy(), | 316 EXPECT_CALL(*helper.channel_proxy(), |
314 ReceivedRTCPPacket(&rtcp_packet[0], rtcp_packet.size())) | 317 ReceivedRTCPPacket(&rtcp_packet[0], rtcp_packet.size())) |
315 .WillOnce(Return(true)); | 318 .WillOnce(Return(true)); |
316 EXPECT_TRUE(recv_stream.DeliverRtcp(&rtcp_packet[0], rtcp_packet.size())); | 319 EXPECT_TRUE(recv_stream.DeliverRtcp(&rtcp_packet[0], rtcp_packet.size())); |
317 } | 320 } |
318 | 321 |
319 TEST(AudioReceiveStreamTest, GetStats) { | 322 TEST(AudioReceiveStreamTest, GetStats) { |
320 ConfigHelper helper; | 323 ConfigHelper helper; |
321 internal::AudioReceiveStream recv_stream( | 324 internal::AudioReceiveStream recv_stream( |
322 helper.congestion_controller(), helper.config(), helper.audio_state(), | 325 helper.packet_router(), |
323 helper.event_log()); | 326 helper.congestion_controller()->GetRemoteBitrateEstimator(true), |
| 327 helper.config(), helper.audio_state(), helper.event_log()); |
324 helper.SetupMockForGetStats(); | 328 helper.SetupMockForGetStats(); |
325 AudioReceiveStream::Stats stats = recv_stream.GetStats(); | 329 AudioReceiveStream::Stats stats = recv_stream.GetStats(); |
326 EXPECT_EQ(kRemoteSsrc, stats.remote_ssrc); | 330 EXPECT_EQ(kRemoteSsrc, stats.remote_ssrc); |
327 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesReceived), stats.bytes_rcvd); | 331 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesReceived), stats.bytes_rcvd); |
328 EXPECT_EQ(static_cast<uint32_t>(kCallStats.packetsReceived), | 332 EXPECT_EQ(static_cast<uint32_t>(kCallStats.packetsReceived), |
329 stats.packets_rcvd); | 333 stats.packets_rcvd); |
330 EXPECT_EQ(kCallStats.cumulativeLost, stats.packets_lost); | 334 EXPECT_EQ(kCallStats.cumulativeLost, stats.packets_lost); |
331 EXPECT_EQ(Q8ToFloat(kCallStats.fractionLost), stats.fraction_lost); | 335 EXPECT_EQ(Q8ToFloat(kCallStats.fractionLost), stats.fraction_lost); |
332 EXPECT_EQ(std::string(kCodecInst.plname), stats.codec_name); | 336 EXPECT_EQ(std::string(kCodecInst.plname), stats.codec_name); |
333 EXPECT_EQ(kCallStats.extendedMax, stats.ext_seqnum); | 337 EXPECT_EQ(kCallStats.extendedMax, stats.ext_seqnum); |
(...skipping 23 matching lines...) Expand all Loading... |
357 EXPECT_EQ(kAudioDecodeStats.decoded_plc_cng, stats.decoding_plc_cng); | 361 EXPECT_EQ(kAudioDecodeStats.decoded_plc_cng, stats.decoding_plc_cng); |
358 EXPECT_EQ(kAudioDecodeStats.decoded_muted_output, | 362 EXPECT_EQ(kAudioDecodeStats.decoded_muted_output, |
359 stats.decoding_muted_output); | 363 stats.decoding_muted_output); |
360 EXPECT_EQ(kCallStats.capture_start_ntp_time_ms_, | 364 EXPECT_EQ(kCallStats.capture_start_ntp_time_ms_, |
361 stats.capture_start_ntp_time_ms); | 365 stats.capture_start_ntp_time_ms); |
362 } | 366 } |
363 | 367 |
364 TEST(AudioReceiveStreamTest, SetGain) { | 368 TEST(AudioReceiveStreamTest, SetGain) { |
365 ConfigHelper helper; | 369 ConfigHelper helper; |
366 internal::AudioReceiveStream recv_stream( | 370 internal::AudioReceiveStream recv_stream( |
367 helper.congestion_controller(), helper.config(), helper.audio_state(), | 371 helper.packet_router(), |
368 helper.event_log()); | 372 helper.congestion_controller()->GetRemoteBitrateEstimator(true), |
| 373 helper.config(), helper.audio_state(), helper.event_log()); |
369 EXPECT_CALL(*helper.channel_proxy(), | 374 EXPECT_CALL(*helper.channel_proxy(), |
370 SetChannelOutputVolumeScaling(FloatEq(0.765f))); | 375 SetChannelOutputVolumeScaling(FloatEq(0.765f))); |
371 recv_stream.SetGain(0.765f); | 376 recv_stream.SetGain(0.765f); |
372 } | 377 } |
373 | 378 |
374 TEST(AudioReceiveStreamTest, StreamShouldNotBeAddedToMixerWhenVoEReturnsError) { | 379 TEST(AudioReceiveStreamTest, StreamShouldNotBeAddedToMixerWhenVoEReturnsError) { |
375 ConfigHelper helper; | 380 ConfigHelper helper; |
376 internal::AudioReceiveStream recv_stream( | 381 internal::AudioReceiveStream recv_stream( |
377 helper.congestion_controller(), helper.config(), helper.audio_state(), | 382 helper.packet_router(), |
378 helper.event_log()); | 383 helper.congestion_controller()->GetRemoteBitrateEstimator(true), |
| 384 helper.config(), helper.audio_state(), helper.event_log()); |
379 | 385 |
380 EXPECT_CALL(helper.voice_engine(), StartPlayout(_)).WillOnce(Return(-1)); | 386 EXPECT_CALL(helper.voice_engine(), StartPlayout(_)).WillOnce(Return(-1)); |
381 EXPECT_CALL(*helper.audio_mixer(), AddSource(_)).Times(0); | 387 EXPECT_CALL(*helper.audio_mixer(), AddSource(_)).Times(0); |
382 | 388 |
383 recv_stream.Start(); | 389 recv_stream.Start(); |
384 } | 390 } |
385 | 391 |
386 TEST(AudioReceiveStreamTest, StreamShouldBeAddedToMixerOnStart) { | 392 TEST(AudioReceiveStreamTest, StreamShouldBeAddedToMixerOnStart) { |
387 ConfigHelper helper; | 393 ConfigHelper helper; |
388 internal::AudioReceiveStream recv_stream( | 394 internal::AudioReceiveStream recv_stream( |
389 helper.congestion_controller(), helper.config(), helper.audio_state(), | 395 helper.packet_router(), |
390 helper.event_log()); | 396 helper.congestion_controller()->GetRemoteBitrateEstimator(true), |
| 397 helper.config(), helper.audio_state(), helper.event_log()); |
391 | 398 |
392 EXPECT_CALL(helper.voice_engine(), StartPlayout(_)).WillOnce(Return(0)); | 399 EXPECT_CALL(helper.voice_engine(), StartPlayout(_)).WillOnce(Return(0)); |
393 EXPECT_CALL(helper.voice_engine(), StopPlayout(_)); | 400 EXPECT_CALL(helper.voice_engine(), StopPlayout(_)); |
394 EXPECT_CALL(*helper.audio_mixer(), AddSource(&recv_stream)) | 401 EXPECT_CALL(*helper.audio_mixer(), AddSource(&recv_stream)) |
395 .WillOnce(Return(true)); | 402 .WillOnce(Return(true)); |
396 | 403 |
397 recv_stream.Start(); | 404 recv_stream.Start(); |
398 } | 405 } |
399 } // namespace test | 406 } // namespace test |
400 } // namespace webrtc | 407 } // namespace webrtc |
OLD | NEW |