sf_estim.c revision e2e838afcf03e603a41a0455846eaf9614537c16
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** Copyright 2003-2010, VisualOn, Inc. 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ** limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/******************************************************************************* 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File: sf_estim.c 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette Content: Scale factor estimation functions 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*******************************************************************************/ 22f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "basic_op.h" 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "oper_32b.h" 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "sf_estim.h" 26e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov#include "quantize.h" 27e9a74a1a31f82391d44840aa17293021fcab6837Hyejin Kim#include "bit_cnt.h" 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "aac_rom.h" 29dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const Word16 MAX_SCF_DELTA = 60; 31e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*! 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconstants reference in comments 34d11e6151fe88314505fa7adca6278de2e772b11cSvetoslav Ganov 358a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov C0 = 6.75f; 368a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov C1 = -69.33295f; -16/3*log(MAX_QUANT+0.5-logCon)/log(2) 37a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov C2 = 4.0f; 386304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov C3 = 2.66666666f; 39cedc446684e94c9971c38c3206f1f224314bda2aSvetoslav Ganov 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PE_C1 = 3.0f; log(8.0)/log(2) 41f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov PE_C2 = 1.3219281f; log(2.5)/log(2) 42f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov PE_C3 = 0.5593573f; 1-C2/C1 43949e9df25bccb736675f950591d3a286ae4052fcElliott Hughes 44e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov*/ 4503a8017d0fe3b55b69c4328aa0d27bd96a2f1360Eric Fischer 46156f20919b3d5f298f8851215adbf65f8b4dc61bSvetoslav Ganov#define FF_SQRT_BITS 7 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define FF_SQRT_TABLE_SIZE (1<<FF_SQRT_BITS - 1<<(FF_SQRT_BITS-2)) 48dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root#define COEF08_31 0x66666666 /* 0.8*(1 << 31) */ 49e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov#define PE_C1_8 24 /* PE_C1*8 */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define PE_C2_16 21 /* PE_C2*8/PE_C3 */ 51659f145278ffd85f934a435dbec47ead685caf59Elliott Hughes#define PE_SCALE 0x059a /* 0.7 * (1 << (15 - 1 - 3))*/ 52659f145278ffd85f934a435dbec47ead685caf59Elliott Hughes 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define SCALE_ESTIMATE_COEF 0x5555 /* (8.8585/(4*log2(10))) * (1 << 15)*/ 54d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette 55d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette/********************************************************************************* 56d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette* 57d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette* function name: formfac_sqrt 58d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette* description: calculates sqrt(x)/256 59d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette* 60d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette**********************************************************************************/ 61d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette__inline Word32 formfac_sqrt(Word32 x) 62d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette{ 63d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette Word32 y; 64d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette Word32 preshift, postshift; 65d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette 66d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette 6750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov if (x==0) return 0; 684c359b76f9a030f92a302ba74a528faa170bad4eScott Main preshift = norm_l(x) - (INT_BITS-1-FF_SQRT_BITS); 694c359b76f9a030f92a302ba74a528faa170bad4eScott Main postshift = preshift >> 1; 7050f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov preshift = postshift << 1; 71e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov postshift = postshift + 8; /* sqrt/256 */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(preshift >= 0) 73e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov y = x << preshift; /* now 1/4 <= y < 1 */ 74e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov else 75e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov y = x >> (-preshift); 76e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov y = formfac_sqrttable[y-32]; 77e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 78e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if(postshift >= 0) 79e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov y = y >> postshift; 80e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov else 81ba9bf41a77261471a4dc9d7964aec41726b4e4e6Alan Viverette y = y << (-postshift); 8260727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette 83ba9bf41a77261471a4dc9d7964aec41726b4e4e6Alan Viverette return y; 8460727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette} 8560727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette 8660727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette 8760727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette/********************************************************************************* 8860727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette* 89bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio* function name: CalcFormFactorChannel 90d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette* description: calculate the form factor one channel 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* ffac(n) = sqrt(abs(X(k)) + sqrt(abs(X(k+1)) + .... 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**********************************************************************************/ 94e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovstatic void 95e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav GanovCalcFormFactorChannel(Word16 *logSfbFormFactor, 963053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase Word16 *sfbNRelevantLines, 973053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase Word16 *logSfbEnergy, 983053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase PSY_OUT_CHANNEL *psyOutChan) 9960727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette{ 100bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio Word32 sfbw, sfbw1; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Word32 i, j; 102e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word32 sfbOffs, sfb, shift; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sfbw = sfbw1 = 0; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { 107e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov i = sfbOffs+sfb; 108e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (psyOutChan->sfbEnergy[i] > psyOutChan->sfbThreshold[i]) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Word32 accu, avgFormFactor,iSfbWidth; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Word32 *mdctSpec; 11250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i]; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iSfbWidth = invSBF[(sfbw >> 2) - 1]; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mdctSpec = psyOutChan->mdctSpectrum + psyOutChan->sfbOffsets[i]; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project accu = 0; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* calc sum of sqrt(spec) */ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (j=sfbw; j; j--) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logSfbFormFactor[i] = iLog4(accu); 12150f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov logSfbEnergy[i] = iLog4(psyOutChan->sfbEnergy[i]); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project avgFormFactor = fixmul(rsqrt(psyOutChan->sfbEnergy[i],INT_BITS), iSfbWidth); 1234243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov avgFormFactor = rsqrt((Word32)avgFormFactor,INT_BITS) >> 10; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* result is multiplied by 4 */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(avgFormFactor) 126617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette sfbNRelevantLines[i] = accu / avgFormFactor; 127617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette else 128617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette sfbNRelevantLines[i] = 0x7fff; 129617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette } 130617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette else { 131617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette /* set number of lines to zero */ 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sfbNRelevantLines[i] = 0; 13360727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette } 13460727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette } 135518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette } 1360a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette} 137bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 138bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio/********************************************************************************* 1393053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase* 1403053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase* function name: improveScf 1413053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase* description: find better scalefactor with analysis by synthesis 1423053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase* 1433053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase**********************************************************************************/ 1443053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haasestatic Word16 improveScf(Word32 *spec, 1453053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase Word16 sfbWidth, 1463053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase Word32 thresh, 147bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio Word16 scf, 1480a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word16 minScf, 1490a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word32 *dist, 1500a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word16 *minScfCalculated) 1510a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette{ 152bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio Word32 cnt; 153bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio Word32 sfbDist; 1543053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase Word32 scfBest; 155bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio Word32 thresh125 = L_add(thresh, (thresh >> 2)); 1563053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase 157bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio scfBest = scf; 158bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 1593053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase /* calc real distortion */ 160bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio sfbDist = calcSfbDist(spec, sfbWidth, scf); 1613053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase *minScfCalculated = scf; 162bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio if(!sfbDist) 163bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio return scfBest; 164bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 165bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio if (sfbDist > thresh125) { 166039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 scfEstimated; 167039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 sfbDistBest; 168039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfEstimated = scf; 169039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbDistBest = sfbDist; 170039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 171039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio cnt = 0; 172039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio while (sfbDist > thresh125 && (cnt < 3)) { 173039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 174039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scf = scf + 1; 175039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbDist = calcSfbDist(spec, sfbWidth, scf); 176039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 177039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (sfbDist < sfbDistBest) { 178039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfBest = scf; 17913427a04de835677f9e5f727298f168b88faa562Svetoslav Ganov sfbDistBest = sfbDist; 180039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 181bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio cnt = cnt + 1; 182039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 183039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio cnt = 0; 184039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scf = scfEstimated; 185039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbDist = sfbDistBest; 186039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio while ((sfbDist > thresh125) && (cnt < 1) && (scf > minScf)) { 187039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 188039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scf = scf - 1; 189039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbDist = calcSfbDist(spec, sfbWidth, scf); 190e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 191039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (sfbDist < sfbDistBest) { 192039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfBest = scf; 193039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbDistBest = sfbDist; 194039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 195039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio *minScfCalculated = scf; 196039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio cnt = cnt + 1; 1973fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov } 198039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio *dist = sfbDistBest; 199039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 200039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio else { 201039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 sfbDistBest; 202039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 sfbDistAllowed; 203039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 thresh08 = fixmul(COEF08_31, thresh); 2044213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov sfbDistBest = sfbDist; 205039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 206039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (sfbDist < thresh08) 207039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbDistAllowed = sfbDist; 208039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio else 209039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbDistAllowed = thresh08; 210e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov for (cnt=0; cnt<3; cnt++) { 211e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov scf = scf + 1; 212e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov sfbDist = calcSfbDist(spec, sfbWidth, scf); 213e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 214e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (fixmul(COEF08_31,sfbDist) < sfbDistAllowed) { 215e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov *minScfCalculated = scfBest + 1; 216e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov scfBest = scf; 217e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov sfbDistBest = sfbDist; 218e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 219e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 220e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov *dist = sfbDistBest; 221e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 222e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 223bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio /* return best scalefactor */ 224e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return scfBest; 225e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov} 226e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 227e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov/********************************************************************************* 228e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* 229e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* function name: countSingleScfBits 230e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* description: count single scf bits in huffum 231e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* 232e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov**********************************************************************************/ 233e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovstatic Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight) 234039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio{ 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Word16 scfBits; 23650f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 23728104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov scfBits = bitCountScalefactorDelta(scfLeft - scf) + 238e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov bitCountScalefactorDelta(scf - scfRight); 239e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 240e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return scfBits; 241e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov} 242e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 24328104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov/********************************************************************************* 24428104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov* 245e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* function name: calcSingleSpecPe 246e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* description: ldRatio = log2(en(n)) - 0,375*scfGain(n) 247e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* nbits = 0.7*nLines*ldRation for ldRation >= c1 248bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio* nbits = 0.7*nLines*(c2 + c3*ldRatio) for ldRation < c1 249e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* 250e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov**********************************************************************************/ 251e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovstatic Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines) 252e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov{ 253e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word32 specPe; 254e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word32 ldRatio; 255e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word32 scf3; 256e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 25728104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov ldRatio = sfbConstPePart << 3; /* (sfbConstPePart -0.375*scf)*8 */ 258e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov scf3 = scf + scf + scf; 259039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio ldRatio = ldRatio - scf3; 26028104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov 26128104e1de5595a22a6987181b13ddeb192739afdSvetoslav Ganov if (ldRatio < PE_C1_8) { 262518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/ 263518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette ldRatio = (ldRatio + PE_C2_16) >> 1; 264518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette } 265518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette specPe = nLines * ldRatio; 266518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette specPe = (specPe * PE_SCALE) >> 14; 267518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette 268518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette return saturate(specPe); 269518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette} 270518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette 271518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/********************************************************************************* 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* 274039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* function name: countScfBitsDiff 27551c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov* description: count different scf bits used 27651c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov* 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**********************************************************************************/ 278039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Megliostatic Word16 countScfBitsDiff(Word16 *scfOld, Word16 *scfNew, 27951c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov Word16 sfbCnt, Word16 startSfb, Word16 stopSfb) 28051c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov{ 28151c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov Word32 scfBitsDiff; 28251c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov Word32 sfb, sfbLast; 283039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 sfbPrev, sfbNext; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scfBitsDiff = 0; 2868a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov sfb = 0; 2873fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov 288039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* search for first relevant sfb */ 2893fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov sfbLast = startSfb; 2903fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov while (sfbLast < stopSfb && scfOld[sfbLast] == VOAAC_SHRT_MIN) { 2913fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov 292736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov sfbLast = sfbLast + 1; 293736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov } 294039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* search for previous relevant sfb and count diff */ 2958a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov sfbPrev = startSfb - 1; 2968a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov while ((sfbPrev>=0) && scfOld[sfbPrev] == VOAAC_SHRT_MIN) { 297f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 2988a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov sfbPrev = sfbPrev - 1; 2998a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 300039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 3018a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov if (sfbPrev>=0) { 3028a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbPrev] - scfNew[sfbLast]) - 3038a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov bitCountScalefactorDelta(scfOld[sfbPrev] - scfOld[sfbLast]); 3048a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 3058a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov /* now loop through all sfbs and count diffs of relevant sfbs */ 306039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (sfb=sfbLast+1; sfb<stopSfb; sfb++) { 3078a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 3088a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov if (scfOld[sfb] != VOAAC_SHRT_MIN) { 3098a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfb]) - 310f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfb]); 311f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov sfbLast = sfb; 312039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 313f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov } 314f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov /* search for next relevant sfb and count diff */ 31550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov sfbNext = stopSfb; 3160a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette while (sfbNext < sfbCnt && scfOld[sfbNext] == VOAAC_SHRT_MIN) { 3170a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3180a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette sfbNext = sfbNext + 1; 3190a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette } 3200a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3210a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette if (sfbNext < sfbCnt) 3220a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfbNext]) - 3230a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfbNext]); 3240a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3250a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette return saturate(scfBitsDiff); 3260a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette} 3270a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3280a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverettestatic Word16 calcSpecPeDiff(Word16 *scfOld, 3290a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word16 *scfNew, 3300a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word16 *sfbConstPePart, 3310a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word16 *logSfbEnergy, 3320a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word16 *logSfbFormFactor, 3330a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word16 *sfbNRelevantLines, 3340a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word16 startSfb, 3350a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word16 stopSfb) 3360a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette{ 3370a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word32 specPeDiff; 3380a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word32 sfb; 3390a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3400a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette specPeDiff = 0; 3410a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3420a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette /* loop through all sfbs and count pe difference */ 3430a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette for (sfb=startSfb; sfb<stopSfb; sfb++) { 3440a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3450a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3460a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette if (scfOld[sfb] != VOAAC_SHRT_MIN) { 3470a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word32 ldRatioOld, ldRatioNew; 3480a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette Word32 scf3; 3490a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3500a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3510a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette if (sfbConstPePart[sfb] == MIN_16) { 3520a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette sfbConstPePart[sfb] = ((logSfbEnergy[sfb] - 3530a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette logSfbFormFactor[sfb]) + 11-8*4+3) >> 2; 3540a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette } 3550a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 3560a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 357e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov ldRatioOld = sfbConstPePart[sfb] << 3; 358e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov scf3 = scfOld[sfb] + scfOld[sfb] + scfOld[sfb]; 359e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov ldRatioOld = ldRatioOld - scf3; 3605f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov ldRatioNew = sfbConstPePart[sfb] << 3; 361e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov scf3 = scfNew[sfb] + scfNew[sfb] + scfNew[sfb]; 362e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov ldRatioNew = ldRatioNew - scf3; 363039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 364e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov if (ldRatioOld < PE_C1_8) { 365e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/ 366e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov ldRatioOld = (ldRatioOld + PE_C2_16) >> 1; 3675f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov } 368d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette 369d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette if (ldRatioNew < PE_C1_8) { 370d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/ 371d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette ldRatioNew = (ldRatioNew + PE_C2_16) >> 1; 3725f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov } 3735f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov 3745f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov specPeDiff += sfbNRelevantLines[sfb] * (ldRatioNew - ldRatioOld); 3755f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov } 3760a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette } 377039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 3785f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov specPeDiff = (specPeDiff * PE_SCALE) >> 14; 3795f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov 3805f3f6ce154ca1a0075f8ca13872d74f935acbe3dSvetoslav Ganov return saturate(specPeDiff); 381e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov} 382d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette 383d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette 384d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette/********************************************************************************* 385d25eb9fbb9d659aab5e8ea25d16cb8bcb458a1a9Alan Viverette* 386e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* function name: assimilateSingleScf 387e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* description: searched for single scalefactor bands, where the number of bits gained 388e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* by using a smaller scfgain(n) is greater than the estimated increased 389e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov* bit demand 390039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* 391e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov**********************************************************************************/ 392e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovstatic void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan, 393e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word16 *scf, 394e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word16 *minScf, 395e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word32 *sfbDist, 396e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word16 *sfbConstPePart, 39750f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov Word16 *logSfbEnergy, 398e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word16 *logSfbFormFactor, 399039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *sfbNRelevantLines, 400e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word16 *minScfCalculated, 401e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Flag restartOnSuccess) 402e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov{ 403e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word32 sfbLast, sfbAct, sfbNext, scfAct, scfMin; 404e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word16 *scfLast, *scfNext; 405e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word32 sfbPeOld, sfbPeNew; 406e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word32 sfbDistNew; 407e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov Word32 j; 408039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Flag success; 409039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 deltaPe, deltaPeNew, deltaPeTmp; 410039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *prevScfLast = psyOutChan->prevScfLast; 411039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *prevScfNext = psyOutChan->prevScfNext; 412039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *deltaPeLast = psyOutChan->deltaPeLast; 413d015e3454ec1271ba6e5e3e6f0e5f7459b8b09eaAlan Viverette Flag updateMinScfCalculated; 414039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 415039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio success = 0; 416039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio deltaPe = 0; 417039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 418039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for(j=0;j<psyOutChan->sfbCnt;j++){ 419039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio prevScfLast[j] = MAX_16; 420039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio prevScfNext[j] = MAX_16; 421039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio deltaPeLast[j] = MAX_16; 422039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 423039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 424a67d9095b7731df3a6ae3f45738a2980151fd1afCraig Mautner sfbLast = -1; 425039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbAct = -1; 426039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbNext = -1; 427e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov scfLast = 0; 428e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov scfNext = 0; 429e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov scfMin = MAX_16; 430039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio do { 431039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* search for new relevant sfb */ 432039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbNext = sfbNext + 1; 433bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio while (sfbNext < psyOutChan->sfbCnt && scf[sfbNext] == MIN_16) { 434bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 435f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov sfbNext = sfbNext + 1; 436039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 437039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 438039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if ((sfbLast>=0) && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) { 439f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov /* relevant scfs to the left and to the right */ 440039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfAct = scf[sfbAct]; 441f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov scfLast = scf + sfbLast; 442039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfNext = scf + sfbNext; 443039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfMin = min(*scfLast, *scfNext); 444039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 445f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov else { 4460a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 4470a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette if (sfbLast == -1 && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) { 4480a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette /* first relevant scf */ 449039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfAct = scf[sfbAct]; 450bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio scfLast = &scfAct; 451949e9df25bccb736675f950591d3a286ae4052fcElliott Hughes scfNext = scf + sfbNext; 452039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfMin = *scfNext; 453bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 454f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov else { 455039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 456039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if ((sfbLast>=0) && (sfbAct>=0) && sfbNext == psyOutChan->sfbCnt) { 457039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* last relevant scf */ 458bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio scfAct = scf[sfbAct]; 459039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfLast = scf + sfbLast; 460039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfNext = &scfAct; 461039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfMin = *scfLast; 462039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 463039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 464039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 465039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 466518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette if (sfbAct>=0) 467bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio scfMin = max(scfMin, minScf[sfbAct]); 468039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 469039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if ((sfbAct >= 0) && 470039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio (sfbLast>=0 || sfbNext < psyOutChan->sfbCnt) && 471039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfAct > scfMin && 472039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio (*scfLast != prevScfLast[sfbAct] || 473039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio *scfNext != prevScfNext[sfbAct] || 474039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio deltaPe < deltaPeLast[sfbAct])) { 475039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio success = 0; 476039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 477949e9df25bccb736675f950591d3a286ae4052fcElliott Hughes /* estimate required bits for actual scf */ 478949e9df25bccb736675f950591d3a286ae4052fcElliott Hughes if (sfbConstPePart[sfbAct] == MIN_16) { 479949e9df25bccb736675f950591d3a286ae4052fcElliott Hughes sfbConstPePart[sfbAct] = logSfbEnergy[sfbAct] - 480039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio logSfbFormFactor[sfbAct] + 11-8*4; /* 4*log2(6.75) - 32 */ 481f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov 482bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio if (sfbConstPePart[sfbAct] < 0) 483039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] + 3; 484039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] >> 2; 485039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 486039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 487039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbPeOld = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) + 488039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio countSingleScfBits(scfAct, *scfLast, *scfNext); 489039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio deltaPeNew = deltaPe; 490039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio updateMinScfCalculated = 1; 491039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio do { 492039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfAct = scfAct - 1; 493518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette /* check only if the same check was not done before */ 494518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette 495039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (scfAct < minScfCalculated[sfbAct]) { 496bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio sfbPeNew = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) + 497039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio countSingleScfBits(scfAct, *scfLast, *scfNext); 498039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* use new scf if no increase in pe and 499039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio quantization error is smaller */ 500039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio deltaPeTmp = deltaPe + sfbPeNew - sfbPeOld; 501039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 502f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov if (deltaPeTmp < 10) { 503f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov sfbDistNew = calcSfbDist(psyOutChan->mdctSpectrum+ 504039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio psyOutChan->sfbOffsets[sfbAct], 505039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio (psyOutChan->sfbOffsets[sfbAct+1] - psyOutChan->sfbOffsets[sfbAct]), 506039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfAct); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sfbDistNew < sfbDist[sfbAct]) { 508039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* success, replace scf by new one */ 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scf[sfbAct] = scfAct; 510518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette sfbDist[sfbAct] = sfbDistNew; 511518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette deltaPeNew = deltaPeTmp; 512518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette success = 1; 513518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette } 514518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette /* mark as already checked */ 515518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette 516518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette if (updateMinScfCalculated) { 517518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette minScfCalculated[sfbAct] = scfAct; 518518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette } 519518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette } 520518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette else { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateMinScfCalculated = 0; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52350f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov } 524518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette 525518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette } while (scfAct > scfMin); 526bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio deltaPe = deltaPeNew; 527bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio /* save parameters to avoid multiple computations of the same sfb */ 528bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio prevScfLast[sfbAct] = *scfLast; 529518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette prevScfNext[sfbAct] = *scfNext; 530518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette deltaPeLast[sfbAct] = deltaPe; 531bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 532bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 533bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio if (success && restartOnSuccess) { 534039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* start again at first sfb */ 53550f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov sfbLast = -1; 5363053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase sfbAct = -1; 537039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbNext = -1; 538039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfLast = 0; 539039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfNext = 0; 540039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfMin = MAX_16; 541039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio success = 0; 542039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 543039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio else { 544039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* shift sfbs for next band */ 545039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbLast = sfbAct; 546039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbAct = sfbNext; 547039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 548039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 549039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } while (sfbNext < psyOutChan->sfbCnt); 550039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio} 551039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 552039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 553039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio/********************************************************************************* 554039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* 555039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* function name: assimilateMultipleScf 556039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* description: scalefactor difference reduction 557039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* 558039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio**********************************************************************************/ 559039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Megliostatic void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan, 560039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *scf, 561039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *minScf, 562039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 *sfbDist, 563039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *sfbConstPePart, 564039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *logSfbEnergy, 565039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *logSfbFormFactor, 566039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *sfbNRelevantLines) 567039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio{ 568039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 sfb, startSfb, stopSfb, scfMin, scfMax, scfAct; 569039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Flag possibleRegionFound; 570039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 deltaScfBits; 571039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 deltaSpecPe; 572039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 deltaPe, deltaPeNew; 573039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 sfbCnt; 574039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 *sfbDistNew = psyOutChan->sfbDistNew; 575039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *scfTmp = psyOutChan->prevScfLast; 576039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 577039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio deltaPe = 0; 578039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbCnt = psyOutChan->sfbCnt; 579039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 580039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* calc min and max scalfactors */ 581039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfMin = MAX_16; 5823053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase scfMax = MIN_16; 583039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (sfb=0; sfb<sfbCnt; sfb++) { 584039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 585039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (scf[sfb] != MIN_16) { 586039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfMin = min(scfMin, scf[sfb]); 587039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfMax = max(scfMax, scf[sfb]); 588039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 589039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 590039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 591039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (scfMax != MIN_16) { 592039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 593039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfAct = scfMax; 594039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 595039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio do { 596039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfAct = scfAct - 1; 597039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (sfb=0; sfb<sfbCnt; sfb++) { 598039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfTmp[sfb] = scf[sfb]; 599039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 600039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio stopSfb = 0; 601039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio do { 602039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfb = stopSfb; 603039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 604bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] <= scfAct)) { 605039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfb = sfb + 1; 606039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 607039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio startSfb = sfb; 608039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfb = sfb + 1; 609039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 610039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] > scfAct)) { 611039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfb = sfb + 1; 612039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 613039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio stopSfb = sfb; 614039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 615039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio possibleRegionFound = 0; 616039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 617039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (startSfb < sfbCnt) { 618039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio possibleRegionFound = 1; 619039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (sfb=startSfb; sfb<stopSfb; sfb++) { 620039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 621039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (scf[sfb]!=MIN_16) { 622039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 623039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (scfAct < minScf[sfb]) { 624039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio possibleRegionFound = 0; 625039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio break; 626039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 627039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 628039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 629039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 630039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 631039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 632039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (possibleRegionFound) { /* region found */ 633039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 634039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* replace scfs in region by scfAct */ 635039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (sfb=startSfb; sfb<stopSfb; sfb++) { 636039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 637039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (scfTmp[sfb]!=MIN_16) 638039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfTmp[sfb] = scfAct; 639039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 640039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 641039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* estimate change in bit demand for new scfs */ 642039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio deltaScfBits = countScfBitsDiff(scf,scfTmp,sfbCnt,startSfb,stopSfb); 643039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio deltaSpecPe = calcSpecPeDiff(scf, scfTmp, sfbConstPePart, 644039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio logSfbEnergy, logSfbFormFactor, sfbNRelevantLines, 645039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio startSfb, stopSfb); 646039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio deltaPeNew = deltaPe + deltaScfBits + deltaSpecPe; 647039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 648039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 649039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (deltaPeNew < 10) { 650039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 distOldSum, distNewSum; 651039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 652039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* quantize and calc sum of new distortion */ 653039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio distOldSum = 0; 654039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio distNewSum = 0; 655039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (sfb=startSfb; sfb<stopSfb; sfb++) { 656039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 657039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (scfTmp[sfb] != MIN_16) { 658039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio distOldSum = L_add(distOldSum, sfbDist[sfb]); 659039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 660039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbDistNew[sfb] = calcSfbDist(psyOutChan->mdctSpectrum + 661039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio psyOutChan->sfbOffsets[sfb], 662039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio (psyOutChan->sfbOffsets[sfb+1] - psyOutChan->sfbOffsets[sfb]), 663039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfAct); 664039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 665039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 666039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (sfbDistNew[sfb] > psyOutChan->sfbThreshold[sfb]) { 667039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio distNewSum = distOldSum << 1; 668039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio break; 669039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 670039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio distNewSum = L_add(distNewSum, sfbDistNew[sfb]); 671039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 672039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 673039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 674039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (distNewSum < distOldSum) { 675039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio deltaPe = deltaPeNew; 676039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (sfb=startSfb; sfb<stopSfb; sfb++) { 677039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 678039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (scf[sfb]!=MIN_16) { 679039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scf[sfb] = scfAct; 680039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbDist[sfb] = sfbDistNew[sfb]; 681039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 682039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 683039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 684039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 685039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 686039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } while (stopSfb <= sfbCnt); 687039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } while (scfAct > scfMin); 688039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 689039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio} 690039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 691039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio/********************************************************************************* 692039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* 693039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* function name: EstimateScaleFactorsChannel 694039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* description: estimate scale factors for one channel 695039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* 696039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio**********************************************************************************/ 697039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Megliostatic void 698039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di MeglioEstimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan, 699039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *scf, 700039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *globalGain, 701039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *logSfbEnergy, 702039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *logSfbFormFactor, 703039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *sfbNRelevantLines) 704039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio{ 705039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 i, j; 706039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 thresh, energy; 707039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 energyPart, thresholdPart; 708039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 scfInt, minScf, maxScf, maxAllowedScf, lastSf; 709039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 maxSpec; 710039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 *sfbDist = psyOutChan->sfbDist; 711039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *minSfMaxQuant = psyOutChan->minSfMaxQuant; 712039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 *minScfCalculated = psyOutChan->minScfCalculated; 713039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 714039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 715039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (i=0; i<psyOutChan->sfbCnt; i++) { 716039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 sbfwith, sbfStart; 717039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word32 *mdctSpec; 718039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio thresh = psyOutChan->sfbThreshold[i]; 719039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio energy = psyOutChan->sfbEnergy[i]; 720039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 721039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sbfStart = psyOutChan->sfbOffsets[i]; 722039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart; 723039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio mdctSpec = psyOutChan->mdctSpectrum+sbfStart; 724039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 725039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio maxSpec = 0; 726039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* maximum of spectrum */ 727dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root for (j=sbfwith; j; j-- ) { 728dddda8d188408ff18935b1b0e15a00fe012a03daKenny Root Word32 absSpec = L_abs(*mdctSpec); mdctSpec++; 729039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio maxSpec |= absSpec; 730039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 731039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 732039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* scfs without energy or with thresh>energy are marked with MIN_16 */ 733039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scf[i] = MIN_16; 734039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio minSfMaxQuant[i] = MIN_16; 735039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 736039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if ((maxSpec > 0) && (energy > thresh)) { 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 738039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio energyPart = logSfbFormFactor[i]; 739039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio thresholdPart = iLog4(thresh); 740039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* -20 = 4*log2(6.75) - 32 */ 741039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfInt = ((thresholdPart - energyPart - 20) * SCALE_ESTIMATE_COEF) >> 15; 742039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 743039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio minSfMaxQuant[i] = iLog4(maxSpec) - 68; /* 68 -16/3*log(MAX_QUANT+0.5-logCon)/log(2) + 1 */ 744039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 745039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 746039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (minSfMaxQuant[i] > scfInt) { 747039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfInt = minSfMaxQuant[i]; 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 750039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* find better scalefactor with analysis by synthesis */ 751039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart, 752039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sbfwith, 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thresh, scfInt, minSfMaxQuant[i], 754039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio &sfbDist[i], &minScfCalculated[i]); 755039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 756039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scf[i] = scfInt; 757039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 759039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 760039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 761039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* scalefactor differece reduction */ 762039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio { 763039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 sfbConstPePart[MAX_GROUPED_SFB]; 764039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for(i=0;i<psyOutChan->sfbCnt;i++) { 7650a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette sfbConstPePart[i] = MIN_16; 7660a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette } 7670a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 7680a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette assimilateSingleScf(psyOutChan, scf, 7690a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy, 7700a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette logSfbFormFactor, sfbNRelevantLines, minScfCalculated, 1); 7710a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette 7720a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette assimilateMultipleScf(psyOutChan, scf, 7730a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy, 7740a04bb0d4bf18318fe5473bf5615c2016bc26373Alan Viverette logSfbFormFactor, sfbNRelevantLines); 775039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 776039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 777039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* get max scalefac for global gain */ 778039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio maxScf = MIN_16; 779039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio minScf = MAX_16; 780039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (i=0; i<psyOutChan->sfbCnt; i++) { 781039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 782039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (maxScf < scf[i]) { 783039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio maxScf = scf[i]; 784039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 785039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 786039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if ((scf[i] != MIN_16) && (minScf > scf[i])) { 787039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio minScf = scf[i]; 788039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 789039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 790039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* limit scf delta */ 791bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio maxAllowedScf = minScf + MAX_SCF_DELTA; 792bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio for(i=0; i<psyOutChan->sfbCnt; i++) { 793bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 794bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio if ((scf[i] != MIN_16) && (maxAllowedScf < scf[i])) { 795039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scf[i] = maxAllowedScf; 796039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 797039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 798039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* new maxScf if any scf has been limited */ 799039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 800039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (maxAllowedScf < maxScf) { 801039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio maxScf = maxAllowedScf; 802039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 803039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 804039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* calc loop scalefactors */ 805039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 806039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (maxScf > MIN_16) { 807039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio *globalGain = maxScf; 808039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio lastSf = 0; 809039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 810039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for(i=0; i<psyOutChan->sfbCnt; i++) { 811039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 812039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio if (scf[i] == MIN_16) { 813039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scf[i] = lastSf; 814bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio /* set band explicitely to zero */ 815bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) { 816bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio psyOutChan->mdctSpectrum[j] = 0; 817bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 818039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 819039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio else { 820039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scf[i] = maxScf - scf[i]; 821039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio lastSf = scf[i]; 822039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 823039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 824039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 825039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio else{ 826039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio *globalGain = 0; 827039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio /* set spectrum explicitely to zero */ 828039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for(i=0; i<psyOutChan->sfbCnt; i++) { 829039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio scf[i] = 0; 830039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) { 831039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio psyOutChan->mdctSpectrum[j] = 0; 832039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 833039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 834039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 835039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio} 836039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 837039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio/********************************************************************************* 838039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* 839039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* function name: CalcFormFactor 840039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* description: estimate Form factors for all channel 841039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* 842039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio**********************************************************************************/ 843039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Megliovoid 844039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di MeglioCalcFormFactor(Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB], 845039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB], 846039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB], 847039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], 848039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio const Word16 nChannels) 849039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio{ 850039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 j; 851039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 852039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (j=0; j<nChannels; j++) { 853039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio CalcFormFactorChannel(logSfbFormFactor[j], sfbNRelevantLines[j], logSfbEnergy[j], &psyOutChannel[j]); 854039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio } 855039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio} 856039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 857039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio/********************************************************************************* 858039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* 859039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* function name: EstimateScaleFactors 860039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* description: estimate scale factors for all channel 861039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio* 862039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio**********************************************************************************/ 863039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Megliovoid 864039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di MeglioEstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], 865039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS], 866039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB], 867039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB], 868039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB], 869039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio const Word16 nChannels) 870039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio{ 871039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio Word16 j; 872039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio 873039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio for (j=0; j<nChannels; j++) { 874039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio EstimateScaleFactorsChannel(&psyOutChannel[j], 875039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio qcOutChannel[j].scf, 876039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio &(qcOutChannel[j].globalGain), 877039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio logSfbEnergy[j], 878039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio logSfbFormFactor[j], 879039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio sfbNRelevantLines[j]); 880e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov } 881e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov} 882e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov 883039a784ea3c24625b74084be18530f81dabd4bbbFabrice Di Meglio