1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 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
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * bandwidth_estimator.h
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * This header file contains the API for the Bandwidth Estimator
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * designed for iSAC.
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_BANDWIDTH_ESTIMATOR_H_
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_BANDWIDTH_ESTIMATOR_H_
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "structs.h"
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "settings.h"
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MIN_ISAC_BW     10000
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MIN_ISAC_BW_LB  10000
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MIN_ISAC_BW_UB  25000
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MAX_ISAC_BW     56000
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MAX_ISAC_BW_UB  32000
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MAX_ISAC_BW_LB  32000
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MIN_ISAC_MD     5
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MAX_ISAC_MD     25
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// assumed header size, in bytes; we don't know the exact number
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// (header compression may be used)
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define HEADER_SIZE        35
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Initial Frame-Size, in ms, for Wideband & Super-Wideband Mode
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define INIT_FRAME_LEN_WB  60
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define INIT_FRAME_LEN_SWB 30
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Initial Bottleneck Estimate, in bits/sec, for
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Wideband & Super-wideband mode
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define INIT_BN_EST_WB     20e3f
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define INIT_BN_EST_SWB    56e3f
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Initial Header rate (header rate depends on frame-size),
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// in bits/sec, for Wideband & Super-Wideband mode.
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define INIT_HDR_RATE_WB                                                \
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ((float)HEADER_SIZE * 8.0f * 1000.0f / (float)INIT_FRAME_LEN_WB)
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define INIT_HDR_RATE_SWB                                               \
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ((float)HEADER_SIZE * 8.0f * 1000.0f / (float)INIT_FRAME_LEN_SWB)
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// number of packets in a row for a high rate burst
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define BURST_LEN       3
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// ms, max time between two full bursts
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define BURST_INTERVAL  500
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// number of packets in a row for initial high rate burst
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define INIT_BURST_LEN  5
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// bits/s, rate for the first BURST_LEN packets
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define INIT_RATE_WB       INIT_BN_EST_WB
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define INIT_RATE_SWB      INIT_BN_EST_SWB
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(__cplusplus)
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern "C" {
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* This function initializes the struct                    */
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* to be called before using the struct for anything else  */
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* returns 0 if everything went fine, -1 otherwise         */
78fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  int32_t WebRtcIsac_InitBandwidthEstimator(
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      BwEstimatorstr*           bwest_str,
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      enum IsacSamplingRate encoderSampRate,
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      enum IsacSamplingRate decoderSampRate);
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* This function updates the receiving estimate                                                      */
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* Parameters:                                                                                       */
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* rtp_number    - value from RTP packet, from NetEq                                                 */
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* frame length  - length of signal frame in ms, from iSAC decoder                                   */
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* send_ts       - value in RTP header giving send time in samples                                   */
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* arr_ts        - value given by timeGetTime() time of arrival in samples of packet from NetEq      */
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* pksize        - size of packet in bytes, from NetEq                                               */
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* Index         - integer (range 0...23) indicating bottle neck & jitter as estimated by other side */
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* returns 0 if everything went fine, -1 otherwise                                                   */
92fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  int16_t WebRtcIsac_UpdateBandwidthEstimator(
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      BwEstimatorstr*    bwest_str,
94fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      const uint16_t rtp_number,
95fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      const int32_t  frame_length,
96fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      const uint32_t send_ts,
97fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      const uint32_t arr_ts,
98fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      const int32_t  pksize);
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* Update receiving estimates. Used when we only receive BWE index, no iSAC data packet. */
101fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  int16_t WebRtcIsac_UpdateUplinkBwImpl(
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      BwEstimatorstr*           bwest_str,
103fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      int16_t               Index,
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      enum IsacSamplingRate encoderSamplingFreq);
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* Returns the bandwidth/jitter estimation code (integer 0...23) to put in the sending iSAC payload */
107fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  uint16_t WebRtcIsac_GetDownlinkBwJitIndexImpl(
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      BwEstimatorstr*           bwest_str,
109fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      int16_t*              bottleneckIndex,
110fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      int16_t*              jitterInfo,
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      enum IsacSamplingRate decoderSamplingFreq);
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* Returns the bandwidth estimation (in bps) */
114fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  int32_t WebRtcIsac_GetDownlinkBandwidth(
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const BwEstimatorstr *bwest_str);
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* Returns the max delay (in ms) */
118fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  int32_t WebRtcIsac_GetDownlinkMaxDelay(
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const BwEstimatorstr *bwest_str);
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* Returns the bandwidth that iSAC should send with in bps */
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void WebRtcIsac_GetUplinkBandwidth(
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const BwEstimatorstr* bwest_str,
124fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      int32_t*          bitRate);
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* Returns the max delay value from the other side in ms */
127fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  int32_t WebRtcIsac_GetUplinkMaxDelay(
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const BwEstimatorstr *bwest_str);
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /*
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * update amount of data in bottle neck buffer and burst handling
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * returns minimum payload size (bytes)
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int WebRtcIsac_GetMinBytes(
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      RateModel*         State,
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      int                StreamSize,    /* bytes in bitstream */
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const int          FrameLen,      /* ms per frame */
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const double       BottleNeck,    /* bottle neck rate; excl headers (bps) */
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const double       DelayBuildUp,  /* max delay from bottleneck buffering (ms) */
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      enum ISACBandwidth bandwidth
142fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      /*,int16_t        frequentLargePackets*/);
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /*
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * update long-term average bitrate and amount of data in buffer
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void WebRtcIsac_UpdateRateModel(
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      RateModel*   State,
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      int          StreamSize,                /* bytes in bitstream */
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const int    FrameSamples,        /* samples per frame */
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const double BottleNeck);       /* bottle neck rate; excl headers (bps) */
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void WebRtcIsac_InitRateModel(
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      RateModel *State);
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* Returns the new framelength value (input argument: bottle_neck) */
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int WebRtcIsac_GetNewFrameLength(
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      double bottle_neck,
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      int    current_framelength);
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /* Returns the new SNR value (input argument: bottle_neck) */
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  double WebRtcIsac_GetSnr(
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      double bottle_neck,
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      int    new_framelength);
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
168fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  int16_t WebRtcIsac_UpdateUplinkJitter(
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      BwEstimatorstr*              bwest_str,
170fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      int32_t                  index);
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(__cplusplus)
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_BANDWIDTH_ESTIMATOR_H_ */
178