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