Index: webrtc/voice_engine/channel.cc |
diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc |
index 2791f7f8b4ed555ed9da3e8d3f45ab6b9fa18171..a9cf2b26dc8edea51bb8d56b57d13a52275e58b2 100644 |
--- a/webrtc/voice_engine/channel.cc |
+++ b/webrtc/voice_engine/channel.cc |
@@ -333,16 +333,32 @@ class StatisticsProxy : public RtcpStatisticsCallback { |
class VoERtcpObserver : public RtcpBandwidthObserver { |
public: |
- explicit VoERtcpObserver(Channel* owner) : owner_(owner) {} |
+ explicit VoERtcpObserver(Channel* owner) |
+ : owner_(owner), bandwidth_observer_(nullptr) {} |
virtual ~VoERtcpObserver() {} |
+ void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) { |
+ rtc::CritScope lock(&crit_); |
+ bandwidth_observer_ = bandwidth_observer; |
+ } |
+ |
void OnReceivedEstimatedBitrate(uint32_t bitrate) override { |
- // Not used for Voice Engine. |
+ rtc::CritScope lock(&crit_); |
+ if (bandwidth_observer_) { |
+ bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate); |
+ } |
} |
void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks, |
int64_t rtt, |
int64_t now_ms) override { |
+ { |
+ rtc::CritScope lock(&crit_); |
+ if (bandwidth_observer_) { |
+ bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt, |
+ now_ms); |
+ } |
+ } |
// TODO(mflodman): Do we need to aggregate reports here or can we jut send |
// what we get? I.e. do we ever get multiple reports bundled into one RTCP |
// report for VoiceEngine? |
@@ -384,6 +400,8 @@ class VoERtcpObserver : public RtcpBandwidthObserver { |
Channel* owner_; |
// Maps remote side ssrc to extended highest sequence number received. |
std::map<uint32_t, uint32_t> extended_max_sequence_number_; |
+ rtc::CriticalSection crit_; |
+ RtcpBandwidthObserver* bandwidth_observer_ GUARDED_BY(crit_); |
}; |
int32_t Channel::SendData(FrameType frameType, |
@@ -2424,10 +2442,12 @@ void Channel::EnableReceiveTransportSequenceNumber(int id) { |
void Channel::RegisterSenderCongestionControlObjects( |
RtpPacketSender* rtp_packet_sender, |
TransportFeedbackObserver* transport_feedback_observer, |
- PacketRouter* packet_router) { |
+ PacketRouter* packet_router, |
+ RtcpBandwidthObserver* bandwidth_observer) { |
RTC_DCHECK(rtp_packet_sender); |
RTC_DCHECK(transport_feedback_observer); |
RTC_DCHECK(packet_router && !packet_router_); |
+ rtcp_observer_->SetBandwidthObserver(bandwidth_observer); |
feedback_observer_proxy_->SetTransportFeedbackObserver( |
transport_feedback_observer); |
seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router); |
@@ -2447,6 +2467,7 @@ void Channel::RegisterReceiverCongestionControlObjects( |
void Channel::ResetCongestionControlObjects() { |
RTC_DCHECK(packet_router_); |
_rtpRtcpModule->SetStorePacketsStatus(false, 600); |
+ rtcp_observer_->SetBandwidthObserver(nullptr); |
feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr); |
seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr); |
packet_router_->RemoveRtpModule(_rtpRtcpModule.get()); |