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