diff options
Diffstat (limited to 'media/libstagefright/codecs/aacenc/src/adj_thr.c')
-rw-r--r-- | media/libstagefright/codecs/aacenc/src/adj_thr.c | 156 |
1 files changed, 78 insertions, 78 deletions
diff --git a/media/libstagefright/codecs/aacenc/src/adj_thr.c b/media/libstagefright/codecs/aacenc/src/adj_thr.c index 0dbd216..83b43a1 100644 --- a/media/libstagefright/codecs/aacenc/src/adj_thr.c +++ b/media/libstagefright/codecs/aacenc/src/adj_thr.c @@ -1,26 +1,26 @@ -/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: adj_thr.c
-
- Content: Threshold compensation functions
-
+/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: adj_thr.c + + Content: Threshold compensation functions + *******************************************************************************/ -#include "basic_op.h"
+#include "basic_op.h" #include "oper_32b.h" #include "adj_thr_data.h" #include "adj_thr.h" @@ -29,14 +29,14 @@ #define minSnrLimit 0x6666 /* 1 dB */ -#define PEBITS_COEF 0x170a /* 0.18*(1 << 15)*/
-
-#define HOLE_THR_LONG 0x2873 /* 0.316*(1 << 15) */
-#define HOLE_THR_SHORT 0x4000 /* 0.5 *(1 << 15) */
-
-#define MS_THRSPREAD_COEF 0x7333 /* 0.9 * (1 << 15) */
-
-#define MIN_SNR_COEF 0x651f /* 3.16* (1 << (15 - 2)) */
+#define PEBITS_COEF 0x170a /* 0.18*(1 << 15)*/ + +#define HOLE_THR_LONG 0x2873 /* 0.316*(1 << 15) */ +#define HOLE_THR_SHORT 0x4000 /* 0.5 *(1 << 15) */ + +#define MS_THRSPREAD_COEF 0x7333 /* 0.9 * (1 << 15) */ + +#define MIN_SNR_COEF 0x651f /* 3.16* (1 << (15 - 2)) */ /* values for avoid hole flag */ enum _avoid_hole_state { @@ -67,15 +67,15 @@ static void calcThreshExp(Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB], PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], const Word16 nChannels) { - Word16 ch, sfb, sfbGrp;
+ Word16 ch, sfb, sfbGrp; Word32 *pthrExp, *psfbThre; for (ch=0; ch<nChannels; ch++) { - PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
- for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup)
- pthrExp = &(thrExp[ch][sfbGrp]);
- psfbThre = psyOutChan->sfbThreshold + sfbGrp;
+ PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; + for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup) + pthrExp = &(thrExp[ch][sfbGrp]); + psfbThre = psyOutChan->sfbThreshold + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { - *pthrExp = rsqrt(rsqrt(*psfbThre,INT_BITS),INT_BITS);
+ *pthrExp = rsqrt(rsqrt(*psfbThre,INT_BITS),INT_BITS); pthrExp++; psfbThre++; } } @@ -112,7 +112,7 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], } if (nSfb > 0) { - avgEn = avgEn / nSfb;
+ avgEn = avgEn / nSfb; log_avgEn = iLog4(avgEn); startRatio_x_avgEn = fixmul(msaParam->startRatio, avgEn); @@ -172,18 +172,18 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], if (psyOutChan->windowSequence != SHORT_WINDOW) { for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ - psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;
+ psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { - *psfbSpreadEn = *psfbSpreadEn >> 1; /* 0.5 */
+ *psfbSpreadEn = *psfbSpreadEn >> 1; /* 0.5 */ ++psfbSpreadEn; } } } else { - for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
+ for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { - *psfbSpreadEn = (*psfbSpreadEn >> 1) + (*psfbSpreadEn >> 3); /* 0.63 */
+ *psfbSpreadEn = (*psfbSpreadEn >> 1) + (*psfbSpreadEn >> 3); /* 0.63 */ ++psfbSpreadEn; } } @@ -201,7 +201,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], threshold = HOLE_THR_SHORT; for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ - Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp;
+ Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { Word32 sfbEn, sfbEnm1, sfbEnp1, avgEn; @@ -219,7 +219,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], if (sfbEn > avgEn && avgEn > 0) { Word32 tmpMinSnr; - shift = norm_l(sfbEn);
+ shift = norm_l(sfbEn); tmpMinSnr = Div_32(L_mpy_ls(avgEn, minSnrLimit) << shift, sfbEn << shift ); tmpMinSnr = max(tmpMinSnr, HOLE_THR_LONG); tmpMinSnr = max(tmpMinSnr, threshold); @@ -231,7 +231,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], Word32 tmpMinSnr; Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr); - if(minSnrEn < sfbEn) {
+ if(minSnrEn < sfbEn) { shift = norm_l(sfbEn); tmpMinSnr = Div_32( minSnrEn << shift, sfbEn<<shift); } @@ -242,7 +242,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], *psfbMinSnr = (min((tmpMinSnr >> 2), mult(*psfbMinSnr, MIN_SNR_COEF)) << 2); - }
+ } psfbMinSnr++; } } @@ -266,17 +266,17 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], psyOutChanM->sfbMinSnr[sfb] = MAX_16; } else { - shift = norm_l(sfbEnM);
- psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb],
+ shift = norm_l(sfbEnM); + psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb], round16(Div_32(maxThr<<shift, sfbEnM << shift))), minSnrLimit); } if(maxThr >= sfbEnS) { psyOutChanS->sfbMinSnr[sfb] = MAX_16; } - else {
+ else { shift = norm_l(sfbEnS); - psyOutChanS->sfbMinSnr[sfb] = min(max(psyOutChanS->sfbMinSnr[sfb],
+ psyOutChanS->sfbMinSnr[sfb] = min(max(psyOutChanS->sfbMinSnr[sfb], round16(Div_32(maxThr << shift, sfbEnS << shift))), minSnrLimit); } @@ -295,7 +295,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], for(ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ - Word16 *pahFlag = ahFlag[ch] + sfbGrp;
+ Word16 *pahFlag = ahFlag[ch] + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { if ((psyOutChan->sfbSpreadedEnergy[sfbGrp+sfb] > psyOutChan->sfbEnergy[sfbGrp+sfb]) || @@ -328,7 +328,7 @@ static void calcPeNoAH(Word16 *pe, PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], const Word16 nChannels) { - Word16 ch, sfb, sfbGrp;
+ Word16 ch, sfb, sfbGrp; int ipe, iconstPart, inActiveLines; ipe = 0; @@ -347,7 +347,7 @@ static void calcPeNoAH(Word16 *pe, } } } - }
+ } *pe = saturate(ipe); *constPart = saturate(iconstPart); @@ -367,14 +367,14 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], const Word32 redVal) { Word32 sfbThrReduced; - Word32 *psfbEn, *psfbThr;
- Word16 ch, sfb, sfbGrp;
+ Word32 *psfbEn, *psfbThr; + Word16 ch, sfb, sfbGrp; for(ch=0; ch<nChannels; ch++) { PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) { - psfbEn = psyOutChan->sfbEnergy + sfbGrp;
- psfbThr = psyOutChan->sfbThreshold + sfbGrp;
+ psfbEn = psyOutChan->sfbEnergy + sfbGrp; + psfbThr = psyOutChan->sfbThreshold + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { if (*psfbEn > *psfbThr) { @@ -391,8 +391,8 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE; } *psfbThr = sfbThrReduced; - }
-
+ } + psfbEn++; psfbThr++; } } @@ -419,8 +419,8 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], PSY_OUT_CHANNEL *psyOutChan; PE_CHANNEL_DATA *peChanData; Word32 deltaSfbPe; - Word32 normFactor;
- Word32 *psfbPeFactors;
+ Word32 normFactor; + Word32 *psfbPeFactors; Word16 *psfbNActiveLines, *pahFlag; Word32 sfbEn, sfbThr; Word32 sfbThrReduced; @@ -431,9 +431,9 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], psyOutChan = &psyOutChannel[ch]; peChanData = &peData->peChannelData[ch]; for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ - psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp;
- psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp;
- pahFlag = ahFlag[ch] + sfbGrp;
+ psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp; + psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp; + pahFlag = ahFlag[ch] + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal; @@ -444,8 +444,8 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], } else { *psfbPeFactors = 0; - }
- psfbPeFactors++;
+ } + psfbPeFactors++; pahFlag++; psfbNActiveLines++; } } @@ -457,9 +457,9 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], psyOutChan = &psyOutChannel[ch]; peChanData = &peData->peChannelData[ch]; for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ - psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp;
- psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp;
- pahFlag = ahFlag[ch] + sfbGrp;
+ psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp; + psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp; + pahFlag = ahFlag[ch] + sfbGrp; for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { /* pe difference for this sfb */ deltaSfbPe = *psfbPeFactors * deltaPe; @@ -487,7 +487,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], if(thrFactor > sfbThr) { - shift = norm_l(thrFactor);
+ shift = norm_l(thrFactor); sfbThrReduced = Div_32( sfbThr << shift, thrFactor<<shift ); } else { @@ -506,8 +506,8 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], } psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced; - }
-
+ } + pahFlag++; psfbNActiveLines++; psfbPeFactors++; } } @@ -539,8 +539,8 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], for (sfb=sfbSubWin; sfb<psyOutChannel[0].sfbCnt; sfb+=psyOutChannel[0].sfbPerGroup) { /* loop over all channels */ - PE_CHANNEL_DATA* peChan = peData->peChannelData;
- PSY_OUT_CHANNEL* psyOutCh = psyOutChannel;
+ PE_CHANNEL_DATA* peChan = peData->peChannelData; + PSY_OUT_CHANNEL* psyOutCh = psyOutChannel; for (ch=0; ch<nChannels; ch++) { if (ahFlag[ch][sfb] != NO_AH && psyOutCh->sfbMinSnr[sfb] < minSnrLimit) { @@ -553,7 +553,7 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], peChan->sfbPe[sfb]; peData->pe = peData->pe + deltaPe; peChan->pe = peChan->pe + deltaPe; - }
+ } peChan += 1; psyOutCh += 1; } /* stop if enough has been saved */ @@ -659,7 +659,7 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], if(ahCnt) { Word32 iahCnt; - shift = norm_l(ahCnt);
+ shift = norm_l(ahCnt); iahCnt = Div_32( 1 << shift, ahCnt << shift ); avgEn = fixmul(avgEn, iahCnt); } @@ -831,7 +831,7 @@ static Word16 calcBitSave(Word16 fillLevel, fillLevel = max(fillLevel, clipLow); fillLevel = min(fillLevel, clipHigh); - if(clipHigh-clipLow)
+ if(clipHigh-clipLow) bitsave = (maxBitSave - (((maxBitSave-minBitSave)*(fillLevel-clipLow))/ (clipHigh-clipLow))); @@ -860,7 +860,7 @@ static Word16 calcBitSpend(Word16 fillLevel, fillLevel = max(fillLevel, clipLow); fillLevel = min(fillLevel, clipHigh); - if(clipHigh-clipLow)
+ if(clipHigh-clipLow) bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) / (clipHigh-clipLow))); @@ -964,7 +964,7 @@ static Word16 bitresCalcBitFac( const Word16 bitresBits, bresParam->clipSpendLow, bresParam->clipSpendHigh, bresParam->minBitSpend, bresParam->maxBitSpend); - if(adjThrChan->peMax != adjThrChan->peMin)
+ if(adjThrChan->peMax != adjThrChan->peMin) bitresFac = (100 - bitSave) + extract_l(((bitSpend + bitSave) * (pex - adjThrChan->peMin)) / (adjThrChan->peMax - adjThrChan->peMin)); else @@ -1196,7 +1196,7 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState, if (peOffsDiff > 0) { Word32 temp = 1000 - (nChannels * 200); - chBitDistribution[ch] = chBitDistribution[ch] +
+ chBitDistribution[ch] = chBitDistribution[ch] + (temp * peData.peChannelData[ch].pe) / peOffsDiff; } } |