congestion_controller.cc revision cb89c6f91491e683e47e5505536c154c905d5194
19ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org/* 29ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 39ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org * 49ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org * Use of this source code is governed by a BSD-style license 59ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org * that can be found in the LICENSE file in the root of the source 69ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org * tree. An additional intellectual property rights grant can be found 79ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org * in the file PATENTS. All contributing project authors may 89ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org * be found in the AUTHORS file in the root of the source tree. 99ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org */ 109ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org 119ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org#include "video_engine/vie_channel_group.h" 129ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org 1349888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org#include "modules/bitrate_controller/include/bitrate_controller.h" 149ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org#include "modules/rtp_rtcp/interface/rtp_rtcp.h" 159ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org#include "video_engine/vie_channel.h" 169ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org#include "video_engine/vie_encoder.h" 179ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org#include "video_engine/vie_remb.h" 189ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org 199ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.orgnamespace webrtc { 209ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org 219ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.orgChannelGroup::ChannelGroup(ProcessThread* process_thread) 2249888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org : remb_(new VieRemb(process_thread)), 23cb89c6f91491e683e47e5505536c154c905d5194bjornv@webrtc.org bitrate_controller_(BitrateController::CreateBitrateController()) { 2449888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org} 259ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org 269ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.orgChannelGroup::~ChannelGroup() { 279ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org assert(channels_.empty()); 289ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org assert(!remb_->InUse()); 299ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org} 309ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.orgvoid ChannelGroup::AddChannel(int channel_id) { 319ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org channels_.insert(channel_id); 329ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org} 339ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org 34cb89c6f91491e683e47e5505536c154c905d5194bjornv@webrtc.orgvoid ChannelGroup::RemoveChannel(int channel_id) { 359ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org channels_.erase(channel_id); 369ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org} 379ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org 389ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.orgbool ChannelGroup::HasChannel(int channel_id) { 399ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org return channels_.find(channel_id) != channels_.end(); 409ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org} 419ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org 429ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.orgbool ChannelGroup::Empty() { 439ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org return channels_.empty(); 449ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org} 459ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org 46cb89c6f91491e683e47e5505536c154c905d5194bjornv@webrtc.orgRtpRemoteBitrateObserver* ChannelGroup::GetRtpRemoteBitrateObserver() { 47cb89c6f91491e683e47e5505536c154c905d5194bjornv@webrtc.org return remb_.get(); 482853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org} 492853dde5201d9ddc284ce5efb9688f6340487acepwestin@webrtc.org 50cb89c6f91491e683e47e5505536c154c905d5194bjornv@webrtc.orgBitrateController* ChannelGroup::GetBitrateController() { 51cb89c6f91491e683e47e5505536c154c905d5194bjornv@webrtc.org return bitrate_controller_.get(); 52f72881406fba86adc2d649bb1caee0d5604f9339stefan@webrtc.org} 53f72881406fba86adc2d649bb1caee0d5604f9339stefan@webrtc.org 549ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.orgbool ChannelGroup::SetChannelRembStatus(int channel_id, 559ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org bool sender, 569ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org bool receiver, 579ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org ViEChannel* channel, 589ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org ViEEncoder* encoder) { 599ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org // Update the channel state. 609ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org if (sender || receiver) { 619ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org if (!channel->EnableRemb(true)) { 629ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org return false; 639ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org } 649ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org } else if (channel) { 659ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org channel->EnableRemb(false); 669ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org } 67cb89c6f91491e683e47e5505536c154c905d5194bjornv@webrtc.org // Update the remb instance with necesary RTp modules. 689ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org RtpRtcp* rtp_module = channel->rtp_rtcp(); 699ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org if (sender) { 709ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org remb_->AddRembSender(rtp_module); 719ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org } else { 729ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org remb_->RemoveRembSender(rtp_module); 739ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org } 749ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org if (receiver) { 759ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org remb_->AddReceiveChannel(rtp_module); 769ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org } else { 779ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org remb_->RemoveReceiveChannel(rtp_module); 789ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org } 799ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org return true; 809ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org} 819ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org 829ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org} // namespace webrtc 83