OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 12 matching lines...) Expand all Loading... |
23 #include "webrtc/system_wrappers/include/field_trial.h" | 23 #include "webrtc/system_wrappers/include/field_trial.h" |
24 | 24 |
25 namespace webrtc { | 25 namespace webrtc { |
26 | 26 |
27 const int64_t kNoTimestamp = -1; | 27 const int64_t kNoTimestamp = -1; |
28 const int64_t kSendTimeHistoryWindowMs = 60000; | 28 const int64_t kSendTimeHistoryWindowMs = 60000; |
29 const int64_t kBaseTimestampScaleFactor = | 29 const int64_t kBaseTimestampScaleFactor = |
30 rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 8); | 30 rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 8); |
31 const int64_t kBaseTimestampRangeSizeUs = kBaseTimestampScaleFactor * (1 << 24); | 31 const int64_t kBaseTimestampRangeSizeUs = kBaseTimestampScaleFactor * (1 << 24); |
32 | 32 |
33 class PacketInfoComparator { | 33 class PacketFeedbackComparator { |
34 public: | 34 public: |
35 inline bool operator()(const PacketInfo& lhs, const PacketInfo& rhs) { | 35 inline bool operator()(const PacketFeedback& lhs, const PacketFeedback& rhs) { |
36 if (lhs.arrival_time_ms != rhs.arrival_time_ms) | 36 if (lhs.arrival_time_ms != rhs.arrival_time_ms) |
37 return lhs.arrival_time_ms < rhs.arrival_time_ms; | 37 return lhs.arrival_time_ms < rhs.arrival_time_ms; |
38 if (lhs.send_time_ms != rhs.send_time_ms) | 38 if (lhs.send_time_ms != rhs.send_time_ms) |
39 return lhs.send_time_ms < rhs.send_time_ms; | 39 return lhs.send_time_ms < rhs.send_time_ms; |
40 return lhs.sequence_number < rhs.sequence_number; | 40 return lhs.sequence_number < rhs.sequence_number; |
41 } | 41 } |
42 }; | 42 }; |
43 | 43 |
44 TransportFeedbackAdapter::TransportFeedbackAdapter( | 44 TransportFeedbackAdapter::TransportFeedbackAdapter( |
45 RtcEventLog* event_log, | 45 RtcEventLog* event_log, |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 int transport_overhead_bytes_per_packet) { | 103 int transport_overhead_bytes_per_packet) { |
104 rtc::CritScope cs(&lock_); | 104 rtc::CritScope cs(&lock_); |
105 transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet; | 105 transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet; |
106 } | 106 } |
107 | 107 |
108 int64_t TransportFeedbackAdapter::GetProbingIntervalMs() const { | 108 int64_t TransportFeedbackAdapter::GetProbingIntervalMs() const { |
109 rtc::CritScope cs(&bwe_lock_); | 109 rtc::CritScope cs(&bwe_lock_); |
110 return delay_based_bwe_->GetProbingIntervalMs(); | 110 return delay_based_bwe_->GetProbingIntervalMs(); |
111 } | 111 } |
112 | 112 |
113 std::vector<PacketInfo> TransportFeedbackAdapter::GetPacketFeedbackVector( | 113 std::vector<PacketFeedback> TransportFeedbackAdapter::GetPacketFeedbackVector( |
114 const rtcp::TransportFeedback& feedback) { | 114 const rtcp::TransportFeedback& feedback) { |
115 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 115 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
116 int64_t timestamp_us = feedback.GetBaseTimeUs(); | 116 int64_t timestamp_us = feedback.GetBaseTimeUs(); |
117 // Add timestamp deltas to a local time base selected on first packet arrival. | 117 // Add timestamp deltas to a local time base selected on first packet arrival. |
118 // This won't be the true time base, but makes it easier to manually inspect | 118 // This won't be the true time base, but makes it easier to manually inspect |
119 // time stamps. | 119 // time stamps. |
120 if (last_timestamp_us_ == kNoTimestamp) { | 120 if (last_timestamp_us_ == kNoTimestamp) { |
121 current_offset_ms_ = clock_->TimeInMilliseconds(); | 121 current_offset_ms_ = clock_->TimeInMilliseconds(); |
122 } else { | 122 } else { |
123 int64_t delta = timestamp_us - last_timestamp_us_; | 123 int64_t delta = timestamp_us - last_timestamp_us_; |
124 | 124 |
125 // Detect and compensate for wrap-arounds in base time. | 125 // Detect and compensate for wrap-arounds in base time. |
126 if (std::abs(delta - kBaseTimestampRangeSizeUs) < std::abs(delta)) { | 126 if (std::abs(delta - kBaseTimestampRangeSizeUs) < std::abs(delta)) { |
127 delta -= kBaseTimestampRangeSizeUs; // Wrap backwards. | 127 delta -= kBaseTimestampRangeSizeUs; // Wrap backwards. |
128 } else if (std::abs(delta + kBaseTimestampRangeSizeUs) < std::abs(delta)) { | 128 } else if (std::abs(delta + kBaseTimestampRangeSizeUs) < std::abs(delta)) { |
129 delta += kBaseTimestampRangeSizeUs; // Wrap forwards. | 129 delta += kBaseTimestampRangeSizeUs; // Wrap forwards. |
130 } | 130 } |
131 | 131 |
132 current_offset_ms_ += delta / 1000; | 132 current_offset_ms_ += delta / 1000; |
133 } | 133 } |
134 last_timestamp_us_ = timestamp_us; | 134 last_timestamp_us_ = timestamp_us; |
135 | 135 |
136 auto received_packets = feedback.GetReceivedPackets(); | 136 auto received_packets = feedback.GetReceivedPackets(); |
137 std::vector<PacketInfo> packet_feedback_vector; | 137 std::vector<PacketFeedback> packet_feedback_vector; |
138 packet_feedback_vector.reserve(received_packets.size()); | 138 packet_feedback_vector.reserve(received_packets.size()); |
139 if (received_packets.empty()) { | 139 if (received_packets.empty()) { |
140 LOG(LS_INFO) << "Empty transport feedback packet received."; | 140 LOG(LS_INFO) << "Empty transport feedback packet received."; |
141 return packet_feedback_vector; | 141 return packet_feedback_vector; |
142 } | 142 } |
143 { | 143 { |
144 rtc::CritScope cs(&lock_); | 144 rtc::CritScope cs(&lock_); |
145 size_t failed_lookups = 0; | 145 size_t failed_lookups = 0; |
146 int64_t offset_us = 0; | 146 int64_t offset_us = 0; |
147 int64_t timestamp_ms = 0; | 147 int64_t timestamp_ms = 0; |
148 for (const auto& packet : feedback.GetReceivedPackets()) { | 148 for (const auto& packet : feedback.GetReceivedPackets()) { |
149 offset_us += packet.delta_us(); | 149 offset_us += packet.delta_us(); |
150 timestamp_ms = current_offset_ms_ + (offset_us / 1000); | 150 timestamp_ms = current_offset_ms_ + (offset_us / 1000); |
151 PacketInfo info(timestamp_ms, packet.sequence_number()); | 151 PacketFeedback packet_feedback(timestamp_ms, packet.sequence_number()); |
152 if (!send_time_history_.GetInfo(&info, true)) | 152 if (!send_time_history_.GetFeedback(&packet_feedback, true)) |
153 ++failed_lookups; | 153 ++failed_lookups; |
154 packet_feedback_vector.push_back(info); | 154 packet_feedback_vector.push_back(packet_feedback); |
155 } | 155 } |
156 std::sort(packet_feedback_vector.begin(), packet_feedback_vector.end(), | 156 std::sort(packet_feedback_vector.begin(), packet_feedback_vector.end(), |
157 PacketInfoComparator()); | 157 PacketFeedbackComparator()); |
158 if (failed_lookups > 0) { | 158 if (failed_lookups > 0) { |
159 LOG(LS_WARNING) << "Failed to lookup send time for " << failed_lookups | 159 LOG(LS_WARNING) << "Failed to lookup send time for " << failed_lookups |
160 << " packet" << (failed_lookups > 1 ? "s" : "") | 160 << " packet" << (failed_lookups > 1 ? "s" : "") |
161 << ". Send time history too small?"; | 161 << ". Send time history too small?"; |
162 } | 162 } |
163 } | 163 } |
164 return packet_feedback_vector; | 164 return packet_feedback_vector; |
165 } | 165 } |
166 | 166 |
167 void TransportFeedbackAdapter::OnTransportFeedback( | 167 void TransportFeedbackAdapter::OnTransportFeedback( |
168 const rtcp::TransportFeedback& feedback) { | 168 const rtcp::TransportFeedback& feedback) { |
169 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 169 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
170 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback); | 170 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback); |
171 DelayBasedBwe::Result result; | 171 DelayBasedBwe::Result result; |
172 { | 172 { |
173 rtc::CritScope cs(&bwe_lock_); | 173 rtc::CritScope cs(&bwe_lock_); |
174 result = delay_based_bwe_->IncomingPacketFeedbackVector( | 174 result = delay_based_bwe_->IncomingPacketFeedbackVector( |
175 last_packet_feedback_vector_); | 175 last_packet_feedback_vector_); |
176 } | 176 } |
177 if (result.updated) | 177 if (result.updated) |
178 bitrate_controller_->OnDelayBasedBweResult(result); | 178 bitrate_controller_->OnDelayBasedBweResult(result); |
179 } | 179 } |
180 | 180 |
181 std::vector<PacketInfo> TransportFeedbackAdapter::GetTransportFeedbackVector() | 181 std::vector<PacketFeedback> |
182 const { | 182 TransportFeedbackAdapter::GetTransportFeedbackVector() const { |
183 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 183 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
184 return last_packet_feedback_vector_; | 184 return last_packet_feedback_vector_; |
185 } | 185 } |
186 | 186 |
187 void TransportFeedbackAdapter::OnRttUpdate(int64_t avg_rtt_ms, | 187 void TransportFeedbackAdapter::OnRttUpdate(int64_t avg_rtt_ms, |
188 int64_t max_rtt_ms) { | 188 int64_t max_rtt_ms) { |
189 RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread()); | 189 RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread()); |
190 rtc::CritScope cs(&bwe_lock_); | 190 rtc::CritScope cs(&bwe_lock_); |
191 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 191 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
192 } | 192 } |
193 | 193 |
194 } // namespace webrtc | 194 } // namespace webrtc |
OLD | NEW |