1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11d5d709e492b5592114ecc197516a453acfee46dfpbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
12d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org#include "webrtc/system_wrappers/interface/rtp_to_ntp.h"
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(WrapAroundTests, NoWrap) {
17d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(0, CheckForWrapArounds(0xFFFFFFFF, 0xFFFFFFFE));
18d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(0, CheckForWrapArounds(1, 0));
19d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(0, CheckForWrapArounds(0x00010000, 0x0000FFFF));
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(WrapAroundTests, ForwardWrap) {
23d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(1, CheckForWrapArounds(0, 0xFFFFFFFF));
24d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(1, CheckForWrapArounds(0, 0xFFFF0000));
25d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(1, CheckForWrapArounds(0x0000FFFF, 0xFFFFFFFF));
26d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(1, CheckForWrapArounds(0x0000FFFF, 0xFFFF0000));
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(WrapAroundTests, BackwardWrap) {
30d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(-1, CheckForWrapArounds(0xFFFFFFFF, 0));
31d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(-1, CheckForWrapArounds(0xFFFF0000, 0));
32d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(-1, CheckForWrapArounds(0xFFFFFFFF, 0x0000FFFF));
33d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_EQ(-1, CheckForWrapArounds(0xFFFF0000, 0x0000FFFF));
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(WrapAroundTests, OldRtcpWrapped) {
37d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  RtcpList rtcp;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_sec = 0;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_frac = 0;
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t timestamp = 0;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kOneMsInNtpFrac = 4294967;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kTimestampTicksPerMs = 90;
43d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp -= kTimestampTicksPerMs;
46d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp -= kTimestampTicksPerMs;
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int64_t timestamp_in_ms = -1;
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // This expected to fail since it's highly unlikely that the older RTCP
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // has a much smaller RTP timestamp than the newer.
52d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_FALSE(RtpToNtpMs(timestamp, rtcp, &timestamp_in_ms));
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(WrapAroundTests, NewRtcpWrapped) {
56d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  RtcpList rtcp;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_sec = 0;
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_frac = 0;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t timestamp = 0xFFFFFFFF;
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kOneMsInNtpFrac = 4294967;
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kTimestampTicksPerMs = 90;
62d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp += kTimestampTicksPerMs;
65d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int64_t timestamp_in_ms = -1;
67d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_TRUE(RtpToNtpMs(rtcp.back().rtp_timestamp, rtcp, &timestamp_in_ms));
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Since this RTP packet has the same timestamp as the RTCP packet constructed
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // at time 0 it should be mapped to 0 as well.
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, timestamp_in_ms);
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(WrapAroundTests, RtpWrapped) {
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kOneMsInNtpFrac = 4294967;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kTimestampTicksPerMs = 90;
76d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  RtcpList rtcp;
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_sec = 0;
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_frac = 0;
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t timestamp = 0xFFFFFFFF - 2 * kTimestampTicksPerMs;
80d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp += kTimestampTicksPerMs;
83d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp += kTimestampTicksPerMs;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int64_t timestamp_in_ms = -1;
87d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_TRUE(RtpToNtpMs(timestamp, rtcp, &timestamp_in_ms));
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Since this RTP packet has the same timestamp as the RTCP packet constructed
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // at time 0 it should be mapped to 0 as well.
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(2, timestamp_in_ms);
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(WrapAroundTests, OldRtp_RtcpsWrapped) {
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kOneMsInNtpFrac = 4294967;
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kTimestampTicksPerMs = 90;
96d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  RtcpList rtcp;
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_sec = 0;
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_frac = 0;
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t timestamp = 0;
100d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp += kTimestampTicksPerMs;
103d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp -= 2*kTimestampTicksPerMs;
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int64_t timestamp_in_ms = -1;
107d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_FALSE(RtpToNtpMs(timestamp, rtcp, &timestamp_in_ms));
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(WrapAroundTests, OldRtp_NewRtcpWrapped) {
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kOneMsInNtpFrac = 4294967;
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kTimestampTicksPerMs = 90;
113d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  RtcpList rtcp;
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_sec = 0;
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_frac = 0;
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t timestamp = 0xFFFFFFFF;
117d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp += kTimestampTicksPerMs;
120d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp -= kTimestampTicksPerMs;
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int64_t timestamp_in_ms = -1;
124d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_TRUE(RtpToNtpMs(timestamp, rtcp, &timestamp_in_ms));
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Constructed at the same time as the first RTCP and should therefore be
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // mapped to zero.
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, timestamp_in_ms);
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST(WrapAroundTests, OldRtp_OldRtcpWrapped) {
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kOneMsInNtpFrac = 4294967;
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const uint32_t kTimestampTicksPerMs = 90;
133d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  RtcpList rtcp;
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_sec = 0;
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t ntp_frac = 0;
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t timestamp = 0;
137d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp -= kTimestampTicksPerMs;
140d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  rtcp.push_front(RtcpMeasurement(ntp_sec, ntp_frac, timestamp));
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ntp_frac += kOneMsInNtpFrac;
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  timestamp += 2*kTimestampTicksPerMs;
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int64_t timestamp_in_ms = -1;
144d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  EXPECT_FALSE(RtpToNtpMs(timestamp, rtcp, &timestamp_in_ms));
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};  // namespace webrtc
147