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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
45 BitrateController* bitrate_controller) | 45 BitrateController* bitrate_controller) |
46 : send_side_bwe_with_overhead_(webrtc::field_trial::FindFullName( | 46 : send_side_bwe_with_overhead_(webrtc::field_trial::FindFullName( |
47 "WebRTC-SendSideBwe-WithOverhead") == "Enabled"), | 47 "WebRTC-SendSideBwe-WithOverhead") == "Enabled"), |
48 transport_overhead_bytes_per_packet_(0), | 48 transport_overhead_bytes_per_packet_(0), |
49 send_time_history_(clock, kSendTimeHistoryWindowMs), | 49 send_time_history_(clock, kSendTimeHistoryWindowMs), |
50 clock_(clock), | 50 clock_(clock), |
51 current_offset_ms_(kNoTimestamp), | 51 current_offset_ms_(kNoTimestamp), |
52 last_timestamp_us_(kNoTimestamp), | 52 last_timestamp_us_(kNoTimestamp), |
53 bitrate_controller_(bitrate_controller) {} | 53 bitrate_controller_(bitrate_controller) {} |
54 | 54 |
55 TransportFeedbackAdapter::~TransportFeedbackAdapter() {} | 55 TransportFeedbackAdapter::~TransportFeedbackAdapter() { |
56 RTC_DCHECK(observers_.empty()); | |
57 } | |
56 | 58 |
57 void TransportFeedbackAdapter::InitBwe() { | 59 void TransportFeedbackAdapter::InitBwe() { |
58 rtc::CritScope cs(&bwe_lock_); | 60 rtc::CritScope cs(&bwe_lock_); |
59 delay_based_bwe_.reset(new DelayBasedBwe(clock_)); | 61 delay_based_bwe_.reset(new DelayBasedBwe(clock_)); |
60 } | 62 } |
61 | 63 |
62 void TransportFeedbackAdapter::AddPacket(uint16_t sequence_number, | 64 void TransportFeedbackAdapter::AddPacket(uint32_t ssrc, |
65 uint16_t sequence_number, | |
63 size_t length, | 66 size_t length, |
64 int probe_cluster_id) { | 67 int probe_cluster_id) { |
65 rtc::CritScope cs(&lock_); | 68 { |
66 if (send_side_bwe_with_overhead_) { | 69 rtc::CritScope cs(&lock_); |
67 length += transport_overhead_bytes_per_packet_; | 70 if (send_side_bwe_with_overhead_) { |
71 length += transport_overhead_bytes_per_packet_; | |
72 } | |
73 send_time_history_.AddAndRemoveOld( | |
74 sequence_number, length, probe_cluster_id); | |
68 } | 75 } |
69 send_time_history_.AddAndRemoveOld(sequence_number, length, probe_cluster_id); | 76 |
77 { | |
78 rtc::CritScope cs(&observers_lock_); | |
79 for (auto observer : observers_) { | |
80 observer->OnPacketAdded(ssrc, sequence_number); | |
81 } | |
82 } | |
70 } | 83 } |
71 | 84 |
72 void TransportFeedbackAdapter::OnSentPacket(uint16_t sequence_number, | 85 void TransportFeedbackAdapter::OnSentPacket(uint16_t sequence_number, |
73 int64_t send_time_ms) { | 86 int64_t send_time_ms) { |
74 rtc::CritScope cs(&lock_); | 87 rtc::CritScope cs(&lock_); |
75 send_time_history_.OnSentPacket(sequence_number, send_time_ms); | 88 send_time_history_.OnSentPacket(sequence_number, send_time_ms); |
76 } | 89 } |
77 | 90 |
78 void TransportFeedbackAdapter::SetStartBitrate(int start_bitrate_bps) { | 91 void TransportFeedbackAdapter::SetStartBitrate(int start_bitrate_bps) { |
79 rtc::CritScope cs(&bwe_lock_); | 92 rtc::CritScope cs(&bwe_lock_); |
80 delay_based_bwe_->SetStartBitrate(start_bitrate_bps); | 93 delay_based_bwe_->SetStartBitrate(start_bitrate_bps); |
81 } | 94 } |
82 | 95 |
83 void TransportFeedbackAdapter::SetMinBitrate(int min_bitrate_bps) { | 96 void TransportFeedbackAdapter::SetMinBitrate(int min_bitrate_bps) { |
84 rtc::CritScope cs(&bwe_lock_); | 97 rtc::CritScope cs(&bwe_lock_); |
85 delay_based_bwe_->SetMinBitrate(min_bitrate_bps); | 98 delay_based_bwe_->SetMinBitrate(min_bitrate_bps); |
86 } | 99 } |
87 | 100 |
88 void TransportFeedbackAdapter::SetTransportOverhead( | 101 void TransportFeedbackAdapter::SetTransportOverhead( |
89 int transport_overhead_bytes_per_packet) { | 102 int transport_overhead_bytes_per_packet) { |
90 rtc::CritScope cs(&lock_); | 103 rtc::CritScope cs(&lock_); |
91 transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet; | 104 transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet; |
92 } | 105 } |
93 | 106 |
94 int64_t TransportFeedbackAdapter::GetProbingIntervalMs() const { | 107 int64_t TransportFeedbackAdapter::GetProbingIntervalMs() const { |
95 rtc::CritScope cs(&bwe_lock_); | 108 rtc::CritScope cs(&bwe_lock_); |
96 return delay_based_bwe_->GetProbingIntervalMs(); | 109 return delay_based_bwe_->GetProbingIntervalMs(); |
97 } | 110 } |
98 | 111 |
112 void TransportFeedbackAdapter::RegisterTransportFeedbackAdapterObserver( | |
113 TransportFeedbackAdapterObserver* observer) { | |
114 rtc::CritScope cs(&observers_lock_); | |
115 RTC_DCHECK(observer); | |
116 if (std::find(observers_.begin(), | |
minyue-webrtc
2017/02/22 11:47:55
I would the sanity check be debug only:
RTC_DCHEC
elad.alon_webrtc.org
2017/03/10 12:03:26
Are you sure? Observer registration is not an ofte
minyue-webrtc
2017/03/17 09:20:31
My points are:
1. no user actions seem to trigger
elad.alon_webrtc.org
2017/03/17 10:10:32
The else-clause is there to alert a programmer run
minyue-webrtc
2017/03/21 09:22:58
As a reader's point of view, I would like to see t
| |
117 observers_.end(), | |
118 observer) == observers_.end()) { | |
119 observers_.push_back(observer); | |
120 } else { | |
121 RTC_NOTREACHED(); | |
122 } | |
123 } | |
124 | |
125 void TransportFeedbackAdapter::DeRegisterTransportFeedbackAdapterObserver( | |
126 TransportFeedbackAdapterObserver* observer) { | |
127 rtc::CritScope cs(&observers_lock_); | |
128 RTC_DCHECK(observer); | |
129 auto elem = std::find(observers_.begin(), observers_.end(), observer); | |
130 if (elem != observers_.end()) { | |
131 observers_.erase(elem); | |
132 } else { | |
133 RTC_NOTREACHED(); | |
134 } | |
135 } | |
136 | |
99 std::vector<PacketInfo> TransportFeedbackAdapter::GetPacketFeedbackVector( | 137 std::vector<PacketInfo> TransportFeedbackAdapter::GetPacketFeedbackVector( |
100 const rtcp::TransportFeedback& feedback) { | 138 const rtcp::TransportFeedback& feedback) { |
101 int64_t timestamp_us = feedback.GetBaseTimeUs(); | 139 int64_t timestamp_us = feedback.GetBaseTimeUs(); |
102 // Add timestamp deltas to a local time base selected on first packet arrival. | 140 // Add timestamp deltas to a local time base selected on first packet arrival. |
103 // This won't be the true time base, but makes it easier to manually inspect | 141 // This won't be the true time base, but makes it easier to manually inspect |
104 // time stamps. | 142 // time stamps. |
105 if (last_timestamp_us_ == kNoTimestamp) { | 143 if (last_timestamp_us_ == kNoTimestamp) { |
106 current_offset_ms_ = clock_->TimeInMilliseconds(); | 144 current_offset_ms_ = clock_->TimeInMilliseconds(); |
107 } else { | 145 } else { |
108 int64_t delta = timestamp_us - last_timestamp_us_; | 146 int64_t delta = timestamp_us - last_timestamp_us_; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
149 const rtcp::TransportFeedback& feedback) { | 187 const rtcp::TransportFeedback& feedback) { |
150 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback); | 188 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback); |
151 DelayBasedBwe::Result result; | 189 DelayBasedBwe::Result result; |
152 { | 190 { |
153 rtc::CritScope cs(&bwe_lock_); | 191 rtc::CritScope cs(&bwe_lock_); |
154 result = delay_based_bwe_->IncomingPacketFeedbackVector( | 192 result = delay_based_bwe_->IncomingPacketFeedbackVector( |
155 last_packet_feedback_vector_); | 193 last_packet_feedback_vector_); |
156 } | 194 } |
157 if (result.updated) | 195 if (result.updated) |
158 bitrate_controller_->OnDelayBasedBweResult(result); | 196 bitrate_controller_->OnDelayBasedBweResult(result); |
197 | |
198 { | |
199 rtc::CritScope cs(&observers_lock_); | |
200 for (auto observer : observers_) { | |
201 observer->OnTransportFeedback(feedback); | |
202 } | |
203 } | |
159 } | 204 } |
160 | 205 |
161 std::vector<PacketInfo> TransportFeedbackAdapter::GetTransportFeedbackVector() | 206 std::vector<PacketInfo> TransportFeedbackAdapter::GetTransportFeedbackVector() |
162 const { | 207 const { |
163 return last_packet_feedback_vector_; | 208 return last_packet_feedback_vector_; |
164 } | 209 } |
165 | 210 |
166 void TransportFeedbackAdapter::OnRttUpdate(int64_t avg_rtt_ms, | 211 void TransportFeedbackAdapter::OnRttUpdate(int64_t avg_rtt_ms, |
167 int64_t max_rtt_ms) { | 212 int64_t max_rtt_ms) { |
168 rtc::CritScope cs(&bwe_lock_); | 213 rtc::CritScope cs(&bwe_lock_); |
169 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 214 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
170 } | 215 } |
171 | 216 |
172 } // namespace webrtc | 217 } // namespace webrtc |
OLD | NEW |