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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
137 return packet; | 137 return packet; |
138 } | 138 } |
139 | 139 |
140 // Checks that |packet| has the attributes given in the remaining parameters. | 140 // Checks that |packet| has the attributes given in the remaining parameters. |
141 void VerifyPacket(const Packet* packet, | 141 void VerifyPacket(const Packet* packet, |
142 size_t payload_length, | 142 size_t payload_length, |
143 uint8_t payload_type, | 143 uint8_t payload_type, |
144 uint16_t sequence_number, | 144 uint16_t sequence_number, |
145 uint32_t timestamp, | 145 uint32_t timestamp, |
146 uint8_t payload_value, | 146 uint8_t payload_value, |
147 bool primary = true) { | 147 Packet::Priority priority) { |
148 EXPECT_EQ(payload_length, packet->payload.size()); | 148 EXPECT_EQ(payload_length, packet->payload.size()); |
149 EXPECT_EQ(payload_type, packet->header.payloadType); | 149 EXPECT_EQ(payload_type, packet->header.payloadType); |
150 EXPECT_EQ(sequence_number, packet->header.sequenceNumber); | 150 EXPECT_EQ(sequence_number, packet->header.sequenceNumber); |
151 EXPECT_EQ(timestamp, packet->header.timestamp); | 151 EXPECT_EQ(timestamp, packet->header.timestamp); |
152 EXPECT_EQ(primary, packet->primary); | 152 EXPECT_EQ(priority, packet->priority); |
153 ASSERT_FALSE(packet->payload.empty()); | 153 ASSERT_FALSE(packet->payload.empty()); |
154 for (size_t i = 0; i < packet->payload.size(); ++i) { | 154 for (size_t i = 0; i < packet->payload.size(); ++i) { |
155 ASSERT_EQ(payload_value, packet->payload.data()[i]); | 155 ASSERT_EQ(payload_value, packet->payload.data()[i]); |
156 } | 156 } |
157 } | 157 } |
158 | 158 |
159 void VerifyPacket(const Packet* packet, | |
160 size_t payload_length, | |
161 uint8_t payload_type, | |
162 uint16_t sequence_number, | |
163 uint32_t timestamp, | |
164 uint8_t payload_value, | |
165 bool primary) { | |
166 return VerifyPacket(packet, payload_length, payload_type, sequence_number, | |
167 timestamp, payload_value, | |
168 Packet::Priority{0, primary ? 0 : 1}); | |
169 } | |
170 | |
159 // Start of test definitions. | 171 // Start of test definitions. |
160 | 172 |
161 TEST(PayloadSplitter, CreateAndDestroy) { | 173 TEST(PayloadSplitter, CreateAndDestroy) { |
162 PayloadSplitter* splitter = new PayloadSplitter; | 174 PayloadSplitter* splitter = new PayloadSplitter; |
163 delete splitter; | 175 delete splitter; |
164 } | 176 } |
165 | 177 |
166 // Packet A is split into A1 and A2. | 178 // Packet A is split into A1 and A2. |
167 TEST(RedPayloadSplitter, OnePacketTwoPayloads) { | 179 TEST(RedPayloadSplitter, OnePacketTwoPayloads) { |
168 uint8_t payload_types[] = {0, 0}; | 180 uint8_t payload_types[] = {0, 0}; |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
238 // Manually change timestamp and sequence number of second packet. | 250 // Manually change timestamp and sequence number of second packet. |
239 packet->header.timestamp += kTimestampOffset; | 251 packet->header.timestamp += kTimestampOffset; |
240 packet->header.sequenceNumber++; | 252 packet->header.sequenceNumber++; |
241 packet_list.push_back(packet); | 253 packet_list.push_back(packet); |
242 PayloadSplitter splitter; | 254 PayloadSplitter splitter; |
243 EXPECT_EQ(PayloadSplitter::kOK, splitter.SplitRed(&packet_list)); | 255 EXPECT_EQ(PayloadSplitter::kOK, splitter.SplitRed(&packet_list)); |
244 ASSERT_EQ(6u, packet_list.size()); | 256 ASSERT_EQ(6u, packet_list.size()); |
245 // Check first packet, A1. | 257 // Check first packet, A1. |
246 packet = packet_list.front(); | 258 packet = packet_list.front(); |
247 VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber, | 259 VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber, |
248 kBaseTimestamp, 2, true); | 260 kBaseTimestamp, 2, {0, 0}); |
249 delete packet; | 261 delete packet; |
250 packet_list.pop_front(); | 262 packet_list.pop_front(); |
251 // Check second packet, A2. | 263 // Check second packet, A2. |
252 packet = packet_list.front(); | 264 packet = packet_list.front(); |
253 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber, | 265 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber, |
254 kBaseTimestamp - kTimestampOffset, 1, false); | 266 kBaseTimestamp - kTimestampOffset, 1, {0, 1}); |
255 delete packet; | 267 delete packet; |
256 packet_list.pop_front(); | 268 packet_list.pop_front(); |
257 // Check third packet, A3. | 269 // Check third packet, A3. |
258 packet = packet_list.front(); | 270 packet = packet_list.front(); |
259 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber, | 271 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber, |
260 kBaseTimestamp - 2 * kTimestampOffset, 0, false); | 272 kBaseTimestamp - 2 * kTimestampOffset, 0, {0, 2}); |
261 delete packet; | 273 delete packet; |
262 packet_list.pop_front(); | 274 packet_list.pop_front(); |
263 // Check fourth packet, B1. | 275 // Check fourth packet, B1. |
264 packet = packet_list.front(); | 276 packet = packet_list.front(); |
265 VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber + 1, | 277 VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber + 1, |
266 kBaseTimestamp + kTimestampOffset, 2, true); | 278 kBaseTimestamp + kTimestampOffset, 2, {0, 0}); |
267 delete packet; | 279 delete packet; |
268 packet_list.pop_front(); | 280 packet_list.pop_front(); |
269 // Check fifth packet, B2. | 281 // Check fifth packet, B2. |
270 packet = packet_list.front(); | 282 packet = packet_list.front(); |
271 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber + 1, | 283 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber + 1, |
272 kBaseTimestamp, 1, false); | 284 kBaseTimestamp, 1, {0, 1}); |
273 delete packet; | 285 delete packet; |
274 packet_list.pop_front(); | 286 packet_list.pop_front(); |
275 // Check sixth packet, B3. | 287 // Check sixth packet, B3. |
276 packet = packet_list.front(); | 288 packet = packet_list.front(); |
277 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber + 1, | 289 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber + 1, |
278 kBaseTimestamp - kTimestampOffset, 0, false); | 290 kBaseTimestamp - kTimestampOffset, 0, {0, 2}); |
279 delete packet; | 291 delete packet; |
280 } | 292 } |
281 | 293 |
282 // Creates a list with 4 packets with these payload types: | 294 // Creates a list with 4 packets with these payload types: |
283 // 0 = CNGnb | 295 // 0 = CNGnb |
284 // 1 = PCMu | 296 // 1 = PCMu |
285 // 2 = DTMF (AVT) | 297 // 2 = DTMF (AVT) |
286 // 3 = iLBC | 298 // 3 = iLBC |
287 // We expect the method CheckRedPayloads to discard the iLBC packet, since it | 299 // We expect the method CheckRedPayloads to discard the iLBC packet, since it |
288 // is a non-CNG, non-DTMF payload of another type than the first speech payload | 300 // is a non-CNG, non-DTMF payload of another type than the first speech payload |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
332 packet->payload.SetSize(packet->payload.size() - (kPayloadLength + 1)); | 344 packet->payload.SetSize(packet->payload.size() - (kPayloadLength + 1)); |
333 PacketList packet_list; | 345 PacketList packet_list; |
334 packet_list.push_back(packet); | 346 packet_list.push_back(packet); |
335 PayloadSplitter splitter; | 347 PayloadSplitter splitter; |
336 EXPECT_EQ(PayloadSplitter::kRedLengthMismatch, | 348 EXPECT_EQ(PayloadSplitter::kRedLengthMismatch, |
337 splitter.SplitRed(&packet_list)); | 349 splitter.SplitRed(&packet_list)); |
338 ASSERT_EQ(1u, packet_list.size()); | 350 ASSERT_EQ(1u, packet_list.size()); |
339 // Check first packet. | 351 // Check first packet. |
340 packet = packet_list.front(); | 352 packet = packet_list.front(); |
341 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber, | 353 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber, |
342 kBaseTimestamp - 2 * kTimestampOffset, 0, false); | 354 kBaseTimestamp - 2 * kTimestampOffset, 0, {0, 2}); |
343 delete packet; | 355 delete packet; |
344 packet_list.pop_front(); | 356 packet_list.pop_front(); |
345 } | 357 } |
346 | |
347 TEST(FecPayloadSplitter, MixedPayload) { | |
ossu
2016/09/14 16:21:07
Since splitting is now done on a per-codec basis,
hlundin-webrtc
2016/09/15 09:33:30
Acknowledged.
| |
348 PacketList packet_list; | |
349 DecoderDatabase decoder_database(CreateBuiltinAudioDecoderFactory()); | |
350 | |
351 decoder_database.RegisterPayload(0, NetEqDecoder::kDecoderOpus, "opus"); | |
352 decoder_database.RegisterPayload(1, NetEqDecoder::kDecoderPCMu, "pcmu"); | |
353 | |
354 Packet* packet = CreatePacket(0, 10, 0xFF, true); | |
355 packet_list.push_back(packet); | |
356 | |
357 packet = CreatePacket(0, 10, 0); // Non-FEC Opus payload. | |
358 packet_list.push_back(packet); | |
359 | |
360 packet = CreatePacket(1, 10, 0); // Non-Opus payload. | |
361 packet_list.push_back(packet); | |
362 | |
363 PayloadSplitter splitter; | |
364 EXPECT_EQ(PayloadSplitter::kOK, | |
365 splitter.SplitFec(&packet_list, &decoder_database)); | |
366 EXPECT_EQ(4u, packet_list.size()); | |
367 | |
368 // Check first packet. | |
369 packet = packet_list.front(); | |
370 EXPECT_EQ(0, packet->header.payloadType); | |
371 EXPECT_EQ(kBaseTimestamp - 20 * 48, packet->header.timestamp); | |
372 EXPECT_EQ(10U, packet->payload.size()); | |
373 EXPECT_FALSE(packet->primary); | |
374 delete packet; | |
375 packet_list.pop_front(); | |
376 | |
377 // Check second packet. | |
378 packet = packet_list.front(); | |
379 EXPECT_EQ(0, packet->header.payloadType); | |
380 EXPECT_EQ(kBaseTimestamp, packet->header.timestamp); | |
381 EXPECT_EQ(10U, packet->payload.size()); | |
382 EXPECT_TRUE(packet->primary); | |
383 delete packet; | |
384 packet_list.pop_front(); | |
385 | |
386 // Check third packet. | |
387 packet = packet_list.front(); | |
388 VerifyPacket(packet, 10, 0, kSequenceNumber, kBaseTimestamp, 0, true); | |
389 delete packet; | |
390 packet_list.pop_front(); | |
391 | |
392 // Check fourth packet. | |
393 packet = packet_list.front(); | |
394 VerifyPacket(packet, 10, 1, kSequenceNumber, kBaseTimestamp, 0, true); | |
395 delete packet; | |
396 } | |
397 | |
398 TEST(FecPayloadSplitter, EmbedFecInRed) { | |
ossu
2016/09/14 16:21:07
As RED and FEC is now indicated separately, rather
| |
399 PacketList packet_list; | |
400 DecoderDatabase decoder_database(CreateBuiltinAudioDecoderFactory()); | |
401 | |
402 const int kTimestampOffset = 20 * 48; // 20 ms * 48 kHz. | |
403 uint8_t payload_types[] = {0, 0}; | |
404 decoder_database.RegisterPayload(0, NetEqDecoder::kDecoderOpus, "opus"); | |
405 Packet* packet = CreateRedPayload(2, payload_types, kTimestampOffset, true); | |
406 packet_list.push_back(packet); | |
407 | |
408 PayloadSplitter splitter; | |
409 EXPECT_EQ(PayloadSplitter::kOK, | |
410 splitter.SplitRed(&packet_list)); | |
411 EXPECT_EQ(PayloadSplitter::kOK, | |
412 splitter.SplitFec(&packet_list, &decoder_database)); | |
413 | |
414 EXPECT_EQ(4u, packet_list.size()); | |
415 | |
416 // Check first packet. FEC packet copied from primary payload in RED. | |
417 packet = packet_list.front(); | |
418 EXPECT_EQ(0, packet->header.payloadType); | |
419 EXPECT_EQ(kBaseTimestamp - kTimestampOffset, packet->header.timestamp); | |
420 EXPECT_EQ(kPayloadLength, packet->payload.size()); | |
421 EXPECT_FALSE(packet->primary); | |
422 EXPECT_EQ(packet->payload[3], 1); | |
423 delete packet; | |
424 packet_list.pop_front(); | |
425 | |
426 // Check second packet. Normal packet copied from primary payload in RED. | |
427 packet = packet_list.front(); | |
428 EXPECT_EQ(0, packet->header.payloadType); | |
429 EXPECT_EQ(kBaseTimestamp, packet->header.timestamp); | |
430 EXPECT_EQ(kPayloadLength, packet->payload.size()); | |
431 EXPECT_TRUE(packet->primary); | |
432 EXPECT_EQ(packet->payload[3], 1); | |
433 delete packet; | |
434 packet_list.pop_front(); | |
435 | |
436 // Check third packet. FEC packet copied from secondary payload in RED. | |
437 packet = packet_list.front(); | |
438 EXPECT_EQ(0, packet->header.payloadType); | |
439 EXPECT_EQ(kBaseTimestamp - 2 * kTimestampOffset, packet->header.timestamp); | |
440 EXPECT_EQ(kPayloadLength, packet->payload.size()); | |
441 EXPECT_FALSE(packet->primary); | |
442 EXPECT_EQ(packet->payload[3], 0); | |
443 delete packet; | |
444 packet_list.pop_front(); | |
445 | |
446 // Check fourth packet. Normal packet copied from primary payload in RED. | |
447 packet = packet_list.front(); | |
448 EXPECT_EQ(0, packet->header.payloadType); | |
449 EXPECT_EQ(kBaseTimestamp - kTimestampOffset, packet->header.timestamp); | |
450 EXPECT_EQ(kPayloadLength, packet->payload.size()); | |
451 EXPECT_TRUE(packet->primary); | |
452 EXPECT_EQ(packet->payload[3], 0); | |
453 delete packet; | |
454 packet_list.pop_front(); | |
455 } | |
456 | 358 |
457 } // namespace webrtc | 359 } // namespace webrtc |
OLD | NEW |