Home | History | Annotate | Download | only in src
      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 **********************************************************************************/
     34 void
     35 groupShortData(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