OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 13 matching lines...) Expand all Loading... |
24 double timestamp_to_ms_coeff, | 24 double timestamp_to_ms_coeff, |
25 bool enable_burst_grouping) | 25 bool enable_burst_grouping) |
26 : kTimestampGroupLengthTicks(timestamp_group_length_ticks), | 26 : kTimestampGroupLengthTicks(timestamp_group_length_ticks), |
27 current_timestamp_group_(), | 27 current_timestamp_group_(), |
28 prev_timestamp_group_(), | 28 prev_timestamp_group_(), |
29 timestamp_to_ms_coeff_(timestamp_to_ms_coeff), | 29 timestamp_to_ms_coeff_(timestamp_to_ms_coeff), |
30 burst_grouping_(enable_burst_grouping) {} | 30 burst_grouping_(enable_burst_grouping) {} |
31 | 31 |
32 bool InterArrival::ComputeDeltas(uint32_t timestamp, | 32 bool InterArrival::ComputeDeltas(uint32_t timestamp, |
33 int64_t arrival_time_ms, | 33 int64_t arrival_time_ms, |
34 size_t packet_size, | |
35 uint32_t* timestamp_delta, | 34 uint32_t* timestamp_delta, |
36 int64_t* arrival_time_delta_ms, | 35 int64_t* arrival_time_delta_ms) { |
37 int* packet_size_delta) { | |
38 assert(timestamp_delta != NULL); | 36 assert(timestamp_delta != NULL); |
39 assert(arrival_time_delta_ms != NULL); | 37 assert(arrival_time_delta_ms != NULL); |
40 assert(packet_size_delta != NULL); | |
41 bool calculated_deltas = false; | 38 bool calculated_deltas = false; |
42 if (current_timestamp_group_.IsFirstPacket()) { | 39 if (current_timestamp_group_.IsFirstPacket()) { |
43 // We don't have enough data to update the filter, so we store it until we | 40 // We don't have enough data to update the filter, so we store it until we |
44 // have two frames of data to process. | 41 // have two frames of data to process. |
45 current_timestamp_group_.timestamp = timestamp; | 42 current_timestamp_group_.timestamp = timestamp; |
46 current_timestamp_group_.first_timestamp = timestamp; | 43 current_timestamp_group_.first_timestamp = timestamp; |
47 } else if (!PacketInOrder(timestamp)) { | 44 } else if (!PacketInOrder(timestamp)) { |
48 return false; | 45 return false; |
49 } else if (NewTimestampGroup(arrival_time_ms, timestamp)) { | 46 } else if (NewTimestampGroup(arrival_time_ms, timestamp)) { |
50 // First packet of a later frame, the previous frame sample is ready. | 47 // First packet of a later frame, the previous frame sample is ready. |
51 if (prev_timestamp_group_.complete_time_ms >= 0) { | 48 if (prev_timestamp_group_.complete_time_ms >= 0) { |
52 *timestamp_delta = current_timestamp_group_.timestamp - | 49 *timestamp_delta = current_timestamp_group_.timestamp - |
53 prev_timestamp_group_.timestamp; | 50 prev_timestamp_group_.timestamp; |
54 *arrival_time_delta_ms = current_timestamp_group_.complete_time_ms - | 51 *arrival_time_delta_ms = current_timestamp_group_.complete_time_ms - |
55 prev_timestamp_group_.complete_time_ms; | 52 prev_timestamp_group_.complete_time_ms; |
56 if (*arrival_time_delta_ms < 0) { | 53 if (*arrival_time_delta_ms < 0) { |
57 // The group of packets has been reordered since receiving its local | 54 // The group of packets has been reordered since receiving its local |
58 // arrival timestamp. | 55 // arrival timestamp. |
59 LOG(LS_WARNING) << "Packets are being reordered on the path from the " | 56 LOG(LS_WARNING) << "Packets are being reordered on the path from the " |
60 "socket to the bandwidth estimator. Ignoring this " | 57 "socket to the bandwidth estimator. Ignoring this " |
61 "packet for bandwidth estimation."; | 58 "packet for bandwidth estimation."; |
62 return false; | 59 return false; |
63 } | 60 } |
64 assert(*arrival_time_delta_ms >= 0); | 61 assert(*arrival_time_delta_ms >= 0); |
65 *packet_size_delta = static_cast<int>(current_timestamp_group_.size) - | |
66 static_cast<int>(prev_timestamp_group_.size); | |
67 calculated_deltas = true; | 62 calculated_deltas = true; |
68 } | 63 } |
69 prev_timestamp_group_ = current_timestamp_group_; | 64 prev_timestamp_group_ = current_timestamp_group_; |
70 // The new timestamp is now the current frame. | 65 // The new timestamp is now the current frame. |
71 current_timestamp_group_.first_timestamp = timestamp; | 66 current_timestamp_group_.first_timestamp = timestamp; |
72 current_timestamp_group_.timestamp = timestamp; | 67 current_timestamp_group_.timestamp = timestamp; |
73 current_timestamp_group_.size = 0; | |
74 } | 68 } |
75 else { | 69 else { |
76 current_timestamp_group_.timestamp = LatestTimestamp( | 70 current_timestamp_group_.timestamp = LatestTimestamp( |
77 current_timestamp_group_.timestamp, timestamp); | 71 current_timestamp_group_.timestamp, timestamp); |
78 } | 72 } |
79 // Accumulate the frame size. | 73 current_timestamp_group_.complete_time_ms = |
80 current_timestamp_group_.size += packet_size; | 74 std::max(current_timestamp_group_.complete_time_ms, arrival_time_ms); |
81 current_timestamp_group_.complete_time_ms = arrival_time_ms; | |
82 | 75 |
83 return calculated_deltas; | 76 return calculated_deltas; |
84 } | 77 } |
85 | 78 |
86 bool InterArrival::PacketInOrder(uint32_t timestamp) { | 79 bool InterArrival::PacketInOrder(uint32_t timestamp) { |
87 if (current_timestamp_group_.IsFirstPacket()) { | 80 if (current_timestamp_group_.IsFirstPacket()) { |
88 return true; | 81 return true; |
89 } else { | 82 } else { |
90 // Assume that a diff which is bigger than half the timestamp interval | 83 // Assume that a diff which is bigger than half the timestamp interval |
91 // (32 bits) must be due to reordering. This code is almost identical to | 84 // (32 bits) must be due to reordering. This code is almost identical to |
(...skipping 29 matching lines...) Expand all Loading... |
121 current_timestamp_group_.complete_time_ms; | 114 current_timestamp_group_.complete_time_ms; |
122 uint32_t timestamp_diff = timestamp - current_timestamp_group_.timestamp; | 115 uint32_t timestamp_diff = timestamp - current_timestamp_group_.timestamp; |
123 int64_t ts_delta_ms = timestamp_to_ms_coeff_ * timestamp_diff + 0.5; | 116 int64_t ts_delta_ms = timestamp_to_ms_coeff_ * timestamp_diff + 0.5; |
124 if (ts_delta_ms == 0) | 117 if (ts_delta_ms == 0) |
125 return true; | 118 return true; |
126 int propagation_delta_ms = arrival_time_delta_ms - ts_delta_ms; | 119 int propagation_delta_ms = arrival_time_delta_ms - ts_delta_ms; |
127 return propagation_delta_ms < 0 && | 120 return propagation_delta_ms < 0 && |
128 arrival_time_delta_ms <= kBurstDeltaThresholdMs; | 121 arrival_time_delta_ms <= kBurstDeltaThresholdMs; |
129 } | 122 } |
130 } // namespace webrtc | 123 } // namespace webrtc |
OLD | NEW |