webrtc/webrtc/modules/bitrate_controller/include/bitrate_controller.h
henrik.lundin@webrtc.org 29dd0de5b3 Changing the bitrate clamping in BitrateControllerImpl
This CL implements an alternative to the bitrate clamping that is done
in BitrateControllerImpl. The default behavior is unchanged, but if
the new algorithm is enabled the behavior is as follows:
When the new bitrate is lower than the sum of min bitrates, the
algorithm will give each observer up to its min bitrate, one
observer at a time, until the bitrate budget is depleted. Thus,
with this change, some observers may get less than their min bitrate,
or even zero.

Unit tests are implemented.

Also fixing two old lint warnings in the affected files.

This change is related to the auto-muter feature.

BUG=2436
R=stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/2439005

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5007 4adac7df-926f-26a2-2b94-8c16560cd09d
2013-10-21 14:00:01 +00:00

75 lines
3.1 KiB
C++

/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*
* Usage: this class will register multiple RtcpBitrateObserver's one at each
* RTCP module. It will aggregate the results and run one bandwidth estimation
* and push the result to the encoders via BitrateObserver(s).
*/
#ifndef WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_BITRATE_CONTROLLER_H_
#define WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_BITRATE_CONTROLLER_H_
#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
namespace webrtc {
class BitrateObserver {
/*
* Observer class for the encoders, each encoder should implement this class
* to get the target bitrate. It also get the fraction loss and rtt to
* optimize its settings for this type of network. |target_bitrate| is the
* target media/payload bitrate excluding packet headers, measured in bits
* per second.
*/
public:
virtual void OnNetworkChanged(const uint32_t target_bitrate,
const uint8_t fraction_loss, // 0 - 255.
const uint32_t rtt) = 0;
virtual ~BitrateObserver() {}
};
class BitrateController {
/*
* This class collects feedback from all streams sent to a peer (via
* RTCPBandwidthObservers). It does one aggregated send side bandwidth
* estimation and divide the available bitrate between all its registered
* BitrateObservers.
*/
public:
// The argument |enforce_min_bitrate| controls the behavior when the available
// bitrate is lower than the minimum bitrate, or the sum of minimum bitrates.
// When true, the bitrate will never be set lower than the minimum bitrate(s).
// When false, the bitrate observers will be allocated rates up to their
// respective minimum bitrate, satisfying one observer after the other.
static BitrateController* CreateBitrateController(bool enforce_min_bitrate);
virtual ~BitrateController() {}
virtual RtcpBandwidthObserver* CreateRtcpBandwidthObserver() = 0;
// Gets the available payload bandwidth in bits per second. Note that
// this bandwidth excludes packet headers.
virtual bool AvailableBandwidth(uint32_t* bandwidth) const = 0;
/*
* Set the start and max send bitrate used by the bandwidth management.
*
* observer, updates bitrates if already in use.
* min_bitrate_kbit = 0 equals no min bitrate.
* max_bitrate_kit = 0 equals no max bitrate.
*/
virtual void SetBitrateObserver(BitrateObserver* observer,
const uint32_t start_bitrate,
const uint32_t min_bitrate,
const uint32_t max_bitrate) = 0;
virtual void RemoveBitrateObserver(BitrateObserver* observer) = 0;
};
} // namespace webrtc
#endif // WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_BITRATE_CONTROLLER_H_