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