OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef MEDIA_CAST_COMMON_RTP_TIME_H_ |
| 6 #define MEDIA_CAST_COMMON_RTP_TIME_H_ |
| 7 |
| 8 #include <stdint.h> |
| 9 |
| 10 #include <limits> |
| 11 #include <sstream> |
| 12 |
| 13 #include "base/time/time.h" |
| 14 #include "media/cast/common/expanded_value_base.h" |
| 15 |
| 16 namespace media { |
| 17 namespace cast { |
| 18 |
| 19 // Forward declarations (see below). |
| 20 class RtpTimeDelta; |
| 21 class RtpTimeTicks; |
| 22 |
| 23 // Convenience operator overloads for logging. |
| 24 std::ostream& operator<<(std::ostream& out, const RtpTimeDelta rhs); |
| 25 std::ostream& operator<<(std::ostream& out, const RtpTimeTicks rhs); |
| 26 |
| 27 // The difference between two RtpTimeTicks values. This data type is modeled |
| 28 // off of base::TimeDelta, and used for performing compiler-checked arithmetic |
| 29 // with RtpTimeTicks. |
| 30 // |
| 31 // This data type wraps a value, providing only the meaningful set of math |
| 32 // operations that may be performed on the value. RtpTimeDeltas may be |
| 33 // added/subtracted with other RtpTimeDeltas to produce a RtpTimeDelta holding |
| 34 // the sum/difference. RtpTimeDeltas may also be multiplied or divided by |
| 35 // integer amounts. Finally, RtpTimeDeltas may be divided by other |
| 36 // RtpTimeDeltas to compute a number of periods (floor'ed to an integer), or |
| 37 // modulo each other to determine a time period remainder. |
| 38 // |
| 39 // The base class provides bit truncation/extension features for |
| 40 // wire-formatting, and also the comparison operators. |
| 41 // |
| 42 // Usage example: |
| 43 // |
| 44 // // Time math. |
| 45 // RtpTimeDelta zero; |
| 46 // RtpTimeDelta one_second_later = |
| 47 // zero + RtpTimeDelta::FromTicks(kAudioSamplingRate); |
| 48 // RtpTimeDelta ten_seconds_later = one_second_later * 10; |
| 49 // int64_t ten_periods = ten_seconds_later / one_second_later; |
| 50 // |
| 51 // // Logging convenience. |
| 52 // DLOG(INFO) << "The RTP time offset is " << ten_seconds_later; |
| 53 // |
| 54 // // Convert (approximately!) between RTP timebase and microsecond timebase: |
| 55 // base::TimeDelta nine_seconds_offset = |
| 56 // (ten_seconds_later - one_second_later).ToTimeDelta(kAudioSamplingRate); |
| 57 // RtpTimeDelta nine_seconds_rtp = |
| 58 // RtpTimeDelta::FromTimeDelta(nine_seconds_offset, kAudioSamplingRate); |
| 59 class RtpTimeDelta : public ExpandedValueBase<int64_t, RtpTimeDelta> { |
| 60 public: |
| 61 RtpTimeDelta() : ExpandedValueBase(0) {} |
| 62 |
| 63 // Arithmetic operators (with other deltas). |
| 64 RtpTimeDelta operator+(RtpTimeDelta rhs) const { |
| 65 return RtpTimeDelta(value_ + rhs.value_); |
| 66 } |
| 67 RtpTimeDelta operator-(RtpTimeDelta rhs) const { |
| 68 return RtpTimeDelta(value_ - rhs.value_); |
| 69 } |
| 70 RtpTimeDelta& operator+=(RtpTimeDelta rhs) { return (*this = (*this + rhs)); } |
| 71 RtpTimeDelta& operator-=(RtpTimeDelta rhs) { return (*this = (*this - rhs)); } |
| 72 RtpTimeDelta operator-() const { return RtpTimeDelta(-value_); } |
| 73 |
| 74 // Multiplicative operators (with other deltas). |
| 75 int64_t operator/(RtpTimeDelta rhs) const { return value_ / rhs.value_; } |
| 76 RtpTimeDelta operator%(RtpTimeDelta rhs) const { |
| 77 return RtpTimeDelta(value_ % rhs.value_); |
| 78 } |
| 79 RtpTimeDelta& operator%=(RtpTimeDelta rhs) { return (*this = (*this % rhs)); } |
| 80 |
| 81 // Multiplicative operators (with integer types). |
| 82 template <typename IntType> |
| 83 RtpTimeDelta operator*(IntType rhs) const { |
| 84 static_assert(std::numeric_limits<IntType>::is_integer, |
| 85 "|rhs| must be a POD integer type"); |
| 86 return RtpTimeDelta(value_ * rhs); |
| 87 } |
| 88 template <typename IntType> |
| 89 RtpTimeDelta operator/(IntType rhs) const { |
| 90 static_assert(std::numeric_limits<IntType>::is_integer, |
| 91 "|rhs| must be a POD integer type"); |
| 92 return RtpTimeDelta(value_ / rhs); |
| 93 } |
| 94 template <typename IntType> |
| 95 RtpTimeDelta& operator*=(IntType rhs) { return (*this = (*this * rhs)); } |
| 96 template <typename IntType> |
| 97 RtpTimeDelta& operator/=(IntType rhs) { return (*this = (*this / rhs)); } |
| 98 |
| 99 // Maps this RtpTimeDelta to an approximate TimeDelta using the given |
| 100 // RTP timebase. Assumes a zero-valued TimeDelta corresponds to a zero-valued |
| 101 // RtpTimeDelta. |
| 102 base::TimeDelta ToTimeDelta(int rtp_timebase) const; |
| 103 |
| 104 // Maps the TimeDelta to an approximate RtpTimeDelta using the given RTP |
| 105 // timebase. Assumes a zero-valued TimeDelta corresponds to a zero-valued |
| 106 // RtpTimeDelta. |
| 107 static RtpTimeDelta FromTimeDelta(base::TimeDelta delta, int rtp_timebase); |
| 108 |
| 109 // Construct a RtpTimeDelta from an exact number of ticks. |
| 110 static RtpTimeDelta FromTicks(int64_t ticks); |
| 111 |
| 112 private: |
| 113 friend class ExpandedValueBase<int64_t, RtpTimeDelta>; |
| 114 friend class RtpTimeTicks; |
| 115 friend std::ostream& operator<<(std::ostream& out, const RtpTimeDelta rhs); |
| 116 |
| 117 explicit RtpTimeDelta(int64_t ticks) : ExpandedValueBase(ticks) {} |
| 118 |
| 119 int64_t value() const { return value_; } |
| 120 }; |
| 121 |
| 122 // A media timestamp whose timebase matches the periodicity of the content |
| 123 // (e.g., for audio, the timebase would be the sampling frequency). This data |
| 124 // type is modeled off of base::TimeTicks. |
| 125 // |
| 126 // This data type wraps a value, providing only the meaningful set of math |
| 127 // operations that may be performed on the value. The difference between two |
| 128 // RtpTimeTicks is a RtpTimeDelta. Likewise, adding or subtracting a |
| 129 // RtpTimeTicks with a RtpTimeDelta produces an off-set RtpTimeTicks. |
| 130 // |
| 131 // The base class provides bit truncation/extension features for |
| 132 // wire-formatting, and also the comparison operators. |
| 133 // |
| 134 // Usage example: |
| 135 // |
| 136 // // Time math. |
| 137 // RtpTimeTicks origin; |
| 138 // RtpTimeTicks at_one_second = |
| 139 // origin + RtpTimeDelta::FromTicks(kAudioSamplingRate); |
| 140 // RtpTimeTicks at_two_seconds = |
| 141 // at_one_second + RtpTimeDelta::FromTicks(kAudioSamplingRate); |
| 142 // RtpTimeDelta elasped_in_between = at_two_seconds - at_one_second; |
| 143 // RtpTimeDelta thrice_as_much_elasped = elasped_in_between * 3; |
| 144 // RtpTimeTicks at_four_seconds = at_one_second + thrice_as_much_elasped; |
| 145 // |
| 146 // // Logging convenience. |
| 147 // DLOG(INFO) << "The RTP timestamp is " << at_four_seconds; |
| 148 // |
| 149 // // Convert (approximately!) between RTP timebase and media timestamps in |
| 150 // // microsecond timebase: |
| 151 // base::TimeDelta four_seconds_timestamp = |
| 152 // at_four_seconds.ToTimeDelta(kAudioSamplingRate); |
| 153 // video_frame->set_timestamp(four_seconds_timestamp); |
| 154 // RtpTimeTicks four_seconds_rtp = RtpTimeDelta::FromTimeDelta( |
| 155 // video_frame->timestamp(), kAudioSamplingRate); |
| 156 class RtpTimeTicks : public ExpandedValueBase<int64_t, RtpTimeTicks> { |
| 157 public: |
| 158 RtpTimeTicks() : ExpandedValueBase(0) {} |
| 159 |
| 160 // Compute the difference between two RtpTimeTickses. |
| 161 RtpTimeDelta operator-(RtpTimeTicks rhs) const { |
| 162 return RtpTimeDelta(value_ - rhs.value_); |
| 163 } |
| 164 |
| 165 // Return a new RtpTimeTicks before or after this one. |
| 166 RtpTimeTicks operator+(RtpTimeDelta rhs) const { |
| 167 return RtpTimeTicks(value_ + rhs.value()); |
| 168 } |
| 169 RtpTimeTicks operator-(RtpTimeDelta rhs) const { |
| 170 return RtpTimeTicks(value_ - rhs.value()); |
| 171 } |
| 172 RtpTimeTicks& operator+=(RtpTimeDelta rhs) { return (*this = (*this + rhs)); } |
| 173 RtpTimeTicks& operator-=(RtpTimeDelta rhs) { return (*this = (*this - rhs)); } |
| 174 |
| 175 // Maps this RtpTimeTicks to an approximate TimeDelta using the given |
| 176 // RTP timebase. Assumes a zero-valued TimeDelta corresponds to a zero-valued |
| 177 // RtpTimeTicks. |
| 178 base::TimeDelta ToTimeDelta(int rtp_timebase) const; |
| 179 |
| 180 // Maps the TimeDelta to an approximate RtpTimeTicks using the given RTP |
| 181 // timebase. Assumes a zero-valued TimeDelta corresponds to a zero-valued |
| 182 // RtpTimeTicks. |
| 183 static RtpTimeTicks FromTimeDelta(base::TimeDelta delta, int rtp_timebase); |
| 184 |
| 185 private: |
| 186 friend class ExpandedValueBase<int64_t, RtpTimeTicks>; |
| 187 friend std::ostream& operator<<(std::ostream& out, const RtpTimeTicks rhs); |
| 188 |
| 189 explicit RtpTimeTicks(int64_t value) : ExpandedValueBase(value) {} |
| 190 |
| 191 int64_t value() const { return value_; } |
| 192 }; |
| 193 |
| 194 } // namespace cast |
| 195 } // namespace media |
| 196 |
| 197 #endif // MEDIA_CAST_COMMON_RTP_TIME_H_ |
OLD | NEW |