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

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

Issue 1750353002: Change NetEq::GetAudio to use AudioFrame (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebase Created 4 years, 9 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 11 matching lines...) Expand all
22 #include <memory> 22 #include <memory>
23 #include <set> 23 #include <set>
24 #include <string> 24 #include <string>
25 #include <vector> 25 #include <vector>
26 26
27 #include "gflags/gflags.h" 27 #include "gflags/gflags.h"
28 #include "testing/gtest/include/gtest/gtest.h" 28 #include "testing/gtest/include/gtest/gtest.h"
29 #include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h" 29 #include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h"
30 #include "webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h" 30 #include "webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h"
31 #include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h" 31 #include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
32 #include "webrtc/modules/include/module_common_types.h"
32 #include "webrtc/test/testsupport/fileutils.h" 33 #include "webrtc/test/testsupport/fileutils.h"
33 #include "webrtc/typedefs.h" 34 #include "webrtc/typedefs.h"
34 35
35 #ifdef WEBRTC_NETEQ_UNITTEST_BITEXACT 36 #ifdef WEBRTC_NETEQ_UNITTEST_BITEXACT
36 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD 37 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD
37 #include "external/webrtc/webrtc/modules/audio_coding/neteq/neteq_unittest.pb.h" 38 #include "external/webrtc/webrtc/modules/audio_coding/neteq/neteq_unittest.pb.h"
38 #else 39 #else
39 #include "webrtc/audio_coding/neteq/neteq_unittest.pb.h" 40 #include "webrtc/audio_coding/neteq/neteq_unittest.pb.h"
40 #endif 41 #endif
41 #endif 42 #endif
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 273
273 class NetEqDecodingTest : public ::testing::Test { 274 class NetEqDecodingTest : public ::testing::Test {
274 protected: 275 protected:
275 // NetEQ must be polled for data once every 10 ms. Thus, neither of the 276 // NetEQ must be polled for data once every 10 ms. Thus, neither of the
276 // constants below can be changed. 277 // constants below can be changed.
277 static const int kTimeStepMs = 10; 278 static const int kTimeStepMs = 10;
278 static const size_t kBlockSize8kHz = kTimeStepMs * 8; 279 static const size_t kBlockSize8kHz = kTimeStepMs * 8;
279 static const size_t kBlockSize16kHz = kTimeStepMs * 16; 280 static const size_t kBlockSize16kHz = kTimeStepMs * 16;
280 static const size_t kBlockSize32kHz = kTimeStepMs * 32; 281 static const size_t kBlockSize32kHz = kTimeStepMs * 32;
281 static const size_t kBlockSize48kHz = kTimeStepMs * 48; 282 static const size_t kBlockSize48kHz = kTimeStepMs * 48;
282 static const size_t kMaxBlockSize = kBlockSize48kHz;
283 static const int kInitSampleRateHz = 8000; 283 static const int kInitSampleRateHz = 8000;
284 284
285 NetEqDecodingTest(); 285 NetEqDecodingTest();
286 virtual void SetUp(); 286 virtual void SetUp();
287 virtual void TearDown(); 287 virtual void TearDown();
288 void SelectDecoders(NetEqDecoder* used_codec); 288 void SelectDecoders(NetEqDecoder* used_codec);
289 void LoadDecoders(); 289 void LoadDecoders();
290 void OpenInputFile(const std::string &rtp_file); 290 void OpenInputFile(const std::string &rtp_file);
291 void Process(size_t* out_len); 291 void Process();
292 292
293 void DecodeAndCompare(const std::string& rtp_file, 293 void DecodeAndCompare(const std::string& rtp_file,
294 const std::string& ref_file, 294 const std::string& ref_file,
295 const std::string& stat_ref_file, 295 const std::string& stat_ref_file,
296 const std::string& rtcp_ref_file); 296 const std::string& rtcp_ref_file);
297 297
298 static void PopulateRtpInfo(int frame_index, 298 static void PopulateRtpInfo(int frame_index,
299 int timestamp, 299 int timestamp,
300 WebRtcRTPHeader* rtp_info); 300 WebRtcRTPHeader* rtp_info);
301 static void PopulateCng(int frame_index, 301 static void PopulateCng(int frame_index,
(...skipping 14 matching lines...) Expand all
316 316
317 void DuplicateCng(); 317 void DuplicateCng();
318 318
319 uint32_t PlayoutTimestamp(); 319 uint32_t PlayoutTimestamp();
320 320
321 NetEq* neteq_; 321 NetEq* neteq_;
322 NetEq::Config config_; 322 NetEq::Config config_;
323 std::unique_ptr<test::RtpFileSource> rtp_source_; 323 std::unique_ptr<test::RtpFileSource> rtp_source_;
324 std::unique_ptr<test::Packet> packet_; 324 std::unique_ptr<test::Packet> packet_;
325 unsigned int sim_clock_; 325 unsigned int sim_clock_;
326 int16_t out_data_[kMaxBlockSize]; 326 AudioFrame out_frame_;
327 int output_sample_rate_; 327 int output_sample_rate_;
328 int algorithmic_delay_ms_; 328 int algorithmic_delay_ms_;
329 }; 329 };
330 330
331 // Allocating the static const so that it can be passed by reference. 331 // Allocating the static const so that it can be passed by reference.
332 const int NetEqDecodingTest::kTimeStepMs; 332 const int NetEqDecodingTest::kTimeStepMs;
333 const size_t NetEqDecodingTest::kBlockSize8kHz; 333 const size_t NetEqDecodingTest::kBlockSize8kHz;
334 const size_t NetEqDecodingTest::kBlockSize16kHz; 334 const size_t NetEqDecodingTest::kBlockSize16kHz;
335 const size_t NetEqDecodingTest::kBlockSize32kHz; 335 const size_t NetEqDecodingTest::kBlockSize32kHz;
336 const size_t NetEqDecodingTest::kMaxBlockSize;
337 const int NetEqDecodingTest::kInitSampleRateHz; 336 const int NetEqDecodingTest::kInitSampleRateHz;
338 337
339 NetEqDecodingTest::NetEqDecodingTest() 338 NetEqDecodingTest::NetEqDecodingTest()
340 : neteq_(NULL), 339 : neteq_(NULL),
341 config_(), 340 config_(),
342 sim_clock_(0), 341 sim_clock_(0),
343 output_sample_rate_(kInitSampleRateHz), 342 output_sample_rate_(kInitSampleRateHz),
344 algorithmic_delay_ms_(0) { 343 algorithmic_delay_ms_(0) {
345 config_.sample_rate_hz = kInitSampleRateHz; 344 config_.sample_rate_hz = kInitSampleRateHz;
346 memset(out_data_, 0, sizeof(out_data_));
347 } 345 }
348 346
349 void NetEqDecodingTest::SetUp() { 347 void NetEqDecodingTest::SetUp() {
350 neteq_ = NetEq::Create(config_); 348 neteq_ = NetEq::Create(config_);
351 NetEqNetworkStatistics stat; 349 NetEqNetworkStatistics stat;
352 ASSERT_EQ(0, neteq_->NetworkStatistics(&stat)); 350 ASSERT_EQ(0, neteq_->NetworkStatistics(&stat));
353 algorithmic_delay_ms_ = stat.current_buffer_size_ms; 351 algorithmic_delay_ms_ = stat.current_buffer_size_ms;
354 ASSERT_TRUE(neteq_); 352 ASSERT_TRUE(neteq_);
355 LoadDecoders(); 353 LoadDecoders();
356 } 354 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 "cng-nb", 13)); 397 "cng-nb", 13));
400 // Load CNG 16 kHz. 398 // Load CNG 16 kHz.
401 ASSERT_EQ(0, neteq_->RegisterPayloadType(NetEqDecoder::kDecoderCNGwb, 399 ASSERT_EQ(0, neteq_->RegisterPayloadType(NetEqDecoder::kDecoderCNGwb,
402 "cng-wb", 98)); 400 "cng-wb", 98));
403 } 401 }
404 402
405 void NetEqDecodingTest::OpenInputFile(const std::string &rtp_file) { 403 void NetEqDecodingTest::OpenInputFile(const std::string &rtp_file) {
406 rtp_source_.reset(test::RtpFileSource::Create(rtp_file)); 404 rtp_source_.reset(test::RtpFileSource::Create(rtp_file));
407 } 405 }
408 406
409 void NetEqDecodingTest::Process(size_t* out_len) { 407 void NetEqDecodingTest::Process() {
410 // Check if time to receive. 408 // Check if time to receive.
411 while (packet_ && sim_clock_ >= packet_->time_ms()) { 409 while (packet_ && sim_clock_ >= packet_->time_ms()) {
412 if (packet_->payload_length_bytes() > 0) { 410 if (packet_->payload_length_bytes() > 0) {
413 WebRtcRTPHeader rtp_header; 411 WebRtcRTPHeader rtp_header;
414 packet_->ConvertHeader(&rtp_header); 412 packet_->ConvertHeader(&rtp_header);
415 #ifndef WEBRTC_CODEC_ISAC 413 #ifndef WEBRTC_CODEC_ISAC
416 // Ignore payload type 104 (iSAC-swb) if ISAC is not supported. 414 // Ignore payload type 104 (iSAC-swb) if ISAC is not supported.
417 if (rtp_header.header.payloadType != 104) 415 if (rtp_header.header.payloadType != 104)
418 #endif 416 #endif
419 ASSERT_EQ(0, neteq_->InsertPacket( 417 ASSERT_EQ(0, neteq_->InsertPacket(
420 rtp_header, 418 rtp_header,
421 rtc::ArrayView<const uint8_t>( 419 rtc::ArrayView<const uint8_t>(
422 packet_->payload(), packet_->payload_length_bytes()), 420 packet_->payload(), packet_->payload_length_bytes()),
423 static_cast<uint32_t>(packet_->time_ms() * 421 static_cast<uint32_t>(packet_->time_ms() *
424 (output_sample_rate_ / 1000)))); 422 (output_sample_rate_ / 1000))));
425 } 423 }
426 // Get next packet. 424 // Get next packet.
427 packet_.reset(rtp_source_->NextPacket()); 425 packet_.reset(rtp_source_->NextPacket());
428 } 426 }
429 427
430 // Get audio from NetEq. 428 // Get audio from NetEq.
431 NetEqOutputType type; 429 NetEqOutputType type;
432 size_t num_channels; 430 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
433 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, out_len, 431 ASSERT_TRUE((out_frame_.samples_per_channel_ == kBlockSize8kHz) ||
434 &num_channels, &type)); 432 (out_frame_.samples_per_channel_ == kBlockSize16kHz) ||
435 ASSERT_TRUE((*out_len == kBlockSize8kHz) || 433 (out_frame_.samples_per_channel_ == kBlockSize32kHz) ||
436 (*out_len == kBlockSize16kHz) || 434 (out_frame_.samples_per_channel_ == kBlockSize48kHz));
437 (*out_len == kBlockSize32kHz) || 435 output_sample_rate_ = out_frame_.sample_rate_hz_;
438 (*out_len == kBlockSize48kHz));
439 output_sample_rate_ = static_cast<int>(*out_len / 10 * 1000);
440 EXPECT_EQ(output_sample_rate_, neteq_->last_output_sample_rate_hz()); 436 EXPECT_EQ(output_sample_rate_, neteq_->last_output_sample_rate_hz());
441 437
442 // Increase time. 438 // Increase time.
443 sim_clock_ += kTimeStepMs; 439 sim_clock_ += kTimeStepMs;
444 } 440 }
445 441
446 void NetEqDecodingTest::DecodeAndCompare(const std::string& rtp_file, 442 void NetEqDecodingTest::DecodeAndCompare(const std::string& rtp_file,
447 const std::string& ref_file, 443 const std::string& ref_file,
448 const std::string& stat_ref_file, 444 const std::string& stat_ref_file,
449 const std::string& rtcp_ref_file) { 445 const std::string& rtcp_ref_file) {
(...skipping 16 matching lines...) Expand all
466 rtcp_out_file = webrtc::test::OutputPath() + "neteq_rtcp_stats.dat"; 462 rtcp_out_file = webrtc::test::OutputPath() + "neteq_rtcp_stats.dat";
467 } 463 }
468 RefFiles rtcp_stat_files(rtcp_ref_file, rtcp_out_file); 464 RefFiles rtcp_stat_files(rtcp_ref_file, rtcp_out_file);
469 465
470 packet_.reset(rtp_source_->NextPacket()); 466 packet_.reset(rtp_source_->NextPacket());
471 int i = 0; 467 int i = 0;
472 while (packet_) { 468 while (packet_) {
473 std::ostringstream ss; 469 std::ostringstream ss;
474 ss << "Lap number " << i++ << " in DecodeAndCompare while loop"; 470 ss << "Lap number " << i++ << " in DecodeAndCompare while loop";
475 SCOPED_TRACE(ss.str()); // Print out the parameter values on failure. 471 SCOPED_TRACE(ss.str()); // Print out the parameter values on failure.
476 size_t out_len = 0; 472 ASSERT_NO_FATAL_FAILURE(Process());
477 ASSERT_NO_FATAL_FAILURE(Process(&out_len)); 473 ASSERT_NO_FATAL_FAILURE(ref_files.ProcessReference(
478 ASSERT_NO_FATAL_FAILURE(ref_files.ProcessReference(out_data_, out_len)); 474 out_frame_.data_, out_frame_.samples_per_channel_));
479 475
480 // Query the network statistics API once per second 476 // Query the network statistics API once per second
481 if (sim_clock_ % 1000 == 0) { 477 if (sim_clock_ % 1000 == 0) {
482 // Process NetworkStatistics. 478 // Process NetworkStatistics.
483 NetEqNetworkStatistics network_stats; 479 NetEqNetworkStatistics network_stats;
484 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats)); 480 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
485 ASSERT_NO_FATAL_FAILURE( 481 ASSERT_NO_FATAL_FAILURE(
486 network_stat_files.ProcessReference(network_stats)); 482 network_stat_files.ProcessReference(network_stats));
487 // Compare with CurrentDelay, which should be identical. 483 // Compare with CurrentDelay, which should be identical.
488 EXPECT_EQ(network_stats.current_buffer_size_ms, neteq_->CurrentDelayMs()); 484 EXPECT_EQ(network_stats.current_buffer_size_ms, neteq_->CurrentDelayMs());
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 WebRtcRTPHeader rtp_info; 604 WebRtcRTPHeader rtp_info;
609 rtp_info.header.sequenceNumber = i; 605 rtp_info.header.sequenceNumber = i;
610 rtp_info.header.timestamp = i * kSamples; 606 rtp_info.header.timestamp = i * kSamples;
611 rtp_info.header.ssrc = 0x1234; // Just an arbitrary SSRC. 607 rtp_info.header.ssrc = 0x1234; // Just an arbitrary SSRC.
612 rtp_info.header.payloadType = 94; // PCM16b WB codec. 608 rtp_info.header.payloadType = 94; // PCM16b WB codec.
613 rtp_info.header.markerBit = 0; 609 rtp_info.header.markerBit = 0;
614 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 610 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
615 } 611 }
616 // Pull out all data. 612 // Pull out all data.
617 for (size_t i = 0; i < num_frames; ++i) { 613 for (size_t i = 0; i < num_frames; ++i) {
618 size_t out_len;
619 size_t num_channels;
620 NetEqOutputType type; 614 NetEqOutputType type;
621 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 615 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
622 &num_channels, &type)); 616 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
623 ASSERT_EQ(kBlockSize16kHz, out_len);
624 } 617 }
625 618
626 NetEqNetworkStatistics stats; 619 NetEqNetworkStatistics stats;
627 EXPECT_EQ(0, neteq_->NetworkStatistics(&stats)); 620 EXPECT_EQ(0, neteq_->NetworkStatistics(&stats));
628 // Since all frames are dumped into NetEQ at once, but pulled out with 10 ms 621 // Since all frames are dumped into NetEQ at once, but pulled out with 10 ms
629 // spacing (per definition), we expect the delay to increase with 10 ms for 622 // spacing (per definition), we expect the delay to increase with 10 ms for
630 // each packet. Thus, we are calculating the statistics for a series from 10 623 // each packet. Thus, we are calculating the statistics for a series from 10
631 // to 300, in steps of 10 ms. 624 // to 300, in steps of 10 ms.
632 EXPECT_EQ(155, stats.mean_waiting_time_ms); 625 EXPECT_EQ(155, stats.mean_waiting_time_ms);
633 EXPECT_EQ(155, stats.median_waiting_time_ms); 626 EXPECT_EQ(155, stats.median_waiting_time_ms);
(...skipping 19 matching lines...) Expand all
653 int num_packets = (frame_index % 10 == 0 ? 2 : 1); 646 int num_packets = (frame_index % 10 == 0 ? 2 : 1);
654 for (int n = 0; n < num_packets; ++n) { 647 for (int n = 0; n < num_packets; ++n) {
655 uint8_t payload[kPayloadBytes] = {0}; 648 uint8_t payload[kPayloadBytes] = {0};
656 WebRtcRTPHeader rtp_info; 649 WebRtcRTPHeader rtp_info;
657 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info); 650 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info);
658 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 651 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
659 ++frame_index; 652 ++frame_index;
660 } 653 }
661 654
662 // Pull out data once. 655 // Pull out data once.
663 size_t out_len;
664 size_t num_channels;
665 NetEqOutputType type; 656 NetEqOutputType type;
666 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 657 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
667 &num_channels, &type)); 658 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
668 ASSERT_EQ(kBlockSize16kHz, out_len);
669 } 659 }
670 660
671 NetEqNetworkStatistics network_stats; 661 NetEqNetworkStatistics network_stats;
672 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats)); 662 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
673 EXPECT_EQ(-103196, network_stats.clockdrift_ppm); 663 EXPECT_EQ(-103196, network_stats.clockdrift_ppm);
674 } 664 }
675 665
676 TEST_F(NetEqDecodingTest, TestAverageInterArrivalTimePositive) { 666 TEST_F(NetEqDecodingTest, TestAverageInterArrivalTimePositive) {
677 const int kNumFrames = 5000; // Needed for convergence. 667 const int kNumFrames = 5000; // Needed for convergence.
678 int frame_index = 0; 668 int frame_index = 0;
679 const size_t kSamples = 10 * 16; 669 const size_t kSamples = 10 * 16;
680 const size_t kPayloadBytes = kSamples * 2; 670 const size_t kPayloadBytes = kSamples * 2;
681 for (int i = 0; i < kNumFrames; ++i) { 671 for (int i = 0; i < kNumFrames; ++i) {
682 // Insert one packet each time, except every 10th time where we don't insert 672 // Insert one packet each time, except every 10th time where we don't insert
683 // any packet. This will create a positive clock-drift of approx. 11%. 673 // any packet. This will create a positive clock-drift of approx. 11%.
684 int num_packets = (i % 10 == 9 ? 0 : 1); 674 int num_packets = (i % 10 == 9 ? 0 : 1);
685 for (int n = 0; n < num_packets; ++n) { 675 for (int n = 0; n < num_packets; ++n) {
686 uint8_t payload[kPayloadBytes] = {0}; 676 uint8_t payload[kPayloadBytes] = {0};
687 WebRtcRTPHeader rtp_info; 677 WebRtcRTPHeader rtp_info;
688 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info); 678 PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info);
689 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 679 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
690 ++frame_index; 680 ++frame_index;
691 } 681 }
692 682
693 // Pull out data once. 683 // Pull out data once.
694 size_t out_len;
695 size_t num_channels;
696 NetEqOutputType type; 684 NetEqOutputType type;
697 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 685 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
698 &num_channels, &type)); 686 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
699 ASSERT_EQ(kBlockSize16kHz, out_len);
700 } 687 }
701 688
702 NetEqNetworkStatistics network_stats; 689 NetEqNetworkStatistics network_stats;
703 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats)); 690 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
704 EXPECT_EQ(110946, network_stats.clockdrift_ppm); 691 EXPECT_EQ(110946, network_stats.clockdrift_ppm);
705 } 692 }
706 693
707 void NetEqDecodingTest::LongCngWithClockDrift(double drift_factor, 694 void NetEqDecodingTest::LongCngWithClockDrift(double drift_factor,
708 double network_freeze_ms, 695 double network_freeze_ms,
709 bool pull_audio_during_freeze, 696 bool pull_audio_during_freeze,
710 int delay_tolerance_ms, 697 int delay_tolerance_ms,
711 int max_time_to_speech_ms) { 698 int max_time_to_speech_ms) {
712 uint16_t seq_no = 0; 699 uint16_t seq_no = 0;
713 uint32_t timestamp = 0; 700 uint32_t timestamp = 0;
714 const int kFrameSizeMs = 30; 701 const int kFrameSizeMs = 30;
715 const size_t kSamples = kFrameSizeMs * 16; 702 const size_t kSamples = kFrameSizeMs * 16;
716 const size_t kPayloadBytes = kSamples * 2; 703 const size_t kPayloadBytes = kSamples * 2;
717 double next_input_time_ms = 0.0; 704 double next_input_time_ms = 0.0;
718 double t_ms; 705 double t_ms;
719 size_t out_len;
720 size_t num_channels;
721 NetEqOutputType type; 706 NetEqOutputType type;
722 707
723 // Insert speech for 5 seconds. 708 // Insert speech for 5 seconds.
724 const int kSpeechDurationMs = 5000; 709 const int kSpeechDurationMs = 5000;
725 for (t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) { 710 for (t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) {
726 // Each turn in this for loop is 10 ms. 711 // Each turn in this for loop is 10 ms.
727 while (next_input_time_ms <= t_ms) { 712 while (next_input_time_ms <= t_ms) {
728 // Insert one 30 ms speech frame. 713 // Insert one 30 ms speech frame.
729 uint8_t payload[kPayloadBytes] = {0}; 714 uint8_t payload[kPayloadBytes] = {0};
730 WebRtcRTPHeader rtp_info; 715 WebRtcRTPHeader rtp_info;
731 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 716 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
732 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 717 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
733 ++seq_no; 718 ++seq_no;
734 timestamp += kSamples; 719 timestamp += kSamples;
735 next_input_time_ms += static_cast<double>(kFrameSizeMs) * drift_factor; 720 next_input_time_ms += static_cast<double>(kFrameSizeMs) * drift_factor;
736 } 721 }
737 // Pull out data once. 722 // Pull out data once.
738 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 723 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
739 &num_channels, &type)); 724 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
740 ASSERT_EQ(kBlockSize16kHz, out_len);
741 } 725 }
742 726
743 EXPECT_EQ(kOutputNormal, type); 727 EXPECT_EQ(kOutputNormal, type);
744 int32_t delay_before = timestamp - PlayoutTimestamp(); 728 int32_t delay_before = timestamp - PlayoutTimestamp();
745 729
746 // Insert CNG for 1 minute (= 60000 ms). 730 // Insert CNG for 1 minute (= 60000 ms).
747 const int kCngPeriodMs = 100; 731 const int kCngPeriodMs = 100;
748 const int kCngPeriodSamples = kCngPeriodMs * 16; // Period in 16 kHz samples. 732 const int kCngPeriodSamples = kCngPeriodMs * 16; // Period in 16 kHz samples.
749 const int kCngDurationMs = 60000; 733 const int kCngDurationMs = 60000;
750 for (; t_ms < kSpeechDurationMs + kCngDurationMs; t_ms += 10) { 734 for (; t_ms < kSpeechDurationMs + kCngDurationMs; t_ms += 10) {
751 // Each turn in this for loop is 10 ms. 735 // Each turn in this for loop is 10 ms.
752 while (next_input_time_ms <= t_ms) { 736 while (next_input_time_ms <= t_ms) {
753 // Insert one CNG frame each 100 ms. 737 // Insert one CNG frame each 100 ms.
754 uint8_t payload[kPayloadBytes]; 738 uint8_t payload[kPayloadBytes];
755 size_t payload_len; 739 size_t payload_len;
756 WebRtcRTPHeader rtp_info; 740 WebRtcRTPHeader rtp_info;
757 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len); 741 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
758 ASSERT_EQ(0, neteq_->InsertPacket( 742 ASSERT_EQ(0, neteq_->InsertPacket(
759 rtp_info, 743 rtp_info,
760 rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 744 rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
761 ++seq_no; 745 ++seq_no;
762 timestamp += kCngPeriodSamples; 746 timestamp += kCngPeriodSamples;
763 next_input_time_ms += static_cast<double>(kCngPeriodMs) * drift_factor; 747 next_input_time_ms += static_cast<double>(kCngPeriodMs) * drift_factor;
764 } 748 }
765 // Pull out data once. 749 // Pull out data once.
766 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 750 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
767 &num_channels, &type)); 751 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
768 ASSERT_EQ(kBlockSize16kHz, out_len);
769 } 752 }
770 753
771 EXPECT_EQ(kOutputCNG, type); 754 EXPECT_EQ(kOutputCNG, type);
772 755
773 if (network_freeze_ms > 0) { 756 if (network_freeze_ms > 0) {
774 // First keep pulling audio for |network_freeze_ms| without inserting 757 // First keep pulling audio for |network_freeze_ms| without inserting
775 // any data, then insert CNG data corresponding to |network_freeze_ms| 758 // any data, then insert CNG data corresponding to |network_freeze_ms|
776 // without pulling any output audio. 759 // without pulling any output audio.
777 const double loop_end_time = t_ms + network_freeze_ms; 760 const double loop_end_time = t_ms + network_freeze_ms;
778 for (; t_ms < loop_end_time; t_ms += 10) { 761 for (; t_ms < loop_end_time; t_ms += 10) {
779 // Pull out data once. 762 // Pull out data once.
780 ASSERT_EQ(0, 763 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
781 neteq_->GetAudio( 764 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
782 kMaxBlockSize, out_data_, &out_len, &num_channels, &type));
783 ASSERT_EQ(kBlockSize16kHz, out_len);
784 EXPECT_EQ(kOutputCNG, type); 765 EXPECT_EQ(kOutputCNG, type);
785 } 766 }
786 bool pull_once = pull_audio_during_freeze; 767 bool pull_once = pull_audio_during_freeze;
787 // If |pull_once| is true, GetAudio will be called once half-way through 768 // If |pull_once| is true, GetAudio will be called once half-way through
788 // the network recovery period. 769 // the network recovery period.
789 double pull_time_ms = (t_ms + next_input_time_ms) / 2; 770 double pull_time_ms = (t_ms + next_input_time_ms) / 2;
790 while (next_input_time_ms <= t_ms) { 771 while (next_input_time_ms <= t_ms) {
791 if (pull_once && next_input_time_ms >= pull_time_ms) { 772 if (pull_once && next_input_time_ms >= pull_time_ms) {
792 pull_once = false; 773 pull_once = false;
793 // Pull out data once. 774 // Pull out data once.
794 ASSERT_EQ( 775 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
795 0, 776 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
796 neteq_->GetAudio(
797 kMaxBlockSize, out_data_, &out_len, &num_channels, &type));
798 ASSERT_EQ(kBlockSize16kHz, out_len);
799 EXPECT_EQ(kOutputCNG, type); 777 EXPECT_EQ(kOutputCNG, type);
800 t_ms += 10; 778 t_ms += 10;
801 } 779 }
802 // Insert one CNG frame each 100 ms. 780 // Insert one CNG frame each 100 ms.
803 uint8_t payload[kPayloadBytes]; 781 uint8_t payload[kPayloadBytes];
804 size_t payload_len; 782 size_t payload_len;
805 WebRtcRTPHeader rtp_info; 783 WebRtcRTPHeader rtp_info;
806 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len); 784 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
807 ASSERT_EQ(0, neteq_->InsertPacket( 785 ASSERT_EQ(0, neteq_->InsertPacket(
808 rtp_info, 786 rtp_info,
(...skipping 12 matching lines...) Expand all
821 // Insert one 30 ms speech frame. 799 // Insert one 30 ms speech frame.
822 uint8_t payload[kPayloadBytes] = {0}; 800 uint8_t payload[kPayloadBytes] = {0};
823 WebRtcRTPHeader rtp_info; 801 WebRtcRTPHeader rtp_info;
824 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 802 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
825 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 803 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
826 ++seq_no; 804 ++seq_no;
827 timestamp += kSamples; 805 timestamp += kSamples;
828 next_input_time_ms += kFrameSizeMs * drift_factor; 806 next_input_time_ms += kFrameSizeMs * drift_factor;
829 } 807 }
830 // Pull out data once. 808 // Pull out data once.
831 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 809 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
832 &num_channels, &type)); 810 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
833 ASSERT_EQ(kBlockSize16kHz, out_len);
834 // Increase clock. 811 // Increase clock.
835 t_ms += 10; 812 t_ms += 10;
836 } 813 }
837 814
838 // Check that the speech starts again within reasonable time. 815 // Check that the speech starts again within reasonable time.
839 double time_until_speech_returns_ms = t_ms - speech_restart_time_ms; 816 double time_until_speech_returns_ms = t_ms - speech_restart_time_ms;
840 EXPECT_LT(time_until_speech_returns_ms, max_time_to_speech_ms); 817 EXPECT_LT(time_until_speech_returns_ms, max_time_to_speech_ms);
841 int32_t delay_after = timestamp - PlayoutTimestamp(); 818 int32_t delay_after = timestamp - PlayoutTimestamp();
842 // Compare delay before and after, and make sure it differs less than 20 ms. 819 // Compare delay before and after, and make sure it differs less than 20 ms.
843 EXPECT_LE(delay_after, delay_before + delay_tolerance_ms * 16); 820 EXPECT_LE(delay_after, delay_before + delay_tolerance_ms * 16);
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 TEST_F(NetEqDecodingTest, MAYBE_DecoderError) { 923 TEST_F(NetEqDecodingTest, MAYBE_DecoderError) {
947 const size_t kPayloadBytes = 100; 924 const size_t kPayloadBytes = 100;
948 uint8_t payload[kPayloadBytes] = {0}; 925 uint8_t payload[kPayloadBytes] = {0};
949 WebRtcRTPHeader rtp_info; 926 WebRtcRTPHeader rtp_info;
950 PopulateRtpInfo(0, 0, &rtp_info); 927 PopulateRtpInfo(0, 0, &rtp_info);
951 rtp_info.header.payloadType = 103; // iSAC, but the payload is invalid. 928 rtp_info.header.payloadType = 103; // iSAC, but the payload is invalid.
952 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 929 EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
953 NetEqOutputType type; 930 NetEqOutputType type;
954 // Set all of |out_data_| to 1, and verify that it was set to 0 by the call 931 // Set all of |out_data_| to 1, and verify that it was set to 0 by the call
955 // to GetAudio. 932 // to GetAudio.
956 for (size_t i = 0; i < kMaxBlockSize; ++i) { 933 for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; ++i) {
957 out_data_[i] = 1; 934 out_frame_.data_[i] = 1;
958 } 935 }
959 size_t num_channels; 936 EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(&out_frame_, &type));
960 size_t samples_per_channel;
961 EXPECT_EQ(NetEq::kFail,
962 neteq_->GetAudio(kMaxBlockSize, out_data_,
963 &samples_per_channel, &num_channels, &type));
964 // Verify that there is a decoder error to check. 937 // Verify that there is a decoder error to check.
965 EXPECT_EQ(NetEq::kDecoderErrorCode, neteq_->LastError()); 938 EXPECT_EQ(NetEq::kDecoderErrorCode, neteq_->LastError());
966 939
967 enum NetEqDecoderError { 940 enum NetEqDecoderError {
968 ISAC_LENGTH_MISMATCH = 6730, 941 ISAC_LENGTH_MISMATCH = 6730,
969 ISAC_RANGE_ERROR_DECODE_FRAME_LENGTH = 6640 942 ISAC_RANGE_ERROR_DECODE_FRAME_LENGTH = 6640
970 }; 943 };
971 #if defined(WEBRTC_CODEC_ISAC) 944 #if defined(WEBRTC_CODEC_ISAC)
972 EXPECT_EQ(ISAC_LENGTH_MISMATCH, neteq_->LastDecoderError()); 945 EXPECT_EQ(ISAC_LENGTH_MISMATCH, neteq_->LastDecoderError());
973 #elif defined(WEBRTC_CODEC_ISACFX) 946 #elif defined(WEBRTC_CODEC_ISACFX)
974 EXPECT_EQ(ISAC_RANGE_ERROR_DECODE_FRAME_LENGTH, neteq_->LastDecoderError()); 947 EXPECT_EQ(ISAC_RANGE_ERROR_DECODE_FRAME_LENGTH, neteq_->LastDecoderError());
975 #endif 948 #endif
976 // Verify that the first 160 samples are set to 0, and that the remaining 949 // Verify that the first 160 samples are set to 0, and that the remaining
977 // samples are left unmodified. 950 // samples are left unmodified.
978 static const int kExpectedOutputLength = 160; // 10 ms at 16 kHz sample rate. 951 static const int kExpectedOutputLength = 160; // 10 ms at 16 kHz sample rate.
979 for (int i = 0; i < kExpectedOutputLength; ++i) { 952 for (int i = 0; i < kExpectedOutputLength; ++i) {
980 std::ostringstream ss; 953 std::ostringstream ss;
981 ss << "i = " << i; 954 ss << "i = " << i;
982 SCOPED_TRACE(ss.str()); // Print out the parameter values on failure. 955 SCOPED_TRACE(ss.str()); // Print out the parameter values on failure.
983 EXPECT_EQ(0, out_data_[i]); 956 EXPECT_EQ(0, out_frame_.data_[i]);
984 } 957 }
985 for (size_t i = kExpectedOutputLength; i < kMaxBlockSize; ++i) { 958 for (size_t i = kExpectedOutputLength; i < AudioFrame::kMaxDataSizeSamples;
959 ++i) {
986 std::ostringstream ss; 960 std::ostringstream ss;
987 ss << "i = " << i; 961 ss << "i = " << i;
988 SCOPED_TRACE(ss.str()); // Print out the parameter values on failure. 962 SCOPED_TRACE(ss.str()); // Print out the parameter values on failure.
989 EXPECT_EQ(1, out_data_[i]); 963 EXPECT_EQ(1, out_frame_.data_[i]);
990 } 964 }
991 } 965 }
992 966
993 TEST_F(NetEqDecodingTest, GetAudioBeforeInsertPacket) { 967 TEST_F(NetEqDecodingTest, GetAudioBeforeInsertPacket) {
994 NetEqOutputType type; 968 NetEqOutputType type;
995 // Set all of |out_data_| to 1, and verify that it was set to 0 by the call 969 // Set all of |out_data_| to 1, and verify that it was set to 0 by the call
996 // to GetAudio. 970 // to GetAudio.
997 for (size_t i = 0; i < kMaxBlockSize; ++i) { 971 for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; ++i) {
998 out_data_[i] = 1; 972 out_frame_.data_[i] = 1;
999 } 973 }
1000 size_t num_channels; 974 EXPECT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
1001 size_t samples_per_channel;
1002 EXPECT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_,
1003 &samples_per_channel,
1004 &num_channels, &type));
1005 // Verify that the first block of samples is set to 0. 975 // Verify that the first block of samples is set to 0.
1006 static const int kExpectedOutputLength = 976 static const int kExpectedOutputLength =
1007 kInitSampleRateHz / 100; // 10 ms at initial sample rate. 977 kInitSampleRateHz / 100; // 10 ms at initial sample rate.
1008 for (int i = 0; i < kExpectedOutputLength; ++i) { 978 for (int i = 0; i < kExpectedOutputLength; ++i) {
1009 std::ostringstream ss; 979 std::ostringstream ss;
1010 ss << "i = " << i; 980 ss << "i = " << i;
1011 SCOPED_TRACE(ss.str()); // Print out the parameter values on failure. 981 SCOPED_TRACE(ss.str()); // Print out the parameter values on failure.
1012 EXPECT_EQ(0, out_data_[i]); 982 EXPECT_EQ(0, out_frame_.data_[i]);
1013 } 983 }
1014 // Verify that the sample rate did not change from the initial configuration. 984 // Verify that the sample rate did not change from the initial configuration.
1015 EXPECT_EQ(config_.sample_rate_hz, neteq_->last_output_sample_rate_hz()); 985 EXPECT_EQ(config_.sample_rate_hz, neteq_->last_output_sample_rate_hz());
1016 } 986 }
1017 987
1018 class NetEqBgnTest : public NetEqDecodingTest { 988 class NetEqBgnTest : public NetEqDecodingTest {
1019 protected: 989 protected:
1020 virtual void TestCondition(double sum_squared_noise, 990 virtual void TestCondition(double sum_squared_noise,
1021 bool should_be_faded) = 0; 991 bool should_be_faded) = 0;
1022 992
1023 void CheckBgn(int sampling_rate_hz) { 993 void CheckBgn(int sampling_rate_hz) {
1024 size_t expected_samples_per_channel = 0; 994 size_t expected_samples_per_channel = 0;
1025 uint8_t payload_type = 0xFF; // Invalid. 995 uint8_t payload_type = 0xFF; // Invalid.
1026 if (sampling_rate_hz == 8000) { 996 if (sampling_rate_hz == 8000) {
1027 expected_samples_per_channel = kBlockSize8kHz; 997 expected_samples_per_channel = kBlockSize8kHz;
1028 payload_type = 93; // PCM 16, 8 kHz. 998 payload_type = 93; // PCM 16, 8 kHz.
1029 } else if (sampling_rate_hz == 16000) { 999 } else if (sampling_rate_hz == 16000) {
1030 expected_samples_per_channel = kBlockSize16kHz; 1000 expected_samples_per_channel = kBlockSize16kHz;
1031 payload_type = 94; // PCM 16, 16 kHZ. 1001 payload_type = 94; // PCM 16, 16 kHZ.
1032 } else if (sampling_rate_hz == 32000) { 1002 } else if (sampling_rate_hz == 32000) {
1033 expected_samples_per_channel = kBlockSize32kHz; 1003 expected_samples_per_channel = kBlockSize32kHz;
1034 payload_type = 95; // PCM 16, 32 kHz. 1004 payload_type = 95; // PCM 16, 32 kHz.
1035 } else { 1005 } else {
1036 ASSERT_TRUE(false); // Unsupported test case. 1006 ASSERT_TRUE(false); // Unsupported test case.
1037 } 1007 }
1038 1008
1039 NetEqOutputType type; 1009 NetEqOutputType type;
1040 int16_t output[kBlockSize32kHz]; // Maximum size is chosen. 1010 AudioFrame output;
1041 test::AudioLoop input; 1011 test::AudioLoop input;
1042 // We are using the same 32 kHz input file for all tests, regardless of 1012 // We are using the same 32 kHz input file for all tests, regardless of
1043 // |sampling_rate_hz|. The output may sound weird, but the test is still 1013 // |sampling_rate_hz|. The output may sound weird, but the test is still
1044 // valid. 1014 // valid.
1045 ASSERT_TRUE(input.Init( 1015 ASSERT_TRUE(input.Init(
1046 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"), 1016 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
1047 10 * sampling_rate_hz, // Max 10 seconds loop length. 1017 10 * sampling_rate_hz, // Max 10 seconds loop length.
1048 expected_samples_per_channel)); 1018 expected_samples_per_channel));
1049 1019
1050 // Payload of 10 ms of PCM16 32 kHz. 1020 // Payload of 10 ms of PCM16 32 kHz.
1051 uint8_t payload[kBlockSize32kHz * sizeof(int16_t)]; 1021 uint8_t payload[kBlockSize32kHz * sizeof(int16_t)];
1052 WebRtcRTPHeader rtp_info; 1022 WebRtcRTPHeader rtp_info;
1053 PopulateRtpInfo(0, 0, &rtp_info); 1023 PopulateRtpInfo(0, 0, &rtp_info);
1054 rtp_info.header.payloadType = payload_type; 1024 rtp_info.header.payloadType = payload_type;
1055 1025
1056 size_t number_channels = 0;
1057 size_t samples_per_channel = 0;
1058
1059 uint32_t receive_timestamp = 0; 1026 uint32_t receive_timestamp = 0;
1060 for (int n = 0; n < 10; ++n) { // Insert few packets and get audio. 1027 for (int n = 0; n < 10; ++n) { // Insert few packets and get audio.
1061 auto block = input.GetNextBlock(); 1028 auto block = input.GetNextBlock();
1062 ASSERT_EQ(expected_samples_per_channel, block.size()); 1029 ASSERT_EQ(expected_samples_per_channel, block.size());
1063 size_t enc_len_bytes = 1030 size_t enc_len_bytes =
1064 WebRtcPcm16b_Encode(block.data(), block.size(), payload); 1031 WebRtcPcm16b_Encode(block.data(), block.size(), payload);
1065 ASSERT_EQ(enc_len_bytes, expected_samples_per_channel * 2); 1032 ASSERT_EQ(enc_len_bytes, expected_samples_per_channel * 2);
1066 1033
1067 number_channels = 0;
1068 samples_per_channel = 0;
1069 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, rtc::ArrayView<const uint8_t>( 1034 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, rtc::ArrayView<const uint8_t>(
1070 payload, enc_len_bytes), 1035 payload, enc_len_bytes),
1071 receive_timestamp)); 1036 receive_timestamp));
1072 ASSERT_EQ(0, 1037 output.Reset();
1073 neteq_->GetAudio(kBlockSize32kHz, 1038 ASSERT_EQ(0, neteq_->GetAudio(&output, &type));
1074 output, 1039 ASSERT_EQ(1u, output.num_channels_);
1075 &samples_per_channel, 1040 ASSERT_EQ(expected_samples_per_channel, output.samples_per_channel_);
1076 &number_channels,
1077 &type));
1078 ASSERT_EQ(1u, number_channels);
1079 ASSERT_EQ(expected_samples_per_channel, samples_per_channel);
1080 ASSERT_EQ(kOutputNormal, type); 1041 ASSERT_EQ(kOutputNormal, type);
1081 1042
1082 // Next packet. 1043 // Next packet.
1083 rtp_info.header.timestamp += expected_samples_per_channel; 1044 rtp_info.header.timestamp += expected_samples_per_channel;
1084 rtp_info.header.sequenceNumber++; 1045 rtp_info.header.sequenceNumber++;
1085 receive_timestamp += expected_samples_per_channel; 1046 receive_timestamp += expected_samples_per_channel;
1086 } 1047 }
1087 1048
1088 number_channels = 0; 1049 output.Reset();
1089 samples_per_channel = 0;
1090 1050
1091 // Get audio without inserting packets, expecting PLC and PLC-to-CNG. Pull 1051 // Get audio without inserting packets, expecting PLC and PLC-to-CNG. Pull
1092 // one frame without checking speech-type. This is the first frame pulled 1052 // one frame without checking speech-type. This is the first frame pulled
1093 // without inserting any packet, and might not be labeled as PLC. 1053 // without inserting any packet, and might not be labeled as PLC.
1094 ASSERT_EQ(0, 1054 ASSERT_EQ(0, neteq_->GetAudio(&output, &type));
1095 neteq_->GetAudio(kBlockSize32kHz, 1055 ASSERT_EQ(1u, output.num_channels_);
1096 output, 1056 ASSERT_EQ(expected_samples_per_channel, output.samples_per_channel_);
1097 &samples_per_channel,
1098 &number_channels,
1099 &type));
1100 ASSERT_EQ(1u, number_channels);
1101 ASSERT_EQ(expected_samples_per_channel, samples_per_channel);
1102 1057
1103 // To be able to test the fading of background noise we need at lease to 1058 // To be able to test the fading of background noise we need at lease to
1104 // pull 611 frames. 1059 // pull 611 frames.
1105 const int kFadingThreshold = 611; 1060 const int kFadingThreshold = 611;
1106 1061
1107 // Test several CNG-to-PLC packet for the expected behavior. The number 20 1062 // Test several CNG-to-PLC packet for the expected behavior. The number 20
1108 // is arbitrary, but sufficiently large to test enough number of frames. 1063 // is arbitrary, but sufficiently large to test enough number of frames.
1109 const int kNumPlcToCngTestFrames = 20; 1064 const int kNumPlcToCngTestFrames = 20;
1110 bool plc_to_cng = false; 1065 bool plc_to_cng = false;
1111 for (int n = 0; n < kFadingThreshold + kNumPlcToCngTestFrames; ++n) { 1066 for (int n = 0; n < kFadingThreshold + kNumPlcToCngTestFrames; ++n) {
1112 number_channels = 0; 1067 output.Reset();
1113 samples_per_channel = 0; 1068 memset(output.data_, 1, sizeof(output.data_)); // Set to non-zero.
1114 memset(output, 1, sizeof(output)); // Set to non-zero. 1069 ASSERT_EQ(0, neteq_->GetAudio(&output, &type));
1115 ASSERT_EQ(0, 1070 ASSERT_EQ(1u, output.num_channels_);
1116 neteq_->GetAudio(kBlockSize32kHz, 1071 ASSERT_EQ(expected_samples_per_channel, output.samples_per_channel_);
1117 output,
1118 &samples_per_channel,
1119 &number_channels,
1120 &type));
1121 ASSERT_EQ(1u, number_channels);
1122 ASSERT_EQ(expected_samples_per_channel, samples_per_channel);
1123 if (type == kOutputPLCtoCNG) { 1072 if (type == kOutputPLCtoCNG) {
1124 plc_to_cng = true; 1073 plc_to_cng = true;
1125 double sum_squared = 0; 1074 double sum_squared = 0;
1126 for (size_t k = 0; k < number_channels * samples_per_channel; ++k) 1075 for (size_t k = 0;
1127 sum_squared += output[k] * output[k]; 1076 k < output.num_channels_ * output.samples_per_channel_; ++k)
1077 sum_squared += output.data_[k] * output.data_[k];
1128 TestCondition(sum_squared, n > kFadingThreshold); 1078 TestCondition(sum_squared, n > kFadingThreshold);
1129 } else { 1079 } else {
1130 EXPECT_EQ(kOutputPLC, type); 1080 EXPECT_EQ(kOutputPLC, type);
1131 } 1081 }
1132 } 1082 }
1133 EXPECT_TRUE(plc_to_cng); // Just to be sure that PLC-to-CNG has occurred. 1083 EXPECT_TRUE(plc_to_cng); // Just to be sure that PLC-to-CNG has occurred.
1134 } 1084 }
1135 }; 1085 };
1136 1086
1137 class NetEqBgnTestOn : public NetEqBgnTest { 1087 class NetEqBgnTestOn : public NetEqBgnTest {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
1275 // packets should not produce error, statistics should not show any packet loss 1225 // packets should not produce error, statistics should not show any packet loss
1276 // and sync-packets should decode to zero. 1226 // and sync-packets should decode to zero.
1277 // TODO(turajs) we will have a better test if we have a referece NetEq, and 1227 // TODO(turajs) we will have a better test if we have a referece NetEq, and
1278 // when Sync packets are inserted in "test" NetEq we insert all-zero payload 1228 // when Sync packets are inserted in "test" NetEq we insert all-zero payload
1279 // in reference NetEq and compare the output of those two. 1229 // in reference NetEq and compare the output of those two.
1280 TEST_F(NetEqDecodingTest, SyncPacketDecode) { 1230 TEST_F(NetEqDecodingTest, SyncPacketDecode) {
1281 WebRtcRTPHeader rtp_info; 1231 WebRtcRTPHeader rtp_info;
1282 PopulateRtpInfo(0, 0, &rtp_info); 1232 PopulateRtpInfo(0, 0, &rtp_info);
1283 const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t); 1233 const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t);
1284 uint8_t payload[kPayloadBytes]; 1234 uint8_t payload[kPayloadBytes];
1285 int16_t decoded[kBlockSize16kHz]; 1235 AudioFrame output;
1286 int algorithmic_frame_delay = algorithmic_delay_ms_ / 10 + 1; 1236 int algorithmic_frame_delay = algorithmic_delay_ms_ / 10 + 1;
1287 for (size_t n = 0; n < kPayloadBytes; ++n) { 1237 for (size_t n = 0; n < kPayloadBytes; ++n) {
1288 payload[n] = (rand() & 0xF0) + 1; // Non-zero random sequence. 1238 payload[n] = (rand() & 0xF0) + 1; // Non-zero random sequence.
1289 } 1239 }
1290 // Insert some packets which decode to noise. We are not interested in 1240 // Insert some packets which decode to noise. We are not interested in
1291 // actual decoded values. 1241 // actual decoded values.
1292 NetEqOutputType output_type; 1242 NetEqOutputType output_type;
1293 size_t num_channels;
1294 size_t samples_per_channel;
1295 uint32_t receive_timestamp = 0; 1243 uint32_t receive_timestamp = 0;
1296 for (int n = 0; n < 100; ++n) { 1244 for (int n = 0; n < 100; ++n) {
1297 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp)); 1245 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
1298 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1246 ASSERT_EQ(0, neteq_->GetAudio(&output, &output_type));
1299 &samples_per_channel, &num_channels, 1247 ASSERT_EQ(kBlockSize16kHz, output.samples_per_channel_);
1300 &output_type)); 1248 ASSERT_EQ(1u, output.num_channels_);
1301 ASSERT_EQ(kBlockSize16kHz, samples_per_channel);
1302 ASSERT_EQ(1u, num_channels);
1303 1249
1304 rtp_info.header.sequenceNumber++; 1250 rtp_info.header.sequenceNumber++;
1305 rtp_info.header.timestamp += kBlockSize16kHz; 1251 rtp_info.header.timestamp += kBlockSize16kHz;
1306 receive_timestamp += kBlockSize16kHz; 1252 receive_timestamp += kBlockSize16kHz;
1307 } 1253 }
1308 const int kNumSyncPackets = 10; 1254 const int kNumSyncPackets = 10;
1309 1255
1310 // Make sure sufficient number of sync packets are inserted that we can 1256 // Make sure sufficient number of sync packets are inserted that we can
1311 // conduct a test. 1257 // conduct a test.
1312 ASSERT_GT(kNumSyncPackets, algorithmic_frame_delay); 1258 ASSERT_GT(kNumSyncPackets, algorithmic_frame_delay);
1313 // Insert sync-packets, the decoded sequence should be all-zero. 1259 // Insert sync-packets, the decoded sequence should be all-zero.
1314 for (int n = 0; n < kNumSyncPackets; ++n) { 1260 for (int n = 0; n < kNumSyncPackets; ++n) {
1315 ASSERT_EQ(0, neteq_->InsertSyncPacket(rtp_info, receive_timestamp)); 1261 ASSERT_EQ(0, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
1316 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1262 ASSERT_EQ(0, neteq_->GetAudio(&output, &output_type));
1317 &samples_per_channel, &num_channels, 1263 ASSERT_EQ(kBlockSize16kHz, output.samples_per_channel_);
1318 &output_type)); 1264 ASSERT_EQ(1u, output.num_channels_);
1319 ASSERT_EQ(kBlockSize16kHz, samples_per_channel);
1320 ASSERT_EQ(1u, num_channels);
1321 if (n > algorithmic_frame_delay) { 1265 if (n > algorithmic_frame_delay) {
1322 EXPECT_TRUE(IsAllZero(decoded, samples_per_channel * num_channels)); 1266 EXPECT_TRUE(IsAllZero(
1267 output.data_, output.samples_per_channel_ * output.num_channels_));
1323 } 1268 }
1324 rtp_info.header.sequenceNumber++; 1269 rtp_info.header.sequenceNumber++;
1325 rtp_info.header.timestamp += kBlockSize16kHz; 1270 rtp_info.header.timestamp += kBlockSize16kHz;
1326 receive_timestamp += kBlockSize16kHz; 1271 receive_timestamp += kBlockSize16kHz;
1327 } 1272 }
1328 1273
1329 // We insert regular packets, if sync packet are not correctly buffered then 1274 // We insert regular packets, if sync packet are not correctly buffered then
1330 // network statistics would show some packet loss. 1275 // network statistics would show some packet loss.
1331 for (int n = 0; n <= algorithmic_frame_delay + 10; ++n) { 1276 for (int n = 0; n <= algorithmic_frame_delay + 10; ++n) {
1332 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp)); 1277 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
1333 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1278 ASSERT_EQ(0, neteq_->GetAudio(&output, &output_type));
1334 &samples_per_channel, &num_channels,
1335 &output_type));
1336 if (n >= algorithmic_frame_delay + 1) { 1279 if (n >= algorithmic_frame_delay + 1) {
1337 // Expect that this frame contain samples from regular RTP. 1280 // Expect that this frame contain samples from regular RTP.
1338 EXPECT_TRUE(IsAllNonZero(decoded, samples_per_channel * num_channels)); 1281 EXPECT_TRUE(IsAllNonZero(
1282 output.data_, output.samples_per_channel_ * output.num_channels_));
1339 } 1283 }
1340 rtp_info.header.sequenceNumber++; 1284 rtp_info.header.sequenceNumber++;
1341 rtp_info.header.timestamp += kBlockSize16kHz; 1285 rtp_info.header.timestamp += kBlockSize16kHz;
1342 receive_timestamp += kBlockSize16kHz; 1286 receive_timestamp += kBlockSize16kHz;
1343 } 1287 }
1344 NetEqNetworkStatistics network_stats; 1288 NetEqNetworkStatistics network_stats;
1345 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats)); 1289 ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
1346 // Expecting a "clean" network. 1290 // Expecting a "clean" network.
1347 EXPECT_EQ(0, network_stats.packet_loss_rate); 1291 EXPECT_EQ(0, network_stats.packet_loss_rate);
1348 EXPECT_EQ(0, network_stats.expand_rate); 1292 EXPECT_EQ(0, network_stats.expand_rate);
1349 EXPECT_EQ(0, network_stats.accelerate_rate); 1293 EXPECT_EQ(0, network_stats.accelerate_rate);
1350 EXPECT_LE(network_stats.preemptive_rate, 150); 1294 EXPECT_LE(network_stats.preemptive_rate, 150);
1351 } 1295 }
1352 1296
1353 // Test if the size of the packet buffer reported correctly when containing 1297 // Test if the size of the packet buffer reported correctly when containing
1354 // sync packets. Also, test if network packets override sync packets. That is to 1298 // sync packets. Also, test if network packets override sync packets. That is to
1355 // prefer decoding a network packet to a sync packet, if both have same sequence 1299 // prefer decoding a network packet to a sync packet, if both have same sequence
1356 // number and timestamp. 1300 // number and timestamp.
1357 TEST_F(NetEqDecodingTest, SyncPacketBufferSizeAndOverridenByNetworkPackets) { 1301 TEST_F(NetEqDecodingTest, SyncPacketBufferSizeAndOverridenByNetworkPackets) {
1358 WebRtcRTPHeader rtp_info; 1302 WebRtcRTPHeader rtp_info;
1359 PopulateRtpInfo(0, 0, &rtp_info); 1303 PopulateRtpInfo(0, 0, &rtp_info);
1360 const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t); 1304 const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t);
1361 uint8_t payload[kPayloadBytes]; 1305 uint8_t payload[kPayloadBytes];
1362 int16_t decoded[kBlockSize16kHz]; 1306 AudioFrame output;
1363 for (size_t n = 0; n < kPayloadBytes; ++n) { 1307 for (size_t n = 0; n < kPayloadBytes; ++n) {
1364 payload[n] = (rand() & 0xF0) + 1; // Non-zero random sequence. 1308 payload[n] = (rand() & 0xF0) + 1; // Non-zero random sequence.
1365 } 1309 }
1366 // Insert some packets which decode to noise. We are not interested in 1310 // Insert some packets which decode to noise. We are not interested in
1367 // actual decoded values. 1311 // actual decoded values.
1368 NetEqOutputType output_type; 1312 NetEqOutputType output_type;
1369 size_t num_channels;
1370 size_t samples_per_channel;
1371 uint32_t receive_timestamp = 0; 1313 uint32_t receive_timestamp = 0;
1372 int algorithmic_frame_delay = algorithmic_delay_ms_ / 10 + 1; 1314 int algorithmic_frame_delay = algorithmic_delay_ms_ / 10 + 1;
1373 for (int n = 0; n < algorithmic_frame_delay; ++n) { 1315 for (int n = 0; n < algorithmic_frame_delay; ++n) {
1374 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp)); 1316 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
1375 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1317 ASSERT_EQ(0, neteq_->GetAudio(&output, &output_type));
1376 &samples_per_channel, &num_channels, 1318 ASSERT_EQ(kBlockSize16kHz, output.samples_per_channel_);
1377 &output_type)); 1319 ASSERT_EQ(1u, output.num_channels_);
1378 ASSERT_EQ(kBlockSize16kHz, samples_per_channel);
1379 ASSERT_EQ(1u, num_channels);
1380 rtp_info.header.sequenceNumber++; 1320 rtp_info.header.sequenceNumber++;
1381 rtp_info.header.timestamp += kBlockSize16kHz; 1321 rtp_info.header.timestamp += kBlockSize16kHz;
1382 receive_timestamp += kBlockSize16kHz; 1322 receive_timestamp += kBlockSize16kHz;
1383 } 1323 }
1384 const int kNumSyncPackets = 10; 1324 const int kNumSyncPackets = 10;
1385 1325
1386 WebRtcRTPHeader first_sync_packet_rtp_info; 1326 WebRtcRTPHeader first_sync_packet_rtp_info;
1387 memcpy(&first_sync_packet_rtp_info, &rtp_info, sizeof(rtp_info)); 1327 memcpy(&first_sync_packet_rtp_info, &rtp_info, sizeof(rtp_info));
1388 1328
1389 // Insert sync-packets, but no decoding. 1329 // Insert sync-packets, but no decoding.
(...skipping 14 matching lines...) Expand all
1404 // Insert. 1344 // Insert.
1405 for (int n = 0; n < kNumSyncPackets; ++n) { 1345 for (int n = 0; n < kNumSyncPackets; ++n) {
1406 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp)); 1346 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
1407 rtp_info.header.sequenceNumber++; 1347 rtp_info.header.sequenceNumber++;
1408 rtp_info.header.timestamp += kBlockSize16kHz; 1348 rtp_info.header.timestamp += kBlockSize16kHz;
1409 receive_timestamp += kBlockSize16kHz; 1349 receive_timestamp += kBlockSize16kHz;
1410 } 1350 }
1411 1351
1412 // Decode. 1352 // Decode.
1413 for (int n = 0; n < kNumSyncPackets; ++n) { 1353 for (int n = 0; n < kNumSyncPackets; ++n) {
1414 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1354 ASSERT_EQ(0, neteq_->GetAudio(&output, &output_type));
1415 &samples_per_channel, &num_channels, 1355 ASSERT_EQ(kBlockSize16kHz, output.samples_per_channel_);
1416 &output_type)); 1356 ASSERT_EQ(1u, output.num_channels_);
1417 ASSERT_EQ(kBlockSize16kHz, samples_per_channel); 1357 EXPECT_TRUE(IsAllNonZero(
1418 ASSERT_EQ(1u, num_channels); 1358 output.data_, output.samples_per_channel_ * output.num_channels_));
1419 EXPECT_TRUE(IsAllNonZero(decoded, samples_per_channel * num_channels));
1420 } 1359 }
1421 } 1360 }
1422 1361
1423 void NetEqDecodingTest::WrapTest(uint16_t start_seq_no, 1362 void NetEqDecodingTest::WrapTest(uint16_t start_seq_no,
1424 uint32_t start_timestamp, 1363 uint32_t start_timestamp,
1425 const std::set<uint16_t>& drop_seq_numbers, 1364 const std::set<uint16_t>& drop_seq_numbers,
1426 bool expect_seq_no_wrap, 1365 bool expect_seq_no_wrap,
1427 bool expect_timestamp_wrap) { 1366 bool expect_timestamp_wrap) {
1428 uint16_t seq_no = start_seq_no; 1367 uint16_t seq_no = start_seq_no;
1429 uint32_t timestamp = start_timestamp; 1368 uint32_t timestamp = start_timestamp;
1430 const int kBlocksPerFrame = 3; // Number of 10 ms blocks per frame. 1369 const int kBlocksPerFrame = 3; // Number of 10 ms blocks per frame.
1431 const int kFrameSizeMs = kBlocksPerFrame * kTimeStepMs; 1370 const int kFrameSizeMs = kBlocksPerFrame * kTimeStepMs;
1432 const int kSamples = kBlockSize16kHz * kBlocksPerFrame; 1371 const int kSamples = kBlockSize16kHz * kBlocksPerFrame;
1433 const size_t kPayloadBytes = kSamples * sizeof(int16_t); 1372 const size_t kPayloadBytes = kSamples * sizeof(int16_t);
1434 double next_input_time_ms = 0.0; 1373 double next_input_time_ms = 0.0;
1435 int16_t decoded[kBlockSize16kHz];
1436 size_t num_channels;
1437 size_t samples_per_channel;
1438 NetEqOutputType output_type;
1439 uint32_t receive_timestamp = 0; 1374 uint32_t receive_timestamp = 0;
1440 1375
1441 // Insert speech for 2 seconds. 1376 // Insert speech for 2 seconds.
1442 const int kSpeechDurationMs = 2000; 1377 const int kSpeechDurationMs = 2000;
1443 int packets_inserted = 0; 1378 int packets_inserted = 0;
1444 uint16_t last_seq_no; 1379 uint16_t last_seq_no;
1445 uint32_t last_timestamp; 1380 uint32_t last_timestamp;
1446 bool timestamp_wrapped = false; 1381 bool timestamp_wrapped = false;
1447 bool seq_no_wrapped = false; 1382 bool seq_no_wrapped = false;
1448 for (double t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) { 1383 for (double t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) {
(...skipping 26 matching lines...) Expand all
1475 1410
1476 ++seq_no; 1411 ++seq_no;
1477 timestamp += kSamples; 1412 timestamp += kSamples;
1478 receive_timestamp += kSamples; 1413 receive_timestamp += kSamples;
1479 next_input_time_ms += static_cast<double>(kFrameSizeMs); 1414 next_input_time_ms += static_cast<double>(kFrameSizeMs);
1480 1415
1481 seq_no_wrapped |= seq_no < last_seq_no; 1416 seq_no_wrapped |= seq_no < last_seq_no;
1482 timestamp_wrapped |= timestamp < last_timestamp; 1417 timestamp_wrapped |= timestamp < last_timestamp;
1483 } 1418 }
1484 // Pull out data once. 1419 // Pull out data once.
1485 ASSERT_EQ(0, neteq_->GetAudio(kBlockSize16kHz, decoded, 1420 AudioFrame output;
1486 &samples_per_channel, &num_channels, 1421 NetEqOutputType output_type;
1487 &output_type)); 1422 ASSERT_EQ(0, neteq_->GetAudio(&output, &output_type));
1488 ASSERT_EQ(kBlockSize16kHz, samples_per_channel); 1423 ASSERT_EQ(kBlockSize16kHz, output.samples_per_channel_);
1489 ASSERT_EQ(1u, num_channels); 1424 ASSERT_EQ(1u, output.num_channels_);
1490 1425
1491 // Expect delay (in samples) to be less than 2 packets. 1426 // Expect delay (in samples) to be less than 2 packets.
1492 EXPECT_LE(timestamp - PlayoutTimestamp(), 1427 EXPECT_LE(timestamp - PlayoutTimestamp(),
1493 static_cast<uint32_t>(kSamples * 2)); 1428 static_cast<uint32_t>(kSamples * 2));
1494 } 1429 }
1495 // Make sure we have actually tested wrap-around. 1430 // Make sure we have actually tested wrap-around.
1496 ASSERT_EQ(expect_seq_no_wrap, seq_no_wrapped); 1431 ASSERT_EQ(expect_seq_no_wrap, seq_no_wrapped);
1497 ASSERT_EQ(expect_timestamp_wrap, timestamp_wrapped); 1432 ASSERT_EQ(expect_timestamp_wrap, timestamp_wrapped);
1498 } 1433 }
1499 1434
(...skipping 29 matching lines...) Expand all
1529 uint32_t timestamp = 0; 1464 uint32_t timestamp = 0;
1530 const int kFrameSizeMs = 10; 1465 const int kFrameSizeMs = 10;
1531 const int kSampleRateKhz = 16; 1466 const int kSampleRateKhz = 16;
1532 const int kSamples = kFrameSizeMs * kSampleRateKhz; 1467 const int kSamples = kFrameSizeMs * kSampleRateKhz;
1533 const size_t kPayloadBytes = kSamples * 2; 1468 const size_t kPayloadBytes = kSamples * 2;
1534 1469
1535 const int algorithmic_delay_samples = std::max( 1470 const int algorithmic_delay_samples = std::max(
1536 algorithmic_delay_ms_ * kSampleRateKhz, 5 * kSampleRateKhz / 8); 1471 algorithmic_delay_ms_ * kSampleRateKhz, 5 * kSampleRateKhz / 8);
1537 // Insert three speech packets. Three are needed to get the frame length 1472 // Insert three speech packets. Three are needed to get the frame length
1538 // correct. 1473 // correct.
1539 size_t out_len;
1540 size_t num_channels;
1541 NetEqOutputType type; 1474 NetEqOutputType type;
1542 uint8_t payload[kPayloadBytes] = {0}; 1475 uint8_t payload[kPayloadBytes] = {0};
1543 WebRtcRTPHeader rtp_info; 1476 WebRtcRTPHeader rtp_info;
1544 for (int i = 0; i < 3; ++i) { 1477 for (int i = 0; i < 3; ++i) {
1545 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 1478 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
1546 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 1479 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1547 ++seq_no; 1480 ++seq_no;
1548 timestamp += kSamples; 1481 timestamp += kSamples;
1549 1482
1550 // Pull audio once. 1483 // Pull audio once.
1551 ASSERT_EQ(0, 1484 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
1552 neteq_->GetAudio( 1485 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1553 kMaxBlockSize, out_data_, &out_len, &num_channels, &type));
1554 ASSERT_EQ(kBlockSize16kHz, out_len);
1555 } 1486 }
1556 // Verify speech output. 1487 // Verify speech output.
1557 EXPECT_EQ(kOutputNormal, type); 1488 EXPECT_EQ(kOutputNormal, type);
1558 1489
1559 // Insert same CNG packet twice. 1490 // Insert same CNG packet twice.
1560 const int kCngPeriodMs = 100; 1491 const int kCngPeriodMs = 100;
1561 const int kCngPeriodSamples = kCngPeriodMs * kSampleRateKhz; 1492 const int kCngPeriodSamples = kCngPeriodMs * kSampleRateKhz;
1562 size_t payload_len; 1493 size_t payload_len;
1563 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len); 1494 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
1564 // This is the first time this CNG packet is inserted. 1495 // This is the first time this CNG packet is inserted.
1565 ASSERT_EQ( 1496 ASSERT_EQ(
1566 0, neteq_->InsertPacket( 1497 0, neteq_->InsertPacket(
1567 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 1498 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
1568 1499
1569 // Pull audio once and make sure CNG is played. 1500 // Pull audio once and make sure CNG is played.
1570 ASSERT_EQ(0, 1501 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
1571 neteq_->GetAudio( 1502 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1572 kMaxBlockSize, out_data_, &out_len, &num_channels, &type));
1573 ASSERT_EQ(kBlockSize16kHz, out_len);
1574 EXPECT_EQ(kOutputCNG, type); 1503 EXPECT_EQ(kOutputCNG, type);
1575 EXPECT_EQ(timestamp - algorithmic_delay_samples, PlayoutTimestamp()); 1504 EXPECT_EQ(timestamp - algorithmic_delay_samples, PlayoutTimestamp());
1576 1505
1577 // Insert the same CNG packet again. Note that at this point it is old, since 1506 // Insert the same CNG packet again. Note that at this point it is old, since
1578 // we have already decoded the first copy of it. 1507 // we have already decoded the first copy of it.
1579 ASSERT_EQ( 1508 ASSERT_EQ(
1580 0, neteq_->InsertPacket( 1509 0, neteq_->InsertPacket(
1581 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 1510 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
1582 1511
1583 // Pull audio until we have played |kCngPeriodMs| of CNG. Start at 10 ms since 1512 // Pull audio until we have played |kCngPeriodMs| of CNG. Start at 10 ms since
1584 // we have already pulled out CNG once. 1513 // we have already pulled out CNG once.
1585 for (int cng_time_ms = 10; cng_time_ms < kCngPeriodMs; cng_time_ms += 10) { 1514 for (int cng_time_ms = 10; cng_time_ms < kCngPeriodMs; cng_time_ms += 10) {
1586 ASSERT_EQ(0, 1515 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
1587 neteq_->GetAudio( 1516 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1588 kMaxBlockSize, out_data_, &out_len, &num_channels, &type));
1589 ASSERT_EQ(kBlockSize16kHz, out_len);
1590 EXPECT_EQ(kOutputCNG, type); 1517 EXPECT_EQ(kOutputCNG, type);
1591 EXPECT_EQ(timestamp - algorithmic_delay_samples, 1518 EXPECT_EQ(timestamp - algorithmic_delay_samples,
1592 PlayoutTimestamp()); 1519 PlayoutTimestamp());
1593 } 1520 }
1594 1521
1595 // Insert speech again. 1522 // Insert speech again.
1596 ++seq_no; 1523 ++seq_no;
1597 timestamp += kCngPeriodSamples; 1524 timestamp += kCngPeriodSamples;
1598 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 1525 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
1599 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 1526 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1600 1527
1601 // Pull audio once and verify that the output is speech again. 1528 // Pull audio once and verify that the output is speech again.
1602 ASSERT_EQ(0, 1529 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
1603 neteq_->GetAudio( 1530 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1604 kMaxBlockSize, out_data_, &out_len, &num_channels, &type));
1605 ASSERT_EQ(kBlockSize16kHz, out_len);
1606 EXPECT_EQ(kOutputNormal, type); 1531 EXPECT_EQ(kOutputNormal, type);
1607 EXPECT_EQ(timestamp + kSamples - algorithmic_delay_samples, 1532 EXPECT_EQ(timestamp + kSamples - algorithmic_delay_samples,
1608 PlayoutTimestamp()); 1533 PlayoutTimestamp());
1609 } 1534 }
1610 1535
1611 uint32_t NetEqDecodingTest::PlayoutTimestamp() { 1536 uint32_t NetEqDecodingTest::PlayoutTimestamp() {
1612 uint32_t playout_timestamp = 0; 1537 uint32_t playout_timestamp = 0;
1613 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(&playout_timestamp)); 1538 EXPECT_TRUE(neteq_->GetPlayoutTimestamp(&playout_timestamp));
1614 return playout_timestamp; 1539 return playout_timestamp;
1615 } 1540 }
(...skipping 16 matching lines...) Expand all
1632 1557
1633 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len); 1558 PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
1634 ASSERT_EQ( 1559 ASSERT_EQ(
1635 NetEq::kOK, 1560 NetEq::kOK,
1636 neteq_->InsertPacket( 1561 neteq_->InsertPacket(
1637 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0)); 1562 rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
1638 ++seq_no; 1563 ++seq_no;
1639 timestamp += kCngPeriodSamples; 1564 timestamp += kCngPeriodSamples;
1640 1565
1641 // Pull audio once and make sure CNG is played. 1566 // Pull audio once and make sure CNG is played.
1642 size_t out_len;
1643 size_t num_channels;
1644 NetEqOutputType type; 1567 NetEqOutputType type;
1645 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 1568 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
1646 &num_channels, &type)); 1569 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1647 ASSERT_EQ(kBlockSize16kHz, out_len);
1648 EXPECT_EQ(kOutputCNG, type); 1570 EXPECT_EQ(kOutputCNG, type);
1649 1571
1650 // Insert some speech packets. 1572 // Insert some speech packets.
1651 for (int i = 0; i < 3; ++i) { 1573 for (int i = 0; i < 3; ++i) {
1652 PopulateRtpInfo(seq_no, timestamp, &rtp_info); 1574 PopulateRtpInfo(seq_no, timestamp, &rtp_info);
1653 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); 1575 ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
1654 ++seq_no; 1576 ++seq_no;
1655 timestamp += kSamples; 1577 timestamp += kSamples;
1656 1578
1657 // Pull audio once. 1579 // Pull audio once.
1658 ASSERT_EQ(0, neteq_->GetAudio(kMaxBlockSize, out_data_, &out_len, 1580 ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &type));
1659 &num_channels, &type)); 1581 ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
1660 ASSERT_EQ(kBlockSize16kHz, out_len);
1661 } 1582 }
1662 // Verify speech output. 1583 // Verify speech output.
1663 EXPECT_EQ(kOutputNormal, type); 1584 EXPECT_EQ(kOutputNormal, type);
1664 } 1585 }
1665 1586
1666 } // namespace webrtc 1587 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_coding/neteq/neteq_stereo_unittest.cc ('k') | webrtc/modules/audio_coding/neteq/sync_buffer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698