Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Side by Side Diff: webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.c

Issue 1208923002: iSAC: Functions for importing and exporting bandwidth est. info (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: review comments Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 /* 11 /*
12 * bandwidth_estimator.c 12 * bandwidth_estimator.c
13 * 13 *
14 * This file contains the code for the Bandwidth Estimator designed 14 * This file contains the code for the Bandwidth Estimator designed
15 * for iSAC. 15 * for iSAC.
16 * 16 *
17 * NOTE! Castings needed for C55, do not remove! 17 * NOTE! Castings needed for C55, do not remove!
18 * 18 *
19 */ 19 */
20 20
21 #include "bandwidth_estimator.h" 21 #include "bandwidth_estimator.h"
22
23 #include <assert.h>
22 #include "settings.h" 24 #include "settings.h"
23 25
24 26
25 /* array of quantization levels for bottle neck info; Matlab code: */ 27 /* array of quantization levels for bottle neck info; Matlab code: */
26 /* sprintf('%4.1ff, ', logspace(log10(5000), log10(40000), 12)) */ 28 /* sprintf('%4.1ff, ', logspace(log10(5000), log10(40000), 12)) */
27 static const int16_t kQRateTable[12] = { 29 static const int16_t kQRateTable[12] = {
28 10000, 11115, 12355, 13733, 15265, 16967, 30 10000, 11115, 12355, 13733, 15265, 16967,
29 18860, 20963, 23301, 25900, 28789, 32000 31 18860, 20963, 23301, 25900, 28789, 32000
30 }; 32 };
31 33
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 bweStr->highSpeedSend = 0; 111 bweStr->highSpeedSend = 0;
110 bweStr->inWaitPeriod = 0; 112 bweStr->inWaitPeriod = 0;
111 113
112 /* Find the inverse of the max bw and min bw in Q30 114 /* Find the inverse of the max bw and min bw in Q30
113 * (1 / (MAX_ISAC_BW + INIT_HDR_RATE) in Q30 115 * (1 / (MAX_ISAC_BW + INIT_HDR_RATE) in Q30
114 * (1 / (MIN_ISAC_BW + INIT_HDR_RATE) in Q30 116 * (1 / (MIN_ISAC_BW + INIT_HDR_RATE) in Q30
115 */ 117 */
116 bweStr->maxBwInv = kInvBandwidth[3]; 118 bweStr->maxBwInv = kInvBandwidth[3];
117 bweStr->minBwInv = kInvBandwidth[2]; 119 bweStr->minBwInv = kInvBandwidth[2];
118 120
121 bweStr->external_bw_info.in_use = 0;
122
119 return 0; 123 return 0;
120 } 124 }
121 125
122 /**************************************************************************** 126 /****************************************************************************
123 * WebRtcIsacfix_UpdateUplinkBwImpl(...) 127 * WebRtcIsacfix_UpdateUplinkBwImpl(...)
124 * 128 *
125 * This function updates bottle neck rate received from other side in payload 129 * This function updates bottle neck rate received from other side in payload
126 * and calculates a new bottle neck to send to the other side. 130 * and calculates a new bottle neck to send to the other side.
127 * 131 *
128 * Input/Output: 132 * Input/Output:
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 int32_t sign; 173 int32_t sign;
170 174
171 uint32_t byteSecondsPerBit; 175 uint32_t byteSecondsPerBit;
172 uint32_t tempLower; 176 uint32_t tempLower;
173 uint32_t tempUpper; 177 uint32_t tempUpper;
174 int32_t recBwAvgInv; 178 int32_t recBwAvgInv;
175 int32_t numPktsExpected; 179 int32_t numPktsExpected;
176 180
177 int16_t errCode; 181 int16_t errCode;
178 182
183 assert(!bweStr->external_bw_info.in_use);
184
179 /* UPDATE ESTIMATES FROM OTHER SIDE */ 185 /* UPDATE ESTIMATES FROM OTHER SIDE */
180 186
181 /* The function also checks if Index has a valid value */ 187 /* The function also checks if Index has a valid value */
182 errCode = WebRtcIsacfix_UpdateUplinkBwRec(bweStr, Index); 188 errCode = WebRtcIsacfix_UpdateUplinkBwRec(bweStr, Index);
183 if (errCode <0) { 189 if (errCode <0) {
184 return(errCode); 190 return(errCode);
185 } 191 }
186 192
187 193
188 /* UPDATE ESTIMATES ON THIS SIDE */ 194 /* UPDATE ESTIMATES ON THIS SIDE */
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 } 544 }
539 545
540 /* This function updates the send bottle neck rate */ 546 /* This function updates the send bottle neck rate */
541 /* Index - integer (range 0...23) indicating bottle neck & jitter as est imated by other side */ 547 /* Index - integer (range 0...23) indicating bottle neck & jitter as est imated by other side */
542 /* returns 0 if everything went fine, -1 otherwise */ 548 /* returns 0 if everything went fine, -1 otherwise */
543 int16_t WebRtcIsacfix_UpdateUplinkBwRec(BwEstimatorstr *bweStr, 549 int16_t WebRtcIsacfix_UpdateUplinkBwRec(BwEstimatorstr *bweStr,
544 const int16_t Index) 550 const int16_t Index)
545 { 551 {
546 uint16_t RateInd; 552 uint16_t RateInd;
547 553
554 assert(!bweStr->external_bw_info.in_use);
555
548 if ( (Index < 0) || (Index > 23) ) { 556 if ( (Index < 0) || (Index > 23) ) {
549 return -ISAC_RANGE_ERROR_BW_ESTIMATOR; 557 return -ISAC_RANGE_ERROR_BW_ESTIMATOR;
550 } 558 }
551 559
552 /* UPDATE ESTIMATES FROM OTHER SIDE */ 560 /* UPDATE ESTIMATES FROM OTHER SIDE */
553 561
554 if ( Index > 11 ) { 562 if ( Index > 11 ) {
555 RateInd = Index - 12; 563 RateInd = Index - 12;
556 /* compute the jitter estimate as decoded on the other side in Q9 */ 564 /* compute the jitter estimate as decoded on the other side in Q9 */
557 /* sendMaxDelayAvg = 0.9 * sendMaxDelayAvg + 0.1 * MAX_ISAC_MD */ 565 /* sendMaxDelayAvg = 0.9 * sendMaxDelayAvg + 0.1 * MAX_ISAC_MD */
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 int32_t maxDelay; 617 int32_t maxDelay;
610 uint16_t rateInd; 618 uint16_t rateInd;
611 uint16_t maxDelayBit; 619 uint16_t maxDelayBit;
612 int32_t tempTerm1; 620 int32_t tempTerm1;
613 int32_t tempTerm2; 621 int32_t tempTerm2;
614 int32_t tempTermX; 622 int32_t tempTermX;
615 int32_t tempTermY; 623 int32_t tempTermY;
616 int32_t tempMin; 624 int32_t tempMin;
617 int32_t tempMax; 625 int32_t tempMax;
618 626
627 if (bweStr->external_bw_info.in_use)
628 return bweStr->external_bw_info.bottleneck_idx;
629
619 /* Get Rate Index */ 630 /* Get Rate Index */
620 631
621 /* Get unquantized rate. Always returns 10000 <= rate <= 32000 */ 632 /* Get unquantized rate. Always returns 10000 <= rate <= 32000 */
622 rate = WebRtcIsacfix_GetDownlinkBandwidth(bweStr); 633 rate = WebRtcIsacfix_GetDownlinkBandwidth(bweStr);
623 634
624 /* Compute the averaged BN estimate on this side */ 635 /* Compute the averaged BN estimate on this side */
625 636
626 /* recBwAvg = 0.9 * recBwAvg + 0.1 * (rate + bweStr->recHeaderRate), 0.9 and 0 .1 in Q9 */ 637 /* recBwAvg = 0.9 * recBwAvg + 0.1 * (rate + bweStr->recHeaderRate), 0.9 and 0 .1 in Q9 */
627 bweStr->recBwAvg = 922 * bweStr->recBwAvg + 638 bweStr->recBwAvg = 922 * bweStr->recBwAvg +
628 102 * (((uint32_t)rate + bweStr->recHeaderRate) << 5); 639 102 * (((uint32_t)rate + bweStr->recHeaderRate) << 5);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 725
715 /* get the bottle neck rate from far side to here, as estimated on this side */ 726 /* get the bottle neck rate from far side to here, as estimated on this side */
716 uint16_t WebRtcIsacfix_GetDownlinkBandwidth(const BwEstimatorstr *bweStr) 727 uint16_t WebRtcIsacfix_GetDownlinkBandwidth(const BwEstimatorstr *bweStr)
717 { 728 {
718 uint32_t recBw; 729 uint32_t recBw;
719 int32_t jitter_sign; /* Q8 */ 730 int32_t jitter_sign; /* Q8 */
720 int32_t bw_adjust; /* Q16 */ 731 int32_t bw_adjust; /* Q16 */
721 int32_t rec_jitter_short_term_abs_inv; /* Q18 */ 732 int32_t rec_jitter_short_term_abs_inv; /* Q18 */
722 int32_t temp; 733 int32_t temp;
723 734
735 assert(!bweStr->external_bw_info.in_use);
736
724 /* Q18 rec jitter short term abs is in Q13, multiply it by 2^13 to save preci sion 737 /* Q18 rec jitter short term abs is in Q13, multiply it by 2^13 to save preci sion
725 2^18 then needs to be shifted 13 bits to 2^31 */ 738 2^18 then needs to be shifted 13 bits to 2^31 */
726 rec_jitter_short_term_abs_inv = 0x80000000u / bweStr->recJitterShortTermAbs; 739 rec_jitter_short_term_abs_inv = 0x80000000u / bweStr->recJitterShortTermAbs;
727 740
728 /* Q27 = 9 + 18 */ 741 /* Q27 = 9 + 18 */
729 jitter_sign = (bweStr->recJitterShortTerm >> 4) * 742 jitter_sign = (bweStr->recJitterShortTerm >> 4) *
730 rec_jitter_short_term_abs_inv; 743 rec_jitter_short_term_abs_inv;
731 744
732 if (jitter_sign < 0) { 745 if (jitter_sign < 0) {
733 temp = -jitter_sign; 746 temp = -jitter_sign;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 } 783 }
771 784
772 return (uint16_t) recBw; 785 return (uint16_t) recBw;
773 } 786 }
774 787
775 /* Returns the mmax delay (in ms) */ 788 /* Returns the mmax delay (in ms) */
776 int16_t WebRtcIsacfix_GetDownlinkMaxDelay(const BwEstimatorstr *bweStr) 789 int16_t WebRtcIsacfix_GetDownlinkMaxDelay(const BwEstimatorstr *bweStr)
777 { 790 {
778 int16_t recMaxDelay = (int16_t)(bweStr->recMaxDelay >> 15); 791 int16_t recMaxDelay = (int16_t)(bweStr->recMaxDelay >> 15);
779 792
793 assert(!bweStr->external_bw_info.in_use);
794
780 /* limit range of jitter estimate */ 795 /* limit range of jitter estimate */
781 if (recMaxDelay < MIN_ISAC_MD) { 796 if (recMaxDelay < MIN_ISAC_MD) {
782 recMaxDelay = MIN_ISAC_MD; 797 recMaxDelay = MIN_ISAC_MD;
783 } else if (recMaxDelay > MAX_ISAC_MD) { 798 } else if (recMaxDelay > MAX_ISAC_MD) {
784 recMaxDelay = MAX_ISAC_MD; 799 recMaxDelay = MAX_ISAC_MD;
785 } 800 }
786 801
787 return recMaxDelay; 802 return recMaxDelay;
788 } 803 }
789 804
790 /* get the bottle neck rate from here to far side, as estimated by far side */ 805 /* Clamp val to the closed interval [min,max]. */
791 int16_t WebRtcIsacfix_GetUplinkBandwidth(const BwEstimatorstr *bweStr) 806 static int16_t clamp(int16_t val, int16_t min, int16_t max) {
792 { 807 assert(min <= max);
793 int16_t send_bw; 808 return val < min ? min : (val > max ? max : val);
794
795 send_bw = (int16_t) WEBRTC_SPL_RSHIFT_U32(bweStr->sendBwAvg, 7);
796
797 /* limit range of bottle neck rate */
798 if (send_bw < MIN_ISAC_BW) {
799 send_bw = MIN_ISAC_BW;
800 } else if (send_bw > MAX_ISAC_BW) {
801 send_bw = MAX_ISAC_BW;
802 }
803
804 return send_bw;
805 } 809 }
806 810
807 811 int16_t WebRtcIsacfix_GetUplinkBandwidth(const BwEstimatorstr* bweStr) {
808 812 return bweStr->external_bw_info.in_use
809 /* Returns the max delay value from the other side in ms */ 813 ? bweStr->external_bw_info.send_bw_avg
810 int16_t WebRtcIsacfix_GetUplinkMaxDelay(const BwEstimatorstr *bweStr) 814 : clamp(bweStr->sendBwAvg >> 7, MIN_ISAC_BW, MAX_ISAC_BW);
811 {
812 int16_t send_max_delay = (int16_t)(bweStr->sendMaxDelayAvg >> 9);
813
814 /* limit range of jitter estimate */
815 if (send_max_delay < MIN_ISAC_MD) {
816 send_max_delay = MIN_ISAC_MD;
817 } else if (send_max_delay > MAX_ISAC_MD) {
818 send_max_delay = MAX_ISAC_MD;
819 }
820
821 return send_max_delay;
822 } 815 }
823 816
817 int16_t WebRtcIsacfix_GetUplinkMaxDelay(const BwEstimatorstr* bweStr) {
818 return bweStr->external_bw_info.in_use
819 ? bweStr->external_bw_info.send_max_delay_avg
820 : clamp(bweStr->sendMaxDelayAvg >> 9, MIN_ISAC_MD, MAX_ISAC_MD);
821 }
824 822
823 void WebRtcIsacfixBw_GetBandwidthInfo(BwEstimatorstr* bweStr,
824 IsacBandwidthInfo* bwinfo) {
825 assert(!bweStr->external_bw_info.in_use);
826 bwinfo->in_use = 1;
827 bwinfo->send_bw_avg = WebRtcIsacfix_GetUplinkBandwidth(bweStr);
828 bwinfo->send_max_delay_avg = WebRtcIsacfix_GetUplinkMaxDelay(bweStr);
829 bwinfo->bottleneck_idx = WebRtcIsacfix_GetDownlinkBwIndexImpl(bweStr);
830 bwinfo->jitter_info = 0; // Not used.
831 }
825 832
833 void WebRtcIsacfixBw_SetBandwidthInfo(BwEstimatorstr* bweStr,
834 const IsacBandwidthInfo* bwinfo) {
835 memcpy(&bweStr->external_bw_info, bwinfo,
836 sizeof bweStr->external_bw_info);
837 }
826 838
827 /* 839 /*
828 * update long-term average bitrate and amount of data in buffer 840 * update long-term average bitrate and amount of data in buffer
829 * returns minimum payload size (bytes) 841 * returns minimum payload size (bytes)
830 */ 842 */
831 uint16_t WebRtcIsacfix_GetMinBytes(RateModel *State, 843 uint16_t WebRtcIsacfix_GetMinBytes(RateModel *State,
832 int16_t StreamSize, /* byt es in bitstream */ 844 int16_t StreamSize, /* byt es in bitstream */
833 const int16_t FrameSamples, /* sam ples per frame */ 845 const int16_t FrameSamples, /* sam ples per frame */
834 const int16_t BottleNeck, /* bottle ne ck rate; excl headers (bps) */ 846 const int16_t BottleNeck, /* bottle ne ck rate; excl headers (bps) */
835 const int16_t DelayBuildUp) /* max delay from bottle neck buffering (ms) */ 847 const int16_t DelayBuildUp) /* max delay from bottle neck buffering (ms) */
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 /*s2nr = -1*(a_60 << 10) + ((b_60 * bottle_neck) >> 10);*/ 1029 /*s2nr = -1*(a_60 << 10) + ((b_60 * bottle_neck) >> 10);*/
1018 s2nr = -22500 + (int16_t)(500 * bottle_neck >> 10); 1030 s2nr = -22500 + (int16_t)(500 * bottle_neck >> 10);
1019 break; 1031 break;
1020 default: 1032 default:
1021 s2nr = -1; /* Error */ 1033 s2nr = -1; /* Error */
1022 } 1034 }
1023 1035
1024 return s2nr; //return in Q10 1036 return s2nr; //return in Q10
1025 1037
1026 } 1038 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698