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