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

Side by Side Diff: webrtc/modules/audio_coding/neteq/neteq_unittest.cc

Issue 2812933002: Revert of Change NetEq::InsertPacket to take an RTPHeader (Closed)
Patch Set: Created 3 years, 8 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) 2011 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2011 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 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 void NetEqDecodingTest::Process() { 317 void NetEqDecodingTest::Process() {
318 // Check if time to receive. 318 // Check if time to receive.
319 while (packet_ && sim_clock_ >= packet_->time_ms()) { 319 while (packet_ && sim_clock_ >= packet_->time_ms()) {
320 if (packet_->payload_length_bytes() > 0) { 320 if (packet_->payload_length_bytes() > 0) {
321 WebRtcRTPHeader rtp_header; 321 WebRtcRTPHeader rtp_header;
322 packet_->ConvertHeader(&rtp_header); 322 packet_->ConvertHeader(&rtp_header);
323 #ifndef WEBRTC_CODEC_ISAC 323 #ifndef WEBRTC_CODEC_ISAC
324 // Ignore payload type 104 (iSAC-swb) if ISAC is not supported. 324 // Ignore payload type 104 (iSAC-swb) if ISAC is not supported.
325 if (rtp_header.header.payloadType != 104) 325 if (rtp_header.header.payloadType != 104)
326 #endif 326 #endif
327 ASSERT_EQ(0, 327 ASSERT_EQ(0, neteq_->InsertPacket(
328 neteq_->InsertPacket( 328 rtp_header,
329 rtp_header.header, 329 rtc::ArrayView<const uint8_t>(
330 rtc::ArrayView<const uint8_t>( 330 packet_->payload(), packet_->payload_length_bytes()),
331 packet_->payload(), packet_->payload_length_bytes()), 331 static_cast<uint32_t>(packet_->time_ms() *
332 static_cast<uint32_t>(packet_->time_ms() * 332 (output_sample_rate_ / 1000))));
333 (output_sample_rate_ / 1000))));
334 } 333 }
335 // Get next packet. 334 // Get next packet.
336 packet_ = rtp_source_->NextPacket(); 335 packet_ = rtp_source_->NextPacket();
337 } 336 }
338 337
339 // Get audio from NetEq. 338 // Get audio from NetEq.
340 bool muted; 339 bool muted;
341 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 340 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
342 ASSERT_FALSE(muted); 341 ASSERT_FALSE(muted);
343 ASSERT_TRUE((out_frame_.samples_per_channel_ == kBlockSize8kHz) || 342 ASSERT_TRUE((out_frame_.samples_per_channel_ == kBlockSize8kHz) ||
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 const size_t kSamples = 10 * 16; 519 const size_t kSamples = 10 * 16;
521 const size_t kPayloadBytes = kSamples * 2; 520 const size_t kPayloadBytes = kSamples * 2;
522 for (size_t i = 0; i < num_frames; ++i) { 521 for (size_t i = 0; i < num_frames; ++i) {
523 const uint8_t payload[kPayloadBytes] = {0}; 522 const uint8_t payload[kPayloadBytes] = {0};
524 WebRtcRTPHeader rtp_info; 523 WebRtcRTPHeader rtp_info;
525 rtp_info.header.sequenceNumber = i; 524 rtp_info.header.sequenceNumber = i;
526 rtp_info.header.timestamp = i * kSamples; 525 rtp_info.header.timestamp = i * kSamples;
527 rtp_info.header.ssrc = 0x1234; // Just an arbitrary SSRC. 526 rtp_info.header.ssrc = 0x1234; // Just an arbitrary SSRC.
528 rtp_info.header.payloadType = 94; // PCM16b WB codec. 527 rtp_info.header.payloadType = 94; // PCM16b WB codec.
529 rtp_info.header.markerBit = 0; 528 rtp_info.header.markerBit = 0;
530 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 529 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
531 } 530 }
532 // Pull out all data. 531 // Pull out all data.
533 for (size_t i = 0; i < num_frames; ++i) { 532 for (size_t i = 0; i < num_frames; ++i) {
534 bool muted; 533 bool muted;
535 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 534 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
536 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 535 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
537 } 536 }
538 537
539 NetEqNetworkStatistics stats; 538 NetEqNetworkStatistics stats;
540 EXPECT_EQ(0, neteq_->NetworkStatistics(&stats)); 539 EXPECT_EQ(0, neteq_->NetworkStatistics(&stats));
(...skipping 20 matching lines...) Expand all
561 const size_t kSamples = 10 * 16; 560 const size_t kSamples = 10 * 16;
562 const size_t kPayloadBytes = kSamples * 2; 561 const size_t kPayloadBytes = kSamples * 2;
563 while (frame_index < kNumFrames) { 562 while (frame_index < kNumFrames) {
564 // Insert one packet each time, except every 10th time where we insert two 563 // Insert one packet each time, except every 10th time where we insert two
565 // packets at once. This will create a negative clock-drift of approx. 10%. 564 // packets at once. This will create a negative clock-drift of approx. 10%.
566 int num_packets = (frame_index % 10 == 0 ? 2 : 1); 565 int num_packets = (frame_index % 10 == 0 ? 2 : 1);
567 for (int n = 0; n < num_packets; ++n) { 566 for (int n = 0; n < num_packets; ++n) {
568 uint8_t payload[kPayloadBytes] = {0}; 567 uint8_t payload[kPayloadBytes] = {0};
569 WebRtcRTPHeader rtp_info; 568 WebRtcRTPHeader rtp_info;
570 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info); 569 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info);
571 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 570 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
572 ++frame_index; 571 ++frame_index;
573 } 572 }
574 573
575 // Pull out data once. 574 // Pull out data once.
576 bool muted; 575 bool muted;
577 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 576 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
578 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 577 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
579 } 578 }
580 579
581 NetEqNetworkStatistics network_stats; 580 NetEqNetworkStatistics network_stats;
582 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats)); 581 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
583 EXPECT_EQ(-103192, network_stats.clockdrift_ppm); 582 EXPECT_EQ(-103192, network_stats.clockdrift_ppm);
584 } 583 }
585 584
586 TEST_F(NetEqDecodingTest, TestAverageInterArrivalTimePositive) { 585 TEST_F(NetEqDecodingTest, TestAverageInterArrivalTimePositive) {
587 const int kNumFrames = 5000; // Needed for convergence. 586 const int kNumFrames = 5000; // Needed for convergence.
588 int frame_index = 0; 587 int frame_index = 0;
589 const size_t kSamples = 10 * 16; 588 const size_t kSamples = 10 * 16;
590 const size_t kPayloadBytes = kSamples * 2; 589 const size_t kPayloadBytes = kSamples * 2;
591 for (int i = 0; i < kNumFrames; ++i) { 590 for (int i = 0; i < kNumFrames; ++i) {
592 // Insert one packet each time, except every 10th time where we don't insert 591 // Insert one packet each time, except every 10th time where we don't insert
593 // any packet. This will create a positive clock-drift of approx. 11%. 592 // any packet. This will create a positive clock-drift of approx. 11%.
594 int num_packets = (i % 10 == 9 ? 0 : 1); 593 int num_packets = (i % 10 == 9 ? 0 : 1);
595 for (int n = 0; n < num_packets; ++n) { 594 for (int n = 0; n < num_packets; ++n) {
596 uint8_t payload[kPayloadBytes] = {0}; 595 uint8_t payload[kPayloadBytes] = {0};
597 WebRtcRTPHeader rtp_info; 596 WebRtcRTPHeader rtp_info;
598 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info); 597 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info);
599 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 598 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
600 ++frame_index; 599 ++frame_index;
601 } 600 }
602 601
603 // Pull out data once. 602 // Pull out data once.
604 bool muted; 603 bool muted;
605 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 604 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
606 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 605 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
607 } 606 }
608 607
609 NetEqNetworkStatistics network_stats; 608 NetEqNetworkStatistics network_stats;
(...skipping 17 matching lines...) Expand all
627 626
628 // Insert speech for 5 seconds. 627 // Insert speech for 5 seconds.
629 const int kSpeechDurationMs = 5000; 628 const int kSpeechDurationMs = 5000;
630 for (t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) { 629 for (t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) {
631 // Each turn in this for loop is 10 ms. 630 // Each turn in this for loop is 10 ms.
632 while (next_input_time_ms <= t_ms) { 631 while (next_input_time_ms <= t_ms) {
633 // Insert one 30 ms speech frame. 632 // Insert one 30 ms speech frame.
634 uint8_t payload[kPayloadBytes] = {0}; 633 uint8_t payload[kPayloadBytes] = {0};
635 WebRtcRTPHeader rtp_info; 634 WebRtcRTPHeader rtp_info;
636 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 635 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
637 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 636 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
638 ++seq_no; 637 ++seq_no;
639 timestamp += kSamples; 638 timestamp += kSamples;
640 next_input_time_ms += static_cast<double>(kFrameSizeMs) * drift_factor; 639 next_input_time_ms += static_cast<double>(kFrameSizeMs) * drift_factor;
641 } 640 }
642 // Pull out data once. 641 // Pull out data once.
643 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 642 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
644 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 643 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
645 } 644 }
646 645
647 EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_); 646 EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_);
648 rtc::Optional<uint32_t> playout_timestamp = PlayoutTimestamp(); 647 rtc::Optional<uint32_t> playout_timestamp = PlayoutTimestamp();
649 ASSERT_TRUE(playout_timestamp); 648 ASSERT_TRUE(playout_timestamp);
650 int32_t delay_before = timestamp - *playout_timestamp; 649 int32_t delay_before = timestamp - *playout_timestamp;
651 650
652 // Insert CNG for 1 minute (= 60000 ms). 651 // Insert CNG for 1 minute (= 60000 ms).
653 const int kCngPeriodMs = 100; 652 const int kCngPeriodMs = 100;
654 const int kCngPeriodSamples = kCngPeriodMs * 16; // Period in 16 kHz samples. 653 const int kCngPeriodSamples = kCngPeriodMs * 16; // Period in 16 kHz samples.
655 const int kCngDurationMs = 60000; 654 const int kCngDurationMs = 60000;
656 for (; t_ms < kSpeechDurationMs + kCngDurationMs; t_ms += 10) { 655 for (; t_ms < kSpeechDurationMs + kCngDurationMs; t_ms += 10) {
657 // Each turn in this for loop is 10 ms. 656 // Each turn in this for loop is 10 ms.
658 while (next_input_time_ms <= t_ms) { 657 while (next_input_time_ms <= t_ms) {
659 // Insert one CNG frame each 100 ms. 658 // Insert one CNG frame each 100 ms.
660 uint8_t payload[kPayloadBytes]; 659 uint8_t payload[kPayloadBytes];
661 size_t payload_len; 660 size_t payload_len;
662 WebRtcRTPHeader rtp_info; 661 WebRtcRTPHeader rtp_info;
663 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len); 662 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
664 ASSERT_EQ(0, neteq_->InsertPacket( 663 ASSERT_EQ(0, neteq_->InsertPacket(
665 rtp_info.header, 664 rtp_info,
666 rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 665 rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
667 ++seq_no; 666 ++seq_no;
668 timestamp += kCngPeriodSamples; 667 timestamp += kCngPeriodSamples;
669 next_input_time_ms += static_cast<double>(kCngPeriodMs) * drift_factor; 668 next_input_time_ms += static_cast<double>(kCngPeriodMs) * drift_factor;
670 } 669 }
671 // Pull out data once. 670 // Pull out data once.
672 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 671 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
673 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 672 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
674 } 673 }
675 674
(...skipping 22 matching lines...) Expand all
698 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 697 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
699 EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_); 698 EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
700 t_ms += 10; 699 t_ms += 10;
701 } 700 }
702 // Insert one CNG frame each 100 ms. 701 // Insert one CNG frame each 100 ms.
703 uint8_t payload[kPayloadBytes]; 702 uint8_t payload[kPayloadBytes];
704 size_t payload_len; 703 size_t payload_len;
705 WebRtcRTPHeader rtp_info; 704 WebRtcRTPHeader rtp_info;
706 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len); 705 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
707 ASSERT_EQ(0, neteq_->InsertPacket( 706 ASSERT_EQ(0, neteq_->InsertPacket(
708 rtp_info.header, 707 rtp_info,
709 rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 708 rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
710 ++seq_no; 709 ++seq_no;
711 timestamp += kCngPeriodSamples; 710 timestamp += kCngPeriodSamples;
712 next_input_time_ms += kCngPeriodMs * drift_factor; 711 next_input_time_ms += kCngPeriodMs * drift_factor;
713 } 712 }
714 } 713 }
715 714
716 // Insert speech again until output type is speech. 715 // Insert speech again until output type is speech.
717 double speech_restart_time_ms = t_ms; 716 double speech_restart_time_ms = t_ms;
718 while (out_frame_.speech_type_ != AudioFrame::kNormalSpeech) { 717 while (out_frame_.speech_type_ != AudioFrame::kNormalSpeech) {
719 // Each turn in this for loop is 10 ms. 718 // Each turn in this for loop is 10 ms.
720 while (next_input_time_ms <= t_ms) { 719 while (next_input_time_ms <= t_ms) {
721 // Insert one 30 ms speech frame. 720 // Insert one 30 ms speech frame.
722 uint8_t payload[kPayloadBytes] = {0}; 721 uint8_t payload[kPayloadBytes] = {0};
723 WebRtcRTPHeader rtp_info; 722 WebRtcRTPHeader rtp_info;
724 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 723 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
725 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 724 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
726 ++seq_no; 725 ++seq_no;
727 timestamp += kSamples; 726 timestamp += kSamples;
728 next_input_time_ms += kFrameSizeMs * drift_factor; 727 next_input_time_ms += kFrameSizeMs * drift_factor;
729 } 728 }
730 // Pull out data once. 729 // Pull out data once.
731 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 730 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
732 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 731 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
733 // Increase clock. 732 // Increase clock.
734 t_ms += 10; 733 t_ms += 10;
735 } 734 }
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
827 kDelayToleranceMs, 826 kDelayToleranceMs,
828 kMaxTimeToSpeechMs); 827 kMaxTimeToSpeechMs);
829 } 828 }
830 829
831 TEST_F(NetEqDecodingTest, UnknownPayloadType) { 830 TEST_F(NetEqDecodingTest, UnknownPayloadType) {
832 const size_t kPayloadBytes = 100; 831 const size_t kPayloadBytes = 100;
833 uint8_t payload[kPayloadBytes] = {0}; 832 uint8_t payload[kPayloadBytes] = {0};
834 WebRtcRTPHeader rtp_info; 833 WebRtcRTPHeader rtp_info;
835 PopulateRtpInfo(0, 0, &rtp_info); 834 PopulateRtpInfo(0, 0, &rtp_info);
836 rtp_info.header.payloadType = 1; // Not registered as a decoder. 835 rtp_info.header.payloadType = 1; // Not registered as a decoder.
837 EXPECT_EQ(NetEq::kFail, neteq_->InsertPacket(rtp_info.header, payload, 0)); 836 EXPECT_EQ(NetEq::kFail, neteq_->InsertPacket(rtp_info, payload, 0));
838 EXPECT_EQ(NetEq::kUnknownRtpPayloadType, neteq_->LastError()); 837 EXPECT_EQ(NetEq::kUnknownRtpPayloadType, neteq_->LastError());
839 } 838 }
840 839
841 #if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX) 840 #if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
842 #define MAYBE_DecoderError DecoderError 841 #define MAYBE_DecoderError DecoderError
843 #else 842 #else
844 #define MAYBE_DecoderError DISABLED_DecoderError 843 #define MAYBE_DecoderError DISABLED_DecoderError
845 #endif 844 #endif
846 845
847 TEST_F(NetEqDecodingTest, MAYBE_DecoderError) { 846 TEST_F(NetEqDecodingTest, MAYBE_DecoderError) {
848 const size_t kPayloadBytes = 100; 847 const size_t kPayloadBytes = 100;
849 uint8_t payload[kPayloadBytes] = {0}; 848 uint8_t payload[kPayloadBytes] = {0};
850 WebRtcRTPHeader rtp_info; 849 WebRtcRTPHeader rtp_info;
851 PopulateRtpInfo(0, 0, &rtp_info); 850 PopulateRtpInfo(0, 0, &rtp_info);
852 rtp_info.header.payloadType = 103; // iSAC, but the payload is invalid. 851 rtp_info.header.payloadType = 103; // iSAC, but the payload is invalid.
853 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 852 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
854 // Set all of |out_data_| to 1, and verify that it was set to 0 by the call 853 // Set all of |out_data_| to 1, and verify that it was set to 0 by the call
855 // to GetAudio. 854 // to GetAudio.
856 for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; ++i) { 855 for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; ++i) {
857 out_frame_.data_[i] = 1; 856 out_frame_.data_[i] = 1;
858 } 857 }
859 bool muted; 858 bool muted;
860 EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(&out_frame_, &muted)); 859 EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(&out_frame_, &muted));
861 ASSERT_FALSE(muted); 860 ASSERT_FALSE(muted);
862 // Verify that there is a decoder error to check. 861 // Verify that there is a decoder error to check.
863 EXPECT_EQ(NetEq::kDecoderErrorCode, neteq_->LastError()); 862 EXPECT_EQ(NetEq::kDecoderErrorCode, neteq_->LastError());
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
950 949
951 uint32_t receive_timestamp = 0; 950 uint32_t receive_timestamp = 0;
952 bool muted; 951 bool muted;
953 for (int n = 0; n < 10; ++n) { // Insert few packets and get audio. 952 for (int n = 0; n < 10; ++n) { // Insert few packets and get audio.
954 auto block = input.GetNextBlock(); 953 auto block = input.GetNextBlock();
955 ASSERT_EQ(expected_samples_per_channel, block.size()); 954 ASSERT_EQ(expected_samples_per_channel, block.size());
956 size_t enc_len_bytes = 955 size_t enc_len_bytes =
957 WebRtcPcm16b_Encode(block.data(), block.size(), payload); 956 WebRtcPcm16b_Encode(block.data(), block.size(), payload);
958 ASSERT_EQ(enc_len_bytes, expected_samples_per_channel * 2); 957 ASSERT_EQ(enc_len_bytes, expected_samples_per_channel * 2);
959 958
960 ASSERT_EQ(0, neteq_->InsertPacket( 959 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, rtc::ArrayView<const uint8_t>(
961 rtp_info.header, 960 payload, enc_len_bytes),
962 rtc::ArrayView<const uint8_t>(payload, enc_len_bytes), 961 receive_timestamp));
963 receive_timestamp));
964 output.Reset(); 962 output.Reset();
965 ASSERT_EQ(0, neteq_->GetAudio(&output, &muted)); 963 ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
966 ASSERT_EQ(1u, output.num_channels_); 964 ASSERT_EQ(1u, output.num_channels_);
967 ASSERT_EQ(expected_samples_per_channel, output.samples_per_channel_); 965 ASSERT_EQ(expected_samples_per_channel, output.samples_per_channel_);
968 ASSERT_EQ(AudioFrame::kNormalSpeech, output.speech_type_); 966 ASSERT_EQ(AudioFrame::kNormalSpeech, output.speech_type_);
969 967
970 // Next packet. 968 // Next packet.
971 rtp_info.header.timestamp += expected_samples_per_channel; 969 rtp_info.header.timestamp += expected_samples_per_channel;
972 rtp_info.header.sequenceNumber++; 970 rtp_info.header.sequenceNumber++;
973 receive_timestamp += expected_samples_per_channel; 971 receive_timestamp += expected_samples_per_channel;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1087 bool seq_no_wrapped = false; 1085 bool seq_no_wrapped = false;
1088 for (double t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) { 1086 for (double t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) {
1089 // Each turn in this for loop is 10 ms. 1087 // Each turn in this for loop is 10 ms.
1090 while (next_input_time_ms <= t_ms) { 1088 while (next_input_time_ms <= t_ms) {
1091 // Insert one 30 ms speech frame. 1089 // Insert one 30 ms speech frame.
1092 uint8_t payload[kPayloadBytes] = {0}; 1090 uint8_t payload[kPayloadBytes] = {0};
1093 WebRtcRTPHeader rtp_info; 1091 WebRtcRTPHeader rtp_info;
1094 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 1092 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
1095 if (drop_seq_numbers.find(seq_no) == drop_seq_numbers.end()) { 1093 if (drop_seq_numbers.find(seq_no) == drop_seq_numbers.end()) {
1096 // This sequence number was not in the set to drop. Insert it. 1094 // This sequence number was not in the set to drop. Insert it.
1097 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 1095 ASSERT_EQ(0,
1098 receive_timestamp)); 1096 neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
1099 ++packets_inserted; 1097 ++packets_inserted;
1100 } 1098 }
1101 NetEqNetworkStatistics network_stats; 1099 NetEqNetworkStatistics network_stats;
1102 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats)); 1100 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
1103 1101
1104 // Due to internal NetEq logic, preferred buffer-size is about 4 times the 1102 // Due to internal NetEq logic, preferred buffer-size is about 4 times the
1105 // packet size for first few packets. Therefore we refrain from checking 1103 // packet size for first few packets. Therefore we refrain from checking
1106 // the criteria. 1104 // the criteria.
1107 if (packets_inserted > 4) { 1105 if (packets_inserted > 4) {
1108 // Expect preferred and actual buffer size to be no more than 2 frames. 1106 // Expect preferred and actual buffer size to be no more than 2 frames.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1176 1174
1177 const int algorithmic_delay_samples = std::max( 1175 const int algorithmic_delay_samples = std::max(
1178 algorithmic_delay_ms_ * kSampleRateKhz, 5 * kSampleRateKhz / 8); 1176 algorithmic_delay_ms_ * kSampleRateKhz, 5 * kSampleRateKhz / 8);
1179 // Insert three speech packets. Three are needed to get the frame length 1177 // Insert three speech packets. Three are needed to get the frame length
1180 // correct. 1178 // correct.
1181 uint8_t payload[kPayloadBytes] = {0}; 1179 uint8_t payload[kPayloadBytes] = {0};
1182 WebRtcRTPHeader rtp_info; 1180 WebRtcRTPHeader rtp_info;
1183 bool muted; 1181 bool muted;
1184 for (int i = 0; i < 3; ++i) { 1182 for (int i = 0; i < 3; ++i) {
1185 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 1183 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
1186 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 1184 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1187 ++seq_no; 1185 ++seq_no;
1188 timestamp += kSamples; 1186 timestamp += kSamples;
1189 1187
1190 // Pull audio once. 1188 // Pull audio once.
1191 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 1189 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
1192 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 1190 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1193 } 1191 }
1194 // Verify speech output. 1192 // Verify speech output.
1195 EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_); 1193 EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_);
1196 1194
1197 // Insert same CNG packet twice. 1195 // Insert same CNG packet twice.
1198 const int kCngPeriodMs = 100; 1196 const int kCngPeriodMs = 100;
1199 const int kCngPeriodSamples = kCngPeriodMs * kSampleRateKhz; 1197 const int kCngPeriodSamples = kCngPeriodMs * kSampleRateKhz;
1200 size_t payload_len; 1198 size_t payload_len;
1201 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len); 1199 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
1202 // This is the first time this CNG packet is inserted. 1200 // This is the first time this CNG packet is inserted.
1203 ASSERT_EQ(0, neteq_->InsertPacket( 1201 ASSERT_EQ(
1204 rtp_info.header, 1202 0, neteq_->InsertPacket(
1205 rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 1203 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
1206 1204
1207 // Pull audio once and make sure CNG is played. 1205 // Pull audio once and make sure CNG is played.
1208 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 1206 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
1209 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 1207 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1210 EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_); 1208 EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
1211 EXPECT_FALSE(PlayoutTimestamp()); // Returns empty value during CNG. 1209 EXPECT_FALSE(PlayoutTimestamp()); // Returns empty value during CNG.
1212 EXPECT_EQ(timestamp - algorithmic_delay_samples, 1210 EXPECT_EQ(timestamp - algorithmic_delay_samples,
1213 out_frame_.timestamp_ + out_frame_.samples_per_channel_); 1211 out_frame_.timestamp_ + out_frame_.samples_per_channel_);
1214 1212
1215 // Insert the same CNG packet again. Note that at this point it is old, since 1213 // Insert the same CNG packet again. Note that at this point it is old, since
1216 // we have already decoded the first copy of it. 1214 // we have already decoded the first copy of it.
1217 ASSERT_EQ(0, neteq_->InsertPacket( 1215 ASSERT_EQ(
1218 rtp_info.header, 1216 0, neteq_->InsertPacket(
1219 rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 1217 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
1220 1218
1221 // Pull audio until we have played |kCngPeriodMs| of CNG. Start at 10 ms since 1219 // Pull audio until we have played |kCngPeriodMs| of CNG. Start at 10 ms since
1222 // we have already pulled out CNG once. 1220 // we have already pulled out CNG once.
1223 for (int cng_time_ms = 10; cng_time_ms < kCngPeriodMs; cng_time_ms += 10) { 1221 for (int cng_time_ms = 10; cng_time_ms < kCngPeriodMs; cng_time_ms += 10) {
1224 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 1222 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
1225 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 1223 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1226 EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_); 1224 EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
1227 EXPECT_FALSE(PlayoutTimestamp()); // Returns empty value during CNG. 1225 EXPECT_FALSE(PlayoutTimestamp()); // Returns empty value during CNG.
1228 EXPECT_EQ(timestamp - algorithmic_delay_samples, 1226 EXPECT_EQ(timestamp - algorithmic_delay_samples,
1229 out_frame_.timestamp_ + out_frame_.samples_per_channel_); 1227 out_frame_.timestamp_ + out_frame_.samples_per_channel_);
1230 } 1228 }
1231 1229
1232 // Insert speech again. 1230 // Insert speech again.
1233 ++seq_no; 1231 ++seq_no;
1234 timestamp += kCngPeriodSamples; 1232 timestamp += kCngPeriodSamples;
1235 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 1233 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
1236 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 1234 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1237 1235
1238 // Pull audio once and verify that the output is speech again. 1236 // Pull audio once and verify that the output is speech again.
1239 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 1237 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
1240 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 1238 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1241 EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_); 1239 EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_);
1242 rtc::Optional<uint32_t> playout_timestamp = PlayoutTimestamp(); 1240 rtc::Optional<uint32_t> playout_timestamp = PlayoutTimestamp();
1243 ASSERT_TRUE(playout_timestamp); 1241 ASSERT_TRUE(playout_timestamp);
1244 EXPECT_EQ(timestamp + kSamples - algorithmic_delay_samples, 1242 EXPECT_EQ(timestamp + kSamples - algorithmic_delay_samples,
1245 *playout_timestamp); 1243 *playout_timestamp);
1246 } 1244 }
(...skipping 12 matching lines...) Expand all
1259 const int kSamples = kFrameSizeMs * kSampleRateKhz; 1257 const int kSamples = kFrameSizeMs * kSampleRateKhz;
1260 const int kPayloadBytes = kSamples * 2; 1258 const int kPayloadBytes = kSamples * 2;
1261 const int kCngPeriodMs = 100; 1259 const int kCngPeriodMs = 100;
1262 const int kCngPeriodSamples = kCngPeriodMs * kSampleRateKhz; 1260 const int kCngPeriodSamples = kCngPeriodMs * kSampleRateKhz;
1263 size_t payload_len; 1261 size_t payload_len;
1264 1262
1265 uint8_t payload[kPayloadBytes] = {0}; 1263 uint8_t payload[kPayloadBytes] = {0};
1266 WebRtcRTPHeader rtp_info; 1264 WebRtcRTPHeader rtp_info;
1267 1265
1268 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len); 1266 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
1269 ASSERT_EQ(NetEq::kOK, 1267 ASSERT_EQ(
1270 neteq_->InsertPacket( 1268 NetEq::kOK,
1271 rtp_info.header, 1269 neteq_->InsertPacket(
1272 rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 1270 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
1273 ++seq_no; 1271 ++seq_no;
1274 timestamp += kCngPeriodSamples; 1272 timestamp += kCngPeriodSamples;
1275 1273
1276 // Pull audio once and make sure CNG is played. 1274 // Pull audio once and make sure CNG is played.
1277 bool muted; 1275 bool muted;
1278 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 1276 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
1279 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 1277 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1280 EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_); 1278 EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
1281 1279
1282 // Insert some speech packets. 1280 // Insert some speech packets.
1283 const uint32_t first_speech_timestamp = timestamp; 1281 const uint32_t first_speech_timestamp = timestamp;
1284 int timeout_counter = 0; 1282 int timeout_counter = 0;
1285 do { 1283 do {
1286 ASSERT_LT(timeout_counter++, 20) << "Test timed out"; 1284 ASSERT_LT(timeout_counter++, 20) << "Test timed out";
1287 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 1285 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
1288 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 1286 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1289 ++seq_no; 1287 ++seq_no;
1290 timestamp += kSamples; 1288 timestamp += kSamples;
1291 1289
1292 // Pull audio once. 1290 // Pull audio once.
1293 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 1291 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
1294 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); 1292 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1295 } while (!IsNewerTimestamp(out_frame_.timestamp_, first_speech_timestamp)); 1293 } while (!IsNewerTimestamp(out_frame_.timestamp_, first_speech_timestamp));
1296 // Verify speech output. 1294 // Verify speech output.
1297 EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_); 1295 EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_);
1298 } 1296 }
1299 1297
1300 class NetEqDecodingTestWithMutedState : public NetEqDecodingTest { 1298 class NetEqDecodingTestWithMutedState : public NetEqDecodingTest {
1301 public: 1299 public:
1302 NetEqDecodingTestWithMutedState() : NetEqDecodingTest() { 1300 NetEqDecodingTestWithMutedState() : NetEqDecodingTest() {
1303 config_.enable_muted_state = true; 1301 config_.enable_muted_state = true;
1304 } 1302 }
1305 1303
1306 protected: 1304 protected:
1307 static constexpr size_t kSamples = 10 * 16; 1305 static constexpr size_t kSamples = 10 * 16;
1308 static constexpr size_t kPayloadBytes = kSamples * 2; 1306 static constexpr size_t kPayloadBytes = kSamples * 2;
1309 1307
1310 void InsertPacket(uint32_t rtp_timestamp) { 1308 void InsertPacket(uint32_t rtp_timestamp) {
1311 uint8_t payload[kPayloadBytes] = {0}; 1309 uint8_t payload[kPayloadBytes] = {0};
1312 WebRtcRTPHeader rtp_info; 1310 WebRtcRTPHeader rtp_info;
1313 PopulateRtpInfo(0, rtp_timestamp, &rtp_info); 1311 PopulateRtpInfo(0, rtp_timestamp, &rtp_info);
1314 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 1312 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1315 } 1313 }
1316 1314
1317 void InsertCngPacket(uint32_t rtp_timestamp) { 1315 void InsertCngPacket(uint32_t rtp_timestamp) {
1318 uint8_t payload[kPayloadBytes] = {0}; 1316 uint8_t payload[kPayloadBytes] = {0};
1319 WebRtcRTPHeader rtp_info; 1317 WebRtcRTPHeader rtp_info;
1320 size_t payload_len; 1318 size_t payload_len;
1321 PopulateCng(0, rtp_timestamp, &rtp_info, payload, &payload_len); 1319 PopulateCng(0, rtp_timestamp, &rtp_info, payload, &payload_len);
1322 EXPECT_EQ(NetEq::kOK, 1320 EXPECT_EQ(
1323 neteq_->InsertPacket( 1321 NetEq::kOK,
1324 rtp_info.header, 1322 neteq_->InsertPacket(
1325 rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 1323 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
1326 } 1324 }
1327 1325
1328 bool GetAudioReturnMuted() { 1326 bool GetAudioReturnMuted() {
1329 bool muted; 1327 bool muted;
1330 EXPECT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); 1328 EXPECT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
1331 return muted; 1329 return muted;
1332 } 1330 }
1333 1331
1334 void GetAudioUntilMuted() { 1332 void GetAudioUntilMuted() {
1335 while (!GetAudioReturnMuted()) { 1333 while (!GetAudioReturnMuted()) {
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
1540 ASSERT_FALSE(config_.enable_muted_state); 1538 ASSERT_FALSE(config_.enable_muted_state);
1541 config2_.enable_muted_state = true; 1539 config2_.enable_muted_state = true;
1542 CreateSecondInstance(); 1540 CreateSecondInstance();
1543 1541
1544 // Insert one speech packet into both NetEqs. 1542 // Insert one speech packet into both NetEqs.
1545 const size_t kSamples = 10 * 16; 1543 const size_t kSamples = 10 * 16;
1546 const size_t kPayloadBytes = kSamples * 2; 1544 const size_t kPayloadBytes = kSamples * 2;
1547 uint8_t payload[kPayloadBytes] = {0}; 1545 uint8_t payload[kPayloadBytes] = {0};
1548 WebRtcRTPHeader rtp_info; 1546 WebRtcRTPHeader rtp_info;
1549 PopulateRtpInfo(0, 0, &rtp_info); 1547 PopulateRtpInfo(0, 0, &rtp_info);
1550 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 1548 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1551 EXPECT_EQ(0, neteq2_->InsertPacket(rtp_info.header, payload, 0)); 1549 EXPECT_EQ(0, neteq2_->InsertPacket(rtp_info, payload, 0));
1552 1550
1553 AudioFrame out_frame1, out_frame2; 1551 AudioFrame out_frame1, out_frame2;
1554 bool muted; 1552 bool muted;
1555 for (int i = 0; i < 1000; ++i) { 1553 for (int i = 0; i < 1000; ++i) {
1556 std::ostringstream ss; 1554 std::ostringstream ss;
1557 ss << "i = " << i; 1555 ss << "i = " << i;
1558 SCOPED_TRACE(ss.str()); // Print out the loop iterator on failure. 1556 SCOPED_TRACE(ss.str()); // Print out the loop iterator on failure.
1559 EXPECT_EQ(0, neteq_->GetAudio(&out_frame1, &muted)); 1557 EXPECT_EQ(0, neteq_->GetAudio(&out_frame1, &muted));
1560 EXPECT_FALSE(muted); 1558 EXPECT_FALSE(muted);
1561 EXPECT_EQ(0, neteq2_->GetAudio(&out_frame2, &muted)); 1559 EXPECT_EQ(0, neteq2_->GetAudio(&out_frame2, &muted));
1562 if (muted) { 1560 if (muted) {
1563 EXPECT_TRUE(AudioFramesEqualExceptData(out_frame1, out_frame2)); 1561 EXPECT_TRUE(AudioFramesEqualExceptData(out_frame1, out_frame2));
1564 } else { 1562 } else {
1565 EXPECT_TRUE(AudioFramesEqual(out_frame1, out_frame2)); 1563 EXPECT_TRUE(AudioFramesEqual(out_frame1, out_frame2));
1566 } 1564 }
1567 } 1565 }
1568 EXPECT_TRUE(muted); 1566 EXPECT_TRUE(muted);
1569 1567
1570 // Insert new data. Timestamp is corrected for the time elapsed since the last 1568 // Insert new data. Timestamp is corrected for the time elapsed since the last
1571 // packet. 1569 // packet.
1572 PopulateRtpInfo(0, kSamples * 1000, &rtp_info); 1570 PopulateRtpInfo(0, kSamples * 1000, &rtp_info);
1573 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info.header, payload, 0)); 1571 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1574 EXPECT_EQ(0, neteq2_->InsertPacket(rtp_info.header, payload, 0)); 1572 EXPECT_EQ(0, neteq2_->InsertPacket(rtp_info, payload, 0));
1575 1573
1576 int counter = 0; 1574 int counter = 0;
1577 while (out_frame1.speech_type_ != AudioFrame::kNormalSpeech) { 1575 while (out_frame1.speech_type_ != AudioFrame::kNormalSpeech) {
1578 ASSERT_LT(counter++, 1000) << "Test timed out"; 1576 ASSERT_LT(counter++, 1000) << "Test timed out";
1579 std::ostringstream ss; 1577 std::ostringstream ss;
1580 ss << "counter = " << counter; 1578 ss << "counter = " << counter;
1581 SCOPED_TRACE(ss.str()); // Print out the loop iterator on failure. 1579 SCOPED_TRACE(ss.str()); // Print out the loop iterator on failure.
1582 EXPECT_EQ(0, neteq_->GetAudio(&out_frame1, &muted)); 1580 EXPECT_EQ(0, neteq_->GetAudio(&out_frame1, &muted));
1583 EXPECT_FALSE(muted); 1581 EXPECT_FALSE(muted);
1584 EXPECT_EQ(0, neteq2_->GetAudio(&out_frame2, &muted)); 1582 EXPECT_EQ(0, neteq2_->GetAudio(&out_frame2, &muted));
1585 if (muted) { 1583 if (muted) {
1586 EXPECT_TRUE(AudioFramesEqualExceptData(out_frame1, out_frame2)); 1584 EXPECT_TRUE(AudioFramesEqualExceptData(out_frame1, out_frame2));
1587 } else { 1585 } else {
1588 EXPECT_TRUE(AudioFramesEqual(out_frame1, out_frame2)); 1586 EXPECT_TRUE(AudioFramesEqual(out_frame1, out_frame2));
1589 } 1587 }
1590 } 1588 }
1591 EXPECT_FALSE(muted); 1589 EXPECT_FALSE(muted);
1592 } 1590 }
1593 1591
1594 } // namespace webrtc 1592 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698