| Index: webrtc/audio/audio_send_stream.cc
|
| diff --git a/webrtc/audio/audio_send_stream.cc b/webrtc/audio/audio_send_stream.cc
|
| index 438d1cc78a5aca5d7657b6368bfbac03fa5aed8e..79afdf6579a1a7300755841deb4f47c4e11d513d 100644
|
| --- a/webrtc/audio/audio_send_stream.cc
|
| +++ b/webrtc/audio/audio_send_stream.cc
|
| @@ -40,6 +40,11 @@ bool IsCodec(const webrtc::CodecInst& codec, const char* ref_name) {
|
| } // namespace
|
|
|
| namespace internal {
|
| +// TODO(elad.alon): Subsequent CL will make these values experiment-dependent.
|
| +constexpr size_t kPacketLossTrackerMaxWindowSizeMs = 15000;
|
| +constexpr size_t kPlrMinNumAckedPackets = 50;
|
| +constexpr size_t kRplrMinNumAckedPairs = 40;
|
| +
|
| AudioSendStream::AudioSendStream(
|
| const webrtc::AudioSendStream::Config& config,
|
| const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
|
| @@ -49,11 +54,15 @@ AudioSendStream::AudioSendStream(
|
| BitrateAllocator* bitrate_allocator,
|
| RtcEventLog* event_log,
|
| RtcpRttStats* rtcp_rtt_stats)
|
| - : worker_queue_(worker_queue),
|
| + : clock_(Clock::GetRealTimeClock()),
|
| + worker_queue_(worker_queue),
|
| config_(config),
|
| audio_state_(audio_state),
|
| bitrate_allocator_(bitrate_allocator),
|
| - congestion_controller_(congestion_controller) {
|
| + congestion_controller_(congestion_controller),
|
| + packet_loss_tracker_(kPacketLossTrackerMaxWindowSizeMs,
|
| + kPlrMinNumAckedPackets,
|
| + kRplrMinNumAckedPairs) {
|
| LOG(LS_INFO) << "AudioSendStream: " << config_.ToString();
|
| RTC_DCHECK_NE(config_.voe_channel_id, -1);
|
| RTC_DCHECK(audio_state_.get());
|
| @@ -72,6 +81,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) {
|
| @@ -96,6 +106,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);
|
| @@ -247,6 +258,23 @@ uint32_t AudioSendStream::OnBitrateUpdated(uint32_t bitrate_bps,
|
| return 0;
|
| }
|
|
|
| +void AudioSendStream::OnPacketAdded(uint32_t ssrc, uint16_t seq_num) {
|
| + // Only packets that belong to this stream are of interest.
|
| + if (ssrc == config_.rtp.ssrc) {
|
| + rtc::CritScope lock(&packet_loss_tracker_cs_);
|
| + packet_loss_tracker_.OnPacketAdded(seq_num, clock_->TimeInMilliseconds());
|
| + }
|
| +}
|
| +
|
| +void AudioSendStream::OnTransportFeedback(
|
| + const rtcp::TransportFeedback& feedback) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| + rtc::CritScope lock(&packet_loss_tracker_cs_);
|
| + packet_loss_tracker_.OnReceivedTransportFeedback(feedback);
|
| + channel_proxy_->OnTwccBasedUplinkPacketLossRate(
|
| + packet_loss_tracker_.GetPacketLossRate());
|
| +}
|
| +
|
| const webrtc::AudioSendStream::Config& AudioSendStream::config() const {
|
| RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| return config_;
|
|
|