Index: webrtc/audio/audio_send_stream.cc |
diff --git a/webrtc/audio/audio_send_stream.cc b/webrtc/audio/audio_send_stream.cc |
index d8bc84858a6a3e33936a89dd1dfa6c6c173d68b9..be7672d7cbb6e55a16d9f77649fa39bf19919867 100644 |
--- a/webrtc/audio/audio_send_stream.cc |
+++ b/webrtc/audio/audio_send_stream.cc |
@@ -11,6 +11,8 @@ |
#include "webrtc/audio/audio_send_stream.h" |
#include <string> |
+#include <vector> |
+#include <utility> |
#include "webrtc/audio/audio_state.h" |
#include "webrtc/audio/conversion.h" |
@@ -18,6 +20,7 @@ |
#include "webrtc/base/checks.h" |
#include "webrtc/base/event.h" |
#include "webrtc/base/logging.h" |
+#include "webrtc/base/mod_ops.h" |
#include "webrtc/base/task_queue.h" |
#include "webrtc/modules/congestion_controller/include/congestion_controller.h" |
#include "webrtc/modules/pacing/paced_sender.h" |
@@ -76,6 +79,7 @@ AudioSendStream::AudioSendStream( |
config_.rtp.nack.rtp_history_ms / 20); |
channel_proxy_->RegisterExternalTransport(config.send_transport); |
+ congestion_controller_->RegisterTransportFeedbackAdapterObserver(this); |
for (const auto& extension : config.rtp.extensions) { |
if (extension.uri == RtpExtension::kAudioLevelUri) { |
@@ -95,6 +99,7 @@ AudioSendStream::AudioSendStream( |
AudioSendStream::~AudioSendStream() { |
RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
LOG(LS_INFO) << "~AudioSendStream: " << config_.ToString(); |
+ congestion_controller_->DeRegisterTransportFeedbackAdapterObserver(this); |
channel_proxy_->DeRegisterExternalTransport(); |
channel_proxy_->ResetCongestionControlObjects(); |
channel_proxy_->SetRtcEventLog(nullptr); |
@@ -253,6 +258,51 @@ uint32_t AudioSendStream::OnBitrateUpdated(uint32_t bitrate_bps, |
return 0; |
} |
+void AudioSendStream::OnPacketAdded(uint32_t ssrc, |
+ uint16_t transport_sequence_number) { |
+ if (ssrc != config_.rtp.ssrc) |
+ return; |
+ |
+ // To make sure everything happens on the same thread, we'll buffer |
+ // this information and pass it down with the first OnTransportFeedback, |
+ // which is called on the thread which channel_proxy_ mostly works on. |
+ rtc::CritScope lock(&packets_sent_since_last_feedback_cs_); |
+ |
+ // Prevent unbounded memory consumption if OnTransportFeedback ends up |
minyue-webrtc
2017/02/22 11:47:55
why should we buffer sent packets? since the packe
elad.alon_webrtc.org
2017/03/10 12:03:25
Please see the previous comment (lines 266-268 on
|
+ // never being called. Messages which are 0x8000 (or more) sequence numbers |
+ // away from the newest message will end up having no effect, so we can |
+ // discard those. |
+ if (!packets_sent_since_last_feedback_.empty() && |
+ ForwardDiff(packets_sent_since_last_feedback_[0], |
+ transport_sequence_number) >= 0x8000) { |
+ // The element are ordered (circularly), so we can batch-remove. No need |
+ // for binary search, because we expect to usually find the edge in the |
+ // beginning of the container. |
+ auto it = packets_sent_since_last_feedback_.cbegin(); |
+ while (it != packets_sent_since_last_feedback_.cend() && |
+ ForwardDiff(*it, transport_sequence_number) >= 0x8000) { |
+ ++it; |
+ } |
+ packets_sent_since_last_feedback_.erase( |
+ packets_sent_since_last_feedback_.cbegin(), it); |
+ } |
+ |
+ packets_sent_since_last_feedback_.push_back(transport_sequence_number); |
+} |
+ |
+void AudioSendStream::OnTransportFeedback( |
+ const rtcp::TransportFeedback& feedback) { |
+ RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ std::vector<uint16_t> packets_sent_since_last_feedback; |
+ { |
+ rtc::CritScope lock(&packets_sent_since_last_feedback_cs_); |
+ std::swap(packets_sent_since_last_feedback_, |
+ packets_sent_since_last_feedback); |
+ } |
+ channel_proxy_->HandleTransportFeedback( |
elad.alon_webrtc.org
2017/03/10 12:03:26
FYI, I've also considered doing this with two sepa
|
+ packets_sent_since_last_feedback, feedback); |
+} |
+ |
const webrtc::AudioSendStream::Config& AudioSendStream::config() const { |
RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
return config_; |