OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 // This function is called when inserting a packet list into the mock packet | 47 // This function is called when inserting a packet list into the mock packet |
48 // buffer. The purpose is to delete all inserted packets properly, to avoid | 48 // buffer. The purpose is to delete all inserted packets properly, to avoid |
49 // memory leaks in the test. | 49 // memory leaks in the test. |
50 int DeletePacketsAndReturnOk(PacketList* packet_list) { | 50 int DeletePacketsAndReturnOk(PacketList* packet_list) { |
51 PacketBuffer::DeleteAllPackets(packet_list); | 51 PacketBuffer::DeleteAllPackets(packet_list); |
52 return PacketBuffer::kOK; | 52 return PacketBuffer::kOK; |
53 } | 53 } |
54 | 54 |
55 class NetEqImplTest : public ::testing::Test { | 55 class NetEqImplTest : public ::testing::Test { |
56 protected: | 56 protected: |
57 NetEqImplTest() | 57 NetEqImplTest() { config_.sample_rate_hz = 8000; } |
58 : neteq_(NULL), | |
59 config_(), | |
60 tick_timer_(new TickTimer), | |
61 mock_buffer_level_filter_(NULL), | |
62 buffer_level_filter_(NULL), | |
63 use_mock_buffer_level_filter_(true), | |
64 mock_decoder_database_(NULL), | |
65 decoder_database_(NULL), | |
66 use_mock_decoder_database_(true), | |
67 mock_delay_peak_detector_(NULL), | |
68 delay_peak_detector_(NULL), | |
69 use_mock_delay_peak_detector_(true), | |
70 mock_delay_manager_(NULL), | |
71 delay_manager_(NULL), | |
72 use_mock_delay_manager_(true), | |
73 mock_dtmf_buffer_(NULL), | |
74 dtmf_buffer_(NULL), | |
75 use_mock_dtmf_buffer_(true), | |
76 mock_dtmf_tone_generator_(NULL), | |
77 dtmf_tone_generator_(NULL), | |
78 use_mock_dtmf_tone_generator_(true), | |
79 mock_packet_buffer_(NULL), | |
80 packet_buffer_(NULL), | |
81 use_mock_packet_buffer_(true), | |
82 mock_payload_splitter_(NULL), | |
83 payload_splitter_(NULL), | |
84 use_mock_payload_splitter_(true), | |
85 timestamp_scaler_(NULL) { | |
86 config_.sample_rate_hz = 8000; | |
87 } | |
88 | 58 |
89 void CreateInstance() { | 59 void CreateInstance() { |
| 60 NetEqImpl::Dependencies deps(config_); |
| 61 |
| 62 // Get a local pointer to NetEq's TickTimer object. |
| 63 tick_timer_ = deps.tick_timer.get(); |
| 64 |
90 if (use_mock_buffer_level_filter_) { | 65 if (use_mock_buffer_level_filter_) { |
91 mock_buffer_level_filter_ = new MockBufferLevelFilter; | 66 std::unique_ptr<MockBufferLevelFilter> mock(new MockBufferLevelFilter); |
92 buffer_level_filter_ = mock_buffer_level_filter_; | 67 mock_buffer_level_filter_ = mock.get(); |
93 } else { | 68 deps.buffer_level_filter = std::move(mock); |
94 buffer_level_filter_ = new BufferLevelFilter; | |
95 } | 69 } |
| 70 buffer_level_filter_ = deps.buffer_level_filter.get(); |
| 71 |
96 if (use_mock_decoder_database_) { | 72 if (use_mock_decoder_database_) { |
97 mock_decoder_database_ = new MockDecoderDatabase; | 73 std::unique_ptr<MockDecoderDatabase> mock(new MockDecoderDatabase); |
| 74 mock_decoder_database_ = mock.get(); |
98 EXPECT_CALL(*mock_decoder_database_, GetActiveCngDecoder()) | 75 EXPECT_CALL(*mock_decoder_database_, GetActiveCngDecoder()) |
99 .WillOnce(ReturnNull()); | 76 .WillOnce(ReturnNull()); |
100 decoder_database_ = mock_decoder_database_; | 77 deps.decoder_database = std::move(mock); |
| 78 } |
| 79 decoder_database_ = deps.decoder_database.get(); |
| 80 |
| 81 if (use_mock_delay_peak_detector_) { |
| 82 std::unique_ptr<MockDelayPeakDetector> mock(new MockDelayPeakDetector); |
| 83 mock_delay_peak_detector_ = mock.get(); |
| 84 EXPECT_CALL(*mock_delay_peak_detector_, Reset()).Times(1); |
| 85 deps.delay_peak_detector = std::move(mock); |
| 86 } |
| 87 delay_peak_detector_ = deps.delay_peak_detector.get(); |
| 88 |
| 89 if (use_mock_delay_manager_) { |
| 90 std::unique_ptr<MockDelayManager> mock(new MockDelayManager( |
| 91 config_.max_packets_in_buffer, delay_peak_detector_)); |
| 92 mock_delay_manager_ = mock.get(); |
| 93 EXPECT_CALL(*mock_delay_manager_, set_streaming_mode(false)).Times(1); |
| 94 deps.delay_manager = std::move(mock); |
| 95 } |
| 96 delay_manager_ = deps.delay_manager.get(); |
| 97 |
| 98 if (use_mock_dtmf_buffer_) { |
| 99 std::unique_ptr<MockDtmfBuffer> mock( |
| 100 new MockDtmfBuffer(config_.sample_rate_hz)); |
| 101 mock_dtmf_buffer_ = mock.get(); |
| 102 deps.dtmf_buffer = std::move(mock); |
| 103 } |
| 104 dtmf_buffer_ = deps.dtmf_buffer.get(); |
| 105 |
| 106 if (use_mock_dtmf_tone_generator_) { |
| 107 std::unique_ptr<MockDtmfToneGenerator> mock(new MockDtmfToneGenerator); |
| 108 mock_dtmf_tone_generator_ = mock.get(); |
| 109 deps.dtmf_tone_generator = std::move(mock); |
| 110 } |
| 111 dtmf_tone_generator_ = deps.dtmf_tone_generator.get(); |
| 112 |
| 113 if (use_mock_packet_buffer_) { |
| 114 std::unique_ptr<MockPacketBuffer> mock( |
| 115 new MockPacketBuffer(config_.max_packets_in_buffer, tick_timer_)); |
| 116 mock_packet_buffer_ = mock.get(); |
| 117 deps.packet_buffer = std::move(mock); |
101 } else { | 118 } else { |
102 decoder_database_ = new DecoderDatabase; | 119 deps.packet_buffer.reset( |
| 120 new PacketBuffer(config_.max_packets_in_buffer, tick_timer_)); |
103 } | 121 } |
104 if (use_mock_delay_peak_detector_) { | 122 packet_buffer_ = deps.packet_buffer.get(); |
105 mock_delay_peak_detector_ = new MockDelayPeakDetector; | 123 |
106 EXPECT_CALL(*mock_delay_peak_detector_, Reset()).Times(1); | 124 if (use_mock_payload_splitter_) { |
107 delay_peak_detector_ = mock_delay_peak_detector_; | 125 std::unique_ptr<MockPayloadSplitter> mock(new MockPayloadSplitter); |
108 } else { | 126 mock_payload_splitter_ = mock.get(); |
109 delay_peak_detector_ = new DelayPeakDetector; | 127 deps.payload_splitter = std::move(mock); |
110 } | 128 } |
111 if (use_mock_delay_manager_) { | 129 payload_splitter_ = deps.payload_splitter.get(); |
112 mock_delay_manager_ = new MockDelayManager(config_.max_packets_in_buffer, | |
113 delay_peak_detector_); | |
114 EXPECT_CALL(*mock_delay_manager_, set_streaming_mode(false)).Times(1); | |
115 delay_manager_ = mock_delay_manager_; | |
116 } else { | |
117 delay_manager_ = | |
118 new DelayManager(config_.max_packets_in_buffer, delay_peak_detector_); | |
119 } | |
120 if (use_mock_dtmf_buffer_) { | |
121 mock_dtmf_buffer_ = new MockDtmfBuffer(config_.sample_rate_hz); | |
122 dtmf_buffer_ = mock_dtmf_buffer_; | |
123 } else { | |
124 dtmf_buffer_ = new DtmfBuffer(config_.sample_rate_hz); | |
125 } | |
126 if (use_mock_dtmf_tone_generator_) { | |
127 mock_dtmf_tone_generator_ = new MockDtmfToneGenerator; | |
128 dtmf_tone_generator_ = mock_dtmf_tone_generator_; | |
129 } else { | |
130 dtmf_tone_generator_ = new DtmfToneGenerator; | |
131 } | |
132 if (use_mock_packet_buffer_) { | |
133 mock_packet_buffer_ = | |
134 new MockPacketBuffer(config_.max_packets_in_buffer, tick_timer_); | |
135 packet_buffer_ = mock_packet_buffer_; | |
136 } else { | |
137 packet_buffer_ = | |
138 new PacketBuffer(config_.max_packets_in_buffer, tick_timer_); | |
139 } | |
140 if (use_mock_payload_splitter_) { | |
141 mock_payload_splitter_ = new MockPayloadSplitter; | |
142 payload_splitter_ = mock_payload_splitter_; | |
143 } else { | |
144 payload_splitter_ = new PayloadSplitter; | |
145 } | |
146 timestamp_scaler_ = new TimestampScaler(*decoder_database_); | |
147 AccelerateFactory* accelerate_factory = new AccelerateFactory; | |
148 ExpandFactory* expand_factory = new ExpandFactory; | |
149 PreemptiveExpandFactory* preemptive_expand_factory = | |
150 new PreemptiveExpandFactory; | |
151 | 130 |
152 neteq_ = new NetEqImpl( | 131 deps.timestamp_scaler = std::unique_ptr<TimestampScaler>( |
153 config_, std::unique_ptr<TickTimer>(tick_timer_), buffer_level_filter_, | 132 new TimestampScaler(*deps.decoder_database.get())); |
154 decoder_database_, delay_manager_, delay_peak_detector_, dtmf_buffer_, | 133 |
155 dtmf_tone_generator_, packet_buffer_, payload_splitter_, | 134 neteq_.reset(new NetEqImpl(config_, std::move(deps))); |
156 timestamp_scaler_, accelerate_factory, expand_factory, | |
157 preemptive_expand_factory); | |
158 ASSERT_TRUE(neteq_ != NULL); | 135 ASSERT_TRUE(neteq_ != NULL); |
159 } | 136 } |
160 | 137 |
161 void UseNoMocks() { | 138 void UseNoMocks() { |
162 ASSERT_TRUE(neteq_ == NULL) << "Must call UseNoMocks before CreateInstance"; | 139 ASSERT_TRUE(neteq_ == NULL) << "Must call UseNoMocks before CreateInstance"; |
163 use_mock_buffer_level_filter_ = false; | 140 use_mock_buffer_level_filter_ = false; |
164 use_mock_decoder_database_ = false; | 141 use_mock_decoder_database_ = false; |
165 use_mock_delay_peak_detector_ = false; | 142 use_mock_delay_peak_detector_ = false; |
166 use_mock_delay_manager_ = false; | 143 use_mock_delay_manager_ = false; |
167 use_mock_dtmf_buffer_ = false; | 144 use_mock_dtmf_buffer_ = false; |
(...skipping 17 matching lines...) Expand all Loading... |
185 } | 162 } |
186 if (use_mock_dtmf_buffer_) { | 163 if (use_mock_dtmf_buffer_) { |
187 EXPECT_CALL(*mock_dtmf_buffer_, Die()).Times(1); | 164 EXPECT_CALL(*mock_dtmf_buffer_, Die()).Times(1); |
188 } | 165 } |
189 if (use_mock_dtmf_tone_generator_) { | 166 if (use_mock_dtmf_tone_generator_) { |
190 EXPECT_CALL(*mock_dtmf_tone_generator_, Die()).Times(1); | 167 EXPECT_CALL(*mock_dtmf_tone_generator_, Die()).Times(1); |
191 } | 168 } |
192 if (use_mock_packet_buffer_) { | 169 if (use_mock_packet_buffer_) { |
193 EXPECT_CALL(*mock_packet_buffer_, Die()).Times(1); | 170 EXPECT_CALL(*mock_packet_buffer_, Die()).Times(1); |
194 } | 171 } |
195 delete neteq_; | |
196 } | 172 } |
197 | 173 |
198 NetEqImpl* neteq_; | 174 std::unique_ptr<NetEqImpl> neteq_; |
199 NetEq::Config config_; | 175 NetEq::Config config_; |
200 TickTimer* tick_timer_; | 176 TickTimer* tick_timer_ = nullptr; |
201 MockBufferLevelFilter* mock_buffer_level_filter_; | 177 MockBufferLevelFilter* mock_buffer_level_filter_ = nullptr; |
202 BufferLevelFilter* buffer_level_filter_; | 178 BufferLevelFilter* buffer_level_filter_ = nullptr; |
203 bool use_mock_buffer_level_filter_; | 179 bool use_mock_buffer_level_filter_ = true; |
204 MockDecoderDatabase* mock_decoder_database_; | 180 MockDecoderDatabase* mock_decoder_database_ = nullptr; |
205 DecoderDatabase* decoder_database_; | 181 DecoderDatabase* decoder_database_ = nullptr; |
206 bool use_mock_decoder_database_; | 182 bool use_mock_decoder_database_ = true; |
207 MockDelayPeakDetector* mock_delay_peak_detector_; | 183 MockDelayPeakDetector* mock_delay_peak_detector_ = nullptr; |
208 DelayPeakDetector* delay_peak_detector_; | 184 DelayPeakDetector* delay_peak_detector_ = nullptr; |
209 bool use_mock_delay_peak_detector_; | 185 bool use_mock_delay_peak_detector_ = true; |
210 MockDelayManager* mock_delay_manager_; | 186 MockDelayManager* mock_delay_manager_ = nullptr; |
211 DelayManager* delay_manager_; | 187 DelayManager* delay_manager_ = nullptr; |
212 bool use_mock_delay_manager_; | 188 bool use_mock_delay_manager_ = true; |
213 MockDtmfBuffer* mock_dtmf_buffer_; | 189 MockDtmfBuffer* mock_dtmf_buffer_ = nullptr; |
214 DtmfBuffer* dtmf_buffer_; | 190 DtmfBuffer* dtmf_buffer_ = nullptr; |
215 bool use_mock_dtmf_buffer_; | 191 bool use_mock_dtmf_buffer_ = true; |
216 MockDtmfToneGenerator* mock_dtmf_tone_generator_; | 192 MockDtmfToneGenerator* mock_dtmf_tone_generator_ = nullptr; |
217 DtmfToneGenerator* dtmf_tone_generator_; | 193 DtmfToneGenerator* dtmf_tone_generator_ = nullptr; |
218 bool use_mock_dtmf_tone_generator_; | 194 bool use_mock_dtmf_tone_generator_ = true; |
219 MockPacketBuffer* mock_packet_buffer_; | 195 MockPacketBuffer* mock_packet_buffer_ = nullptr; |
220 PacketBuffer* packet_buffer_; | 196 PacketBuffer* packet_buffer_ = nullptr; |
221 bool use_mock_packet_buffer_; | 197 bool use_mock_packet_buffer_ = true; |
222 MockPayloadSplitter* mock_payload_splitter_; | 198 MockPayloadSplitter* mock_payload_splitter_ = nullptr; |
223 PayloadSplitter* payload_splitter_; | 199 PayloadSplitter* payload_splitter_ = nullptr; |
224 bool use_mock_payload_splitter_; | 200 bool use_mock_payload_splitter_ = true; |
225 TimestampScaler* timestamp_scaler_; | |
226 }; | 201 }; |
227 | 202 |
228 | 203 |
229 // This tests the interface class NetEq. | 204 // This tests the interface class NetEq. |
230 // TODO(hlundin): Move to separate file? | 205 // TODO(hlundin): Move to separate file? |
231 TEST(NetEq, CreateAndDestroy) { | 206 TEST(NetEq, CreateAndDestroy) { |
232 NetEq::Config config; | 207 NetEq::Config config; |
233 NetEq* neteq = NetEq::Create(config); | 208 NetEq* neteq = NetEq::Create(config); |
234 delete neteq; | 209 delete neteq; |
235 } | 210 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 EXPECT_CALL(*mock_delay_manager_, | 321 EXPECT_CALL(*mock_delay_manager_, |
347 LastDecoderType(NetEqDecoder::kDecoderPCMu)) | 322 LastDecoderType(NetEqDecoder::kDecoderPCMu)) |
348 .Times(1); | 323 .Times(1); |
349 EXPECT_CALL(*mock_delay_manager_, last_pack_cng_or_dtmf()) | 324 EXPECT_CALL(*mock_delay_manager_, last_pack_cng_or_dtmf()) |
350 .WillOnce(Return(0)); | 325 .WillOnce(Return(0)); |
351 EXPECT_CALL(*mock_delay_manager_, SetPacketAudioLength(30)) | 326 EXPECT_CALL(*mock_delay_manager_, SetPacketAudioLength(30)) |
352 .WillOnce(Return(0)); | 327 .WillOnce(Return(0)); |
353 } | 328 } |
354 | 329 |
355 // Expectations for payload splitter. | 330 // Expectations for payload splitter. |
356 EXPECT_CALL(*mock_payload_splitter_, SplitFec(_, _)) | |
357 .Times(2) | |
358 .WillRepeatedly(Return(PayloadSplitter::kOK)); | |
359 EXPECT_CALL(*mock_payload_splitter_, SplitAudio(_, _)) | 331 EXPECT_CALL(*mock_payload_splitter_, SplitAudio(_, _)) |
360 .Times(2) | 332 .Times(2) |
361 .WillRepeatedly(Return(PayloadSplitter::kOK)); | 333 .WillRepeatedly(Return(PayloadSplitter::kOK)); |
362 | 334 |
363 // Insert first packet. | 335 // Insert first packet. |
364 neteq_->InsertPacket(rtp_header, payload, kFirstReceiveTime); | 336 neteq_->InsertPacket(rtp_header, payload, kFirstReceiveTime); |
365 | 337 |
366 // Insert second packet. | 338 // Insert second packet. |
367 rtp_header.header.timestamp += 160; | 339 rtp_header.header.timestamp += 160; |
368 rtp_header.header.sequenceNumber += 1; | 340 rtp_header.header.sequenceNumber += 1; |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 rtp_header.header.sequenceNumber = 0x1234; | 486 rtp_header.header.sequenceNumber = 0x1234; |
515 rtp_header.header.timestamp = 0x12345678; | 487 rtp_header.header.timestamp = 0x12345678; |
516 rtp_header.header.ssrc = 0x87654321; | 488 rtp_header.header.ssrc = 0x87654321; |
517 | 489 |
518 // Create a mock decoder object. | 490 // Create a mock decoder object. |
519 MockAudioDecoder mock_decoder; | 491 MockAudioDecoder mock_decoder; |
520 EXPECT_CALL(mock_decoder, Reset()).WillRepeatedly(Return()); | 492 EXPECT_CALL(mock_decoder, Reset()).WillRepeatedly(Return()); |
521 EXPECT_CALL(mock_decoder, Channels()).WillRepeatedly(Return(1)); | 493 EXPECT_CALL(mock_decoder, Channels()).WillRepeatedly(Return(1)); |
522 EXPECT_CALL(mock_decoder, IncomingPacket(_, kPayloadLengthBytes, _, _, _)) | 494 EXPECT_CALL(mock_decoder, IncomingPacket(_, kPayloadLengthBytes, _, _, _)) |
523 .WillRepeatedly(Return(0)); | 495 .WillRepeatedly(Return(0)); |
524 EXPECT_CALL(mock_decoder, PacketDuration(_, kPayloadLengthBytes)) | |
525 .WillRepeatedly(Return(kPayloadLengthSamples)); | |
526 int16_t dummy_output[kPayloadLengthSamples] = {0}; | 496 int16_t dummy_output[kPayloadLengthSamples] = {0}; |
527 // The below expectation will make the mock decoder write | 497 // The below expectation will make the mock decoder write |
528 // |kPayloadLengthSamples| zeros to the output array, and mark it as speech. | 498 // |kPayloadLengthSamples| zeros to the output array, and mark it as speech. |
529 EXPECT_CALL(mock_decoder, DecodeInternal(Pointee(0), kPayloadLengthBytes, | 499 EXPECT_CALL(mock_decoder, DecodeInternal(Pointee(0), kPayloadLengthBytes, |
530 kSampleRateHz, _, _)) | 500 kSampleRateHz, _, _)) |
531 .WillOnce(DoAll(SetArrayArgument<3>(dummy_output, | 501 .WillOnce(DoAll(SetArrayArgument<3>(dummy_output, |
532 dummy_output + kPayloadLengthSamples), | 502 dummy_output + kPayloadLengthSamples), |
533 SetArgPointee<4>(AudioDecoder::kSpeech), | 503 SetArgPointee<4>(AudioDecoder::kSpeech), |
534 Return(kPayloadLengthSamples))); | 504 Return(kPayloadLengthSamples))); |
535 EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder( | 505 EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder( |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 UseNoMocks(); | 1174 UseNoMocks(); |
1205 CreateInstance(); | 1175 CreateInstance(); |
1206 ASSERT_TRUE(tick_timer_); | 1176 ASSERT_TRUE(tick_timer_); |
1207 EXPECT_EQ(0u, tick_timer_->ticks()); | 1177 EXPECT_EQ(0u, tick_timer_->ticks()); |
1208 AudioFrame output; | 1178 AudioFrame output; |
1209 EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output)); | 1179 EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output)); |
1210 EXPECT_EQ(1u, tick_timer_->ticks()); | 1180 EXPECT_EQ(1u, tick_timer_->ticks()); |
1211 } | 1181 } |
1212 | 1182 |
1213 }// namespace webrtc | 1183 }// namespace webrtc |
OLD | NEW |