Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(249)

Unified Diff: webrtc/audio/audio_send_stream.cc

Issue 2638083002: Attach TransportFeedbackPacketLossTracker to ANA (PLR only) (Closed)
Patch Set: TODO replaced by task (7173). Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_;

Powered by Google App Engine
This is Rietveld 408576698