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

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

Issue 1316523002: Convert channel counts to size_t. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Fix compile Created 4 years, 11 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 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 packet_->payload(), packet_->payload_length_bytes()), 418 packet_->payload(), packet_->payload_length_bytes()),
419 static_cast<uint32_t>(packet_->time_ms() * 419 static_cast<uint32_t>(packet_->time_ms() *
420 (output_sample_rate_ / 1000)))); 420 (output_sample_rate_ / 1000))));
421 } 421 }
422 // Get next packet. 422 // Get next packet.
423 packet_.reset(rtp_source_->NextPacket()); 423 packet_.reset(rtp_source_->NextPacket());
424 } 424 }
425 425
426 // Get audio from NetEq. 426 // Get audio from NetEq.
427 NetEqOutputType type; 427 NetEqOutputType type;
428 int num_channels; 428 size_t num_channels;
429 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, out_len, 429 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, out_len,
430 &num_channels, &type)); 430 &num_channels, &type));
431 ASSERT_TRUE((*out_len == kBlockSize8kHz) || 431 ASSERT_TRUE((*out_len == kBlockSize8kHz) ||
432 (*out_len == kBlockSize16kHz) || 432 (*out_len == kBlockSize16kHz) ||
433 (*out_len == kBlockSize32kHz) || 433 (*out_len == kBlockSize32kHz) ||
434 (*out_len == kBlockSize48kHz)); 434 (*out_len == kBlockSize48kHz));
435 output_sample_rate_ = static_cast<int>(*out_len / 10 * 1000); 435 output_sample_rate_ = static_cast<int>(*out_len / 10 * 1000);
436 EXPECT_EQ(output_sample_rate_, neteq_->last_output_sample_rate_hz()); 436 EXPECT_EQ(output_sample_rate_, neteq_->last_output_sample_rate_hz());
437 437
438 // Increase time. 438 // Increase time.
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 rtp_info.header.sequenceNumber = i; 601 rtp_info.header.sequenceNumber = i;
602 rtp_info.header.timestamp = i * kSamples; 602 rtp_info.header.timestamp = i * kSamples;
603 rtp_info.header.ssrc = 0x1234; // Just an arbitrary SSRC. 603 rtp_info.header.ssrc = 0x1234; // Just an arbitrary SSRC.
604 rtp_info.header.payloadType = 94; // PCM16b WB codec. 604 rtp_info.header.payloadType = 94; // PCM16b WB codec.
605 rtp_info.header.markerBit = 0; 605 rtp_info.header.markerBit = 0;
606 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 606 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
607 } 607 }
608 // Pull out all data. 608 // Pull out all data.
609 for (size_t i = 0; i < num_frames; ++i) { 609 for (size_t i = 0; i < num_frames; ++i) {
610 size_t out_len; 610 size_t out_len;
611 int num_channels; 611 size_t num_channels;
612 NetEqOutputType type; 612 NetEqOutputType type;
613 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 613 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len,
614 &num_channels, &type)); 614 &num_channels, &type));
615 ASSERT_EQ(kBlockSize16kHz, out_len); 615 ASSERT_EQ(kBlockSize16kHz, out_len);
616 } 616 }
617 617
618 NetEqNetworkStatistics stats; 618 NetEqNetworkStatistics stats;
619 EXPECT_EQ(0, neteq_->NetworkStatistics(&stats)); 619 EXPECT_EQ(0, neteq_->NetworkStatistics(&stats));
620 // Since all frames are dumped into NetEQ at once, but pulled out with 10 ms 620 // Since all frames are dumped into NetEQ at once, but pulled out with 10 ms
621 // spacing (per definition), we expect the delay to increase with 10 ms for 621 // spacing (per definition), we expect the delay to increase with 10 ms for
(...skipping 24 matching lines...) Expand all
646 for (int n = 0; n < num_packets; ++n) { 646 for (int n = 0; n < num_packets; ++n) {
647 uint8_t payload[kPayloadBytes] = {0}; 647 uint8_t payload[kPayloadBytes] = {0};
648 WebRtcRTPHeader rtp_info; 648 WebRtcRTPHeader rtp_info;
649 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info); 649 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info);
650 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 650 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
651 ++frame_index; 651 ++frame_index;
652 } 652 }
653 653
654 // Pull out data once. 654 // Pull out data once.
655 size_t out_len; 655 size_t out_len;
656 int num_channels; 656 size_t num_channels;
657 NetEqOutputType type; 657 NetEqOutputType type;
658 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 658 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len,
659 &num_channels, &type)); 659 &num_channels, &type));
660 ASSERT_EQ(kBlockSize16kHz, out_len); 660 ASSERT_EQ(kBlockSize16kHz, out_len);
661 } 661 }
662 662
663 NetEqNetworkStatistics network_stats; 663 NetEqNetworkStatistics network_stats;
664 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats)); 664 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
665 EXPECT_EQ(-103196, network_stats.clockdrift_ppm); 665 EXPECT_EQ(-103196, network_stats.clockdrift_ppm);
666 } 666 }
(...skipping 10 matching lines...) Expand all
677 for (int n = 0; n < num_packets; ++n) { 677 for (int n = 0; n < num_packets; ++n) {
678 uint8_t payload[kPayloadBytes] = {0}; 678 uint8_t payload[kPayloadBytes] = {0};
679 WebRtcRTPHeader rtp_info; 679 WebRtcRTPHeader rtp_info;
680 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info); 680 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info);
681 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 681 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
682 ++frame_index; 682 ++frame_index;
683 } 683 }
684 684
685 // Pull out data once. 685 // Pull out data once.
686 size_t out_len; 686 size_t out_len;
687 int num_channels; 687 size_t num_channels;
688 NetEqOutputType type; 688 NetEqOutputType type;
689 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 689 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len,
690 &num_channels, &type)); 690 &num_channels, &type));
691 ASSERT_EQ(kBlockSize16kHz, out_len); 691 ASSERT_EQ(kBlockSize16kHz, out_len);
692 } 692 }
693 693
694 NetEqNetworkStatistics network_stats; 694 NetEqNetworkStatistics network_stats;
695 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats)); 695 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
696 EXPECT_EQ(110946, network_stats.clockdrift_ppm); 696 EXPECT_EQ(110946, network_stats.clockdrift_ppm);
697 } 697 }
698 698
699 void NetEqDecodingTest::LongCngWithClockDrift(double drift_factor, 699 void NetEqDecodingTest::LongCngWithClockDrift(double drift_factor,
700 double network_freeze_ms, 700 double network_freeze_ms,
701 bool pull_audio_during_freeze, 701 bool pull_audio_during_freeze,
702 int delay_tolerance_ms, 702 int delay_tolerance_ms,
703 int max_time_to_speech_ms) { 703 int max_time_to_speech_ms) {
704 uint16_t seq_no = 0; 704 uint16_t seq_no = 0;
705 uint32_t timestamp = 0; 705 uint32_t timestamp = 0;
706 const int kFrameSizeMs = 30; 706 const int kFrameSizeMs = 30;
707 const size_t kSamples = kFrameSizeMs * 16; 707 const size_t kSamples = kFrameSizeMs * 16;
708 const size_t kPayloadBytes = kSamples * 2; 708 const size_t kPayloadBytes = kSamples * 2;
709 double next_input_time_ms = 0.0; 709 double next_input_time_ms = 0.0;
710 double t_ms; 710 double t_ms;
711 size_t out_len; 711 size_t out_len;
712 int num_channels; 712 size_t num_channels;
713 NetEqOutputType type; 713 NetEqOutputType type;
714 714
715 // Insert speech for 5 seconds. 715 // Insert speech for 5 seconds.
716 const int kSpeechDurationMs = 5000; 716 const int kSpeechDurationMs = 5000;
717 for (t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) { 717 for (t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) {
718 // Each turn in this for loop is 10 ms. 718 // Each turn in this for loop is 10 ms.
719 while (next_input_time_ms <= t_ms) { 719 while (next_input_time_ms <= t_ms) {
720 // Insert one 30 ms speech frame. 720 // Insert one 30 ms speech frame.
721 uint8_t payload[kPayloadBytes] = {0}; 721 uint8_t payload[kPayloadBytes] = {0};
722 WebRtcRTPHeader rtp_info; 722 WebRtcRTPHeader rtp_info;
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 WebRtcRTPHeader rtp_info; 941 WebRtcRTPHeader rtp_info;
942 PopulateRtpInfo(0, 0, &rtp_info); 942 PopulateRtpInfo(0, 0, &rtp_info);
943 rtp_info.header.payloadType = 103; // iSAC, but the payload is invalid. 943 rtp_info.header.payloadType = 103; // iSAC, but the payload is invalid.
944 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 944 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
945 NetEqOutputType type; 945 NetEqOutputType type;
946 // Set all of |out_data_| to 1, and verify that it was set to 0 by the call 946 // Set all of |out_data_| to 1, and verify that it was set to 0 by the call
947 // to GetAudio. 947 // to GetAudio.
948 for (size_t i = 0; i < kMaxBlockSize; ++i) { 948 for (size_t i = 0; i < kMaxBlockSize; ++i) {
949 out_data_[i] = 1; 949 out_data_[i] = 1;
950 } 950 }
951 int num_channels; 951 size_t num_channels;
952 size_t samples_per_channel; 952 size_t samples_per_channel;
953 EXPECT_EQ(NetEq::kFail, 953 EXPECT_EQ(NetEq::kFail,
954 neteq_->GetAudio(kMaxBlockSize, out_data_, 954 neteq_->GetAudio(kMaxBlockSize, out_data_,
955 &samples_per_channel, &num_channels, &type)); 955 &samples_per_channel, &num_channels, &type));
956 // Verify that there is a decoder error to check. 956 // Verify that there is a decoder error to check.
957 EXPECT_EQ(NetEq::kDecoderErrorCode, neteq_->LastError()); 957 EXPECT_EQ(NetEq::kDecoderErrorCode, neteq_->LastError());
958 // Code 6730 is an iSAC error code. 958 // Code 6730 is an iSAC error code.
959 EXPECT_EQ(6730, neteq_->LastDecoderError()); 959 EXPECT_EQ(6730, neteq_->LastDecoderError());
960 // Verify that the first 160 samples are set to 0, and that the remaining 960 // Verify that the first 160 samples are set to 0, and that the remaining
961 // samples are left unmodified. 961 // samples are left unmodified.
(...skipping 13 matching lines...) Expand all
975 } 975 }
976 #endif 976 #endif
977 977
978 TEST_F(NetEqDecodingTest, GetAudioBeforeInsertPacket) { 978 TEST_F(NetEqDecodingTest, GetAudioBeforeInsertPacket) {
979 NetEqOutputType type; 979 NetEqOutputType type;
980 // Set all of |out_data_| to 1, and verify that it was set to 0 by the call 980 // Set all of |out_data_| to 1, and verify that it was set to 0 by the call
981 // to GetAudio. 981 // to GetAudio.
982 for (size_t i = 0; i < kMaxBlockSize; ++i) { 982 for (size_t i = 0; i < kMaxBlockSize; ++i) {
983 out_data_[i] = 1; 983 out_data_[i] = 1;
984 } 984 }
985 int num_channels; 985 size_t num_channels;
986 size_t samples_per_channel; 986 size_t samples_per_channel;
987 EXPECT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, 987 EXPECT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_,
988 &samples_per_channel, 988 &samples_per_channel,
989 &num_channels, &type)); 989 &num_channels, &type));
990 // Verify that the first block of samples is set to 0. 990 // Verify that the first block of samples is set to 0.
991 static const int kExpectedOutputLength = 991 static const int kExpectedOutputLength =
992 kInitSampleRateHz / 100; // 10 ms at initial sample rate. 992 kInitSampleRateHz / 100; // 10 ms at initial sample rate.
993 for (int i = 0; i < kExpectedOutputLength; ++i) { 993 for (int i = 0; i < kExpectedOutputLength; ++i) {
994 std::ostringstream ss; 994 std::ostringstream ss;
995 ss << "i = " << i; 995 ss << "i = " << i;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1031 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"), 1031 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
1032 10 * sampling_rate_hz, // Max 10 seconds loop length. 1032 10 * sampling_rate_hz, // Max 10 seconds loop length.
1033 expected_samples_per_channel)); 1033 expected_samples_per_channel));
1034 1034
1035 // Payload of 10 ms of PCM16 32 kHz. 1035 // Payload of 10 ms of PCM16 32 kHz.
1036 uint8_t payload[kBlockSize32kHz * sizeof(int16_t)]; 1036 uint8_t payload[kBlockSize32kHz * sizeof(int16_t)];
1037 WebRtcRTPHeader rtp_info; 1037 WebRtcRTPHeader rtp_info;
1038 PopulateRtpInfo(0, 0, &rtp_info); 1038 PopulateRtpInfo(0, 0, &rtp_info);
1039 rtp_info.header.payloadType = payload_type; 1039 rtp_info.header.payloadType = payload_type;
1040 1040
1041 int number_channels = 0; 1041 size_t number_channels = 0;
1042 size_t samples_per_channel = 0; 1042 size_t samples_per_channel = 0;
1043 1043
1044 uint32_t receive_timestamp = 0; 1044 uint32_t receive_timestamp = 0;
1045 for (int n = 0; n < 10; ++n) { // Insert few packets and get audio. 1045 for (int n = 0; n < 10; ++n) { // Insert few packets and get audio.
1046 auto block = input.GetNextBlock(); 1046 auto block = input.GetNextBlock();
1047 ASSERT_EQ(expected_samples_per_channel, block.size()); 1047 ASSERT_EQ(expected_samples_per_channel, block.size());
1048 size_t enc_len_bytes = 1048 size_t enc_len_bytes =
1049 WebRtcPcm16b_Encode(block.data(), block.size(), payload); 1049 WebRtcPcm16b_Encode(block.data(), block.size(), payload);
1050 ASSERT_EQ(enc_len_bytes, expected_samples_per_channel * 2); 1050 ASSERT_EQ(enc_len_bytes, expected_samples_per_channel * 2);
1051 1051
1052 number_channels = 0; 1052 number_channels = 0;
1053 samples_per_channel = 0; 1053 samples_per_channel = 0;
1054 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, rtc::ArrayView<const uint8_t>( 1054 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, rtc::ArrayView<const uint8_t>(
1055 payload, enc_len_bytes), 1055 payload, enc_len_bytes),
1056 receive_timestamp)); 1056 receive_timestamp));
1057 ASSERT_EQ(0, 1057 ASSERT_EQ(0,
1058 neteq_->GetAudio(kBlockSize32kHz, 1058 neteq_->GetAudio(kBlockSize32kHz,
1059 output, 1059 output,
1060 &samples_per_channel, 1060 &samples_per_channel,
1061 &number_channels, 1061 &number_channels,
1062 &type)); 1062 &type));
1063 ASSERT_EQ(1, number_channels); 1063 ASSERT_EQ(1u, number_channels);
1064 ASSERT_EQ(expected_samples_per_channel, samples_per_channel); 1064 ASSERT_EQ(expected_samples_per_channel, samples_per_channel);
1065 ASSERT_EQ(kOutputNormal, type); 1065 ASSERT_EQ(kOutputNormal, type);
1066 1066
1067 // Next packet. 1067 // Next packet.
1068 rtp_info.header.timestamp += expected_samples_per_channel; 1068 rtp_info.header.timestamp += expected_samples_per_channel;
1069 rtp_info.header.sequenceNumber++; 1069 rtp_info.header.sequenceNumber++;
1070 receive_timestamp += expected_samples_per_channel; 1070 receive_timestamp += expected_samples_per_channel;
1071 } 1071 }
1072 1072
1073 number_channels = 0; 1073 number_channels = 0;
1074 samples_per_channel = 0; 1074 samples_per_channel = 0;
1075 1075
1076 // Get audio without inserting packets, expecting PLC and PLC-to-CNG. Pull 1076 // Get audio without inserting packets, expecting PLC and PLC-to-CNG. Pull
1077 // one frame without checking speech-type. This is the first frame pulled 1077 // one frame without checking speech-type. This is the first frame pulled
1078 // without inserting any packet, and might not be labeled as PLC. 1078 // without inserting any packet, and might not be labeled as PLC.
1079 ASSERT_EQ(0, 1079 ASSERT_EQ(0,
1080 neteq_->GetAudio(kBlockSize32kHz, 1080 neteq_->GetAudio(kBlockSize32kHz,
1081 output, 1081 output,
1082 &samples_per_channel, 1082 &samples_per_channel,
1083 &number_channels, 1083 &number_channels,
1084 &type)); 1084 &type));
1085 ASSERT_EQ(1, number_channels); 1085 ASSERT_EQ(1u, number_channels);
1086 ASSERT_EQ(expected_samples_per_channel, samples_per_channel); 1086 ASSERT_EQ(expected_samples_per_channel, samples_per_channel);
1087 1087
1088 // To be able to test the fading of background noise we need at lease to 1088 // To be able to test the fading of background noise we need at lease to
1089 // pull 611 frames. 1089 // pull 611 frames.
1090 const int kFadingThreshold = 611; 1090 const int kFadingThreshold = 611;
1091 1091
1092 // Test several CNG-to-PLC packet for the expected behavior. The number 20 1092 // Test several CNG-to-PLC packet for the expected behavior. The number 20
1093 // is arbitrary, but sufficiently large to test enough number of frames. 1093 // is arbitrary, but sufficiently large to test enough number of frames.
1094 const int kNumPlcToCngTestFrames = 20; 1094 const int kNumPlcToCngTestFrames = 20;
1095 bool plc_to_cng = false; 1095 bool plc_to_cng = false;
1096 for (int n = 0; n < kFadingThreshold + kNumPlcToCngTestFrames; ++n) { 1096 for (int n = 0; n < kFadingThreshold + kNumPlcToCngTestFrames; ++n) {
1097 number_channels = 0; 1097 number_channels = 0;
1098 samples_per_channel = 0; 1098 samples_per_channel = 0;
1099 memset(output, 1, sizeof(output)); // Set to non-zero. 1099 memset(output, 1, sizeof(output)); // Set to non-zero.
1100 ASSERT_EQ(0, 1100 ASSERT_EQ(0,
1101 neteq_->GetAudio(kBlockSize32kHz, 1101 neteq_->GetAudio(kBlockSize32kHz,
1102 output, 1102 output,
1103 &samples_per_channel, 1103 &samples_per_channel,
1104 &number_channels, 1104 &number_channels,
1105 &type)); 1105 &type));
1106 ASSERT_EQ(1, number_channels); 1106 ASSERT_EQ(1u, number_channels);
1107 ASSERT_EQ(expected_samples_per_channel, samples_per_channel); 1107 ASSERT_EQ(expected_samples_per_channel, samples_per_channel);
1108 if (type == kOutputPLCtoCNG) { 1108 if (type == kOutputPLCtoCNG) {
1109 plc_to_cng = true; 1109 plc_to_cng = true;
1110 double sum_squared = 0; 1110 double sum_squared = 0;
1111 for (size_t k = 0; k < number_channels * samples_per_channel; ++k) 1111 for (size_t k = 0; k < number_channels * samples_per_channel; ++k)
1112 sum_squared += output[k] * output[k]; 1112 sum_squared += output[k] * output[k];
1113 TestCondition(sum_squared, n > kFadingThreshold); 1113 TestCondition(sum_squared, n > kFadingThreshold);
1114 } else { 1114 } else {
1115 EXPECT_EQ(kOutputPLC, type); 1115 EXPECT_EQ(kOutputPLC, type);
1116 } 1116 }
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t); 1265 const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t);
1266 uint8_t payload[kPayloadBytes]; 1266 uint8_t payload[kPayloadBytes];
1267 int16_t decoded[kBlockSize16kHz]; 1267 int16_t decoded[kBlockSize16kHz];
1268 int algorithmic_frame_delay = algorithmic_delay_ms_ / 10 + 1; 1268 int algorithmic_frame_delay = algorithmic_delay_ms_ / 10 + 1;
1269 for (size_t n = 0; n < kPayloadBytes; ++n) { 1269 for (size_t n = 0; n < kPayloadBytes; ++n) {
1270 payload[n] = (rand() & 0xF0) + 1; // Non-zero random sequence. 1270 payload[n] = (rand() & 0xF0) + 1; // Non-zero random sequence.
1271 } 1271 }
1272 // Insert some packets which decode to noise. We are not interested in 1272 // Insert some packets which decode to noise. We are not interested in
1273 // actual decoded values. 1273 // actual decoded values.
1274 NetEqOutputType output_type; 1274 NetEqOutputType output_type;
1275 int num_channels; 1275 size_t num_channels;
1276 size_t samples_per_channel; 1276 size_t samples_per_channel;
1277 uint32_t receive_timestamp = 0; 1277 uint32_t receive_timestamp = 0;
1278 for (int n = 0; n < 100; ++n) { 1278 for (int n = 0; n < 100; ++n) {
1279 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp)); 1279 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
1280 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1280 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded,
1281 &samples_per_channel, &num_channels, 1281 &samples_per_channel, &num_channels,
1282 &output_type)); 1282 &output_type));
1283 ASSERT_EQ(kBlockSize16kHz, samples_per_channel); 1283 ASSERT_EQ(kBlockSize16kHz, samples_per_channel);
1284 ASSERT_EQ(1, num_channels); 1284 ASSERT_EQ(1u, num_channels);
1285 1285
1286 rtp_info.header.sequenceNumber++; 1286 rtp_info.header.sequenceNumber++;
1287 rtp_info.header.timestamp += kBlockSize16kHz; 1287 rtp_info.header.timestamp += kBlockSize16kHz;
1288 receive_timestamp += kBlockSize16kHz; 1288 receive_timestamp += kBlockSize16kHz;
1289 } 1289 }
1290 const int kNumSyncPackets = 10; 1290 const int kNumSyncPackets = 10;
1291 1291
1292 // Make sure sufficient number of sync packets are inserted that we can 1292 // Make sure sufficient number of sync packets are inserted that we can
1293 // conduct a test. 1293 // conduct a test.
1294 ASSERT_GT(kNumSyncPackets, algorithmic_frame_delay); 1294 ASSERT_GT(kNumSyncPackets, algorithmic_frame_delay);
1295 // Insert sync-packets, the decoded sequence should be all-zero. 1295 // Insert sync-packets, the decoded sequence should be all-zero.
1296 for (int n = 0; n < kNumSyncPackets; ++n) { 1296 for (int n = 0; n < kNumSyncPackets; ++n) {
1297 ASSERT_EQ(0, neteq_->InsertSyncPacket(rtp_info, receive_timestamp)); 1297 ASSERT_EQ(0, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
1298 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1298 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded,
1299 &samples_per_channel, &num_channels, 1299 &samples_per_channel, &num_channels,
1300 &output_type)); 1300 &output_type));
1301 ASSERT_EQ(kBlockSize16kHz, samples_per_channel); 1301 ASSERT_EQ(kBlockSize16kHz, samples_per_channel);
1302 ASSERT_EQ(1, num_channels); 1302 ASSERT_EQ(1u, num_channels);
1303 if (n > algorithmic_frame_delay) { 1303 if (n > algorithmic_frame_delay) {
1304 EXPECT_TRUE(IsAllZero(decoded, samples_per_channel * num_channels)); 1304 EXPECT_TRUE(IsAllZero(decoded, samples_per_channel * num_channels));
1305 } 1305 }
1306 rtp_info.header.sequenceNumber++; 1306 rtp_info.header.sequenceNumber++;
1307 rtp_info.header.timestamp += kBlockSize16kHz; 1307 rtp_info.header.timestamp += kBlockSize16kHz;
1308 receive_timestamp += kBlockSize16kHz; 1308 receive_timestamp += kBlockSize16kHz;
1309 } 1309 }
1310 1310
1311 // We insert regular packets, if sync packet are not correctly buffered then 1311 // We insert regular packets, if sync packet are not correctly buffered then
1312 // network statistics would show some packet loss. 1312 // network statistics would show some packet loss.
(...skipping 28 matching lines...) Expand all
1341 PopulateRtpInfo(0, 0, &rtp_info); 1341 PopulateRtpInfo(0, 0, &rtp_info);
1342 const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t); 1342 const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t);
1343 uint8_t payload[kPayloadBytes]; 1343 uint8_t payload[kPayloadBytes];
1344 int16_t decoded[kBlockSize16kHz]; 1344 int16_t decoded[kBlockSize16kHz];
1345 for (size_t n = 0; n < kPayloadBytes; ++n) { 1345 for (size_t n = 0; n < kPayloadBytes; ++n) {
1346 payload[n] = (rand() & 0xF0) + 1; // Non-zero random sequence. 1346 payload[n] = (rand() & 0xF0) + 1; // Non-zero random sequence.
1347 } 1347 }
1348 // Insert some packets which decode to noise. We are not interested in 1348 // Insert some packets which decode to noise. We are not interested in
1349 // actual decoded values. 1349 // actual decoded values.
1350 NetEqOutputType output_type; 1350 NetEqOutputType output_type;
1351 int num_channels; 1351 size_t num_channels;
1352 size_t samples_per_channel; 1352 size_t samples_per_channel;
1353 uint32_t receive_timestamp = 0; 1353 uint32_t receive_timestamp = 0;
1354 int algorithmic_frame_delay = algorithmic_delay_ms_ / 10 + 1; 1354 int algorithmic_frame_delay = algorithmic_delay_ms_ / 10 + 1;
1355 for (int n = 0; n < algorithmic_frame_delay; ++n) { 1355 for (int n = 0; n < algorithmic_frame_delay; ++n) {
1356 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp)); 1356 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
1357 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1357 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded,
1358 &samples_per_channel, &num_channels, 1358 &samples_per_channel, &num_channels,
1359 &output_type)); 1359 &output_type));
1360 ASSERT_EQ(kBlockSize16kHz, samples_per_channel); 1360 ASSERT_EQ(kBlockSize16kHz, samples_per_channel);
1361 ASSERT_EQ(1, num_channels); 1361 ASSERT_EQ(1u, num_channels);
1362 rtp_info.header.sequenceNumber++; 1362 rtp_info.header.sequenceNumber++;
1363 rtp_info.header.timestamp += kBlockSize16kHz; 1363 rtp_info.header.timestamp += kBlockSize16kHz;
1364 receive_timestamp += kBlockSize16kHz; 1364 receive_timestamp += kBlockSize16kHz;
1365 } 1365 }
1366 const int kNumSyncPackets = 10; 1366 const int kNumSyncPackets = 10;
1367 1367
1368 WebRtcRTPHeader first_sync_packet_rtp_info; 1368 WebRtcRTPHeader first_sync_packet_rtp_info;
1369 memcpy(&first_sync_packet_rtp_info, &rtp_info, sizeof(rtp_info)); 1369 memcpy(&first_sync_packet_rtp_info, &rtp_info, sizeof(rtp_info));
1370 1370
1371 // Insert sync-packets, but no decoding. 1371 // Insert sync-packets, but no decoding.
(...skipping 18 matching lines...) Expand all
1390 rtp_info.header.timestamp += kBlockSize16kHz; 1390 rtp_info.header.timestamp += kBlockSize16kHz;
1391 receive_timestamp += kBlockSize16kHz; 1391 receive_timestamp += kBlockSize16kHz;
1392 } 1392 }
1393 1393
1394 // Decode. 1394 // Decode.
1395 for (int n = 0; n < kNumSyncPackets; ++n) { 1395 for (int n = 0; n < kNumSyncPackets; ++n) {
1396 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1396 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded,
1397 &samples_per_channel, &num_channels, 1397 &samples_per_channel, &num_channels,
1398 &output_type)); 1398 &output_type));
1399 ASSERT_EQ(kBlockSize16kHz, samples_per_channel); 1399 ASSERT_EQ(kBlockSize16kHz, samples_per_channel);
1400 ASSERT_EQ(1, num_channels); 1400 ASSERT_EQ(1u, num_channels);
1401 EXPECT_TRUE(IsAllNonZero(decoded, samples_per_channel * num_channels)); 1401 EXPECT_TRUE(IsAllNonZero(decoded, samples_per_channel * num_channels));
1402 } 1402 }
1403 } 1403 }
1404 1404
1405 void NetEqDecodingTest::WrapTest(uint16_t start_seq_no, 1405 void NetEqDecodingTest::WrapTest(uint16_t start_seq_no,
1406 uint32_t start_timestamp, 1406 uint32_t start_timestamp,
1407 const std::set<uint16_t>& drop_seq_numbers, 1407 const std::set<uint16_t>& drop_seq_numbers,
1408 bool expect_seq_no_wrap, 1408 bool expect_seq_no_wrap,
1409 bool expect_timestamp_wrap) { 1409 bool expect_timestamp_wrap) {
1410 uint16_t seq_no = start_seq_no; 1410 uint16_t seq_no = start_seq_no;
1411 uint32_t timestamp = start_timestamp; 1411 uint32_t timestamp = start_timestamp;
1412 const int kBlocksPerFrame = 3; // Number of 10 ms blocks per frame. 1412 const int kBlocksPerFrame = 3; // Number of 10 ms blocks per frame.
1413 const int kFrameSizeMs = kBlocksPerFrame * kTimeStepMs; 1413 const int kFrameSizeMs = kBlocksPerFrame * kTimeStepMs;
1414 const int kSamples = kBlockSize16kHz * kBlocksPerFrame; 1414 const int kSamples = kBlockSize16kHz * kBlocksPerFrame;
1415 const size_t kPayloadBytes = kSamples * sizeof(int16_t); 1415 const size_t kPayloadBytes = kSamples * sizeof(int16_t);
1416 double next_input_time_ms = 0.0; 1416 double next_input_time_ms = 0.0;
1417 int16_t decoded[kBlockSize16kHz]; 1417 int16_t decoded[kBlockSize16kHz];
1418 int num_channels; 1418 size_t num_channels;
1419 size_t samples_per_channel; 1419 size_t samples_per_channel;
1420 NetEqOutputType output_type; 1420 NetEqOutputType output_type;
1421 uint32_t receive_timestamp = 0; 1421 uint32_t receive_timestamp = 0;
1422 1422
1423 // Insert speech for 2 seconds. 1423 // Insert speech for 2 seconds.
1424 const int kSpeechDurationMs = 2000; 1424 const int kSpeechDurationMs = 2000;
1425 int packets_inserted = 0; 1425 int packets_inserted = 0;
1426 uint16_t last_seq_no; 1426 uint16_t last_seq_no;
1427 uint32_t last_timestamp; 1427 uint32_t last_timestamp;
1428 bool timestamp_wrapped = false; 1428 bool timestamp_wrapped = false;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1461 next_input_time_ms += static_cast<double>(kFrameSizeMs); 1461 next_input_time_ms += static_cast<double>(kFrameSizeMs);
1462 1462
1463 seq_no_wrapped |= seq_no < last_seq_no; 1463 seq_no_wrapped |= seq_no < last_seq_no;
1464 timestamp_wrapped |= timestamp < last_timestamp; 1464 timestamp_wrapped |= timestamp < last_timestamp;
1465 } 1465 }
1466 // Pull out data once. 1466 // Pull out data once.
1467 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1467 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded,
1468 &samples_per_channel, &num_channels, 1468 &samples_per_channel, &num_channels,
1469 &output_type)); 1469 &output_type));
1470 ASSERT_EQ(kBlockSize16kHz, samples_per_channel); 1470 ASSERT_EQ(kBlockSize16kHz, samples_per_channel);
1471 ASSERT_EQ(1, num_channels); 1471 ASSERT_EQ(1u, num_channels);
1472 1472
1473 // Expect delay (in samples) to be less than 2 packets. 1473 // Expect delay (in samples) to be less than 2 packets.
1474 EXPECT_LE(timestamp - PlayoutTimestamp(), 1474 EXPECT_LE(timestamp - PlayoutTimestamp(),
1475 static_cast<uint32_t>(kSamples * 2)); 1475 static_cast<uint32_t>(kSamples * 2));
1476 } 1476 }
1477 // Make sure we have actually tested wrap-around. 1477 // Make sure we have actually tested wrap-around.
1478 ASSERT_EQ(expect_seq_no_wrap, seq_no_wrapped); 1478 ASSERT_EQ(expect_seq_no_wrap, seq_no_wrapped);
1479 ASSERT_EQ(expect_timestamp_wrap, timestamp_wrapped); 1479 ASSERT_EQ(expect_timestamp_wrap, timestamp_wrapped);
1480 } 1480 }
1481 1481
(...skipping 30 matching lines...) Expand all
1512 const int kFrameSizeMs = 10; 1512 const int kFrameSizeMs = 10;
1513 const int kSampleRateKhz = 16; 1513 const int kSampleRateKhz = 16;
1514 const int kSamples = kFrameSizeMs * kSampleRateKhz; 1514 const int kSamples = kFrameSizeMs * kSampleRateKhz;
1515 const size_t kPayloadBytes = kSamples * 2; 1515 const size_t kPayloadBytes = kSamples * 2;
1516 1516
1517 const int algorithmic_delay_samples = std::max( 1517 const int algorithmic_delay_samples = std::max(
1518 algorithmic_delay_ms_ * kSampleRateKhz, 5 * kSampleRateKhz / 8); 1518 algorithmic_delay_ms_ * kSampleRateKhz, 5 * kSampleRateKhz / 8);
1519 // Insert three speech packets. Three are needed to get the frame length 1519 // Insert three speech packets. Three are needed to get the frame length
1520 // correct. 1520 // correct.
1521 size_t out_len; 1521 size_t out_len;
1522 int num_channels; 1522 size_t num_channels;
1523 NetEqOutputType type; 1523 NetEqOutputType type;
1524 uint8_t payload[kPayloadBytes] = {0}; 1524 uint8_t payload[kPayloadBytes] = {0};
1525 WebRtcRTPHeader rtp_info; 1525 WebRtcRTPHeader rtp_info;
1526 for (int i = 0; i < 3; ++i) { 1526 for (int i = 0; i < 3; ++i) {
1527 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 1527 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
1528 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 1528 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1529 ++seq_no; 1529 ++seq_no;
1530 timestamp += kSamples; 1530 timestamp += kSamples;
1531 1531
1532 // Pull audio once. 1532 // Pull audio once.
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1615 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len); 1615 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
1616 ASSERT_EQ( 1616 ASSERT_EQ(
1617 NetEq::kOK, 1617 NetEq::kOK,
1618 neteq_->InsertPacket( 1618 neteq_->InsertPacket(
1619 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 1619 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
1620 ++seq_no; 1620 ++seq_no;
1621 timestamp += kCngPeriodSamples; 1621 timestamp += kCngPeriodSamples;
1622 1622
1623 // Pull audio once and make sure CNG is played. 1623 // Pull audio once and make sure CNG is played.
1624 size_t out_len; 1624 size_t out_len;
1625 int num_channels; 1625 size_t num_channels;
1626 NetEqOutputType type; 1626 NetEqOutputType type;
1627 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 1627 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len,
1628 &num_channels, &type)); 1628 &num_channels, &type));
1629 ASSERT_EQ(kBlockSize16kHz, out_len); 1629 ASSERT_EQ(kBlockSize16kHz, out_len);
1630 EXPECT_EQ(kOutputCNG, type); 1630 EXPECT_EQ(kOutputCNG, type);
1631 1631
1632 // Insert some speech packets. 1632 // Insert some speech packets.
1633 for (int i = 0; i < 3; ++i) { 1633 for (int i = 0; i < 3; ++i) {
1634 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 1634 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
1635 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 1635 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1636 ++seq_no; 1636 ++seq_no;
1637 timestamp += kSamples; 1637 timestamp += kSamples;
1638 1638
1639 // Pull audio once. 1639 // Pull audio once.
1640 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 1640 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len,
1641 &num_channels, &type)); 1641 &num_channels, &type));
1642 ASSERT_EQ(kBlockSize16kHz, out_len); 1642 ASSERT_EQ(kBlockSize16kHz, out_len);
1643 } 1643 }
1644 // Verify speech output. 1644 // Verify speech output.
1645 EXPECT_EQ(kOutputNormal, type); 1645 EXPECT_EQ(kOutputNormal, type);
1646 } 1646 }
1647 1647
1648 } // namespace webrtc 1648 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698