19a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org/* 29a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 39a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org * 49a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org * Use of this source code is governed by a BSD-style license 59a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org * that can be found in the LICENSE file in the root of the source 69a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org * tree. An additional intellectual property rights grant can be found 79a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org * in the file PATENTS. All contributing project authors may 89a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org * be found in the AUTHORS file in the root of the source tree. 99a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org */ 109a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 119a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org// Unit tests for DelayManager class. 129a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 13e5abc854f3dc47de16067c2a41476c39b7626722henrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/neteq/delay_manager.h" 149a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 159a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org#include <math.h> 169a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 1749d62206ededc5905d6121d42fdcce8ed665b2c0kjellander@webrtc.org#include "testing/gmock/include/gmock/gmock.h" 1849d62206ededc5905d6121d42fdcce8ed665b2c0kjellander@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 19e5abc854f3dc47de16067c2a41476c39b7626722henrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/neteq/mock/mock_delay_peak_detector.h" 209a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 219a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgnamespace webrtc { 229a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 239a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgusing ::testing::Return; 24662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.orgusing ::testing::_; 259a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 269a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgclass DelayManagerTest : public ::testing::Test { 279a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org protected: 289a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org static const int kMaxNumberOfPackets = 240; 299a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org static const int kTimeStepMs = 10; 309a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org static const int kFs = 8000; 319a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org static const int kFrameSizeMs = 20; 329a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org static const int kTsIncrement = kFrameSizeMs * kFs / 1000; 339a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 349a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org DelayManagerTest(); 359a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org virtual void SetUp(); 369a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org virtual void TearDown(); 379a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org void SetPacketAudioLength(int lengt_ms); 389a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org void InsertNextPacket(); 399a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org void IncreaseTime(int inc_ms); 409a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 419a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org DelayManager* dm_; 429a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org MockDelayPeakDetector detector_; 439a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org uint16_t seq_no_; 449a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org uint32_t ts_; 459a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org}; 469a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 479a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgDelayManagerTest::DelayManagerTest() 489a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org : dm_(NULL), 499a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org seq_no_(0x1234), 509a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org ts_(0x12345678) { 519a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 529a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 539a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgvoid DelayManagerTest::SetUp() { 549a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, Reset()) 559a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .Times(1); 569a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org dm_ = new DelayManager(kMaxNumberOfPackets, &detector_); 579a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 589a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 599a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgvoid DelayManagerTest::SetPacketAudioLength(int lengt_ms) { 609a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, SetPacketAudioLength(lengt_ms)); 619a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org dm_->SetPacketAudioLength(lengt_ms); 629a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 639a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 649a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgvoid DelayManagerTest::InsertNextPacket() { 659a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs)); 669a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org seq_no_ += 1; 679a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org ts_ += kTsIncrement; 689a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 699a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 709a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgvoid DelayManagerTest::IncreaseTime(int inc_ms) { 719a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org for (int t = 0; t < inc_ms; t += kTimeStepMs) { 729a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, IncrementCounter(kTimeStepMs)) 739a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .Times(1); 749a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org dm_->UpdateCounters(kTimeStepMs); 759a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org } 769a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 779a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgvoid DelayManagerTest::TearDown() { 789a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, Die()); 799a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org delete dm_; 809a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 819a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 829a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, CreateAndDestroy) { 839a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Nothing to do here. The test fixture creates and destroys the DelayManager 849a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // object. 859a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 869a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 879a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, VectorInitialization) { 889a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org const DelayManager::IATVector& vec = dm_->iat_vector(); 899a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org double sum = 0.0; 909a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org for (size_t i = 0; i < vec.size(); i++) { 919a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_NEAR(ldexp(pow(0.5, static_cast<int>(i + 1)), 30), vec[i], 65536); 929a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Tolerance 65536 in Q30 corresponds to a delta of approximately 0.00006. 939a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org sum += vec[i]; 949a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org } 959a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(1 << 30, static_cast<int>(sum)); // Should be 1 in Q30. 969a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 979a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 989a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, SetPacketAudioLength) { 999a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org const int kLengthMs = 30; 1009a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Expect DelayManager to pass on the new length to the detector object. 1019a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, SetPacketAudioLength(kLengthMs)) 1029a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .Times(1); 1039a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs)); 1049a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1)); // Illegal parameter value. 1059a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 1069a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 1079a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, PeakFound) { 1089a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Expect DelayManager to pass on the question to the detector. 1099a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Call twice, and let the detector return true the first time and false the 1109a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // second time. 1119a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, peak_found()) 1129a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .WillOnce(Return(true)) 1139a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .WillOnce(Return(false)); 1149a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_TRUE(dm_->PeakFound()); 1159a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_FALSE(dm_->PeakFound()); 1169a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 1179a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 1189a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, UpdateCounters) { 1199a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Expect DelayManager to pass on the counter update to the detector. 1209a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, IncrementCounter(kTimeStepMs)) 1219a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .Times(1); 1229a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org dm_->UpdateCounters(kTimeStepMs); 1239a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 1249a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 1259a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, UpdateNormal) { 1269a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org SetPacketAudioLength(kFrameSizeMs); 1279a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // First packet arrival. 1289a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org InsertNextPacket(); 1299a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Advance time by one frame size. 1309a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org IncreaseTime(kFrameSizeMs); 1319a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Second packet arrival. 1329a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Expect detector update method to be called once with inter-arrival time 1339a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // equal to 1 packet, and (base) target level equal to 1 as well. 1349a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Return false to indicate no peaks found. 1359a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, Update(1, 1)) 1369a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .WillOnce(Return(false)); 1379a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org InsertNextPacket(); 1389a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(1 << 8, dm_->TargetLevel()); // In Q8. 1399a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(1, dm_->base_target_level()); 1409a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org int lower, higher; 1419a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org dm_->BufferLimits(&lower, &higher); 1429a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Expect |lower| to be 75% of target level, and |higher| to be target level, 1439a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // but also at least 20 ms higher than |lower|, which is the limiting case 1449a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // here. 1459a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ((1 << 8) * 3 / 4, lower); 1469a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher); 1479a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 1489a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 1499a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, UpdateLongInterArrivalTime) { 1509a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org SetPacketAudioLength(kFrameSizeMs); 1519a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // First packet arrival. 1529a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org InsertNextPacket(); 1539a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Advance time by two frame size. 1549a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org IncreaseTime(2 * kFrameSizeMs); 1559a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Second packet arrival. 1569a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Expect detector update method to be called once with inter-arrival time 1579a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // equal to 1 packet, and (base) target level equal to 1 as well. 1589a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Return false to indicate no peaks found. 1599a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, Update(2, 2)) 1609a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .WillOnce(Return(false)); 1619a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org InsertNextPacket(); 1629a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(2 << 8, dm_->TargetLevel()); // In Q8. 1639a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(2, dm_->base_target_level()); 1649a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org int lower, higher; 1659a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org dm_->BufferLimits(&lower, &higher); 1669a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Expect |lower| to be 75% of target level, and |higher| to be target level, 1679a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // but also at least 20 ms higher than |lower|, which is the limiting case 1689a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // here. 1699a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ((2 << 8) * 3 / 4, lower); 1709a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher); 1719a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 1729a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 1739a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, UpdatePeakFound) { 1749a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org SetPacketAudioLength(kFrameSizeMs); 1759a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // First packet arrival. 1769a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org InsertNextPacket(); 1779a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Advance time by one frame size. 1789a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org IncreaseTime(kFrameSizeMs); 1799a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Second packet arrival. 1809a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Expect detector update method to be called once with inter-arrival time 1819a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // equal to 1 packet, and (base) target level equal to 1 as well. 1829a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Return true to indicate that peaks are found. Let the peak height be 5. 1839a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, Update(1, 1)) 1849a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .WillOnce(Return(true)); 1859a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, MaxPeakHeight()) 1869a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .WillOnce(Return(5)); 1879a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org InsertNextPacket(); 1889a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(5 << 8, dm_->TargetLevel()); 1899a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(1, dm_->base_target_level()); // Base target level is w/o peaks. 1909a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org int lower, higher; 1919a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org dm_->BufferLimits(&lower, &higher); 1929a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Expect |lower| to be 75% of target level, and |higher| to be target level. 1939a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ((5 << 8) * 3 / 4, lower); 1949a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(5 << 8, higher); 1959a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 1969a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 197662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.orgTEST_F(DelayManagerTest, TargetDelay) { 1989a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org SetPacketAudioLength(kFrameSizeMs); 1999a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // First packet arrival. 2009a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org InsertNextPacket(); 2019a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Advance time by one frame size. 2029a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org IncreaseTime(kFrameSizeMs); 2039a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Second packet arrival. 2049a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Expect detector update method to be called once with inter-arrival time 2059a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // equal to 1 packet, and (base) target level equal to 1 as well. 2069a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Return false to indicate no peaks found. 2079a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_CALL(detector_, Update(1, 1)) 2089a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org .WillOnce(Return(false)); 2099a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org InsertNextPacket(); 210662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org const int kExpectedTarget = 1; 2119a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); // In Q8. 2129a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(1, dm_->base_target_level()); 2139a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org int lower, higher; 2149a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org dm_->BufferLimits(&lower, &higher); 215662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // Expect |lower| to be 75% of base target level, and |higher| to be 216662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // lower + 20 ms headroom. 217662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_EQ((1 << 8) * 3 / 4, lower); 2189a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher); 2199a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 2209a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 221662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.orgTEST_F(DelayManagerTest, MaxAndRequiredDelay) { 222662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org const int kExpectedTarget = 5; 223662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org const int kTimeIncrement = kExpectedTarget * kFrameSizeMs; 224662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org SetPacketAudioLength(kFrameSizeMs); 225662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // First packet arrival. 226662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org InsertNextPacket(); 227662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // Second packet arrival. 228662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // Expect detector update method to be called once with inter-arrival time 229662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // equal to |kExpectedTarget| packet. Return true to indicate peaks found. 230662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_CALL(detector_, Update(kExpectedTarget, _)) 231662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org .WillRepeatedly(Return(true)); 232662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_CALL(detector_, MaxPeakHeight()) 233662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org .WillRepeatedly(Return(kExpectedTarget)); 234662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org IncreaseTime(kTimeIncrement); 235662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org InsertNextPacket(); 236662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org 237662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // No limit is set. 238662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); 239662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org 240662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org int kMaxDelayPackets = kExpectedTarget - 2; 241662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org int kMaxDelayMs = kMaxDelayPackets * kFrameSizeMs; 242662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs)); 243662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org IncreaseTime(kTimeIncrement); 244662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org InsertNextPacket(); 245662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_EQ(kExpectedTarget * kFrameSizeMs, dm_->least_required_delay_ms()); 246662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_EQ(kMaxDelayPackets << 8, dm_->TargetLevel()); 247662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org 248662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // Target level at least should be one packet. 249662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1)); 250662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org} 251662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org 252662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.orgTEST_F(DelayManagerTest, MinAndRequiredDelay) { 253662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org const int kExpectedTarget = 5; 254662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org const int kTimeIncrement = kExpectedTarget * kFrameSizeMs; 255662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org SetPacketAudioLength(kFrameSizeMs); 256662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // First packet arrival. 257662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org InsertNextPacket(); 258662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // Second packet arrival. 259662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // Expect detector update method to be called once with inter-arrival time 260662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // equal to |kExpectedTarget| packet. Return true to indicate peaks found. 261662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_CALL(detector_, Update(kExpectedTarget, _)) 262662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org .WillRepeatedly(Return(true)); 263662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_CALL(detector_, MaxPeakHeight()) 264662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org .WillRepeatedly(Return(kExpectedTarget)); 265662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org IncreaseTime(kTimeIncrement); 266662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org InsertNextPacket(); 267662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org 268662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // No limit is applied. 269662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel()); 270662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org 271662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org int kMinDelayPackets = kExpectedTarget + 2; 272662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org int kMinDelayMs = kMinDelayPackets * kFrameSizeMs; 273662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org dm_->SetMinimumDelay(kMinDelayMs); 274662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org IncreaseTime(kTimeIncrement); 275662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org InsertNextPacket(); 276662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_EQ(kExpectedTarget * kFrameSizeMs, dm_->least_required_delay_ms()); 277662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel()); 278662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org} 279662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org 2809a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.orgTEST_F(DelayManagerTest, Failures) { 2819a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Wrong sample rate. 2829a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(-1, dm_->Update(0, 0, -1)); 2839a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org // Wrong packet size. 2849a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(-1, dm_->SetPacketAudioLength(0)); 2859a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1)); 286662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org 287662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // Minimum delay higher than a maximum delay is not accepted. 288662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_TRUE(dm_->SetMaximumDelay(10)); 289662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_FALSE(dm_->SetMinimumDelay(20)); 290662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org 291662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org // Maximum delay less than minimum delay is not accepted. 292662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_TRUE(dm_->SetMaximumDelay(100)); 293662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_TRUE(dm_->SetMinimumDelay(80)); 294662ded4a6ddcecf571d31a9ba1469d50652fe0f9turaj@webrtc.org EXPECT_FALSE(dm_->SetMaximumDelay(60)); 2959a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} 2969a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org 2979a400812ca0006d12e538d465ab6728a8ecd07aahenrik.lundin@webrtc.org} // namespace webrtc 298