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