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 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 WebRtcRTPHeader rtp_header; | 377 WebRtcRTPHeader rtp_header; |
378 rtp_header.header.payloadType = kPayloadType; | 378 rtp_header.header.payloadType = kPayloadType; |
379 rtp_header.header.sequenceNumber = 0x1234; | 379 rtp_header.header.sequenceNumber = 0x1234; |
380 rtp_header.header.timestamp = 0x12345678; | 380 rtp_header.header.timestamp = 0x12345678; |
381 rtp_header.header.ssrc = 0x87654321; | 381 rtp_header.header.ssrc = 0x87654321; |
382 | 382 |
383 EXPECT_EQ(NetEq::kOK, | 383 EXPECT_EQ(NetEq::kOK, |
384 neteq_->RegisterPayloadType(kDecoderPCM16B, kPayloadType)); | 384 neteq_->RegisterPayloadType(kDecoderPCM16B, kPayloadType)); |
385 | 385 |
386 // Insert packets. The buffer should not flush. | 386 // Insert packets. The buffer should not flush. |
387 for (int i = 1; i <= config_.max_packets_in_buffer; ++i) { | 387 for (size_t i = 1; i <= config_.max_packets_in_buffer; ++i) { |
388 EXPECT_EQ(NetEq::kOK, | 388 EXPECT_EQ(NetEq::kOK, |
389 neteq_->InsertPacket( | 389 neteq_->InsertPacket( |
390 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); | 390 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); |
391 rtp_header.header.timestamp += kPayloadLengthSamples; | 391 rtp_header.header.timestamp += kPayloadLengthSamples; |
392 rtp_header.header.sequenceNumber += 1; | 392 rtp_header.header.sequenceNumber += 1; |
393 EXPECT_EQ(i, packet_buffer_->NumPacketsInBuffer()); | 393 EXPECT_EQ(i, packet_buffer_->NumPacketsInBuffer()); |
394 } | 394 } |
395 | 395 |
396 // Insert one more packet and make sure the buffer got flushed. That is, it | 396 // Insert one more packet and make sure the buffer got flushed. That is, it |
397 // should only hold one single packet. | 397 // should only hold one single packet. |
398 EXPECT_EQ(NetEq::kOK, | 398 EXPECT_EQ(NetEq::kOK, |
399 neteq_->InsertPacket( | 399 neteq_->InsertPacket( |
400 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); | 400 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); |
401 EXPECT_EQ(1, packet_buffer_->NumPacketsInBuffer()); | 401 EXPECT_EQ(1u, packet_buffer_->NumPacketsInBuffer()); |
402 const RTPHeader* test_header = packet_buffer_->NextRtpHeader(); | 402 const RTPHeader* test_header = packet_buffer_->NextRtpHeader(); |
403 EXPECT_EQ(rtp_header.header.timestamp, test_header->timestamp); | 403 EXPECT_EQ(rtp_header.header.timestamp, test_header->timestamp); |
404 EXPECT_EQ(rtp_header.header.sequenceNumber, test_header->sequenceNumber); | 404 EXPECT_EQ(rtp_header.header.sequenceNumber, test_header->sequenceNumber); |
405 } | 405 } |
406 | 406 |
407 // This test verifies that timestamps propagate from the incoming packets | 407 // This test verifies that timestamps propagate from the incoming packets |
408 // through to the sync buffer and to the playout timestamp. | 408 // through to the sync buffer and to the playout timestamp. |
409 TEST_F(NetEqImplTest, VerifyTimestampPropagation) { | 409 TEST_F(NetEqImplTest, VerifyTimestampPropagation) { |
410 UseNoMocks(); | 410 UseNoMocks(); |
411 CreateInstance(); | 411 CreateInstance(); |
412 | 412 |
413 const uint8_t kPayloadType = 17; // Just an arbitrary number. | 413 const uint8_t kPayloadType = 17; // Just an arbitrary number. |
414 const uint32_t kReceiveTime = 17; // Value doesn't matter for this test. | 414 const uint32_t kReceiveTime = 17; // Value doesn't matter for this test. |
415 const int kSampleRateHz = 8000; | 415 const int kSampleRateHz = 8000; |
416 const int kPayloadLengthSamples = 10 * kSampleRateHz / 1000; // 10 ms. | 416 const size_t kPayloadLengthSamples = |
| 417 static_cast<size_t>(10 * kSampleRateHz / 1000); // 10 ms. |
417 const size_t kPayloadLengthBytes = kPayloadLengthSamples; | 418 const size_t kPayloadLengthBytes = kPayloadLengthSamples; |
418 uint8_t payload[kPayloadLengthBytes] = {0}; | 419 uint8_t payload[kPayloadLengthBytes] = {0}; |
419 WebRtcRTPHeader rtp_header; | 420 WebRtcRTPHeader rtp_header; |
420 rtp_header.header.payloadType = kPayloadType; | 421 rtp_header.header.payloadType = kPayloadType; |
421 rtp_header.header.sequenceNumber = 0x1234; | 422 rtp_header.header.sequenceNumber = 0x1234; |
422 rtp_header.header.timestamp = 0x12345678; | 423 rtp_header.header.timestamp = 0x12345678; |
423 rtp_header.header.ssrc = 0x87654321; | 424 rtp_header.header.ssrc = 0x87654321; |
424 | 425 |
425 // This is a dummy decoder that produces as many output samples as the input | 426 // This is a dummy decoder that produces as many output samples as the input |
426 // has bytes. The output is an increasing series, starting at 1 for the first | 427 // has bytes. The output is an increasing series, starting at 1 for the first |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 EXPECT_EQ(NetEq::kOK, | 460 EXPECT_EQ(NetEq::kOK, |
460 neteq_->RegisterExternalDecoder(&decoder_, kDecoderPCM16B, | 461 neteq_->RegisterExternalDecoder(&decoder_, kDecoderPCM16B, |
461 kPayloadType, kSampleRateHz)); | 462 kPayloadType, kSampleRateHz)); |
462 | 463 |
463 // Insert one packet. | 464 // Insert one packet. |
464 EXPECT_EQ(NetEq::kOK, | 465 EXPECT_EQ(NetEq::kOK, |
465 neteq_->InsertPacket( | 466 neteq_->InsertPacket( |
466 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); | 467 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); |
467 | 468 |
468 // Pull audio once. | 469 // Pull audio once. |
469 const int kMaxOutputSize = 10 * kSampleRateHz / 1000; | 470 const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000); |
470 int16_t output[kMaxOutputSize]; | 471 int16_t output[kMaxOutputSize]; |
471 int samples_per_channel; | 472 size_t samples_per_channel; |
472 int num_channels; | 473 int num_channels; |
473 NetEqOutputType type; | 474 NetEqOutputType type; |
474 EXPECT_EQ( | 475 EXPECT_EQ( |
475 NetEq::kOK, | 476 NetEq::kOK, |
476 neteq_->GetAudio( | 477 neteq_->GetAudio( |
477 kMaxOutputSize, output, &samples_per_channel, &num_channels, &type)); | 478 kMaxOutputSize, output, &samples_per_channel, &num_channels, &type)); |
478 ASSERT_EQ(kMaxOutputSize, samples_per_channel); | 479 ASSERT_EQ(kMaxOutputSize, samples_per_channel); |
479 EXPECT_EQ(1, num_channels); | 480 EXPECT_EQ(1, num_channels); |
480 EXPECT_EQ(kOutputNormal, type); | 481 EXPECT_EQ(kOutputNormal, type); |
481 | 482 |
482 // Start with a simple check that the fake decoder is behaving as expected. | 483 // Start with a simple check that the fake decoder is behaving as expected. |
483 EXPECT_EQ(kPayloadLengthSamples, decoder_.next_value() - 1); | 484 EXPECT_EQ(kPayloadLengthSamples, |
| 485 static_cast<size_t>(decoder_.next_value() - 1)); |
484 | 486 |
485 // The value of the last of the output samples is the same as the number of | 487 // The value of the last of the output samples is the same as the number of |
486 // samples played from the decoded packet. Thus, this number + the RTP | 488 // samples played from the decoded packet. Thus, this number + the RTP |
487 // timestamp should match the playout timestamp. | 489 // timestamp should match the playout timestamp. |
488 uint32_t timestamp = 0; | 490 uint32_t timestamp = 0; |
489 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp)); | 491 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp)); |
490 EXPECT_EQ(rtp_header.header.timestamp + output[samples_per_channel - 1], | 492 EXPECT_EQ(rtp_header.header.timestamp + output[samples_per_channel - 1], |
491 timestamp); | 493 timestamp); |
492 | 494 |
493 // Check the timestamp for the last value in the sync buffer. This should | 495 // Check the timestamp for the last value in the sync buffer. This should |
494 // be one full frame length ahead of the RTP timestamp. | 496 // be one full frame length ahead of the RTP timestamp. |
495 const SyncBuffer* sync_buffer = neteq_->sync_buffer_for_test(); | 497 const SyncBuffer* sync_buffer = neteq_->sync_buffer_for_test(); |
496 ASSERT_TRUE(sync_buffer != NULL); | 498 ASSERT_TRUE(sync_buffer != NULL); |
497 EXPECT_EQ(rtp_header.header.timestamp + kPayloadLengthSamples, | 499 EXPECT_EQ(rtp_header.header.timestamp + kPayloadLengthSamples, |
498 sync_buffer->end_timestamp()); | 500 sync_buffer->end_timestamp()); |
499 | 501 |
500 // Check that the number of samples still to play from the sync buffer add | 502 // Check that the number of samples still to play from the sync buffer add |
501 // up with what was already played out. | 503 // up with what was already played out. |
502 EXPECT_EQ(kPayloadLengthSamples - output[samples_per_channel - 1], | 504 EXPECT_EQ(kPayloadLengthSamples - output[samples_per_channel - 1], |
503 static_cast<int>(sync_buffer->FutureLength())); | 505 sync_buffer->FutureLength()); |
504 } | 506 } |
505 | 507 |
506 TEST_F(NetEqImplTest, ReorderedPacket) { | 508 TEST_F(NetEqImplTest, ReorderedPacket) { |
507 UseNoMocks(); | 509 UseNoMocks(); |
508 CreateInstance(); | 510 CreateInstance(); |
509 | 511 |
510 const uint8_t kPayloadType = 17; // Just an arbitrary number. | 512 const uint8_t kPayloadType = 17; // Just an arbitrary number. |
511 const uint32_t kReceiveTime = 17; // Value doesn't matter for this test. | 513 const uint32_t kReceiveTime = 17; // Value doesn't matter for this test. |
512 const int kSampleRateHz = 8000; | 514 const int kSampleRateHz = 8000; |
513 const int kPayloadLengthSamples = 10 * kSampleRateHz / 1000; // 10 ms. | 515 const size_t kPayloadLengthSamples = |
| 516 static_cast<size_t>(10 * kSampleRateHz / 1000); // 10 ms. |
514 const size_t kPayloadLengthBytes = kPayloadLengthSamples; | 517 const size_t kPayloadLengthBytes = kPayloadLengthSamples; |
515 uint8_t payload[kPayloadLengthBytes] = {0}; | 518 uint8_t payload[kPayloadLengthBytes] = {0}; |
516 WebRtcRTPHeader rtp_header; | 519 WebRtcRTPHeader rtp_header; |
517 rtp_header.header.payloadType = kPayloadType; | 520 rtp_header.header.payloadType = kPayloadType; |
518 rtp_header.header.sequenceNumber = 0x1234; | 521 rtp_header.header.sequenceNumber = 0x1234; |
519 rtp_header.header.timestamp = 0x12345678; | 522 rtp_header.header.timestamp = 0x12345678; |
520 rtp_header.header.ssrc = 0x87654321; | 523 rtp_header.header.ssrc = 0x87654321; |
521 | 524 |
522 // Create a mock decoder object. | 525 // Create a mock decoder object. |
523 MockAudioDecoder mock_decoder; | 526 MockAudioDecoder mock_decoder; |
(...skipping 13 matching lines...) Expand all Loading... |
537 EXPECT_EQ(NetEq::kOK, | 540 EXPECT_EQ(NetEq::kOK, |
538 neteq_->RegisterExternalDecoder(&mock_decoder, kDecoderPCM16B, | 541 neteq_->RegisterExternalDecoder(&mock_decoder, kDecoderPCM16B, |
539 kPayloadType, kSampleRateHz)); | 542 kPayloadType, kSampleRateHz)); |
540 | 543 |
541 // Insert one packet. | 544 // Insert one packet. |
542 EXPECT_EQ(NetEq::kOK, | 545 EXPECT_EQ(NetEq::kOK, |
543 neteq_->InsertPacket( | 546 neteq_->InsertPacket( |
544 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); | 547 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); |
545 | 548 |
546 // Pull audio once. | 549 // Pull audio once. |
547 const int kMaxOutputSize = 10 * kSampleRateHz / 1000; | 550 const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000); |
548 int16_t output[kMaxOutputSize]; | 551 int16_t output[kMaxOutputSize]; |
549 int samples_per_channel; | 552 size_t samples_per_channel; |
550 int num_channels; | 553 int num_channels; |
551 NetEqOutputType type; | 554 NetEqOutputType type; |
552 EXPECT_EQ( | 555 EXPECT_EQ( |
553 NetEq::kOK, | 556 NetEq::kOK, |
554 neteq_->GetAudio( | 557 neteq_->GetAudio( |
555 kMaxOutputSize, output, &samples_per_channel, &num_channels, &type)); | 558 kMaxOutputSize, output, &samples_per_channel, &num_channels, &type)); |
556 ASSERT_EQ(kMaxOutputSize, samples_per_channel); | 559 ASSERT_EQ(kMaxOutputSize, samples_per_channel); |
557 EXPECT_EQ(1, num_channels); | 560 EXPECT_EQ(1, num_channels); |
558 EXPECT_EQ(kOutputNormal, type); | 561 EXPECT_EQ(kOutputNormal, type); |
559 | 562 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 | 602 |
600 // This test verifies that NetEq can handle the situation where the first | 603 // This test verifies that NetEq can handle the situation where the first |
601 // incoming packet is rejected. | 604 // incoming packet is rejected. |
602 TEST_F(NetEqImplTest, FirstPacketUnknown) { | 605 TEST_F(NetEqImplTest, FirstPacketUnknown) { |
603 UseNoMocks(); | 606 UseNoMocks(); |
604 CreateInstance(); | 607 CreateInstance(); |
605 | 608 |
606 const uint8_t kPayloadType = 17; // Just an arbitrary number. | 609 const uint8_t kPayloadType = 17; // Just an arbitrary number. |
607 const uint32_t kReceiveTime = 17; // Value doesn't matter for this test. | 610 const uint32_t kReceiveTime = 17; // Value doesn't matter for this test. |
608 const int kSampleRateHz = 8000; | 611 const int kSampleRateHz = 8000; |
609 const int kPayloadLengthSamples = 10 * kSampleRateHz / 1000; // 10 ms. | 612 const size_t kPayloadLengthSamples = |
| 613 static_cast<size_t>(10 * kSampleRateHz / 1000); // 10 ms. |
610 const size_t kPayloadLengthBytes = kPayloadLengthSamples; | 614 const size_t kPayloadLengthBytes = kPayloadLengthSamples; |
611 uint8_t payload[kPayloadLengthBytes] = {0}; | 615 uint8_t payload[kPayloadLengthBytes] = {0}; |
612 WebRtcRTPHeader rtp_header; | 616 WebRtcRTPHeader rtp_header; |
613 rtp_header.header.payloadType = kPayloadType; | 617 rtp_header.header.payloadType = kPayloadType; |
614 rtp_header.header.sequenceNumber = 0x1234; | 618 rtp_header.header.sequenceNumber = 0x1234; |
615 rtp_header.header.timestamp = 0x12345678; | 619 rtp_header.header.timestamp = 0x12345678; |
616 rtp_header.header.ssrc = 0x87654321; | 620 rtp_header.header.ssrc = 0x87654321; |
617 | 621 |
618 // Insert one packet. Note that we have not registered any payload type, so | 622 // Insert one packet. Note that we have not registered any payload type, so |
619 // this packet will be rejected. | 623 // this packet will be rejected. |
620 EXPECT_EQ(NetEq::kFail, | 624 EXPECT_EQ(NetEq::kFail, |
621 neteq_->InsertPacket(rtp_header, payload, kPayloadLengthBytes, | 625 neteq_->InsertPacket(rtp_header, payload, kPayloadLengthBytes, |
622 kReceiveTime)); | 626 kReceiveTime)); |
623 EXPECT_EQ(NetEq::kUnknownRtpPayloadType, neteq_->LastError()); | 627 EXPECT_EQ(NetEq::kUnknownRtpPayloadType, neteq_->LastError()); |
624 | 628 |
625 // Pull audio once. | 629 // Pull audio once. |
626 const int kMaxOutputSize = 10 * kSampleRateHz / 1000; | 630 const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000); |
627 int16_t output[kMaxOutputSize]; | 631 int16_t output[kMaxOutputSize]; |
628 int samples_per_channel; | 632 size_t samples_per_channel; |
629 int num_channels; | 633 int num_channels; |
630 NetEqOutputType type; | 634 NetEqOutputType type; |
631 EXPECT_EQ(NetEq::kOK, | 635 EXPECT_EQ(NetEq::kOK, |
632 neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel, | 636 neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel, |
633 &num_channels, &type)); | 637 &num_channels, &type)); |
634 ASSERT_LE(samples_per_channel, kMaxOutputSize); | 638 ASSERT_LE(samples_per_channel, kMaxOutputSize); |
635 EXPECT_EQ(kMaxOutputSize, samples_per_channel); | 639 EXPECT_EQ(kMaxOutputSize, samples_per_channel); |
636 EXPECT_EQ(1, num_channels); | 640 EXPECT_EQ(1, num_channels); |
637 EXPECT_EQ(kOutputPLC, type); | 641 EXPECT_EQ(kOutputPLC, type); |
638 | 642 |
639 // Register the payload type. | 643 // Register the payload type. |
640 EXPECT_EQ(NetEq::kOK, | 644 EXPECT_EQ(NetEq::kOK, |
641 neteq_->RegisterPayloadType(kDecoderPCM16B, kPayloadType)); | 645 neteq_->RegisterPayloadType(kDecoderPCM16B, kPayloadType)); |
642 | 646 |
643 // Insert 10 packets. | 647 // Insert 10 packets. |
644 for (int i = 0; i < 10; ++i) { | 648 for (size_t i = 0; i < 10; ++i) { |
645 rtp_header.header.sequenceNumber++; | 649 rtp_header.header.sequenceNumber++; |
646 rtp_header.header.timestamp += kPayloadLengthSamples; | 650 rtp_header.header.timestamp += kPayloadLengthSamples; |
647 EXPECT_EQ(NetEq::kOK, | 651 EXPECT_EQ(NetEq::kOK, |
648 neteq_->InsertPacket(rtp_header, payload, kPayloadLengthBytes, | 652 neteq_->InsertPacket(rtp_header, payload, kPayloadLengthBytes, |
649 kReceiveTime)); | 653 kReceiveTime)); |
650 EXPECT_EQ(i + 1, packet_buffer_->NumPacketsInBuffer()); | 654 EXPECT_EQ(i + 1, packet_buffer_->NumPacketsInBuffer()); |
651 } | 655 } |
652 | 656 |
653 // Pull audio repeatedly and make sure we get normal output, that is not PLC. | 657 // Pull audio repeatedly and make sure we get normal output, that is not PLC. |
654 for (int i = 0; i < 3; ++i) { | 658 for (size_t i = 0; i < 3; ++i) { |
655 EXPECT_EQ(NetEq::kOK, | 659 EXPECT_EQ(NetEq::kOK, |
656 neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel, | 660 neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel, |
657 &num_channels, &type)); | 661 &num_channels, &type)); |
658 ASSERT_LE(samples_per_channel, kMaxOutputSize); | 662 ASSERT_LE(samples_per_channel, kMaxOutputSize); |
659 EXPECT_EQ(kMaxOutputSize, samples_per_channel); | 663 EXPECT_EQ(kMaxOutputSize, samples_per_channel); |
660 EXPECT_EQ(1, num_channels); | 664 EXPECT_EQ(1, num_channels); |
661 EXPECT_EQ(kOutputNormal, type) | 665 EXPECT_EQ(kOutputNormal, type) |
662 << "NetEq did not decode the packets as expected."; | 666 << "NetEq did not decode the packets as expected."; |
663 } | 667 } |
664 } | 668 } |
665 | 669 |
666 // This test verifies that NetEq can handle comfort noise and enters/quits codec | 670 // This test verifies that NetEq can handle comfort noise and enters/quits codec |
667 // internal CNG mode properly. | 671 // internal CNG mode properly. |
668 TEST_F(NetEqImplTest, CodecInternalCng) { | 672 TEST_F(NetEqImplTest, CodecInternalCng) { |
669 UseNoMocks(); | 673 UseNoMocks(); |
670 CreateInstance(); | 674 CreateInstance(); |
671 | 675 |
672 const uint8_t kPayloadType = 17; // Just an arbitrary number. | 676 const uint8_t kPayloadType = 17; // Just an arbitrary number. |
673 const uint32_t kReceiveTime = 17; // Value doesn't matter for this test. | 677 const uint32_t kReceiveTime = 17; // Value doesn't matter for this test. |
674 const int kSampleRateKhz = 48; | 678 const int kSampleRateKhz = 48; |
675 const int kPayloadLengthSamples = 20 * kSampleRateKhz; // 20 ms. | 679 const size_t kPayloadLengthSamples = |
676 const int kPayloadLengthBytes = 10; | 680 static_cast<size_t>(20 * kSampleRateKhz); // 20 ms. |
| 681 const size_t kPayloadLengthBytes = 10; |
677 uint8_t payload[kPayloadLengthBytes] = {0}; | 682 uint8_t payload[kPayloadLengthBytes] = {0}; |
678 int16_t dummy_output[kPayloadLengthSamples] = {0}; | 683 int16_t dummy_output[kPayloadLengthSamples] = {0}; |
679 | 684 |
680 WebRtcRTPHeader rtp_header; | 685 WebRtcRTPHeader rtp_header; |
681 rtp_header.header.payloadType = kPayloadType; | 686 rtp_header.header.payloadType = kPayloadType; |
682 rtp_header.header.sequenceNumber = 0x1234; | 687 rtp_header.header.sequenceNumber = 0x1234; |
683 rtp_header.header.timestamp = 0x12345678; | 688 rtp_header.header.timestamp = 0x12345678; |
684 rtp_header.header.ssrc = 0x87654321; | 689 rtp_header.header.ssrc = 0x87654321; |
685 | 690 |
686 // Create a mock decoder object. | 691 // Create a mock decoder object. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); | 734 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); |
730 | 735 |
731 // Insert second packet (decoder will return CNG). | 736 // Insert second packet (decoder will return CNG). |
732 payload[0] = 1; | 737 payload[0] = 1; |
733 rtp_header.header.sequenceNumber++; | 738 rtp_header.header.sequenceNumber++; |
734 rtp_header.header.timestamp += kPayloadLengthSamples; | 739 rtp_header.header.timestamp += kPayloadLengthSamples; |
735 EXPECT_EQ(NetEq::kOK, | 740 EXPECT_EQ(NetEq::kOK, |
736 neteq_->InsertPacket( | 741 neteq_->InsertPacket( |
737 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); | 742 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); |
738 | 743 |
739 const int kMaxOutputSize = 10 * kSampleRateKhz; | 744 const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateKhz); |
740 int16_t output[kMaxOutputSize]; | 745 int16_t output[kMaxOutputSize]; |
741 int samples_per_channel; | 746 size_t samples_per_channel; |
742 int num_channels; | 747 int num_channels; |
743 uint32_t timestamp; | 748 uint32_t timestamp; |
744 uint32_t last_timestamp; | 749 uint32_t last_timestamp; |
745 NetEqOutputType type; | 750 NetEqOutputType type; |
746 NetEqOutputType expected_type[8] = { | 751 NetEqOutputType expected_type[8] = { |
747 kOutputNormal, kOutputNormal, | 752 kOutputNormal, kOutputNormal, |
748 kOutputCNG, kOutputCNG, | 753 kOutputCNG, kOutputCNG, |
749 kOutputCNG, kOutputCNG, | 754 kOutputCNG, kOutputCNG, |
750 kOutputNormal, kOutputNormal | 755 kOutputNormal, kOutputNormal |
751 }; | 756 }; |
752 int expected_timestamp_increment[8] = { | 757 int expected_timestamp_increment[8] = { |
753 -1, // will not be used. | 758 -1, // will not be used. |
754 10 * kSampleRateKhz, | 759 10 * kSampleRateKhz, |
755 0, 0, // timestamp does not increase during CNG mode. | 760 0, 0, // timestamp does not increase during CNG mode. |
756 0, 0, | 761 0, 0, |
757 50 * kSampleRateKhz, 10 * kSampleRateKhz | 762 50 * kSampleRateKhz, 10 * kSampleRateKhz |
758 }; | 763 }; |
759 | 764 |
760 EXPECT_EQ(NetEq::kOK, | 765 EXPECT_EQ(NetEq::kOK, |
761 neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel, | 766 neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel, |
762 &num_channels, &type)); | 767 &num_channels, &type)); |
763 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(&last_timestamp)); | 768 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(&last_timestamp)); |
764 | 769 |
765 for (int i = 1; i < 6; ++i) { | 770 for (size_t i = 1; i < 6; ++i) { |
766 ASSERT_EQ(kMaxOutputSize, samples_per_channel); | 771 ASSERT_EQ(kMaxOutputSize, samples_per_channel); |
767 EXPECT_EQ(1, num_channels); | 772 EXPECT_EQ(1, num_channels); |
768 EXPECT_EQ(expected_type[i - 1], type); | 773 EXPECT_EQ(expected_type[i - 1], type); |
769 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp)); | 774 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp)); |
770 EXPECT_EQ(NetEq::kOK, | 775 EXPECT_EQ(NetEq::kOK, |
771 neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel, | 776 neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel, |
772 &num_channels, &type)); | 777 &num_channels, &type)); |
773 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp)); | 778 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp)); |
774 EXPECT_EQ(timestamp, last_timestamp + expected_timestamp_increment[i]); | 779 EXPECT_EQ(timestamp, last_timestamp + expected_timestamp_increment[i]); |
775 last_timestamp = timestamp; | 780 last_timestamp = timestamp; |
776 } | 781 } |
777 | 782 |
778 // Insert third packet, which leaves a gap from last packet. | 783 // Insert third packet, which leaves a gap from last packet. |
779 payload[0] = 2; | 784 payload[0] = 2; |
780 rtp_header.header.sequenceNumber += 2; | 785 rtp_header.header.sequenceNumber += 2; |
781 rtp_header.header.timestamp += 2 * kPayloadLengthSamples; | 786 rtp_header.header.timestamp += 2 * kPayloadLengthSamples; |
782 EXPECT_EQ(NetEq::kOK, | 787 EXPECT_EQ(NetEq::kOK, |
783 neteq_->InsertPacket( | 788 neteq_->InsertPacket( |
784 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); | 789 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); |
785 | 790 |
786 for (int i = 6; i < 8; ++i) { | 791 for (size_t i = 6; i < 8; ++i) { |
787 ASSERT_EQ(kMaxOutputSize, samples_per_channel); | 792 ASSERT_EQ(kMaxOutputSize, samples_per_channel); |
788 EXPECT_EQ(1, num_channels); | 793 EXPECT_EQ(1, num_channels); |
789 EXPECT_EQ(expected_type[i - 1], type); | 794 EXPECT_EQ(expected_type[i - 1], type); |
790 EXPECT_EQ(NetEq::kOK, | 795 EXPECT_EQ(NetEq::kOK, |
791 neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel, | 796 neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel, |
792 &num_channels, &type)); | 797 &num_channels, &type)); |
793 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp)); | 798 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp)); |
794 EXPECT_EQ(timestamp, last_timestamp + expected_timestamp_increment[i]); | 799 EXPECT_EQ(timestamp, last_timestamp + expected_timestamp_increment[i]); |
795 last_timestamp = timestamp; | 800 last_timestamp = timestamp; |
796 } | 801 } |
797 | 802 |
798 // Now check the packet buffer, and make sure it is empty. | 803 // Now check the packet buffer, and make sure it is empty. |
799 EXPECT_TRUE(packet_buffer_->Empty()); | 804 EXPECT_TRUE(packet_buffer_->Empty()); |
800 | 805 |
801 EXPECT_CALL(mock_decoder, Die()); | 806 EXPECT_CALL(mock_decoder, Die()); |
802 } | 807 } |
803 | 808 |
804 TEST_F(NetEqImplTest, UnsupportedDecoder) { | 809 TEST_F(NetEqImplTest, UnsupportedDecoder) { |
805 UseNoMocks(); | 810 UseNoMocks(); |
806 CreateInstance(); | 811 CreateInstance(); |
807 static const size_t kNetEqMaxFrameSize = 2880; // 60 ms @ 48 kHz. | 812 static const size_t kNetEqMaxFrameSize = 2880; // 60 ms @ 48 kHz. |
808 static const int kChannels = 2; | 813 static const int kChannels = 2; |
809 | 814 |
810 const uint8_t kPayloadType = 17; // Just an arbitrary number. | 815 const uint8_t kPayloadType = 17; // Just an arbitrary number. |
811 const uint32_t kReceiveTime = 17; // Value doesn't matter for this test. | 816 const uint32_t kReceiveTime = 17; // Value doesn't matter for this test. |
812 const int kSampleRateHz = 8000; | 817 const int kSampleRateHz = 8000; |
813 | 818 |
814 const int kPayloadLengthSamples = 10 * kSampleRateHz / 1000; // 10 ms. | 819 const size_t kPayloadLengthSamples = |
| 820 static_cast<size_t>(10 * kSampleRateHz / 1000); // 10 ms. |
815 const size_t kPayloadLengthBytes = 1; | 821 const size_t kPayloadLengthBytes = 1; |
816 uint8_t payload[kPayloadLengthBytes]= {0}; | 822 uint8_t payload[kPayloadLengthBytes]= {0}; |
817 int16_t dummy_output[kPayloadLengthSamples * kChannels] = {0}; | 823 int16_t dummy_output[kPayloadLengthSamples * kChannels] = {0}; |
818 WebRtcRTPHeader rtp_header; | 824 WebRtcRTPHeader rtp_header; |
819 rtp_header.header.payloadType = kPayloadType; | 825 rtp_header.header.payloadType = kPayloadType; |
820 rtp_header.header.sequenceNumber = 0x1234; | 826 rtp_header.header.sequenceNumber = 0x1234; |
821 rtp_header.header.timestamp = 0x12345678; | 827 rtp_header.header.timestamp = 0x12345678; |
822 rtp_header.header.ssrc = 0x87654321; | 828 rtp_header.header.ssrc = 0x87654321; |
823 | 829 |
824 class MockAudioDecoder : public AudioDecoder { | 830 class MockAudioDecoder : public AudioDecoder { |
(...skipping 20 matching lines...) Expand all Loading... |
845 .Times(0); | 851 .Times(0); |
846 | 852 |
847 EXPECT_CALL(decoder_, DecodeInternal(Pointee(kSecondPayloadValue), | 853 EXPECT_CALL(decoder_, DecodeInternal(Pointee(kSecondPayloadValue), |
848 kPayloadLengthBytes, | 854 kPayloadLengthBytes, |
849 kSampleRateHz, _, _)) | 855 kSampleRateHz, _, _)) |
850 .Times(1) | 856 .Times(1) |
851 .WillOnce(DoAll(SetArrayArgument<3>(dummy_output, | 857 .WillOnce(DoAll(SetArrayArgument<3>(dummy_output, |
852 dummy_output + | 858 dummy_output + |
853 kPayloadLengthSamples * kChannels), | 859 kPayloadLengthSamples * kChannels), |
854 SetArgPointee<4>(AudioDecoder::kSpeech), | 860 SetArgPointee<4>(AudioDecoder::kSpeech), |
855 Return(kPayloadLengthSamples * kChannels))); | 861 Return(static_cast<int>( |
| 862 kPayloadLengthSamples * kChannels)))); |
856 | 863 |
857 EXPECT_CALL(decoder_, PacketDuration(Pointee(kSecondPayloadValue), | 864 EXPECT_CALL(decoder_, PacketDuration(Pointee(kSecondPayloadValue), |
858 kPayloadLengthBytes)) | 865 kPayloadLengthBytes)) |
859 .Times(AtLeast(1)) | 866 .Times(AtLeast(1)) |
860 .WillRepeatedly(Return(kNetEqMaxFrameSize)); | 867 .WillRepeatedly(Return(kNetEqMaxFrameSize)); |
861 | 868 |
862 EXPECT_EQ(NetEq::kOK, | 869 EXPECT_EQ(NetEq::kOK, |
863 neteq_->RegisterExternalDecoder(&decoder_, kDecoderPCM16B, | 870 neteq_->RegisterExternalDecoder(&decoder_, kDecoderPCM16B, |
864 kPayloadType, kSampleRateHz)); | 871 kPayloadType, kSampleRateHz)); |
865 | 872 |
866 // Insert one packet. | 873 // Insert one packet. |
867 payload[0] = kFirstPayloadValue; // This will make Decode() fail. | 874 payload[0] = kFirstPayloadValue; // This will make Decode() fail. |
868 EXPECT_EQ(NetEq::kOK, | 875 EXPECT_EQ(NetEq::kOK, |
869 neteq_->InsertPacket( | 876 neteq_->InsertPacket( |
870 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); | 877 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); |
871 | 878 |
872 // Insert another packet. | 879 // Insert another packet. |
873 payload[0] = kSecondPayloadValue; // This will make Decode() successful. | 880 payload[0] = kSecondPayloadValue; // This will make Decode() successful. |
874 rtp_header.header.sequenceNumber++; | 881 rtp_header.header.sequenceNumber++; |
875 // The second timestamp needs to be at least 30 ms after the first to make | 882 // The second timestamp needs to be at least 30 ms after the first to make |
876 // the second packet get decoded. | 883 // the second packet get decoded. |
877 rtp_header.header.timestamp += 3 * kPayloadLengthSamples; | 884 rtp_header.header.timestamp += 3 * kPayloadLengthSamples; |
878 EXPECT_EQ(NetEq::kOK, | 885 EXPECT_EQ(NetEq::kOK, |
879 neteq_->InsertPacket( | 886 neteq_->InsertPacket( |
880 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); | 887 rtp_header, payload, kPayloadLengthBytes, kReceiveTime)); |
881 | 888 |
882 const int kMaxOutputSize = 10 * kSampleRateHz / 1000 * kChannels; | 889 const size_t kMaxOutputSize = |
| 890 static_cast<size_t>(10 * kSampleRateHz / 1000 * kChannels); |
883 int16_t output[kMaxOutputSize]; | 891 int16_t output[kMaxOutputSize]; |
884 int samples_per_channel; | 892 size_t samples_per_channel; |
885 int num_channels; | 893 int num_channels; |
886 NetEqOutputType type; | 894 NetEqOutputType type; |
887 | 895 |
888 EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(kMaxOutputSize, output, | 896 EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(kMaxOutputSize, output, |
889 &samples_per_channel, &num_channels, | 897 &samples_per_channel, &num_channels, |
890 &type)); | 898 &type)); |
891 EXPECT_EQ(NetEq::kOtherDecoderError, neteq_->LastError()); | 899 EXPECT_EQ(NetEq::kOtherDecoderError, neteq_->LastError()); |
892 EXPECT_EQ(kMaxOutputSize, samples_per_channel * kChannels); | 900 EXPECT_EQ(kMaxOutputSize, samples_per_channel * kChannels); |
893 EXPECT_EQ(kChannels, num_channels); | 901 EXPECT_EQ(kChannels, num_channels); |
894 | 902 |
895 EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(kMaxOutputSize, output, | 903 EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(kMaxOutputSize, output, |
896 &samples_per_channel, &num_channels, | 904 &samples_per_channel, &num_channels, |
897 &type)); | 905 &type)); |
898 EXPECT_EQ(kMaxOutputSize, samples_per_channel * kChannels); | 906 EXPECT_EQ(kMaxOutputSize, samples_per_channel * kChannels); |
899 EXPECT_EQ(kChannels, num_channels); | 907 EXPECT_EQ(kChannels, num_channels); |
900 } | 908 } |
901 | 909 |
902 } // namespace webrtc | 910 } // namespace webrtc |
OLD | NEW |