Index: webrtc/audio/audio_send_stream.cc |
diff --git a/webrtc/audio/audio_send_stream.cc b/webrtc/audio/audio_send_stream.cc |
index d08bfeaa1ef70c43de1de0fd57f1e252966542ec..17979d5760c0a2ca9ceecf9b7ad0cb5e545d3acc 100644 |
--- a/webrtc/audio/audio_send_stream.cc |
+++ b/webrtc/audio/audio_send_stream.cc |
@@ -59,8 +59,11 @@ namespace internal { |
AudioSendStream::AudioSendStream( |
const webrtc::AudioSendStream::Config& config, |
const rtc::scoped_refptr<webrtc::AudioState>& audio_state, |
- CongestionController* congestion_controller) |
- : config_(config), audio_state_(audio_state) { |
+ CongestionController* congestion_controller, |
+ BitrateAllocator* bitrate_allocator) |
+ : config_(config), |
+ audio_state_(audio_state), |
+ bitrate_allocator_(bitrate_allocator) { |
LOG(LS_INFO) << "AudioSendStream: " << config_.ToString(); |
RTC_DCHECK_NE(config_.voe_channel_id, -1); |
RTC_DCHECK(audio_state_.get()); |
@@ -104,6 +107,12 @@ AudioSendStream::~AudioSendStream() { |
void AudioSendStream::Start() { |
RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (config_.min_bitrate_kbps != -1 && config_.max_bitrate_kbps != -1) { |
+ RTC_DCHECK_GE(config_.max_bitrate_kbps, config_.min_bitrate_kbps); |
+ bitrate_allocator_->AddObserver(this, config_.min_bitrate_kbps * 1000, |
+ config_.max_bitrate_kbps * 1000, 0, true); |
+ } |
+ |
ScopedVoEInterface<VoEBase> base(voice_engine()); |
int error = base->StartSend(config_.voe_channel_id); |
if (error != 0) { |
@@ -113,6 +122,7 @@ void AudioSendStream::Start() { |
void AudioSendStream::Stop() { |
RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
+ bitrate_allocator_->RemoveObserver(this); |
ScopedVoEInterface<VoEBase> base(voice_engine()); |
int error = base->StopSend(config_.voe_channel_id); |
if (error != 0) { |
@@ -227,6 +237,24 @@ bool AudioSendStream::DeliverRtcp(const uint8_t* packet, size_t length) { |
return channel_proxy_->ReceivedRTCPPacket(packet, length); |
} |
+uint32_t AudioSendStream::OnBitrateUpdated(uint32_t bitrate_bps, |
+ uint8_t fraction_loss, |
+ int64_t rtt) { |
+ RTC_DCHECK_GE(bitrate_bps, |
+ static_cast<uint32_t>(config_.min_bitrate_kbps * 1000)); |
+ // The bitrate allocator might allocate an higher than max configured bitrate |
+ // if there is room, to allow for, as example, extra FEC. Ignore that for now. |
+ const uint32_t max_bitrate_bps = config_.max_bitrate_kbps * 1000; |
+ if (bitrate_bps > max_bitrate_bps) |
+ bitrate_bps = max_bitrate_bps; |
+ |
+ channel_proxy_->SetBitrate(bitrate_bps); |
+ |
+ // The amount of audio protection is not exposed by the encoder, hence |
+ // always returning 0. |
+ return 0; |
+} |
+ |
const webrtc::AudioSendStream::Config& AudioSendStream::config() const { |
RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
return config_; |