1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  FEC and NACK added bitrate is handled outside class
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org#include <deque>
17d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org
184736a269b43752c5c3208941a7c193cb7a4df3ffpbos@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
194736a269b43752c5c3208941a7c193cb7a4df3ffpbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass SendSideBandwidthEstimation {
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  SendSideBandwidthEstimation();
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual ~SendSideBandwidthEstimation();
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
273b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org  void CurrentEstimate(uint32_t* bitrate, uint8_t* loss, uint32_t* rtt) const;
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
29d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org  // Call periodically to update estimate.
30d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org  void UpdateEstimate(uint32_t now_ms);
31d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org
323b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org  // Call when we receive a RTCP message with TMMBR or REMB.
333b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org  void UpdateReceiverEstimate(uint32_t bandwidth);
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
353b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org  // Call when we receive a RTCP message with a ReceiveBlock.
363b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org  void UpdateReceiverBlock(uint8_t fraction_loss,
373b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org                           uint32_t rtt,
383b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org                           int number_of_packets,
393b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org                           uint32_t now_ms);
403b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org
413b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org  void SetSendBitrate(uint32_t bitrate);
423b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org  void SetMinMaxBitrate(uint32_t min_bitrate, uint32_t max_bitrate);
43c766098f12c57c4c5b50a08b2c9aba2b63686a3chenrik.lundin@webrtc.org  void SetMinBitrate(uint32_t min_bitrate);
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
463b6c0e5068d2f56a903bb7ef7bbf09964ce4f26fandresp@webrtc.org  void CapBitrateToThresholds();
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
48d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org  // Updates history of min bitrates.
49d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org  // After this method returns min_bitrate_history_.front().second contains the
50d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org  // min bitrate used during last kBweIncreaseIntervalMs.
51d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org  void UpdateMinHistory(uint32_t now_ms);
52d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org
53d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org  std::deque<std::pair<uint32_t, uint32_t> > min_bitrate_history_;
54d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // incoming filters
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int accumulate_lost_packets_Q8_;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int accumulate_expected_packets_;
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t bitrate_;
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t min_bitrate_configured_;
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t max_bitrate_configured_;
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org  uint32_t time_last_receiver_block_ms_;
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint8_t last_fraction_loss_;
65d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org  uint16_t last_round_trip_time_ms_;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t bwe_incoming_;
68d7aa2282d621744a07956ff207b5cde756229f09andresp@webrtc.org  uint32_t time_last_decrease_ms_;
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
72