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