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 |
11 #include "webrtc/modules/congestion_controller/transport_feedback_adapter.h" | 11 #include "webrtc/modules/congestion_controller/transport_feedback_adapter.h" |
12 | 12 |
| 13 #include <algorithm> |
| 14 #include <limits> |
| 15 |
13 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
14 #include "webrtc/base/logging.h" | 17 #include "webrtc/base/logging.h" |
15 #include "webrtc/base/mod_ops.h" | 18 #include "webrtc/base/mod_ops.h" |
| 19 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
| 20 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" |
16 #include "webrtc/modules/congestion_controller/delay_based_bwe.h" | 21 #include "webrtc/modules/congestion_controller/delay_based_bwe.h" |
17 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" | 22 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
| 23 #include "webrtc/modules/utility/include/process_thread.h" |
18 #include "webrtc/system_wrappers/include/field_trial.h" | 24 #include "webrtc/system_wrappers/include/field_trial.h" |
19 | 25 |
20 namespace webrtc { | 26 namespace webrtc { |
21 | 27 |
22 const int64_t kNoTimestamp = -1; | 28 const int64_t kNoTimestamp = -1; |
23 const int64_t kSendTimeHistoryWindowMs = 60000; | 29 const int64_t kSendTimeHistoryWindowMs = 60000; |
24 const int64_t kBaseTimestampScaleFactor = | 30 const int64_t kBaseTimestampScaleFactor = |
25 rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 8); | 31 rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 8); |
26 const int64_t kBaseTimestampRangeSizeUs = kBaseTimestampScaleFactor * (1 << 24); | 32 const int64_t kBaseTimestampRangeSizeUs = kBaseTimestampScaleFactor * (1 << 24); |
27 | 33 |
28 TransportFeedbackAdapter::TransportFeedbackAdapter(Clock* clock) | 34 TransportFeedbackAdapter::TransportFeedbackAdapter( |
| 35 RtcEventLog* event_log, |
| 36 Clock* clock, |
| 37 BitrateController* bitrate_controller) |
29 : send_side_bwe_with_overhead_( | 38 : send_side_bwe_with_overhead_( |
30 webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")), | 39 webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")), |
31 transport_overhead_bytes_per_packet_(0), | 40 transport_overhead_bytes_per_packet_(0), |
32 send_time_history_(clock, kSendTimeHistoryWindowMs), | 41 send_time_history_(clock, kSendTimeHistoryWindowMs), |
| 42 event_log_(event_log), |
33 clock_(clock), | 43 clock_(clock), |
34 current_offset_ms_(kNoTimestamp), | 44 current_offset_ms_(kNoTimestamp), |
35 last_timestamp_us_(kNoTimestamp) {} | 45 last_timestamp_us_(kNoTimestamp), |
| 46 bitrate_controller_(bitrate_controller) {} |
36 | 47 |
37 TransportFeedbackAdapter::~TransportFeedbackAdapter() {} | 48 TransportFeedbackAdapter::~TransportFeedbackAdapter() {} |
38 | 49 |
| 50 void TransportFeedbackAdapter::InitBwe() { |
| 51 rtc::CritScope cs(&bwe_lock_); |
| 52 delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_)); |
| 53 } |
| 54 |
39 void TransportFeedbackAdapter::AddPacket(uint16_t sequence_number, | 55 void TransportFeedbackAdapter::AddPacket(uint16_t sequence_number, |
40 size_t length, | 56 size_t length, |
41 const PacedPacketInfo& pacing_info) { | 57 const PacedPacketInfo& pacing_info) { |
42 rtc::CritScope cs(&lock_); | 58 rtc::CritScope cs(&lock_); |
43 if (send_side_bwe_with_overhead_) { | 59 if (send_side_bwe_with_overhead_) { |
44 length += transport_overhead_bytes_per_packet_; | 60 length += transport_overhead_bytes_per_packet_; |
45 } | 61 } |
46 send_time_history_.AddAndRemoveOld(sequence_number, length, pacing_info); | 62 send_time_history_.AddAndRemoveOld(sequence_number, length, pacing_info); |
47 } | 63 } |
48 | 64 |
49 void TransportFeedbackAdapter::OnSentPacket(uint16_t sequence_number, | 65 void TransportFeedbackAdapter::OnSentPacket(uint16_t sequence_number, |
50 int64_t send_time_ms) { | 66 int64_t send_time_ms) { |
51 rtc::CritScope cs(&lock_); | 67 rtc::CritScope cs(&lock_); |
52 send_time_history_.OnSentPacket(sequence_number, send_time_ms); | 68 send_time_history_.OnSentPacket(sequence_number, send_time_ms); |
53 } | 69 } |
54 | 70 |
| 71 void TransportFeedbackAdapter::SetStartBitrate(int start_bitrate_bps) { |
| 72 rtc::CritScope cs(&bwe_lock_); |
| 73 delay_based_bwe_->SetStartBitrate(start_bitrate_bps); |
| 74 } |
| 75 |
| 76 void TransportFeedbackAdapter::SetMinBitrate(int min_bitrate_bps) { |
| 77 rtc::CritScope cs(&bwe_lock_); |
| 78 delay_based_bwe_->SetMinBitrate(min_bitrate_bps); |
| 79 } |
| 80 |
55 void TransportFeedbackAdapter::SetTransportOverhead( | 81 void TransportFeedbackAdapter::SetTransportOverhead( |
56 int transport_overhead_bytes_per_packet) { | 82 int transport_overhead_bytes_per_packet) { |
57 rtc::CritScope cs(&lock_); | 83 rtc::CritScope cs(&lock_); |
58 transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet; | 84 transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet; |
59 } | 85 } |
60 | 86 |
| 87 int64_t TransportFeedbackAdapter::GetProbingIntervalMs() const { |
| 88 rtc::CritScope cs(&bwe_lock_); |
| 89 return delay_based_bwe_->GetProbingIntervalMs(); |
| 90 } |
| 91 |
61 void TransportFeedbackAdapter::ClearSendTimeHistory() { | 92 void TransportFeedbackAdapter::ClearSendTimeHistory() { |
62 rtc::CritScope cs(&lock_); | 93 rtc::CritScope cs(&lock_); |
63 send_time_history_.Clear(); | 94 send_time_history_.Clear(); |
64 } | 95 } |
65 | 96 |
66 std::vector<PacketFeedback> TransportFeedbackAdapter::GetPacketFeedbackVector( | 97 std::vector<PacketFeedback> TransportFeedbackAdapter::GetPacketFeedbackVector( |
67 const rtcp::TransportFeedback& feedback) { | 98 const rtcp::TransportFeedback& feedback) { |
68 int64_t timestamp_us = feedback.GetBaseTimeUs(); | 99 int64_t timestamp_us = feedback.GetBaseTimeUs(); |
69 // Add timestamp deltas to a local time base selected on first packet arrival. | 100 // Add timestamp deltas to a local time base selected on first packet arrival. |
70 // This won't be the true time base, but makes it easier to manually inspect | 101 // This won't be the true time base, but makes it easier to manually inspect |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 << " packet" << (failed_lookups > 1 ? "s" : "") | 165 << " packet" << (failed_lookups > 1 ? "s" : "") |
135 << ". Send time history too small?"; | 166 << ". Send time history too small?"; |
136 } | 167 } |
137 } | 168 } |
138 return packet_feedback_vector; | 169 return packet_feedback_vector; |
139 } | 170 } |
140 | 171 |
141 void TransportFeedbackAdapter::OnTransportFeedback( | 172 void TransportFeedbackAdapter::OnTransportFeedback( |
142 const rtcp::TransportFeedback& feedback) { | 173 const rtcp::TransportFeedback& feedback) { |
143 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback); | 174 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback); |
| 175 DelayBasedBwe::Result result; |
| 176 { |
| 177 rtc::CritScope cs(&bwe_lock_); |
| 178 result = delay_based_bwe_->IncomingPacketFeedbackVector( |
| 179 last_packet_feedback_vector_); |
| 180 } |
| 181 if (result.updated) |
| 182 bitrate_controller_->OnDelayBasedBweResult(result); |
144 } | 183 } |
145 | 184 |
146 std::vector<PacketFeedback> | 185 std::vector<PacketFeedback> |
147 TransportFeedbackAdapter::GetTransportFeedbackVector() const { | 186 TransportFeedbackAdapter::GetTransportFeedbackVector() const { |
148 return last_packet_feedback_vector_; | 187 return last_packet_feedback_vector_; |
149 } | 188 } |
| 189 |
| 190 void TransportFeedbackAdapter::OnRttUpdate(int64_t avg_rtt_ms, |
| 191 int64_t max_rtt_ms) { |
| 192 rtc::CritScope cs(&bwe_lock_); |
| 193 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
| 194 } |
| 195 |
150 } // namespace webrtc | 196 } // namespace webrtc |
OLD | NEW |