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