aboutsummaryrefslogtreecommitdiff
path: root/cast/streaming/rtp_time_unittest.cc
blob: 44312e7bfaac1d8263a7c81a67fb0181f57aed3c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cast/streaming/rtp_time.h"

#include "gtest/gtest.h"

namespace cast {
namespace streaming {

// Tests that conversions between std::chrono durations and RtpTimeDelta are
// accurate.  Note that this implicitly tests the conversions to/from
// RtpTimeTicks as well due to shared implementation.
TEST(RtpTimeDeltaTest, ConversionToAndFromDurations) {
  using std::chrono::microseconds;
  using std::chrono::milliseconds;
  using std::chrono::seconds;

  constexpr int kTimebase = 48000;

  // Origin in both timelines is equivalent.
  ASSERT_EQ(RtpTimeDelta(), RtpTimeDelta::FromTicks(0));
  ASSERT_EQ(RtpTimeDelta(),
            RtpTimeDelta::FromDuration(microseconds(0), kTimebase));
  ASSERT_EQ(microseconds::zero(),
            RtpTimeDelta::FromTicks(0).ToDuration<microseconds>(kTimebase));

  // Conversions that are exact (i.e., do not require rounding).
  ASSERT_EQ(RtpTimeDelta::FromTicks(480),
            RtpTimeDelta::FromDuration(milliseconds(10), kTimebase));
  ASSERT_EQ(RtpTimeDelta::FromTicks(96000),
            RtpTimeDelta::FromDuration(seconds(2), kTimebase));
  ASSERT_EQ(milliseconds(10),
            RtpTimeDelta::FromTicks(480).ToDuration<microseconds>(kTimebase));
  ASSERT_EQ(seconds(2),
            RtpTimeDelta::FromTicks(96000).ToDuration<microseconds>(kTimebase));

  // Conversions that are approximate (i.e., are rounded).
  for (int error_us = -3; error_us <= +3; ++error_us) {
    ASSERT_EQ(
        RtpTimeDelta::FromTicks(0),
        RtpTimeDelta::FromDuration(microseconds(0 + error_us), kTimebase));
    ASSERT_EQ(
        RtpTimeDelta::FromTicks(1),
        RtpTimeDelta::FromDuration(microseconds(21 + error_us), kTimebase));
    ASSERT_EQ(
        RtpTimeDelta::FromTicks(2),
        RtpTimeDelta::FromDuration(microseconds(42 + error_us), kTimebase));
    ASSERT_EQ(
        RtpTimeDelta::FromTicks(3),
        RtpTimeDelta::FromDuration(microseconds(63 + error_us), kTimebase));
    ASSERT_EQ(
        RtpTimeDelta::FromTicks(4),
        RtpTimeDelta::FromDuration(microseconds(83 + error_us), kTimebase));
    ASSERT_EQ(
        RtpTimeDelta::FromTicks(11200000000000),
        RtpTimeDelta::FromDuration(
            microseconds(INT64_C(233333333333333) + error_us), kTimebase));
  }
  ASSERT_EQ(microseconds(21),
            RtpTimeDelta::FromTicks(1).ToDuration<microseconds>(kTimebase));
  ASSERT_EQ(microseconds(42),
            RtpTimeDelta::FromTicks(2).ToDuration<microseconds>(kTimebase));
  ASSERT_EQ(microseconds(63),
            RtpTimeDelta::FromTicks(3).ToDuration<microseconds>(kTimebase));
  ASSERT_EQ(microseconds(83),
            RtpTimeDelta::FromTicks(4).ToDuration<microseconds>(kTimebase));
  ASSERT_EQ(microseconds(INT64_C(233333333333333)),
            RtpTimeDelta::FromTicks(11200000000000)
                .ToDuration<microseconds>(kTimebase));
}

}  // namespace streaming
}  // namespace cast