summaryrefslogtreecommitdiff
path: root/webrtc/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.h
blob: 0704337f7df1bc675fbab439a4b1b2c05b2fd4aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/*
 *  Copyright (c) 2011 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.
 */

/*
 * bandwidth_estimator.h
 *
 * This header file contains the API for the Bandwidth Estimator
 * designed for iSAC.
 *
 */

#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_BANDWIDTH_ESTIMATOR_H_
#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_BANDWIDTH_ESTIMATOR_H_

#include "structs.h"
#include "settings.h"


#define MIN_ISAC_BW     10000
#define MIN_ISAC_BW_LB  10000
#define MIN_ISAC_BW_UB  25000

#define MAX_ISAC_BW     56000
#define MAX_ISAC_BW_UB  32000
#define MAX_ISAC_BW_LB  32000

#define MIN_ISAC_MD     5
#define MAX_ISAC_MD     25

// assumed header size, in bytes; we don't know the exact number
// (header compression may be used)
#define HEADER_SIZE        35

// Initial Frame-Size, in ms, for Wideband & Super-Wideband Mode
#define INIT_FRAME_LEN_WB  60
#define INIT_FRAME_LEN_SWB 30

// Initial Bottleneck Estimate, in bits/sec, for
// Wideband & Super-wideband mode
#define INIT_BN_EST_WB     20e3f
#define INIT_BN_EST_SWB    56e3f

// Initial Header rate (header rate depends on frame-size),
// in bits/sec, for Wideband & Super-Wideband mode.
#define INIT_HDR_RATE_WB                                                \
  ((float)HEADER_SIZE * 8.0f * 1000.0f / (float)INIT_FRAME_LEN_WB)
#define INIT_HDR_RATE_SWB                                               \
  ((float)HEADER_SIZE * 8.0f * 1000.0f / (float)INIT_FRAME_LEN_SWB)

// number of packets in a row for a high rate burst
#define BURST_LEN       3

// ms, max time between two full bursts
#define BURST_INTERVAL  500

// number of packets in a row for initial high rate burst
#define INIT_BURST_LEN  5

// bits/s, rate for the first BURST_LEN packets
#define INIT_RATE_WB       INIT_BN_EST_WB
#define INIT_RATE_SWB      INIT_BN_EST_SWB


#if defined(__cplusplus)
extern "C" {
#endif

  /* This function initializes the struct                    */
  /* to be called before using the struct for anything else  */
  /* returns 0 if everything went fine, -1 otherwise         */
  int32_t WebRtcIsac_InitBandwidthEstimator(
      BwEstimatorstr*           bwest_str,
      enum IsacSamplingRate encoderSampRate,
      enum IsacSamplingRate decoderSampRate);

  /* This function updates the receiving estimate                                                      */
  /* Parameters:                                                                                       */
  /* rtp_number    - value from RTP packet, from NetEq                                                 */
  /* frame length  - length of signal frame in ms, from iSAC decoder                                   */
  /* send_ts       - value in RTP header giving send time in samples                                   */
  /* arr_ts        - value given by timeGetTime() time of arrival in samples of packet from NetEq      */
  /* pksize        - size of packet in bytes, from NetEq                                               */
  /* Index         - integer (range 0...23) indicating bottle neck & jitter as estimated by other side */
  /* returns 0 if everything went fine, -1 otherwise                                                   */
  int16_t WebRtcIsac_UpdateBandwidthEstimator(
      BwEstimatorstr* bwest_str,
      const uint16_t rtp_number,
      const int32_t frame_length,
      const uint32_t send_ts,
      const uint32_t arr_ts,
      const size_t pksize);

  /* Update receiving estimates. Used when we only receive BWE index, no iSAC data packet. */
  int16_t WebRtcIsac_UpdateUplinkBwImpl(
      BwEstimatorstr*           bwest_str,
      int16_t               Index,
      enum IsacSamplingRate encoderSamplingFreq);

  /* Returns the bandwidth/jitter estimation code (integer 0...23) to put in the sending iSAC payload */
  void WebRtcIsac_GetDownlinkBwJitIndexImpl(
      BwEstimatorstr* bwest_str,
      int16_t* bottleneckIndex,
      int16_t* jitterInfo,
      enum IsacSamplingRate decoderSamplingFreq);

  /* Returns the bandwidth estimation (in bps) */
  int32_t WebRtcIsac_GetDownlinkBandwidth(
      const BwEstimatorstr *bwest_str);

  /* Returns the max delay (in ms) */
  int32_t WebRtcIsac_GetDownlinkMaxDelay(
      const BwEstimatorstr *bwest_str);

  /* Returns the bandwidth that iSAC should send with in bps */
  int32_t WebRtcIsac_GetUplinkBandwidth(const BwEstimatorstr* bwest_str);

  /* Returns the max delay value from the other side in ms */
  int32_t WebRtcIsac_GetUplinkMaxDelay(
      const BwEstimatorstr *bwest_str);

  /* Fills in an IsacExternalBandwidthInfo struct. */
  void WebRtcIsacBw_GetBandwidthInfo(
      BwEstimatorstr* bwest_str,
      enum IsacSamplingRate decoder_sample_rate_hz,
      IsacBandwidthInfo* bwinfo);

  /* Uses the values from an IsacExternalBandwidthInfo struct. */
  void WebRtcIsacBw_SetBandwidthInfo(BwEstimatorstr* bwest_str,
                                     const IsacBandwidthInfo* bwinfo);

  /*
   * update amount of data in bottle neck buffer and burst handling
   * returns minimum payload size (bytes)
   */
  int WebRtcIsac_GetMinBytes(
      RateModel*         State,
      int                StreamSize,    /* bytes in bitstream */
      const int          FrameLen,      /* ms per frame */
      const double       BottleNeck,    /* bottle neck rate; excl headers (bps) */
      const double       DelayBuildUp,  /* max delay from bottleneck buffering (ms) */
      enum ISACBandwidth bandwidth
      /*,int16_t        frequentLargePackets*/);

  /*
   * update long-term average bitrate and amount of data in buffer
   */
  void WebRtcIsac_UpdateRateModel(
      RateModel*   State,
      int          StreamSize,                /* bytes in bitstream */
      const int    FrameSamples,        /* samples per frame */
      const double BottleNeck);       /* bottle neck rate; excl headers (bps) */


  void WebRtcIsac_InitRateModel(
      RateModel *State);

  /* Returns the new framelength value (input argument: bottle_neck) */
  int WebRtcIsac_GetNewFrameLength(
      double bottle_neck,
      int    current_framelength);

  /* Returns the new SNR value (input argument: bottle_neck) */
  double WebRtcIsac_GetSnr(
      double bottle_neck,
      int    new_framelength);


  int16_t WebRtcIsac_UpdateUplinkJitter(
      BwEstimatorstr*              bwest_str,
      int32_t                  index);

#if defined(__cplusplus)
}
#endif


#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_BANDWIDTH_ESTIMATOR_H_ */