1a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/*
2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
4a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  Use of this source code is governed by a BSD-style license
5a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  that can be found in the LICENSE file in the root of the source
6a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  tree. An additional intellectual property rights grant can be found
7a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  in the file PATENTS.  All contributing project authors may
8a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  be found in the AUTHORS file in the root of the source tree.
9a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */
10a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
11a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/*
12a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * bandwidth_estimator.h
13a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
14a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * This header file contains the API for the Bandwidth Estimator
15a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * designed for iSAC.
16a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
17a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */
18a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
19a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_BANDWIDTH_ESTIMATOR_H_
20a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_BANDWIDTH_ESTIMATOR_H_
21a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
22a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "structs.h"
23a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
24a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
25a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/****************************************************************************
26a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * WebRtcIsacfix_InitBandwidthEstimator(...)
27a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
28a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * This function initializes the struct for the bandwidth estimator
29a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
30a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Input/Output:
31a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *      - bwest_str        : Struct containing bandwidth information.
32a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
33a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Return value            : 0
34a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */
35a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
36a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 WebRtcIsacfix_InitBandwidthEstimator(BwEstimatorstr *bwest_str);
37a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
38a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
39a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/****************************************************************************
40a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * WebRtcIsacfix_UpdateUplinkBwImpl(...)
41a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
42a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * This function updates bottle neck rate received from other side in payload
43a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * and calculates a new bottle neck to send to the other side.
44a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
45a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Input/Output:
46a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *      - bweStr           : struct containing bandwidth information.
47a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *      - rtpNumber        : value from RTP packet, from NetEq
48a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *      - frameSize        : length of signal frame in ms, from iSAC decoder
49a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *      - sendTime         : value in RTP header giving send time in samples
50a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *      - arrivalTime      : value given by timeGetTime() time of arrival in
51a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *                           samples of packet from NetEq
52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *      - pksize           : size of packet in bytes, from NetEq
53a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *      - Index            : integer (range 0...23) indicating bottle neck &
54a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *                           jitter as estimated by other side
55a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
56a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Return value            : 0 if everything went fine,
57a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *                           -1 otherwise
58a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */
59a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
60a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 WebRtcIsacfix_UpdateUplinkBwImpl(BwEstimatorstr            *bwest_str,
61a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                               const WebRtc_UWord16        rtp_number,
62a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                               const WebRtc_Word16         frameSize,
63a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                               const WebRtc_UWord32    send_ts,
64a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                               const WebRtc_UWord32        arr_ts,
65a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                               const WebRtc_Word16         pksize,
66a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                               const WebRtc_UWord16        Index);
67a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
68a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Update receiving estimates. Used when we only receive BWE index, no iSAC data packet. */
69a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word16 WebRtcIsacfix_UpdateUplinkBwRec(BwEstimatorstr *bwest_str,
70a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                              const WebRtc_Word16 Index);
71a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
72a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/****************************************************************************
73a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * WebRtcIsacfix_GetDownlinkBwIndexImpl(...)
74a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
75a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * This function calculates and returns the bandwidth/jitter estimation code
76a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * (integer 0...23) to put in the sending iSAC payload.
77a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
78a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Input:
79a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *      - bweStr       : BWE struct
80a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
81a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Return:
82a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *      bandwith and jitter index (0..23)
83a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */
84a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_UWord16 WebRtcIsacfix_GetDownlinkBwIndexImpl(BwEstimatorstr *bwest_str);
85a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
86a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Returns the bandwidth estimation (in bps) */
87a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_UWord16 WebRtcIsacfix_GetDownlinkBandwidth(const BwEstimatorstr *bwest_str);
88a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
89a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Returns the bandwidth that iSAC should send with in bps */
90a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word16 WebRtcIsacfix_GetUplinkBandwidth(const BwEstimatorstr *bwest_str);
91a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
92a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Returns the max delay (in ms) */
93a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word16 WebRtcIsacfix_GetDownlinkMaxDelay(const BwEstimatorstr *bwest_str);
94a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
95a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Returns the max delay value from the other side in ms */
96a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word16 WebRtcIsacfix_GetUplinkMaxDelay(const BwEstimatorstr *bwest_str);
97a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
98a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/*
99a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * update amount of data in bottle neck buffer and burst handling
100a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * returns minimum payload size (bytes)
101a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */
102a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_UWord16 WebRtcIsacfix_GetMinBytes(RateModel *State,
103a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                         WebRtc_Word16 StreamSize,     /* bytes in bitstream */
104a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                         const WebRtc_Word16 FrameLen,    /* ms per frame */
105a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                         const WebRtc_Word16 BottleNeck,        /* bottle neck rate; excl headers (bps) */
106a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                         const WebRtc_Word16 DelayBuildUp);     /* max delay from bottle neck buffering (ms) */
107a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
108a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/*
109a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * update long-term average bitrate and amount of data in buffer
110a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */
111a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_UpdateRateModel(RateModel *State,
112a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                   WebRtc_Word16 StreamSize,    /* bytes in bitstream */
113a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                   const WebRtc_Word16 FrameSamples,  /* samples per frame */
114a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                   const WebRtc_Word16 BottleNeck);       /* bottle neck rate; excl headers (bps) */
115a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
116a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
117a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid WebRtcIsacfix_InitRateModel(RateModel *State);
118a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
119a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Returns the new framelength value (input argument: bottle_neck) */
120a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word16 WebRtcIsacfix_GetNewFrameLength(WebRtc_Word16 bottle_neck, WebRtc_Word16 current_framelength);
121a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
122a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Returns the new SNR value (input argument: bottle_neck) */
123a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin//returns snr in Q10
124a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word16 WebRtcIsacfix_GetSnr(WebRtc_Word16 bottle_neck, WebRtc_Word16 framesamples);
125a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
126a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
127a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif /*  WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_BANDWIDTH_ESTIMATOR_H_ */
128