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**********************************************************************************/
34void 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