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