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, ×tamp_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, ×tamp_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, ×tamp_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, ×tamp_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, ×tamp_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, ×tamp_in_ms)); 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; // namespace webrtc 147