grp_data.c revision 41050cdb033641ddf26831d9272c0930f7b40a2d
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**********************************************************************************/
34void
35groupShortData(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