|  | /* | 
|  | *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #ifndef MODULES_REMOTE_BITRATE_ESTIMATOR_INTER_ARRIVAL_H_ | 
|  | #define MODULES_REMOTE_BITRATE_ESTIMATOR_INTER_ARRIVAL_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | // Helper class to compute the inter-arrival time delta and the size delta | 
|  | // between two timestamp groups. A timestamp is a 32 bit unsigned number with | 
|  | // a client defined rate. | 
|  | class InterArrival { | 
|  | public: | 
|  | // After this many packet groups received out of order InterArrival will | 
|  | // reset, assuming that clocks have made a jump. | 
|  | static constexpr int kReorderedResetThreshold = 3; | 
|  | static constexpr int64_t kArrivalTimeOffsetThresholdMs = 3000; | 
|  |  | 
|  | // A timestamp group is defined as all packets with a timestamp which are at | 
|  | // most timestamp_group_length_ticks older than the first timestamp in that | 
|  | // group. | 
|  | InterArrival(uint32_t timestamp_group_length_ticks, | 
|  | double timestamp_to_ms_coeff, | 
|  | bool enable_burst_grouping); | 
|  |  | 
|  | InterArrival() = delete; | 
|  | InterArrival(const InterArrival&) = delete; | 
|  | InterArrival& operator=(const InterArrival&) = delete; | 
|  |  | 
|  | // This function returns true if a delta was computed, or false if the current | 
|  | // group is still incomplete or if only one group has been completed. | 
|  | // `timestamp` is the timestamp. | 
|  | // `arrival_time_ms` is the local time at which the packet arrived. | 
|  | // `packet_size` is the size of the packet. | 
|  | // `timestamp_delta` (output) is the computed timestamp delta. | 
|  | // `arrival_time_delta_ms` (output) is the computed arrival-time delta. | 
|  | // `packet_size_delta` (output) is the computed size delta. | 
|  | bool ComputeDeltas(uint32_t timestamp, | 
|  | int64_t arrival_time_ms, | 
|  | int64_t system_time_ms, | 
|  | size_t packet_size, | 
|  | uint32_t* timestamp_delta, | 
|  | int64_t* arrival_time_delta_ms, | 
|  | int* packet_size_delta); | 
|  |  | 
|  | private: | 
|  | struct TimestampGroup { | 
|  | TimestampGroup() | 
|  | : size(0), | 
|  | first_timestamp(0), | 
|  | timestamp(0), | 
|  | first_arrival_ms(-1), | 
|  | complete_time_ms(-1) {} | 
|  |  | 
|  | bool IsFirstPacket() const { return complete_time_ms == -1; } | 
|  |  | 
|  | size_t size; | 
|  | uint32_t first_timestamp; | 
|  | uint32_t timestamp; | 
|  | int64_t first_arrival_ms; | 
|  | int64_t complete_time_ms; | 
|  | int64_t last_system_time_ms; | 
|  | }; | 
|  |  | 
|  | // Returns true if the packet with timestamp `timestamp` arrived in order. | 
|  | bool PacketInOrder(uint32_t timestamp); | 
|  |  | 
|  | // Returns true if the last packet was the end of the current batch and the | 
|  | // packet with `timestamp` is the first of a new batch. | 
|  | bool NewTimestampGroup(int64_t arrival_time_ms, uint32_t timestamp) const; | 
|  |  | 
|  | bool BelongsToBurst(int64_t arrival_time_ms, uint32_t timestamp) const; | 
|  |  | 
|  | void Reset(); | 
|  |  | 
|  | const uint32_t kTimestampGroupLengthTicks; | 
|  | TimestampGroup current_timestamp_group_; | 
|  | TimestampGroup prev_timestamp_group_; | 
|  | double timestamp_to_ms_coeff_; | 
|  | bool burst_grouping_; | 
|  | int num_consecutive_reordered_packets_; | 
|  | }; | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // MODULES_REMOTE_BITRATE_ESTIMATOR_INTER_ARRIVAL_H_ |