1219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/*
2219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **
4219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** you may not use this file except in compliance with the License.
6219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** You may obtain a copy of the License at
7219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **
8219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **
10219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** See the License for the specific language governing permissions and
14219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** limitations under the License.
15219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard */
16219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/*******************************************************************************
17219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	File:		grp_data.c
18219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
19219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Content:	Short block grouping function
20219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
2117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*******************************************************************************/
2217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
23219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "basic_op.h"
2417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "psy_const.h"
2517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "interface.h"
2617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "grp_data.h"
2717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
2817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*****************************************************************************
2917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*
3017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: groupShortData
3117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description:  group short data for next quantization and coding
3217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*
3317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong**********************************************************************************/
3417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongvoid
3517299ab50ceb70d904e610e3b2d7fb2361a11e03James DonggroupShortData(Word32        *mdctSpectrum,
3617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               Word32        *tmpSpectrum,
3717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               SFB_THRESHOLD *sfbThreshold,
3817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               SFB_ENERGY    *sfbEnergy,
3917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               SFB_ENERGY    *sfbEnergyMS,
4017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               SFB_ENERGY    *sfbSpreadedEnergy,
4117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               const Word16   sfbCnt,
4217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               const Word16  *sfbOffset,
4317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               const Word16  *sfbMinSnr,
4417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               Word16        *groupedSfbOffset,
4517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               Word16        *maxSfbPerGroup,
4617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               Word16        *groupedSfbMinSnr,
4717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               const Word16   noOfGroups,
4817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong               const Word16  *groupLen)
4917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{
5017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  Word32 i, j;
5117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  Word32 line;
5217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  Word32 sfb;
5317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  Word32 grp;
5417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  Word32 wnd;
5517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  Word32 offset;
5617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  Word32 highestSfb;
5717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
5817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  /* for short: regroup and  */
5917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  /* cumulate energies und thresholds group-wise . */
6017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
6117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  /* calculate sfbCnt */
6217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  highestSfb = 0;
6317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  for (wnd=0; wnd<TRANS_FAC; wnd++) {
6417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    for (sfb=sfbCnt - 1; sfb>=highestSfb; sfb--) {
6517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      for (line=(sfbOffset[sfb + 1] - 1); line>=sfbOffset[sfb]; line--) {
6617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
6717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        if (mdctSpectrum[wnd*FRAME_LEN_SHORT+line] != 0) break;
6817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      }
6917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
7017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      if (line >= sfbOffset[sfb]) break;
7117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    }
7217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    highestSfb = max(highestSfb, sfb);
7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  }
7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  if (highestSfb < 0) {
7617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    highestSfb = 0;
7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  }
7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  *maxSfbPerGroup = highestSfb + 1;
7917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  /* calculate sfbOffset */
8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  i = 0;
8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  offset = 0;
8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  for (grp = 0; grp < noOfGroups; grp++) {
8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
8517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp];
8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      i += 1;
8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    }
8817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    offset += groupLen[grp] * FRAME_LEN_SHORT;
8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  }
9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  groupedSfbOffset[i] = FRAME_LEN_LONG;
9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  i += 1;
9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  /* calculate minSnr */
9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  i = 0;
9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  offset = 0;
9617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  for (grp = 0; grp < noOfGroups; grp++) {
9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
9817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      groupedSfbMinSnr[i] = sfbMinSnr[sfb];
9917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      i += 1;
10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    }
10117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    offset += groupLen[grp] * FRAME_LEN_SHORT;
10217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  }
10317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
10417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
10517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  /* sum up sfbThresholds */
10617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  wnd = 0;
10717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  i = 0;
10817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  for (grp = 0; grp < noOfGroups; grp++) {
10917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
11017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      Word32 thresh = sfbThreshold->sfbShort[wnd][sfb];
11117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      for (j=1; j<groupLen[grp]; j++) {
11217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        thresh = L_add(thresh, sfbThreshold->sfbShort[wnd+j][sfb]);
11317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      }
11417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      sfbThreshold->sfbLong[i] = thresh;
11517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      i += 1;
11617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    }
11717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    wnd += groupLen[grp];
11817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  }
11917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
12017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  /* sum up sfbEnergies left/right */
12117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  wnd = 0;
12217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  i = 0;
12317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  for (grp = 0; grp < noOfGroups; grp++) {
12417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
12517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      Word32 energy = sfbEnergy->sfbShort[wnd][sfb];
12617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      for (j=1; j<groupLen[grp]; j++) {
12717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        energy = L_add(energy, sfbEnergy->sfbShort[wnd+j][sfb]);
12817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      }
12917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      sfbEnergy->sfbLong[i] = energy;
13017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      i += 1;
13117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    }
13217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    wnd += groupLen[grp];
13317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  }
13417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
13517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  /* sum up sfbEnergies mid/side */
13617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  wnd = 0;
13717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  i = 0;
13817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  for (grp = 0; grp < noOfGroups; grp++) {
13917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
14017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      Word32 energy = sfbEnergyMS->sfbShort[wnd][sfb];
14117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      for (j=1; j<groupLen[grp]; j++) {
14217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        energy = L_add(energy, sfbEnergyMS->sfbShort[wnd+j][sfb]);
14317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      }
14417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      sfbEnergyMS->sfbLong[i] = energy;
14517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      i += 1;
14617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    }
14717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    wnd += groupLen[grp];
14817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  }
14917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
15017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  /* sum up sfbSpreadedEnergies */
15117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  wnd = 0;
15217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  i = 0;
15317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  for (grp = 0; grp < noOfGroups; grp++) {
15417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
15517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      Word32 energy = sfbSpreadedEnergy->sfbShort[wnd][sfb];
15617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      for (j=1; j<groupLen[grp]; j++) {
15717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        energy = L_add(energy, sfbSpreadedEnergy->sfbShort[wnd+j][sfb]);
15817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      }
15917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      sfbSpreadedEnergy->sfbLong[i] = energy;
16017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      i += 1;
16117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    }
16217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    wnd += groupLen[grp];
16317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  }
16417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
16517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  /* re-group spectrum */
16617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  wnd = 0;
16717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  i = 0;
16817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  for (grp = 0; grp < noOfGroups; grp++) {
16917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    for (sfb = 0; sfb < sfbCnt; sfb++) {
17017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      for (j = 0; j < groupLen[grp]; j++) {
17117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        Word16 lineOffset = FRAME_LEN_SHORT * (wnd + j);
17217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        for (line = lineOffset + sfbOffset[sfb]; line < lineOffset + sfbOffset[sfb+1]; line++) {
17317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          tmpSpectrum[i] = mdctSpectrum[line];
17417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong          i = i + 1;
17517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong        }
17617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong      }
17717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    }
17817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong    wnd += groupLen[grp];
17917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  }
18017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
18117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  for(i=0;i<FRAME_LEN_LONG;i+=4) {
182219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard    mdctSpectrum[i] = tmpSpectrum[i];
183219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	mdctSpectrum[i+1] = tmpSpectrum[i+1];
184219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	mdctSpectrum[i+2] = tmpSpectrum[i+2];
18517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	mdctSpectrum[i+3] = tmpSpectrum[i+3];
18617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong  }
18717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong}
18817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
189