1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*******************************************************************************
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	File:		grp_data.c
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Content:	Short block grouping function
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/
22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_const.h"
25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "interface.h"
26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "grp_data.h"
27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: groupShortData
31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  group short data for next quantization and coding
32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
34956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid
35956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DonggroupShortData(Word32        *mdctSpectrum,
36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               Word32        *tmpSpectrum,
37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               SFB_THRESHOLD *sfbThreshold,
38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               SFB_ENERGY    *sfbEnergy,
39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               SFB_ENERGY    *sfbEnergyMS,
40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               SFB_ENERGY    *sfbSpreadedEnergy,
41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               const Word16   sfbCnt,
42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               const Word16  *sfbOffset,
43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               const Word16  *sfbMinSnr,
44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               Word16        *groupedSfbOffset,
45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               Word16        *maxSfbPerGroup,
46956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               Word16        *groupedSfbMinSnr,
47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               const Word16   noOfGroups,
48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong               const Word16  *groupLen)
49956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 i, j;
51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 line;
52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 sfb;
53956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 grp;
54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 wnd;
55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 offset;
56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 highestSfb;
57956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* for short: regroup and  */
59956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* cumulate energies und thresholds group-wise . */
60b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* calculate sfbCnt */
62b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  highestSfb = 0;
63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (wnd=0; wnd<TRANS_FAC; wnd++) {
64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    for (sfb=sfbCnt - 1; sfb>=highestSfb; sfb--) {
65956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      for (line=(sfbOffset[sfb + 1] - 1); line>=sfbOffset[sfb]; line--) {
66b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
67b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        if (mdctSpectrum[wnd*FRAME_LEN_SHORT+line] != 0) break;
68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
69b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      if (line >= sfbOffset[sfb]) break;
71956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    highestSfb = max(highestSfb, sfb);
73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
74b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  if (highestSfb < 0) {
76b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    highestSfb = 0;
77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  *maxSfbPerGroup = highestSfb + 1;
79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* calculate sfbOffset */
81b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  i = 0;
82b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  offset = 0;
83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (grp = 0; grp < noOfGroups; grp++) {
84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp];
86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      i += 1;
87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    offset += groupLen[grp] * FRAME_LEN_SHORT;
89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
90b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  groupedSfbOffset[i] = FRAME_LEN_LONG;
91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  i += 1;
92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* calculate minSnr */
94b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  i = 0;
95b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  offset = 0;
96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (grp = 0; grp < noOfGroups; grp++) {
97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
98b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      groupedSfbMinSnr[i] = sfbMinSnr[sfb];
99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      i += 1;
100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    offset += groupLen[grp] * FRAME_LEN_SHORT;
102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* sum up sfbThresholds */
106b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  wnd = 0;
107b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  i = 0;
108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (grp = 0; grp < noOfGroups; grp++) {
109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
110b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      Word32 thresh = sfbThreshold->sfbShort[wnd][sfb];
111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      for (j=1; j<groupLen[grp]; j++) {
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        thresh = L_add(thresh, sfbThreshold->sfbShort[wnd+j][sfb]);
113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
114b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      sfbThreshold->sfbLong[i] = thresh;
115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      i += 1;
116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    wnd += groupLen[grp];
118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
120956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* sum up sfbEnergies left/right */
121b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  wnd = 0;
122b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  i = 0;
123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (grp = 0; grp < noOfGroups; grp++) {
124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
125b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      Word32 energy = sfbEnergy->sfbShort[wnd][sfb];
126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      for (j=1; j<groupLen[grp]; j++) {
127956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        energy = L_add(energy, sfbEnergy->sfbShort[wnd+j][sfb]);
128956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
129b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      sfbEnergy->sfbLong[i] = energy;
130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      i += 1;
131956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
132956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    wnd += groupLen[grp];
133956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* sum up sfbEnergies mid/side */
136b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  wnd = 0;
137b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  i = 0;
138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (grp = 0; grp < noOfGroups; grp++) {
139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
140b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      Word32 energy = sfbEnergyMS->sfbShort[wnd][sfb];
141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      for (j=1; j<groupLen[grp]; j++) {
142956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        energy = L_add(energy, sfbEnergyMS->sfbShort[wnd+j][sfb]);
143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
144b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      sfbEnergyMS->sfbLong[i] = energy;
145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      i += 1;
146956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    wnd += groupLen[grp];
148956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
149956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* sum up sfbSpreadedEnergies */
151b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  wnd = 0;
152b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  i = 0;
153956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (grp = 0; grp < noOfGroups; grp++) {
154956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
155b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      Word32 energy = sfbSpreadedEnergy->sfbShort[wnd][sfb];
156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      for (j=1; j<groupLen[grp]; j++) {
157956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        energy = L_add(energy, sfbSpreadedEnergy->sfbShort[wnd+j][sfb]);
158956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
159b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      sfbSpreadedEnergy->sfbLong[i] = energy;
160956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      i += 1;
161956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    wnd += groupLen[grp];
163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
165956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* re-group spectrum */
166b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  wnd = 0;
167b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  i = 0;
168956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (grp = 0; grp < noOfGroups; grp++) {
169956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
170956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      for (j = 0; j < groupLen[grp]; j++) {
171956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        Word16 lineOffset = FRAME_LEN_SHORT * (wnd + j);
172956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        for (line = lineOffset + sfbOffset[sfb]; line < lineOffset + sfbOffset[sfb+1]; line++) {
173b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard          tmpSpectrum[i] = mdctSpectrum[line];
174956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong          i = i + 1;
175956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        }
176956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      }
177956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
178956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    wnd += groupLen[grp];
179956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
180956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
181956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for(i=0;i<FRAME_LEN_LONG;i+=4) {
182b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    mdctSpectrum[i] = tmpSpectrum[i];
183b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	mdctSpectrum[i+1] = tmpSpectrum[i+1];
184b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	mdctSpectrum[i+2] = tmpSpectrum[i+2];
185b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	mdctSpectrum[i+3] = tmpSpectrum[i+3];
186956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
187956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
188956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
189