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..940e8f50c76a740aada28079eeab9e42a04c09a8 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,41 @@ 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); |
+ return val < min ? min : (val > max ? max : 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 |