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