17959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org/* 27959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 37959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org * 47959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org * Use of this source code is governed by a BSD-style license 57959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org * that can be found in the LICENSE file in the root of the source 67959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org * tree. An additional intellectual property rights grant can be found 77959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org * in the file PATENTS. All contributing project authors may 87959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org * be found in the AUTHORS file in the root of the source tree. 97959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org */ 107959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 113ecc162d010d9943925be27773f73b901904bff1pbos@webrtc.org#include <string.h> 127959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 133c0aae17f0e3a70fe90ecc6835926b66a3de18fbkjellander@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 143e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#include "webrtc/modules/audio_coding/acm2/initial_delay_manager.h" 157959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 167959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgnamespace webrtc { 177959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 186d5d2480757a87c7f2fb40be88cfdeca419fc6a4turaj@webrtc.orgnamespace acm2 { 196d5d2480757a87c7f2fb40be88cfdeca419fc6a4turaj@webrtc.org 207959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgnamespace { 217959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 227959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgconst uint8_t kAudioPayloadType = 0; 237959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgconst uint8_t kCngPayloadType = 1; 247959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgconst uint8_t kAvtPayloadType = 2; 257959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 267959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgconst int kSamplingRateHz = 16000; 277959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgconst int kInitDelayMs = 200; 287959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgconst int kFrameSizeMs = 20; 297959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgconst uint32_t kTimestampStep = kFrameSizeMs * kSamplingRateHz / 1000; 307959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgconst int kLatePacketThreshold = 5; 317959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 327959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgvoid InitRtpInfo(WebRtcRTPHeader* rtp_info) { 337959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org memset(rtp_info, 0, sizeof(*rtp_info)); 347959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.markerBit = false; 357959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.payloadType = kAudioPayloadType; 367959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.sequenceNumber = 1234; 377959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.timestamp = 0xFFFFFFFD; // Close to wrap around. 387959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.ssrc = 0x87654321; // Arbitrary. 397959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.numCSRCs = 0; // Arbitrary. 407959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.paddingLength = 0; 417959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.headerLength = sizeof(RTPHeader); 427959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.payload_type_frequency = kSamplingRateHz; 437959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.extension.absoluteSendTime = 0; 447959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.extension.transmissionTimeOffset = 0; 457959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->frameType = kAudioFrameSpeech; 467959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} 477959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 487959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgvoid ForwardRtpHeader(int n, 497959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org WebRtcRTPHeader* rtp_info, 507959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org uint32_t* rtp_receive_timestamp) { 517959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.sequenceNumber += n; 527959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info->header.timestamp += n * kTimestampStep; 537959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org *rtp_receive_timestamp += n * kTimestampStep; 547959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} 557959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 567959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgvoid NextRtpHeader(WebRtcRTPHeader* rtp_info, 577959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org uint32_t* rtp_receive_timestamp) { 587959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ForwardRtpHeader(1, rtp_info, rtp_receive_timestamp); 597959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} 607959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 617959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} // namespace 627959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 637959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgclass InitialDelayManagerTest : public ::testing::Test { 647959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org protected: 657959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManagerTest() 667959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org : manager_(new InitialDelayManager(kInitDelayMs, kLatePacketThreshold)), 677959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_receive_timestamp_(1111) { } // Arbitrary starting point. 687959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 697959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org virtual void SetUp() { 707959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ASSERT_TRUE(manager_.get() != NULL); 717959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitRtpInfo(&rtp_info_); 727959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org } 737959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 747959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org void GetNextRtpHeader(WebRtcRTPHeader* rtp_info, 757959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org uint32_t* rtp_receive_timestamp) const { 767959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org memcpy(rtp_info, &rtp_info_, sizeof(*rtp_info)); 777959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org *rtp_receive_timestamp = rtp_receive_timestamp_; 787959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(rtp_info, rtp_receive_timestamp); 797959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org } 807959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 8100b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<InitialDelayManager> manager_; 827959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org WebRtcRTPHeader rtp_info_; 837959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org uint32_t rtp_receive_timestamp_; 847959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org}; 857959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 867959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgTEST_F(InitialDelayManagerTest, Init) { 877959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_TRUE(manager_->buffering()); 887959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_FALSE(manager_->PacketBuffered()); 897959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->DisableBuffering(); 907959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_FALSE(manager_->buffering()); 917959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::SyncStream sync_stream; 927959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 937959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Call before any packet inserted. 947959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->LatePackets(0x6789ABCD, &sync_stream); // Arbitrary but large 957959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // receive timestamp. 967959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, sync_stream.num_sync_packets); 977959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 987959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Insert non-audio packets, a CNG and DTMF. 997959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info_.header.payloadType = kCngPayloadType; 1007959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 1017959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kCngPacket, false, 1027959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 1037959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, sync_stream.num_sync_packets); 1047959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ForwardRtpHeader(5, &rtp_info_, &rtp_receive_timestamp_); 1057959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info_.header.payloadType = kAvtPayloadType; 1067959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 1077959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAvtPacket, false, 1087959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 1097959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Gap in sequence numbers but no audio received, sync-stream should be empty. 1107959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, sync_stream.num_sync_packets); 1117959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->LatePackets(0x45678987, &sync_stream); // Large arbitrary receive 1127959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // timestamp. 1137959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // |manager_| has no estimate of timestamp-step and has not received any 1147959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // audio packet. 1157959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, sync_stream.num_sync_packets); 1167959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1177959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1187959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(&rtp_info_, &rtp_receive_timestamp_); 1197959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info_.header.payloadType = kAudioPayloadType; 1207959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // First packet. 1217959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 1227959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, true, 1237959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 1247959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, sync_stream.num_sync_packets); 1257959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1267959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Call LatePAcket() after only one packet inserted. 1277959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->LatePackets(0x6789ABCD, &sync_stream); // Arbitrary but large 1287959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // receive timestamp. 1297959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, sync_stream.num_sync_packets); 1307959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1317959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Gap in timestamp, but this packet is also flagged as "new," therefore, 1327959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // expecting empty sync-stream. 1337959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ForwardRtpHeader(5, &rtp_info_, &rtp_receive_timestamp_); 1347959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 1357959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, true, 1367959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 1377959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} 1387959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1397959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgTEST_F(InitialDelayManagerTest, MissingPacket) { 1407959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::SyncStream sync_stream; 1417959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // First packet. 1427959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 1437959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, true, 1447959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 1457959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ASSERT_EQ(0, sync_stream.num_sync_packets); 1467959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1477959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Second packet. 1487959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(&rtp_info_, &rtp_receive_timestamp_); 1497959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 1507959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, false, 1517959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 1527959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ASSERT_EQ(0, sync_stream.num_sync_packets); 1537959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1547959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Third packet, missing packets start from here. 1557959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(&rtp_info_, &rtp_receive_timestamp_); 1567959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1577959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // First sync-packet in sync-stream is one after the above packet. 1587959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org WebRtcRTPHeader expected_rtp_info; 1597959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org uint32_t expected_receive_timestamp; 1607959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org GetNextRtpHeader(&expected_rtp_info, &expected_receive_timestamp); 1617959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1627959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org const int kNumMissingPackets = 10; 1637959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ForwardRtpHeader(kNumMissingPackets, &rtp_info_, &rtp_receive_timestamp_); 1647959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 1657959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, false, 1667959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 1677959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(kNumMissingPackets - 2, sync_stream.num_sync_packets); 1687959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, memcmp(&expected_rtp_info, &sync_stream.rtp_info, 1697959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org sizeof(expected_rtp_info))); 1707959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(kTimestampStep, sync_stream.timestamp_step); 1717959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(expected_receive_timestamp, sync_stream.receive_timestamp); 1727959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} 1737959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1747959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org// There hasn't been any consecutive packets to estimate timestamp-step. 1757959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgTEST_F(InitialDelayManagerTest, MissingPacketEstimateTimestamp) { 1767959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::SyncStream sync_stream; 1777959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // First packet. 1787959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 1797959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, true, 1807959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 1817959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ASSERT_EQ(0, sync_stream.num_sync_packets); 1827959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1837959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Second packet, missing packets start here. 1847959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(&rtp_info_, &rtp_receive_timestamp_); 1857959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1867959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // First sync-packet in sync-stream is one after the above. 1877959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org WebRtcRTPHeader expected_rtp_info; 1887959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org uint32_t expected_receive_timestamp; 1897959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org GetNextRtpHeader(&expected_rtp_info, &expected_receive_timestamp); 1907959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 1917959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org const int kNumMissingPackets = 10; 1927959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ForwardRtpHeader(kNumMissingPackets, &rtp_info_, &rtp_receive_timestamp_); 1937959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 1947959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, false, 1957959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 1967959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(kNumMissingPackets - 2, sync_stream.num_sync_packets); 1977959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, memcmp(&expected_rtp_info, &sync_stream.rtp_info, 1987959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org sizeof(expected_rtp_info))); 1997959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} 2007959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2017959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgTEST_F(InitialDelayManagerTest, MissingPacketWithCng) { 2027959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::SyncStream sync_stream; 2037959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2047959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // First packet. 2057959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 2067959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, true, 2077959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 2087959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ASSERT_EQ(0, sync_stream.num_sync_packets); 2097959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2107959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Second packet as CNG. 2117959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(&rtp_info_, &rtp_receive_timestamp_); 2127959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info_.header.payloadType = kCngPayloadType; 2137959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 2147959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kCngPacket, false, 2157959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 2167959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ASSERT_EQ(0, sync_stream.num_sync_packets); 2177959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2187959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Audio packet after CNG. Missing packets start from this packet. 2197959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info_.header.payloadType = kAudioPayloadType; 2207959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(&rtp_info_, &rtp_receive_timestamp_); 2217959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2227959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Timestamps are increased higher than regular packet. 2237959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org const uint32_t kCngTimestampStep = 5 * kTimestampStep; 2247959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info_.header.timestamp += kCngTimestampStep; 2257959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_receive_timestamp_ += kCngTimestampStep; 2267959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2277959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // First sync-packet in sync-stream is the one after the above packet. 2287959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org WebRtcRTPHeader expected_rtp_info; 2297959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org uint32_t expected_receive_timestamp; 2307959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org GetNextRtpHeader(&expected_rtp_info, &expected_receive_timestamp); 2317959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2327959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org const int kNumMissingPackets = 10; 2337959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ForwardRtpHeader(kNumMissingPackets, &rtp_info_, &rtp_receive_timestamp_); 2347959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 2357959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, false, 2367959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 2377959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(kNumMissingPackets - 2, sync_stream.num_sync_packets); 2387959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, memcmp(&expected_rtp_info, &sync_stream.rtp_info, 2397959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org sizeof(expected_rtp_info))); 2407959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(kTimestampStep, sync_stream.timestamp_step); 2417959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(expected_receive_timestamp, sync_stream.receive_timestamp); 2427959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} 2437959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2447959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgTEST_F(InitialDelayManagerTest, LatePacket) { 2457959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::SyncStream sync_stream; 2467959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // First packet. 2477959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 2487959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, true, 2497959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 2507959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ASSERT_EQ(0, sync_stream.num_sync_packets); 2517959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2527959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Second packet. 2537959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(&rtp_info_, &rtp_receive_timestamp_); 2547959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 2557959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, false, 2567959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 2577959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ASSERT_EQ(0, sync_stream.num_sync_packets); 2587959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2597959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Timestamp increment for 10ms; 2607959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org const uint32_t kTimestampStep10Ms = kSamplingRateHz / 100; 2617959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2627959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // 10 ms after the second packet is inserted. 2637959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org uint32_t timestamp_now = rtp_receive_timestamp_ + kTimestampStep10Ms; 2647959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2657959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Third packet, late packets start from this packet. 2667959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(&rtp_info_, &rtp_receive_timestamp_); 2677959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2687959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // First sync-packet in sync-stream, which is one after the above packet. 2697959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org WebRtcRTPHeader expected_rtp_info; 2707959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org uint32_t expected_receive_timestamp; 2717959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org GetNextRtpHeader(&expected_rtp_info, &expected_receive_timestamp); 2727959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2737959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org const int kLatePacketThreshold = 5; 2747959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2757959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org int expected_num_late_packets = kLatePacketThreshold - 1; 2767959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org for (int k = 0; k < 2; ++k) { 2777959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org for (int n = 1; n < kLatePacketThreshold * kFrameSizeMs / 10; ++n) { 2787959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->LatePackets(timestamp_now, &sync_stream); 2797959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, sync_stream.num_sync_packets) << 2807959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org "try " << k << " loop number " << n; 2817959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org timestamp_now += kTimestampStep10Ms; 2827959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org } 2837959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->LatePackets(timestamp_now, &sync_stream); 2847959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2857959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(expected_num_late_packets, sync_stream.num_sync_packets) << 2867959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org "try " << k; 2877959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(kTimestampStep, sync_stream.timestamp_step) << 2887959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org "try " << k; 2897959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(expected_receive_timestamp, sync_stream.receive_timestamp) << 2907959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org "try " << k; 2917959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, memcmp(&expected_rtp_info, &sync_stream.rtp_info, 2927959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org sizeof(expected_rtp_info))); 2937959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2947959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org timestamp_now += kTimestampStep10Ms; 2957959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 2967959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // |manger_| assumes the |sync_stream| obtained by LatePacket() is fully 2977959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // injected. The last injected packet is sync-packet, therefore, there will 2987959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // not be any gap between sync stream of this and the next iteration. 2997959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ForwardRtpHeader(sync_stream.num_sync_packets, &expected_rtp_info, 3007959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org &expected_receive_timestamp); 3017959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org expected_num_late_packets = kLatePacketThreshold; 3027959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org } 3037959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3047959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Test "no-gap" for missing packet after late packet. 3057959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // |expected_rtp_info| is the expected sync-packet if any packet is missing. 3067959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org memcpy(&rtp_info_, &expected_rtp_info, sizeof(rtp_info_)); 3077959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_receive_timestamp_ = expected_receive_timestamp; 3087959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3097959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org int kNumMissingPackets = 3; // Arbitrary. 3107959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ForwardRtpHeader(kNumMissingPackets, &rtp_info_, &rtp_receive_timestamp_); 3117959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 3127959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, false, 3137959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 3147959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3157959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Note that there is one packet gap between the last sync-packet and the 3167959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // latest inserted packet. 3177959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(kNumMissingPackets - 1, sync_stream.num_sync_packets); 3187959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(kTimestampStep, sync_stream.timestamp_step); 3197959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(expected_receive_timestamp, sync_stream.receive_timestamp); 3207959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, memcmp(&expected_rtp_info, &sync_stream.rtp_info, 3217959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org sizeof(expected_rtp_info))); 3227959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} 3237959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3247959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgTEST_F(InitialDelayManagerTest, NoLatePacketAfterCng) { 3257959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::SyncStream sync_stream; 3267959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3277959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // First packet. 3287959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 3297959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, true, 3307959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 3317959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ASSERT_EQ(0, sync_stream.num_sync_packets); 3327959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3337959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Second packet as CNG. 3347959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(&rtp_info_, &rtp_receive_timestamp_); 3357959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org rtp_info_.header.payloadType = kCngPayloadType; 3367959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 3377959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kCngPacket, false, 3387959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kSamplingRateHz, &sync_stream); 3397959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org ASSERT_EQ(0, sync_stream.num_sync_packets); 3407959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3417959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Forward the time more then |kLatePacketThreshold| packets. 3427959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org uint32_t timestamp_now = rtp_receive_timestamp_ + kTimestampStep * (3 + 3437959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kLatePacketThreshold); 3447959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3457959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->LatePackets(timestamp_now, &sync_stream); 3467959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, sync_stream.num_sync_packets); 3477959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} 3487959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3497959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.orgTEST_F(InitialDelayManagerTest, BufferingAudio) { 3507959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::SyncStream sync_stream; 3517959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3527959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org // Very first packet is not counted in calculation of buffered audio. 3537959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org for (int n = 0; n < kInitDelayMs / kFrameSizeMs; ++n) { 3547959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 3557959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, 3567959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org n == 0, kSamplingRateHz, &sync_stream); 3577959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, sync_stream.num_sync_packets); 3587959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_TRUE(manager_->buffering()); 3597959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org const uint32_t expected_playout_timestamp = rtp_info_.header.timestamp - 3607959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org kInitDelayMs * kSamplingRateHz / 1000; 36194454b71adc37e15fd3f5a5fc432063f05caabcbwu@webrtc.org uint32_t actual_playout_timestamp = 0; 36294454b71adc37e15fd3f5a5fc432063f05caabcbwu@webrtc.org EXPECT_TRUE(manager_->GetPlayoutTimestamp(&actual_playout_timestamp)); 36394454b71adc37e15fd3f5a5fc432063f05caabcbwu@webrtc.org EXPECT_EQ(expected_playout_timestamp, actual_playout_timestamp); 3647959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org NextRtpHeader(&rtp_info_, &rtp_receive_timestamp_); 3657959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org } 3667959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3677959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org manager_->UpdateLastReceivedPacket(rtp_info_, rtp_receive_timestamp_, 3687959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org InitialDelayManager::kAudioPacket, 3697959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org false, kSamplingRateHz, &sync_stream); 3707959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_EQ(0, sync_stream.num_sync_packets); 3717959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org EXPECT_FALSE(manager_->buffering()); 3727959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} 3737959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org 3746d5d2480757a87c7f2fb40be88cfdeca419fc6a4turaj@webrtc.org} // namespace acm2 3756d5d2480757a87c7f2fb40be88cfdeca419fc6a4turaj@webrtc.org 3767959e16cc2da9ebf5eda61bdf0eb423d8d3006baturaj@webrtc.org} // namespace webrtc 377