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:		interface.c
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Content:	Interface psychoaccoustic/quantizer functions
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/
22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "oper_32b.h"
25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_const.h"
26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "interface.h"
27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/*****************************************************************************
29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: BuildInterface
31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description:  update output parameter
32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*
33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/
34956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid BuildInterface(Word32                  *groupedMdctSpectrum,
35956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const Word16             mdctScale,
36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    SFB_THRESHOLD           *groupedSfbThreshold,
37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    SFB_ENERGY              *groupedSfbEnergy,
38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    SFB_ENERGY              *groupedSfbSpreadedEnergy,
39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const SFB_ENERGY_SUM     sfbEnergySumLR,
40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const SFB_ENERGY_SUM     sfbEnergySumMS,
41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const Word16             windowSequence,
42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const Word16             windowShape,
43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const Word16             groupedSfbCnt,
44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const Word16            *groupedSfbOffset,
45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const Word16             maxSfbPerGroup,
46956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const Word16            *groupedSfbMinSnr,
47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const Word16             noOfGroups,
48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    const Word16            *groupLen,
49956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong                    PSY_OUT_CHANNEL         *psyOutCh)
50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{
51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word32 j;
52b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  Word32 grp;
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  Word32 mask;
54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  Word16 *tmpV;
55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /*
57956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  copy values to psyOut
58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  */
59b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyOutCh->maxSfbPerGroup    = maxSfbPerGroup;
60b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyOutCh->sfbCnt            = groupedSfbCnt;
61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  if(noOfGroups)
62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	psyOutCh->sfbPerGroup     = groupedSfbCnt/ noOfGroups;
63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  else
64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	psyOutCh->sfbPerGroup     = 0x7fff;
65b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyOutCh->windowSequence    = windowSequence;
66b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyOutCh->windowShape       = windowShape;
67b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyOutCh->mdctScale         = mdctScale;
68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  psyOutCh->mdctSpectrum      = groupedMdctSpectrum;
69956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  psyOutCh->sfbEnergy         = groupedSfbEnergy->sfbLong;
70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  psyOutCh->sfbThreshold      = groupedSfbThreshold->sfbLong;
71956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong;
72b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard  tmpV = psyOutCh->sfbOffsets;
74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for(j=0; j<groupedSfbCnt + 1; j++) {
75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      *tmpV++ = groupedSfbOffset[j];
76956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
77b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  tmpV = psyOutCh->sfbMinSnr;
79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for(j=0;j<groupedSfbCnt; j++) {
80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	  *tmpV++ =   groupedSfbMinSnr[j];
81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
82b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  /* generate grouping mask */
84b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  mask = 0;
85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  for (grp = 0; grp < noOfGroups; grp++) {
86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    mask = mask << 1;
87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    for (j=1; j<groupLen[grp]; j++) {
88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      mask = mask << 1;
89b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard      mask |= 1;
90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
92b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard  psyOutCh->groupingMask = mask;
93b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  if (windowSequence != SHORT_WINDOW) {
95b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    psyOutCh->sfbEnSumLR =  sfbEnergySumLR.sfbLong;
96b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    psyOutCh->sfbEnSumMS =  sfbEnergySumMS.sfbLong;
97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  else {
99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 i;
100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    Word32 accuSumMS=0;
101b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    Word32 accuSumLR=0;
1029fc4dfb69df0b5a13b7a1904272eb1dcf8113d0cMartin Storsjo    const Word32 *pSumMS = sfbEnergySumMS.sfbShort;
1039fc4dfb69df0b5a13b7a1904272eb1dcf8113d0cMartin Storsjo    const Word32 *pSumLR = sfbEnergySumLR.sfbShort;
104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    for (i=TRANS_FAC; i; i--) {
106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      accuSumLR = L_add(accuSumLR, *pSumLR); pSumLR++;
107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong      accuSumMS = L_add(accuSumMS, *pSumMS); pSumMS++;
108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong    }
109b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    psyOutCh->sfbEnSumMS = accuSumMS;
110b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard    psyOutCh->sfbEnSumLR = accuSumLR;
111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong  }
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}
113