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

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

Issue 2886993005: Introduce RtpStreamReceiver and RtpStreamReceiverControllerInterface. (Closed)
Patch Set: Protect construction of FlexfecReceiveStreamImpl. Created 3 years, 6 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 <map> 11 #include <map>
12 #include <string> 12 #include <string>
13 #include <vector> 13 #include <vector>
14 14
15 #include "webrtc/api/test/mock_audio_mixer.h" 15 #include "webrtc/api/test/mock_audio_mixer.h"
16 #include "webrtc/audio/audio_receive_stream.h" 16 #include "webrtc/audio/audio_receive_stream.h"
17 #include "webrtc/audio/conversion.h" 17 #include "webrtc/audio/conversion.h"
18 #include "webrtc/call/rtp_stream_receiver_controller.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"
19 #include "webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller .h" 20 #include "webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller .h"
20 #include "webrtc/modules/pacing/packet_router.h" 21 #include "webrtc/modules/pacing/packet_router.h"
21 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" 22 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
22 #include "webrtc/test/gtest.h" 23 #include "webrtc/test/gtest.h"
23 #include "webrtc/test/mock_audio_decoder_factory.h" 24 #include "webrtc/test/mock_audio_decoder_factory.h"
24 #include "webrtc/test/mock_voe_channel_proxy.h" 25 #include "webrtc/test/mock_voe_channel_proxy.h"
25 #include "webrtc/test/mock_voice_engine.h" 26 #include "webrtc/test/mock_voice_engine.h"
26 27
27 namespace webrtc { 28 namespace webrtc {
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 stream_config_.decoder_factory = decoder_factory_; 131 stream_config_.decoder_factory = decoder_factory_;
131 } 132 }
132 133
133 PacketRouter* packet_router() { return &packet_router_; } 134 PacketRouter* packet_router() { return &packet_router_; }
134 MockRtcEventLog* event_log() { return &event_log_; } 135 MockRtcEventLog* event_log() { return &event_log_; }
135 AudioReceiveStream::Config& config() { return stream_config_; } 136 AudioReceiveStream::Config& config() { return stream_config_; }
136 rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; } 137 rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; }
137 rtc::scoped_refptr<MockAudioMixer> audio_mixer() { return audio_mixer_; } 138 rtc::scoped_refptr<MockAudioMixer> audio_mixer() { return audio_mixer_; }
138 MockVoiceEngine& voice_engine() { return voice_engine_; } 139 MockVoiceEngine& voice_engine() { return voice_engine_; }
139 MockVoEChannelProxy* channel_proxy() { return channel_proxy_; } 140 MockVoEChannelProxy* channel_proxy() { return channel_proxy_; }
141 RtpStreamReceiverControllerInterface* rtp_stream_receiver_controller() {
142 return &rtp_stream_receiver_controller_;
143 }
140 144
141 void SetupMockForGetStats() { 145 void SetupMockForGetStats() {
142 using testing::DoAll; 146 using testing::DoAll;
143 using testing::SetArgPointee; 147 using testing::SetArgPointee;
144 148
145 ASSERT_TRUE(channel_proxy_); 149 ASSERT_TRUE(channel_proxy_);
146 EXPECT_CALL(*channel_proxy_, GetRTCPStatistics()) 150 EXPECT_CALL(*channel_proxy_, GetRTCPStatistics())
147 .WillOnce(Return(kCallStats)); 151 .WillOnce(Return(kCallStats));
148 EXPECT_CALL(*channel_proxy_, GetDelayEstimate()) 152 EXPECT_CALL(*channel_proxy_, GetDelayEstimate())
149 .WillOnce(Return(kJitterBufferDelay + kPlayoutBufferDelay)); 153 .WillOnce(Return(kJitterBufferDelay + kPlayoutBufferDelay));
150 EXPECT_CALL(*channel_proxy_, GetSpeechOutputLevelFullRange()) 154 EXPECT_CALL(*channel_proxy_, GetSpeechOutputLevelFullRange())
151 .WillOnce(Return(kSpeechOutputLevel)); 155 .WillOnce(Return(kSpeechOutputLevel));
152 EXPECT_CALL(*channel_proxy_, GetNetworkStatistics()) 156 EXPECT_CALL(*channel_proxy_, GetNetworkStatistics())
153 .WillOnce(Return(kNetworkStats)); 157 .WillOnce(Return(kNetworkStats));
154 EXPECT_CALL(*channel_proxy_, GetDecodingCallStatistics()) 158 EXPECT_CALL(*channel_proxy_, GetDecodingCallStatistics())
155 .WillOnce(Return(kAudioDecodeStats)); 159 .WillOnce(Return(kAudioDecodeStats));
156 EXPECT_CALL(*channel_proxy_, GetRecCodec(_)) 160 EXPECT_CALL(*channel_proxy_, GetRecCodec(_))
157 .WillOnce(DoAll(SetArgPointee<0>(kCodecInst), Return(true))); 161 .WillOnce(DoAll(SetArgPointee<0>(kCodecInst), Return(true)));
158 } 162 }
159 163
160 private: 164 private:
161 PacketRouter packet_router_; 165 PacketRouter packet_router_;
162 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_; 166 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
163 MockRtcEventLog event_log_; 167 MockRtcEventLog event_log_;
164 testing::StrictMock<MockVoiceEngine> voice_engine_; 168 testing::StrictMock<MockVoiceEngine> voice_engine_;
165 rtc::scoped_refptr<AudioState> audio_state_; 169 rtc::scoped_refptr<AudioState> audio_state_;
166 rtc::scoped_refptr<MockAudioMixer> audio_mixer_; 170 rtc::scoped_refptr<MockAudioMixer> audio_mixer_;
167 AudioReceiveStream::Config stream_config_; 171 AudioReceiveStream::Config stream_config_;
168 testing::StrictMock<MockVoEChannelProxy>* channel_proxy_ = nullptr; 172 testing::StrictMock<MockVoEChannelProxy>* channel_proxy_ = nullptr;
173 RtpStreamReceiverController rtp_stream_receiver_controller_;
169 }; 174 };
170 175
171 void BuildOneByteExtension(std::vector<uint8_t>::iterator it, 176 void BuildOneByteExtension(std::vector<uint8_t>::iterator it,
172 int id, 177 int id,
173 uint32_t extension_value, 178 uint32_t extension_value,
174 size_t value_length) { 179 size_t value_length) {
175 const uint16_t kRtpOneByteHeaderExtensionId = 0xBEDE; 180 const uint16_t kRtpOneByteHeaderExtensionId = 0xBEDE;
176 ByteWriter<uint16_t>::WriteBigEndian(&(*it), kRtpOneByteHeaderExtensionId); 181 ByteWriter<uint16_t>::WriteBigEndian(&(*it), kRtpOneByteHeaderExtensionId);
177 it += 2; 182 it += 2;
178 183
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 "{rtp: {remote_ssrc: 1234, local_ssrc: 5678, transport_cc: off, nack: " 236 "{rtp: {remote_ssrc: 1234, local_ssrc: 5678, transport_cc: off, nack: "
232 "{rtp_history_ms: 0}, extensions: [{uri: " 237 "{rtp_history_ms: 0}, extensions: [{uri: "
233 "urn:ietf:params:rtp-hdrext:ssrc-audio-level, id: 3}]}, " 238 "urn:ietf:params:rtp-hdrext:ssrc-audio-level, id: 3}]}, "
234 "rtcp_send_transport: null, voe_channel_id: 2}", 239 "rtcp_send_transport: null, voe_channel_id: 2}",
235 config.ToString()); 240 config.ToString());
236 } 241 }
237 242
238 TEST(AudioReceiveStreamTest, ConstructDestruct) { 243 TEST(AudioReceiveStreamTest, ConstructDestruct) {
239 ConfigHelper helper; 244 ConfigHelper helper;
240 internal::AudioReceiveStream recv_stream( 245 internal::AudioReceiveStream recv_stream(
246 helper.rtp_stream_receiver_controller(),
241 helper.packet_router(), 247 helper.packet_router(),
242 helper.config(), helper.audio_state(), helper.event_log()); 248 helper.config(), helper.audio_state(), helper.event_log());
243 } 249 }
244 250
245 TEST(AudioReceiveStreamTest, ReceiveRtpPacket) { 251 TEST(AudioReceiveStreamTest, ReceiveRtpPacket) {
246 ConfigHelper helper; 252 ConfigHelper helper;
247 helper.config().rtp.transport_cc = true; 253 helper.config().rtp.transport_cc = true;
248 internal::AudioReceiveStream recv_stream( 254 internal::AudioReceiveStream recv_stream(
255 helper.rtp_stream_receiver_controller(),
249 helper.packet_router(), 256 helper.packet_router(),
250 helper.config(), helper.audio_state(), helper.event_log()); 257 helper.config(), helper.audio_state(), helper.event_log());
251 const int kTransportSequenceNumberValue = 1234; 258 const int kTransportSequenceNumberValue = 1234;
252 std::vector<uint8_t> rtp_packet = CreateRtpHeaderWithOneByteExtension( 259 std::vector<uint8_t> rtp_packet = CreateRtpHeaderWithOneByteExtension(
253 kTransportSequenceNumberId, kTransportSequenceNumberValue, 2); 260 kTransportSequenceNumberId, kTransportSequenceNumberValue, 2);
254 PacketTime packet_time(5678000, 0); 261 PacketTime packet_time(5678000, 0);
255 262
256 RtpPacketReceived parsed_packet; 263 RtpPacketReceived parsed_packet;
257 ASSERT_TRUE(parsed_packet.Parse(&rtp_packet[0], rtp_packet.size())); 264 ASSERT_TRUE(parsed_packet.Parse(&rtp_packet[0], rtp_packet.size()));
258 parsed_packet.set_arrival_time_ms((packet_time.timestamp + 500) / 1000); 265 parsed_packet.set_arrival_time_ms((packet_time.timestamp + 500) / 1000);
259 266
260 EXPECT_CALL(*helper.channel_proxy(), 267 EXPECT_CALL(*helper.channel_proxy(),
261 OnRtpPacket(testing::Ref(parsed_packet))); 268 OnRtpPacket(testing::Ref(parsed_packet)));
262 269
263 recv_stream.OnRtpPacket(parsed_packet); 270 recv_stream.OnRtpPacket(parsed_packet);
264 } 271 }
265 272
266 TEST(AudioReceiveStreamTest, ReceiveRtcpPacket) { 273 TEST(AudioReceiveStreamTest, ReceiveRtcpPacket) {
267 ConfigHelper helper; 274 ConfigHelper helper;
268 helper.config().rtp.transport_cc = true; 275 helper.config().rtp.transport_cc = true;
269 internal::AudioReceiveStream recv_stream( 276 internal::AudioReceiveStream recv_stream(
277 helper.rtp_stream_receiver_controller(),
270 helper.packet_router(), 278 helper.packet_router(),
271 helper.config(), helper.audio_state(), helper.event_log()); 279 helper.config(), helper.audio_state(), helper.event_log());
272 280
273 std::vector<uint8_t> rtcp_packet = CreateRtcpSenderReport(); 281 std::vector<uint8_t> rtcp_packet = CreateRtcpSenderReport();
274 EXPECT_CALL(*helper.channel_proxy(), 282 EXPECT_CALL(*helper.channel_proxy(),
275 ReceivedRTCPPacket(&rtcp_packet[0], rtcp_packet.size())) 283 ReceivedRTCPPacket(&rtcp_packet[0], rtcp_packet.size()))
276 .WillOnce(Return(true)); 284 .WillOnce(Return(true));
277 EXPECT_TRUE(recv_stream.DeliverRtcp(&rtcp_packet[0], rtcp_packet.size())); 285 EXPECT_TRUE(recv_stream.DeliverRtcp(&rtcp_packet[0], rtcp_packet.size()));
278 } 286 }
279 287
280 TEST(AudioReceiveStreamTest, GetStats) { 288 TEST(AudioReceiveStreamTest, GetStats) {
281 ConfigHelper helper; 289 ConfigHelper helper;
282 internal::AudioReceiveStream recv_stream( 290 internal::AudioReceiveStream recv_stream(
291 helper.rtp_stream_receiver_controller(),
283 helper.packet_router(), 292 helper.packet_router(),
284 helper.config(), helper.audio_state(), helper.event_log()); 293 helper.config(), helper.audio_state(), helper.event_log());
285 helper.SetupMockForGetStats(); 294 helper.SetupMockForGetStats();
286 AudioReceiveStream::Stats stats = recv_stream.GetStats(); 295 AudioReceiveStream::Stats stats = recv_stream.GetStats();
287 EXPECT_EQ(kRemoteSsrc, stats.remote_ssrc); 296 EXPECT_EQ(kRemoteSsrc, stats.remote_ssrc);
288 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesReceived), stats.bytes_rcvd); 297 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesReceived), stats.bytes_rcvd);
289 EXPECT_EQ(static_cast<uint32_t>(kCallStats.packetsReceived), 298 EXPECT_EQ(static_cast<uint32_t>(kCallStats.packetsReceived),
290 stats.packets_rcvd); 299 stats.packets_rcvd);
291 EXPECT_EQ(kCallStats.cumulativeLost, stats.packets_lost); 300 EXPECT_EQ(kCallStats.cumulativeLost, stats.packets_lost);
292 EXPECT_EQ(Q8ToFloat(kCallStats.fractionLost), stats.fraction_lost); 301 EXPECT_EQ(Q8ToFloat(kCallStats.fractionLost), stats.fraction_lost);
(...skipping 25 matching lines...) Expand all
318 EXPECT_EQ(kAudioDecodeStats.decoded_plc_cng, stats.decoding_plc_cng); 327 EXPECT_EQ(kAudioDecodeStats.decoded_plc_cng, stats.decoding_plc_cng);
319 EXPECT_EQ(kAudioDecodeStats.decoded_muted_output, 328 EXPECT_EQ(kAudioDecodeStats.decoded_muted_output,
320 stats.decoding_muted_output); 329 stats.decoding_muted_output);
321 EXPECT_EQ(kCallStats.capture_start_ntp_time_ms_, 330 EXPECT_EQ(kCallStats.capture_start_ntp_time_ms_,
322 stats.capture_start_ntp_time_ms); 331 stats.capture_start_ntp_time_ms);
323 } 332 }
324 333
325 TEST(AudioReceiveStreamTest, SetGain) { 334 TEST(AudioReceiveStreamTest, SetGain) {
326 ConfigHelper helper; 335 ConfigHelper helper;
327 internal::AudioReceiveStream recv_stream( 336 internal::AudioReceiveStream recv_stream(
337 helper.rtp_stream_receiver_controller(),
328 helper.packet_router(), 338 helper.packet_router(),
329 helper.config(), helper.audio_state(), helper.event_log()); 339 helper.config(), helper.audio_state(), helper.event_log());
330 EXPECT_CALL(*helper.channel_proxy(), 340 EXPECT_CALL(*helper.channel_proxy(),
331 SetChannelOutputVolumeScaling(FloatEq(0.765f))); 341 SetChannelOutputVolumeScaling(FloatEq(0.765f)));
332 recv_stream.SetGain(0.765f); 342 recv_stream.SetGain(0.765f);
333 } 343 }
334 344
335 TEST(AudioReceiveStreamTest, StreamShouldNotBeAddedToMixerWhenVoEReturnsError) { 345 TEST(AudioReceiveStreamTest, StreamShouldNotBeAddedToMixerWhenVoEReturnsError) {
336 ConfigHelper helper; 346 ConfigHelper helper;
337 internal::AudioReceiveStream recv_stream( 347 internal::AudioReceiveStream recv_stream(
348 helper.rtp_stream_receiver_controller(),
338 helper.packet_router(), 349 helper.packet_router(),
339 helper.config(), helper.audio_state(), helper.event_log()); 350 helper.config(), helper.audio_state(), helper.event_log());
340 351
341 EXPECT_CALL(helper.voice_engine(), StartPlayout(_)).WillOnce(Return(-1)); 352 EXPECT_CALL(helper.voice_engine(), StartPlayout(_)).WillOnce(Return(-1));
342 EXPECT_CALL(*helper.audio_mixer(), AddSource(_)).Times(0); 353 EXPECT_CALL(*helper.audio_mixer(), AddSource(_)).Times(0);
343 354
344 recv_stream.Start(); 355 recv_stream.Start();
345 } 356 }
346 357
347 TEST(AudioReceiveStreamTest, StreamShouldBeAddedToMixerOnStart) { 358 TEST(AudioReceiveStreamTest, StreamShouldBeAddedToMixerOnStart) {
348 ConfigHelper helper; 359 ConfigHelper helper;
349 internal::AudioReceiveStream recv_stream( 360 internal::AudioReceiveStream recv_stream(
361 helper.rtp_stream_receiver_controller(),
350 helper.packet_router(), 362 helper.packet_router(),
351 helper.config(), helper.audio_state(), helper.event_log()); 363 helper.config(), helper.audio_state(), helper.event_log());
352 364
353 EXPECT_CALL(helper.voice_engine(), StartPlayout(_)).WillOnce(Return(0)); 365 EXPECT_CALL(helper.voice_engine(), StartPlayout(_)).WillOnce(Return(0));
354 EXPECT_CALL(helper.voice_engine(), StopPlayout(_)); 366 EXPECT_CALL(helper.voice_engine(), StopPlayout(_));
355 EXPECT_CALL(*helper.audio_mixer(), AddSource(&recv_stream)) 367 EXPECT_CALL(*helper.audio_mixer(), AddSource(&recv_stream))
356 .WillOnce(Return(true)); 368 .WillOnce(Return(true));
357 369
358 recv_stream.Start(); 370 recv_stream.Start();
359 } 371 }
360 } // namespace test 372 } // namespace test
361 } // namespace webrtc 373 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698