• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef MODULES_REMOTE_BITRATE_ESTIMATOR_INTER_ARRIVAL_H_
12 #define MODULES_REMOTE_BITRATE_ESTIMATOR_INTER_ARRIVAL_H_
13 
14 #include <stddef.h>
15 #include <stdint.h>
16 
17 namespace webrtc {
18 
19 // Helper class to compute the inter-arrival time delta and the size delta
20 // between two timestamp groups. A timestamp is a 32 bit unsigned number with
21 // a client defined rate.
22 class InterArrival {
23  public:
24   // After this many packet groups received out of order InterArrival will
25   // reset, assuming that clocks have made a jump.
26   static constexpr int kReorderedResetThreshold = 3;
27   static constexpr int64_t kArrivalTimeOffsetThresholdMs = 3000;
28 
29   // A timestamp group is defined as all packets with a timestamp which are at
30   // most timestamp_group_length_ticks older than the first timestamp in that
31   // group.
32   InterArrival(uint32_t timestamp_group_length_ticks,
33                double timestamp_to_ms_coeff,
34                bool enable_burst_grouping);
35 
36   InterArrival() = delete;
37   InterArrival(const InterArrival&) = delete;
38   InterArrival& operator=(const InterArrival&) = delete;
39 
40   // This function returns true if a delta was computed, or false if the current
41   // group is still incomplete or if only one group has been completed.
42   // `timestamp` is the timestamp.
43   // `arrival_time_ms` is the local time at which the packet arrived.
44   // `packet_size` is the size of the packet.
45   // `timestamp_delta` (output) is the computed timestamp delta.
46   // `arrival_time_delta_ms` (output) is the computed arrival-time delta.
47   // `packet_size_delta` (output) is the computed size delta.
48   bool ComputeDeltas(uint32_t timestamp,
49                      int64_t arrival_time_ms,
50                      int64_t system_time_ms,
51                      size_t packet_size,
52                      uint32_t* timestamp_delta,
53                      int64_t* arrival_time_delta_ms,
54                      int* packet_size_delta);
55 
56  private:
57   struct TimestampGroup {
TimestampGroupTimestampGroup58     TimestampGroup()
59         : size(0),
60           first_timestamp(0),
61           timestamp(0),
62           first_arrival_ms(-1),
63           complete_time_ms(-1) {}
64 
IsFirstPacketTimestampGroup65     bool IsFirstPacket() const { return complete_time_ms == -1; }
66 
67     size_t size;
68     uint32_t first_timestamp;
69     uint32_t timestamp;
70     int64_t first_arrival_ms;
71     int64_t complete_time_ms;
72     int64_t last_system_time_ms;
73   };
74 
75   // Returns true if the packet with timestamp `timestamp` arrived in order.
76   bool PacketInOrder(uint32_t timestamp);
77 
78   // Returns true if the last packet was the end of the current batch and the
79   // packet with `timestamp` is the first of a new batch.
80   bool NewTimestampGroup(int64_t arrival_time_ms, uint32_t timestamp) const;
81 
82   bool BelongsToBurst(int64_t arrival_time_ms, uint32_t timestamp) const;
83 
84   void Reset();
85 
86   const uint32_t kTimestampGroupLengthTicks;
87   TimestampGroup current_timestamp_group_;
88   TimestampGroup prev_timestamp_group_;
89   double timestamp_to_ms_coeff_;
90   bool burst_grouping_;
91   int num_consecutive_reordered_packets_;
92 };
93 }  // namespace webrtc
94 
95 #endif  // MODULES_REMOTE_BITRATE_ESTIMATOR_INTER_ARRIVAL_H_
96