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 |
11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
12 | 12 |
13 #include "webrtc/audio/audio_receive_stream.h" | 13 #include "webrtc/audio/audio_receive_stream.h" |
14 #include "webrtc/audio/conversion.h" | 14 #include "webrtc/audio/conversion.h" |
15 #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitra
te_estimator.h" | 15 #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitra
te_estimator.h" |
16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
17 #include "webrtc/test/fake_voice_engine.h" | 17 #include "webrtc/test/mock_voice_engine.h" |
18 | 18 |
| 19 namespace webrtc { |
| 20 namespace test { |
19 namespace { | 21 namespace { |
20 | 22 |
21 using webrtc::ByteWriter; | 23 const int kChannelId = 2; |
22 | 24 const uint32_t kRemoteSsrc = 1234; |
| 25 const uint32_t kLocalSsrc = 5678; |
23 const size_t kAbsoluteSendTimeLength = 4; | 26 const size_t kAbsoluteSendTimeLength = 4; |
24 | 27 |
25 void BuildAbsoluteSendTimeExtension(uint8_t* buffer, | 28 void BuildAbsoluteSendTimeExtension(uint8_t* buffer, |
26 int id, | 29 int id, |
27 uint32_t abs_send_time) { | 30 uint32_t abs_send_time) { |
28 const size_t kRtpOneByteHeaderLength = 4; | 31 const size_t kRtpOneByteHeaderLength = 4; |
29 const uint16_t kRtpOneByteHeaderExtensionId = 0xBEDE; | 32 const uint16_t kRtpOneByteHeaderExtensionId = 0xBEDE; |
30 ByteWriter<uint16_t>::WriteBigEndian(buffer, kRtpOneByteHeaderExtensionId); | 33 ByteWriter<uint16_t>::WriteBigEndian(buffer, kRtpOneByteHeaderExtensionId); |
31 | 34 |
32 const uint32_t kPosLength = 2; | 35 const uint32_t kPosLength = 2; |
(...skipping 18 matching lines...) Expand all Loading... |
51 ByteWriter<uint32_t>::WriteBigEndian(header + 8, 0x4321); // SSRC. | 54 ByteWriter<uint32_t>::WriteBigEndian(header + 8, 0x4321); // SSRC. |
52 int32_t rtp_header_length = webrtc::kRtpHeaderSize; | 55 int32_t rtp_header_length = webrtc::kRtpHeaderSize; |
53 | 56 |
54 BuildAbsoluteSendTimeExtension(header + rtp_header_length, extension_id, | 57 BuildAbsoluteSendTimeExtension(header + rtp_header_length, extension_id, |
55 abs_send_time); | 58 abs_send_time); |
56 rtp_header_length += kAbsoluteSendTimeLength; | 59 rtp_header_length += kAbsoluteSendTimeLength; |
57 return rtp_header_length; | 60 return rtp_header_length; |
58 } | 61 } |
59 } // namespace | 62 } // namespace |
60 | 63 |
61 namespace webrtc { | |
62 namespace test { | |
63 | |
64 TEST(AudioReceiveStreamTest, ConfigToString) { | 64 TEST(AudioReceiveStreamTest, ConfigToString) { |
65 const int kAbsSendTimeId = 3; | 65 const int kAbsSendTimeId = 3; |
66 AudioReceiveStream::Config config; | 66 AudioReceiveStream::Config config; |
67 config.rtp.remote_ssrc = 1234; | 67 config.rtp.remote_ssrc = kRemoteSsrc; |
68 config.rtp.local_ssrc = 5678; | 68 config.rtp.local_ssrc = kLocalSsrc; |
69 config.rtp.extensions.push_back( | 69 config.rtp.extensions.push_back( |
70 RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId)); | 70 RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId)); |
71 config.voe_channel_id = 1; | 71 config.voe_channel_id = kChannelId; |
72 config.combined_audio_video_bwe = true; | 72 config.combined_audio_video_bwe = true; |
73 EXPECT_EQ("{rtp: {remote_ssrc: 1234, local_ssrc: 5678, extensions: [{name: " | 73 EXPECT_EQ( |
| 74 "{rtp: {remote_ssrc: 1234, local_ssrc: 5678, extensions: [{name: " |
74 "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 3}]}, " | 75 "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 3}]}, " |
75 "receive_transport: nullptr, rtcp_send_transport: nullptr, " | 76 "receive_transport: nullptr, rtcp_send_transport: nullptr, " |
76 "voe_channel_id: 1, combined_audio_video_bwe: true}", config.ToString()); | 77 "voe_channel_id: 2, combined_audio_video_bwe: true}", |
| 78 config.ToString()); |
77 } | 79 } |
78 | 80 |
79 TEST(AudioReceiveStreamTest, ConstructDestruct) { | 81 TEST(AudioReceiveStreamTest, ConstructDestruct) { |
80 MockRemoteBitrateEstimator remote_bitrate_estimator; | 82 MockRemoteBitrateEstimator remote_bitrate_estimator; |
81 FakeVoiceEngine voice_engine; | 83 MockVoiceEngine voice_engine; |
82 AudioReceiveStream::Config config; | 84 AudioReceiveStream::Config config; |
83 config.voe_channel_id = 1; | 85 config.voe_channel_id = kChannelId; |
84 internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, | 86 internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, |
85 &voice_engine); | 87 &voice_engine); |
86 } | 88 } |
87 | 89 |
88 TEST(AudioReceiveStreamTest, AudioPacketUpdatesBweWithTimestamp) { | 90 TEST(AudioReceiveStreamTest, AudioPacketUpdatesBweWithTimestamp) { |
89 MockRemoteBitrateEstimator remote_bitrate_estimator; | 91 MockRemoteBitrateEstimator remote_bitrate_estimator; |
90 FakeVoiceEngine voice_engine; | 92 MockVoiceEngine voice_engine; |
91 AudioReceiveStream::Config config; | 93 AudioReceiveStream::Config config; |
92 config.combined_audio_video_bwe = true; | 94 config.combined_audio_video_bwe = true; |
93 config.voe_channel_id = FakeVoiceEngine::kRecvChannelId; | 95 config.voe_channel_id = kChannelId; |
94 const int kAbsSendTimeId = 3; | 96 const int kAbsSendTimeId = 3; |
95 config.rtp.extensions.push_back( | 97 config.rtp.extensions.push_back( |
96 RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId)); | 98 RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId)); |
97 internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, | 99 internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, |
98 &voice_engine); | 100 &voice_engine); |
99 uint8_t rtp_packet[30]; | 101 uint8_t rtp_packet[30]; |
100 const int kAbsSendTimeValue = 1234; | 102 const int kAbsSendTimeValue = 1234; |
101 CreateRtpHeaderWithAbsSendTime(rtp_packet, kAbsSendTimeId, kAbsSendTimeValue); | 103 CreateRtpHeaderWithAbsSendTime(rtp_packet, kAbsSendTimeId, kAbsSendTimeValue); |
102 PacketTime packet_time(5678000, 0); | 104 PacketTime packet_time(5678000, 0); |
103 const size_t kExpectedHeaderLength = 20; | 105 const size_t kExpectedHeaderLength = 20; |
104 EXPECT_CALL(remote_bitrate_estimator, | 106 EXPECT_CALL(remote_bitrate_estimator, |
105 IncomingPacket(packet_time.timestamp / 1000, | 107 IncomingPacket(packet_time.timestamp / 1000, |
106 sizeof(rtp_packet) - kExpectedHeaderLength, testing::_, false)) | 108 sizeof(rtp_packet) - kExpectedHeaderLength, |
| 109 testing::_, false)) |
107 .Times(1); | 110 .Times(1); |
108 EXPECT_TRUE( | 111 EXPECT_TRUE( |
109 recv_stream.DeliverRtp(rtp_packet, sizeof(rtp_packet), packet_time)); | 112 recv_stream.DeliverRtp(rtp_packet, sizeof(rtp_packet), packet_time)); |
110 } | 113 } |
111 | 114 |
112 TEST(AudioReceiveStreamTest, GetStats) { | 115 TEST(AudioReceiveStreamTest, GetStats) { |
| 116 const int kJitterBufferDelay = -7; |
| 117 const int kPlayoutBufferDelay = 302; |
| 118 const unsigned int kSpeechOutputLevel = 99; |
| 119 const CallStatistics kCallStats = {345, 678, 901, 234, -12, |
| 120 3456, 7890, 567, 890, 123}; |
| 121 |
| 122 const CodecInst kCodecInst = {123, "codec_name_recv", 96000, -187, -198, |
| 123 -103}; |
| 124 |
| 125 const NetworkStatistics kNetworkStats = { |
| 126 123, 456, false, 0, 0, 789, 12, 345, 678, 901, -1, -1, -1, -1, -1, 0}; |
| 127 |
| 128 webrtc::AudioDecodingCallStats audio_decode_stats; |
| 129 { |
| 130 audio_decode_stats.calls_to_silence_generator = 234; |
| 131 audio_decode_stats.calls_to_neteq = 567; |
| 132 audio_decode_stats.decoded_normal = 890; |
| 133 audio_decode_stats.decoded_plc = 123; |
| 134 audio_decode_stats.decoded_cng = 456; |
| 135 audio_decode_stats.decoded_plc_cng = 789; |
| 136 } |
| 137 |
113 MockRemoteBitrateEstimator remote_bitrate_estimator; | 138 MockRemoteBitrateEstimator remote_bitrate_estimator; |
114 FakeVoiceEngine voice_engine; | 139 MockVoiceEngine voice_engine; |
115 AudioReceiveStream::Config config; | 140 AudioReceiveStream::Config config; |
116 config.rtp.remote_ssrc = FakeVoiceEngine::kRecvSsrc; | 141 config.rtp.remote_ssrc = kRemoteSsrc; |
117 config.voe_channel_id = FakeVoiceEngine::kRecvChannelId; | 142 config.voe_channel_id = kChannelId; |
118 internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, | 143 internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, |
119 &voice_engine); | 144 &voice_engine); |
120 | 145 |
| 146 using testing::_; |
| 147 using testing::DoAll; |
| 148 using testing::Return; |
| 149 using testing::SetArgPointee; |
| 150 using testing::SetArgReferee; |
| 151 EXPECT_CALL(voice_engine, GetRemoteSSRC(kChannelId, _)) |
| 152 .WillOnce(DoAll(SetArgReferee<1>(0), Return(0))); |
| 153 EXPECT_CALL(voice_engine, GetRTCPStatistics(kChannelId, _)) |
| 154 .WillOnce(DoAll(SetArgReferee<1>(kCallStats), Return(0))); |
| 155 EXPECT_CALL(voice_engine, GetRecCodec(kChannelId, _)) |
| 156 .WillOnce(DoAll(SetArgReferee<1>(kCodecInst), Return(0))); |
| 157 EXPECT_CALL(voice_engine, GetDelayEstimate(kChannelId, _, _)) |
| 158 .WillOnce(DoAll(SetArgPointee<1>(kJitterBufferDelay), |
| 159 SetArgPointee<2>(kPlayoutBufferDelay), Return(0))); |
| 160 EXPECT_CALL(voice_engine, GetSpeechOutputLevelFullRange(kChannelId, _)) |
| 161 .WillOnce(DoAll(SetArgReferee<1>(kSpeechOutputLevel), Return(0))); |
| 162 EXPECT_CALL(voice_engine, GetNetworkStatistics(kChannelId, _)) |
| 163 .WillOnce(DoAll(SetArgReferee<1>(kNetworkStats), Return(0))); |
| 164 EXPECT_CALL(voice_engine, GetDecodingCallStatistics(kChannelId, _)) |
| 165 .WillOnce(DoAll(SetArgPointee<1>(audio_decode_stats), Return(0))); |
| 166 |
121 AudioReceiveStream::Stats stats = recv_stream.GetStats(); | 167 AudioReceiveStream::Stats stats = recv_stream.GetStats(); |
122 const CallStatistics& call_stats = FakeVoiceEngine::kRecvCallStats; | 168 EXPECT_EQ(kRemoteSsrc, stats.remote_ssrc); |
123 const CodecInst& codec_inst = FakeVoiceEngine::kRecvCodecInst; | 169 EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesReceived), stats.bytes_rcvd); |
124 const NetworkStatistics& net_stats = FakeVoiceEngine::kRecvNetworkStats; | 170 EXPECT_EQ(static_cast<uint32_t>(kCallStats.packetsReceived), |
125 const AudioDecodingCallStats& decode_stats = | |
126 FakeVoiceEngine::kRecvAudioDecodingCallStats; | |
127 EXPECT_EQ(FakeVoiceEngine::kRecvSsrc, stats.remote_ssrc); | |
128 EXPECT_EQ(static_cast<int64_t>(call_stats.bytesReceived), stats.bytes_rcvd); | |
129 EXPECT_EQ(static_cast<uint32_t>(call_stats.packetsReceived), | |
130 stats.packets_rcvd); | 171 stats.packets_rcvd); |
131 EXPECT_EQ(call_stats.cumulativeLost, stats.packets_lost); | 172 EXPECT_EQ(kCallStats.cumulativeLost, stats.packets_lost); |
132 EXPECT_EQ(Q8ToFloat(call_stats.fractionLost), stats.fraction_lost); | 173 EXPECT_EQ(Q8ToFloat(kCallStats.fractionLost), stats.fraction_lost); |
133 EXPECT_EQ(std::string(codec_inst.plname), stats.codec_name); | 174 EXPECT_EQ(std::string(kCodecInst.plname), stats.codec_name); |
134 EXPECT_EQ(call_stats.extendedMax, stats.ext_seqnum); | 175 EXPECT_EQ(kCallStats.extendedMax, stats.ext_seqnum); |
135 EXPECT_EQ(call_stats.jitterSamples / (codec_inst.plfreq / 1000), | 176 EXPECT_EQ(kCallStats.jitterSamples / (kCodecInst.plfreq / 1000), |
136 stats.jitter_ms); | 177 stats.jitter_ms); |
137 EXPECT_EQ(net_stats.currentBufferSize, stats.jitter_buffer_ms); | 178 EXPECT_EQ(kNetworkStats.currentBufferSize, stats.jitter_buffer_ms); |
138 EXPECT_EQ(net_stats.preferredBufferSize, stats.jitter_buffer_preferred_ms); | 179 EXPECT_EQ(kNetworkStats.preferredBufferSize, |
139 EXPECT_EQ(static_cast<uint32_t>(FakeVoiceEngine::kRecvJitterBufferDelay + | 180 stats.jitter_buffer_preferred_ms); |
140 FakeVoiceEngine::kRecvPlayoutBufferDelay), stats.delay_estimate_ms); | 181 EXPECT_EQ(static_cast<uint32_t>(kJitterBufferDelay + kPlayoutBufferDelay), |
141 EXPECT_EQ(static_cast<int32_t>(FakeVoiceEngine::kRecvSpeechOutputLevel), | 182 stats.delay_estimate_ms); |
142 stats.audio_level); | 183 EXPECT_EQ(static_cast<int32_t>(kSpeechOutputLevel), stats.audio_level); |
143 EXPECT_EQ(Q14ToFloat(net_stats.currentExpandRate), stats.expand_rate); | 184 EXPECT_EQ(Q14ToFloat(kNetworkStats.currentExpandRate), stats.expand_rate); |
144 EXPECT_EQ(Q14ToFloat(net_stats.currentSpeechExpandRate), | 185 EXPECT_EQ(Q14ToFloat(kNetworkStats.currentSpeechExpandRate), |
145 stats.speech_expand_rate); | 186 stats.speech_expand_rate); |
146 EXPECT_EQ(Q14ToFloat(net_stats.currentSecondaryDecodedRate), | 187 EXPECT_EQ(Q14ToFloat(kNetworkStats.currentSecondaryDecodedRate), |
147 stats.secondary_decoded_rate); | 188 stats.secondary_decoded_rate); |
148 EXPECT_EQ(Q14ToFloat(net_stats.currentAccelerateRate), stats.accelerate_rate); | 189 EXPECT_EQ(Q14ToFloat(kNetworkStats.currentAccelerateRate), |
149 EXPECT_EQ(Q14ToFloat(net_stats.currentPreemptiveRate), | 190 stats.accelerate_rate); |
| 191 EXPECT_EQ(Q14ToFloat(kNetworkStats.currentPreemptiveRate), |
150 stats.preemptive_expand_rate); | 192 stats.preemptive_expand_rate); |
151 EXPECT_EQ(decode_stats.calls_to_silence_generator, | 193 EXPECT_EQ(audio_decode_stats.calls_to_silence_generator, |
152 stats.decoding_calls_to_silence_generator); | 194 stats.decoding_calls_to_silence_generator); |
153 EXPECT_EQ(decode_stats.calls_to_neteq, stats.decoding_calls_to_neteq); | 195 EXPECT_EQ(audio_decode_stats.calls_to_neteq, stats.decoding_calls_to_neteq); |
154 EXPECT_EQ(decode_stats.decoded_normal, stats.decoding_normal); | 196 EXPECT_EQ(audio_decode_stats.decoded_normal, stats.decoding_normal); |
155 EXPECT_EQ(decode_stats.decoded_plc, stats.decoding_plc); | 197 EXPECT_EQ(audio_decode_stats.decoded_plc, stats.decoding_plc); |
156 EXPECT_EQ(decode_stats.decoded_cng, stats.decoding_cng); | 198 EXPECT_EQ(audio_decode_stats.decoded_cng, stats.decoding_cng); |
157 EXPECT_EQ(decode_stats.decoded_plc_cng, stats.decoding_plc_cng); | 199 EXPECT_EQ(audio_decode_stats.decoded_plc_cng, stats.decoding_plc_cng); |
158 EXPECT_EQ(call_stats.capture_start_ntp_time_ms_, | 200 EXPECT_EQ(kCallStats.capture_start_ntp_time_ms_, |
159 stats.capture_start_ntp_time_ms); | 201 stats.capture_start_ntp_time_ms); |
160 } | 202 } |
161 } // namespace test | 203 } // namespace test |
162 } // namespace webrtc | 204 } // namespace webrtc |
OLD | NEW |