• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:		interface.c
18 
19 	Content:	Interface psychoaccoustic/quantizer functions
20 
21 *******************************************************************************/
22 
23 #include "basic_op.h"
24 #include "oper_32b.h"
25 #include "psy_const.h"
26 #include "interface.h"
27 
28 /*****************************************************************************
29 *
30 * function name: BuildInterface
31 * description:  update output parameter
32 *
33 **********************************************************************************/
BuildInterface(Word32 * groupedMdctSpectrum,const Word16 mdctScale,SFB_THRESHOLD * groupedSfbThreshold,SFB_ENERGY * groupedSfbEnergy,SFB_ENERGY * groupedSfbSpreadedEnergy,const SFB_ENERGY_SUM sfbEnergySumLR,const SFB_ENERGY_SUM sfbEnergySumMS,const Word16 windowSequence,const Word16 windowShape,const Word16 groupedSfbCnt,const Word16 * groupedSfbOffset,const Word16 maxSfbPerGroup,const Word16 * groupedSfbMinSnr,const Word16 noOfGroups,const Word16 * groupLen,PSY_OUT_CHANNEL * psyOutCh)34 void BuildInterface(Word32                  *groupedMdctSpectrum,
35                     const Word16             mdctScale,
36                     SFB_THRESHOLD           *groupedSfbThreshold,
37                     SFB_ENERGY              *groupedSfbEnergy,
38                     SFB_ENERGY              *groupedSfbSpreadedEnergy,
39                     const SFB_ENERGY_SUM     sfbEnergySumLR,
40                     const SFB_ENERGY_SUM     sfbEnergySumMS,
41                     const Word16             windowSequence,
42                     const Word16             windowShape,
43                     const Word16             groupedSfbCnt,
44                     const Word16            *groupedSfbOffset,
45                     const Word16             maxSfbPerGroup,
46                     const Word16            *groupedSfbMinSnr,
47                     const Word16             noOfGroups,
48                     const Word16            *groupLen,
49                     PSY_OUT_CHANNEL         *psyOutCh)
50 {
51   Word32 j;
52   Word32 grp;
53   Word32 mask;
54   Word16 *tmpV;
55 
56   /*
57   copy values to psyOut
58   */
59   psyOutCh->maxSfbPerGroup    = maxSfbPerGroup;
60   psyOutCh->sfbCnt            = groupedSfbCnt;
61   if(noOfGroups)
62 	psyOutCh->sfbPerGroup     = groupedSfbCnt/ noOfGroups;
63   else
64 	psyOutCh->sfbPerGroup     = 0x7fff;
65   psyOutCh->windowSequence    = windowSequence;
66   psyOutCh->windowShape       = windowShape;
67   psyOutCh->mdctScale         = mdctScale;
68   psyOutCh->mdctSpectrum      = groupedMdctSpectrum;
69   psyOutCh->sfbEnergy         = groupedSfbEnergy->sfbLong;
70   psyOutCh->sfbThreshold      = groupedSfbThreshold->sfbLong;
71   psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong;
72 
73   tmpV = psyOutCh->sfbOffsets;
74   for(j=0; j<groupedSfbCnt + 1; j++) {
75       *tmpV++ = groupedSfbOffset[j];
76   }
77 
78   tmpV = psyOutCh->sfbMinSnr;
79   for(j=0;j<groupedSfbCnt; j++) {
80 	  *tmpV++ =   groupedSfbMinSnr[j];
81   }
82 
83   /* generate grouping mask */
84   mask = 0;
85   for (grp = 0; grp < noOfGroups; grp++) {
86     mask = mask << 1;
87     for (j=1; j<groupLen[grp]; j++) {
88       mask = mask << 1;
89       mask |= 1;
90     }
91   }
92   psyOutCh->groupingMask = mask;
93 
94   if (windowSequence != SHORT_WINDOW) {
95     psyOutCh->sfbEnSumLR =  sfbEnergySumLR.sfbLong;
96     psyOutCh->sfbEnSumMS =  sfbEnergySumMS.sfbLong;
97   }
98   else {
99     Word32 i;
100     Word32 accuSumMS=0;
101     Word32 accuSumLR=0;
102     const Word32 *pSumMS = sfbEnergySumMS.sfbShort;
103     const Word32 *pSumLR = sfbEnergySumLR.sfbShort;
104 
105     for (i=TRANS_FAC; i; i--) {
106       accuSumLR = L_add(accuSumLR, *pSumLR); pSumLR++;
107       accuSumMS = L_add(accuSumMS, *pSumMS); pSumMS++;
108     }
109     psyOutCh->sfbEnSumMS = accuSumMS;
110     psyOutCh->sfbEnSumLR = accuSumLR;
111   }
112 }
113