Chromium Code Reviews| Index: webrtc/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c |
| diff --git a/webrtc/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c b/webrtc/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c |
| index ce8ceb217a7b1c981c85abfd8210602fe0ad248c..f3f515304031565b359a7374ee5c7cd3dea27ff2 100644 |
| --- a/webrtc/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c |
| +++ b/webrtc/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c |
| @@ -20,7 +20,9 @@ |
| #include "settings.h" |
| #include "isac.h" |
| +#include <assert.h> |
| #include <math.h> |
| +#include <string.h> |
| /* array of quantization levels for bottle neck info; Matlab code: */ |
| /* sprintf('%4.1ff, ', logspace(log10(5000), log10(40000), 12)) */ |
| @@ -119,6 +121,9 @@ int32_t WebRtcIsac_InitBandwidthEstimator( |
| bwest_str->inWaitLatePkts = 0; |
| bwest_str->senderTimestamp = 0; |
| bwest_str->receiverTimestamp = 0; |
| + |
| + bwest_str->external_bw_info.in_use = 0; |
| + |
| return 0; |
| } |
| @@ -154,6 +159,7 @@ int16_t WebRtcIsac_UpdateBandwidthEstimator( |
| int immediate_set = 0; |
| int num_pkts_expected; |
| + assert(!bwest_str->external_bw_info.in_use); |
| // We have to adjust the header-rate if the first packet has a |
| // frame-size different than the initialized value. |
| @@ -508,6 +514,8 @@ int16_t WebRtcIsac_UpdateUplinkBwImpl( |
| int16_t index, |
| enum IsacSamplingRate encoderSamplingFreq) |
| { |
| + assert(!bwest_str->external_bw_info.in_use); |
| + |
| if((index < 0) || (index > 23)) |
| { |
| return -ISAC_RANGE_ERROR_BW_ESTIMATOR; |
| @@ -564,6 +572,8 @@ int16_t WebRtcIsac_UpdateUplinkJitter( |
| BwEstimatorstr* bwest_str, |
| int32_t index) |
| { |
| + assert(!bwest_str->external_bw_info.in_use); |
| + |
| if((index < 0) || (index > 23)) |
| { |
| return -ISAC_RANGE_ERROR_BW_ESTIMATOR; |
| @@ -589,7 +599,7 @@ int16_t WebRtcIsac_UpdateUplinkJitter( |
| // Returns the bandwidth/jitter estimation code (integer 0...23) |
| // to put in the sending iSAC payload |
| -uint16_t |
| +void |
| WebRtcIsac_GetDownlinkBwJitIndexImpl( |
| BwEstimatorstr* bwest_str, |
| int16_t* bottleneckIndex, |
| @@ -609,6 +619,12 @@ WebRtcIsac_GetDownlinkBwJitIndexImpl( |
| int16_t maxInd; |
| int16_t midInd; |
| + if (bwest_str->external_bw_info.in_use) { |
| + *bottleneckIndex = bwest_str->external_bw_info.bottleneck_idx; |
| + *jitterInfo = bwest_str->external_bw_info.jitter_info; |
| + return; |
| + } |
| + |
| /* Get Max Delay Bit */ |
| /* get unquantized max delay */ |
| MaxDelay = (float)WebRtcIsac_GetDownlinkMaxDelay(bwest_str); |
| @@ -684,8 +700,6 @@ WebRtcIsac_GetDownlinkBwJitIndexImpl( |
| bwest_str->rec_bw_avg = (1 - weight) * bwest_str->rec_bw_avg + weight * |
| (rate + bwest_str->rec_header_rate); |
| - |
| - return 0; |
| } |
| @@ -697,6 +711,8 @@ int32_t WebRtcIsac_GetDownlinkBandwidth( const BwEstimatorstr *bwest_str) |
| float jitter_sign; |
| float bw_adjust; |
| + assert(!bwest_str->external_bw_info.in_use); |
| + |
| /* create a value between -1.0 and 1.0 indicating "average sign" of jitter */ |
| jitter_sign = bwest_str->rec_jitter_short_term / |
| bwest_str->rec_jitter_short_term_abs; |
| @@ -725,6 +741,8 @@ WebRtcIsac_GetDownlinkMaxDelay(const BwEstimatorstr *bwest_str) |
| { |
| int32_t rec_max_delay; |
| + assert(!bwest_str->external_bw_info.in_use); |
| + |
| rec_max_delay = (int32_t)(bwest_str->rec_max_delay); |
| /* limit range of jitter estimate */ |
| @@ -739,48 +757,45 @@ WebRtcIsac_GetDownlinkMaxDelay(const BwEstimatorstr *bwest_str) |
| return rec_max_delay; |
| } |
| -/* get the bottle neck rate from here to far side, as estimated by far side */ |
| -void |
| -WebRtcIsac_GetUplinkBandwidth( |
| - const BwEstimatorstr* bwest_str, |
| - int32_t* bitRate) |
| -{ |
| - /* limit range of bottle neck rate */ |
| - if (bwest_str->send_bw_avg < MIN_ISAC_BW) |
| - { |
| - *bitRate = MIN_ISAC_BW; |
| - } |
| - else if (bwest_str->send_bw_avg > MAX_ISAC_BW) |
| - { |
| - *bitRate = MAX_ISAC_BW; |
| - } |
| - else |
| - { |
| - *bitRate = (int32_t)(bwest_str->send_bw_avg); |
| - } |
| - return; |
| +/* Clamp val to the closed interval [min,max]. */ |
| +static int32_t clamp(int32_t val, int32_t min, int32_t max) { |
| + assert(min <= max); |
| + if (val <= min) |
|
hlundin-webrtc
2015/06/26 10:35:14
Same here: consider one-liner.
kwiberg-webrtc
2015/06/28 03:17:41
Done.
|
| + return min; |
| + if (val >= max) |
| + return max; |
| + return val; |
| } |
| -/* Returns the max delay value from the other side in ms */ |
| -int32_t |
| -WebRtcIsac_GetUplinkMaxDelay(const BwEstimatorstr *bwest_str) |
| -{ |
| - int32_t send_max_delay; |
| +int32_t WebRtcIsac_GetUplinkBandwidth(const BwEstimatorstr* bwest_str) { |
| + return bwest_str->external_bw_info.in_use |
| + ? bwest_str->external_bw_info.send_bw_avg |
| + : clamp(bwest_str->send_bw_avg, MIN_ISAC_BW, MAX_ISAC_BW); |
| +} |
| - send_max_delay = (int32_t)(bwest_str->send_max_delay_avg); |
| +int32_t WebRtcIsac_GetUplinkMaxDelay(const BwEstimatorstr* bwest_str) { |
| + return bwest_str->external_bw_info.in_use |
| + ? bwest_str->external_bw_info.send_max_delay_avg |
| + : clamp(bwest_str->send_max_delay_avg, MIN_ISAC_MD, MAX_ISAC_MD); |
| +} |
| - /* limit range of jitter estimate */ |
| - if (send_max_delay < MIN_ISAC_MD) |
| - { |
| - send_max_delay = MIN_ISAC_MD; |
| - } |
| - else if (send_max_delay > MAX_ISAC_MD) |
| - { |
| - send_max_delay = MAX_ISAC_MD; |
| - } |
| - return send_max_delay; |
| +void WebRtcIsacBw_GetBandwidthInfo(BwEstimatorstr* bwest_str, |
| + enum IsacSamplingRate decoder_sample_rate_hz, |
| + IsacBandwidthInfo* bwinfo) { |
| + assert(!bwest_str->external_bw_info.in_use); |
| + bwinfo->in_use = 1; |
| + bwinfo->send_bw_avg = WebRtcIsac_GetUplinkBandwidth(bwest_str); |
| + bwinfo->send_max_delay_avg = WebRtcIsac_GetUplinkMaxDelay(bwest_str); |
| + WebRtcIsac_GetDownlinkBwJitIndexImpl(bwest_str, &bwinfo->bottleneck_idx, |
| + &bwinfo->jitter_info, |
| + decoder_sample_rate_hz); |
| } |
| +void WebRtcIsacBw_SetBandwidthInfo(BwEstimatorstr* bwest_str, |
| + const IsacBandwidthInfo* bwinfo) { |
| + memcpy(&bwest_str->external_bw_info, bwinfo, |
| + sizeof bwest_str->external_bw_info); |
| +} |
| /* |
| * update long-term average bitrate and amount of data in buffer |