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