1 /*
2 ** Copyright 2003-2010, VisualOn, Inc.
3 **
4 ** Licensed under the Apache License, Version 2.0 (the "License");
5 ** you may not use this file except in compliance with the License.
6 ** You may obtain a copy of the License at
7 **
8 ** http://www.apache.org/licenses/LICENSE-2.0
9 **
10 ** Unless required by applicable law or agreed to in writing, software
11 ** distributed under the License is distributed on an "AS IS" BASIS,
12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16 /*******************************************************************************
17 File: grp_data.c
18
19 Content: Short block grouping function
20
21 *******************************************************************************/
22
23 #include "basic_op.h"
24 #include "psy_const.h"
25 #include "interface.h"
26 #include "grp_data.h"
27
28 /*****************************************************************************
29 *
30 * function name: groupShortData
31 * description: group short data for next quantization and coding
32 *
33 **********************************************************************************/
34 void
groupShortData(Word32 * mdctSpectrum,Word32 * tmpSpectrum,SFB_THRESHOLD * sfbThreshold,SFB_ENERGY * sfbEnergy,SFB_ENERGY * sfbEnergyMS,SFB_ENERGY * sfbSpreadedEnergy,const Word16 sfbCnt,const Word16 * sfbOffset,const Word16 * sfbMinSnr,Word16 * groupedSfbOffset,Word16 * maxSfbPerGroup,Word16 * groupedSfbMinSnr,const Word16 noOfGroups,const Word16 * groupLen)35 groupShortData(Word32 *mdctSpectrum,
36 Word32 *tmpSpectrum,
37 SFB_THRESHOLD *sfbThreshold,
38 SFB_ENERGY *sfbEnergy,
39 SFB_ENERGY *sfbEnergyMS,
40 SFB_ENERGY *sfbSpreadedEnergy,
41 const Word16 sfbCnt,
42 const Word16 *sfbOffset,
43 const Word16 *sfbMinSnr,
44 Word16 *groupedSfbOffset,
45 Word16 *maxSfbPerGroup,
46 Word16 *groupedSfbMinSnr,
47 const Word16 noOfGroups,
48 const Word16 *groupLen)
49 {
50 Word32 i, j;
51 Word32 line;
52 Word32 sfb;
53 Word32 grp;
54 Word32 wnd;
55 Word32 offset;
56 Word32 highestSfb;
57
58 /* for short: regroup and */
59 /* cumulate energies und thresholds group-wise . */
60
61 /* calculate sfbCnt */
62 highestSfb = 0;
63 for (wnd=0; wnd<TRANS_FAC; wnd++) {
64 for (sfb=sfbCnt - 1; sfb>=highestSfb; sfb--) {
65 for (line=(sfbOffset[sfb + 1] - 1); line>=sfbOffset[sfb]; line--) {
66
67 if (mdctSpectrum[wnd*FRAME_LEN_SHORT+line] != 0) break;
68 }
69
70 if (line >= sfbOffset[sfb]) break;
71 }
72 highestSfb = max(highestSfb, sfb);
73 }
74
75 if (highestSfb < 0) {
76 highestSfb = 0;
77 }
78 *maxSfbPerGroup = highestSfb + 1;
79
80 /* calculate sfbOffset */
81 i = 0;
82 offset = 0;
83 for (grp = 0; grp < noOfGroups; grp++) {
84 for (sfb = 0; sfb < sfbCnt; sfb++) {
85 groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp];
86 i += 1;
87 }
88 offset += groupLen[grp] * FRAME_LEN_SHORT;
89 }
90 groupedSfbOffset[i] = FRAME_LEN_LONG;
91 i += 1;
92
93 /* calculate minSnr */
94 i = 0;
95 offset = 0;
96 for (grp = 0; grp < noOfGroups; grp++) {
97 for (sfb = 0; sfb < sfbCnt; sfb++) {
98 groupedSfbMinSnr[i] = sfbMinSnr[sfb];
99 i += 1;
100 }
101 offset += groupLen[grp] * FRAME_LEN_SHORT;
102 }
103
104
105 /* sum up sfbThresholds */
106 wnd = 0;
107 i = 0;
108 for (grp = 0; grp < noOfGroups; grp++) {
109 for (sfb = 0; sfb < sfbCnt; sfb++) {
110 Word32 thresh = sfbThreshold->sfbShort[wnd][sfb];
111 for (j=1; j<groupLen[grp]; j++) {
112 thresh = L_add(thresh, sfbThreshold->sfbShort[wnd+j][sfb]);
113 }
114 sfbThreshold->sfbLong[i] = thresh;
115 i += 1;
116 }
117 wnd += groupLen[grp];
118 }
119
120 /* sum up sfbEnergies left/right */
121 wnd = 0;
122 i = 0;
123 for (grp = 0; grp < noOfGroups; grp++) {
124 for (sfb = 0; sfb < sfbCnt; sfb++) {
125 Word32 energy = sfbEnergy->sfbShort[wnd][sfb];
126 for (j=1; j<groupLen[grp]; j++) {
127 energy = L_add(energy, sfbEnergy->sfbShort[wnd+j][sfb]);
128 }
129 sfbEnergy->sfbLong[i] = energy;
130 i += 1;
131 }
132 wnd += groupLen[grp];
133 }
134
135 /* sum up sfbEnergies mid/side */
136 wnd = 0;
137 i = 0;
138 for (grp = 0; grp < noOfGroups; grp++) {
139 for (sfb = 0; sfb < sfbCnt; sfb++) {
140 Word32 energy = sfbEnergyMS->sfbShort[wnd][sfb];
141 for (j=1; j<groupLen[grp]; j++) {
142 energy = L_add(energy, sfbEnergyMS->sfbShort[wnd+j][sfb]);
143 }
144 sfbEnergyMS->sfbLong[i] = energy;
145 i += 1;
146 }
147 wnd += groupLen[grp];
148 }
149
150 /* sum up sfbSpreadedEnergies */
151 wnd = 0;
152 i = 0;
153 for (grp = 0; grp < noOfGroups; grp++) {
154 for (sfb = 0; sfb < sfbCnt; sfb++) {
155 Word32 energy = sfbSpreadedEnergy->sfbShort[wnd][sfb];
156 for (j=1; j<groupLen[grp]; j++) {
157 energy = L_add(energy, sfbSpreadedEnergy->sfbShort[wnd+j][sfb]);
158 }
159 sfbSpreadedEnergy->sfbLong[i] = energy;
160 i += 1;
161 }
162 wnd += groupLen[grp];
163 }
164
165 /* re-group spectrum */
166 wnd = 0;
167 i = 0;
168 for (grp = 0; grp < noOfGroups; grp++) {
169 for (sfb = 0; sfb < sfbCnt; sfb++) {
170 for (j = 0; j < groupLen[grp]; j++) {
171 Word16 lineOffset = FRAME_LEN_SHORT * (wnd + j);
172 for (line = lineOffset + sfbOffset[sfb]; line < lineOffset + sfbOffset[sfb+1]; line++) {
173 tmpSpectrum[i] = mdctSpectrum[line];
174 i = i + 1;
175 }
176 }
177 }
178 wnd += groupLen[grp];
179 }
180
181 for(i=0;i<FRAME_LEN_LONG;i+=4) {
182 mdctSpectrum[i] = tmpSpectrum[i];
183 mdctSpectrum[i+1] = tmpSpectrum[i+1];
184 mdctSpectrum[i+2] = tmpSpectrum[i+2];
185 mdctSpectrum[i+3] = tmpSpectrum[i+3];
186 }
187 }
188
189