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