line_pe.c revision f3664ae9369a861ffbc2354e8e93e48983802062
1b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*
2b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** Copyright 2003-2010, VisualOn, Inc.
3b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber **
4b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** Licensed under the Apache License, Version 2.0 (the "License");
5b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** you may not use this file except in compliance with the License.
6b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** You may obtain a copy of the License at
7b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber **
8b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber **     http://www.apache.org/licenses/LICENSE-2.0
9b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber **
10b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** Unless required by applicable law or agreed to in writing, software
11b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** distributed under the License is distributed on an "AS IS" BASIS,
12b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** See the License for the specific language governing permissions and
14b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber ** limitations under the License.
15b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber */
16b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*******************************************************************************
17b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber	File:		line_pe.c
18b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
19b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber	Content:	Perceptual entropie module functions
20b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
21b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*******************************************************************************/
22b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
23b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "basic_op.h"
24b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "oper_32b.h"
25b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "typedef.h"
26b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber#include "line_pe.h"
27b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
28b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
29b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word16  C1_I = 12;    /* log(8.0)/log(2) *4         */
30b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word32  C2_I = 10830; /* log(2.5)/log(2) * 1024 * 4 * 2 */
31b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huberstatic const Word16  C3_I = 573;   /* (1-C2/C1) *1024            */
32b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
33b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
34b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*****************************************************************************
35b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*
36b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* function name: prepareSfbPe
37b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* description:  constants that do not change during successive pe calculations
38b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*
39b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber**********************************************************************************/
40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid prepareSfbPe(PE_DATA *peData,
41b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                  PSY_OUT_CHANNEL  psyOutChannel[MAX_CHANNELS],
42b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                  Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
43b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                  Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
44b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                  const Word16 nChannels,
45b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                  const Word16 peOffset)
46b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
47b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  Word32 sfbGrp, sfb;
48b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  Word32 ch;
49b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  for(ch=0; ch<nChannels; ch++) {
51b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    PE_CHANNEL_DATA *peChanData=&peData->peChannelData[ch];
53b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for(sfbGrp=0;sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup){
54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
55b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber	    peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb];
56b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2;
57b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber	    peChanData->sfbLdEnergy[sfbGrp+sfb] = logSfbEnergy[ch][sfbGrp+sfb];
58b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
59b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
60b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  }
61b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  peData->offset = peOffset;
62b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
63b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
64b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
65b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber/*****************************************************************************
66b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*
67b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* function name: calcSfbPe
68b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber* description:  constPart is sfbPe without the threshold part n*ld(thr) or n*C3*ld(thr)
69b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber*
70b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber**********************************************************************************/
71b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Hubervoid calcSfbPe(PE_DATA *peData,
72b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
73b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber               const Word16 nChannels)
74b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber{
75b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  Word32 ch;
76b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  Word32 sfbGrp, sfb;
77b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  Word32 nLines4;
78b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  Word32 ldThr, ldRatio;
79b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  Word32 pe, constPart, nActiveLines;
80b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
81b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  peData->pe = peData->offset;
82b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  peData->constPart = 0;
83b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  peData->nActiveLines = 0;
84b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  for(ch=0; ch<nChannels; ch++) {
85b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
86b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
87b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    const Word32 *sfbEnergy = psyOutChan->sfbEnergy;
88b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    const Word32 *sfbThreshold = psyOutChan->sfbThreshold;
89b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
90b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    pe = 0;
91b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    constPart = 0;
92b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    nActiveLines = 0;
93b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
94b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
95b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
96b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 nrg = sfbEnergy[sfbGrp+sfb];
97b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 thres = sfbThreshold[sfbGrp+sfb];
98b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb];
99b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
100b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        if (nrg > thres) {
101b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          ldThr = iLog4(thres);
102b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
103b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          ldRatio = sfbLDEn - ldThr;
104b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
105b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          nLines4 = peChanData->sfbNLines4[sfbGrp+sfb];
106b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
107b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          /* sfbPe = nl*log2(en/thr)*/
108b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber		  if (ldRatio >= C1_I) {
109b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            peChanData->sfbPe[sfbGrp+sfb] = (nLines4*ldRatio + 8) >> 4;
110b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            peChanData->sfbConstPart[sfbGrp+sfb] = ((nLines4*sfbLDEn)) >> 4;
111b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          }
112b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          else {
113b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber		  /* sfbPe = nl*(c2 + c3*log2(en/thr))*/
114b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            peChanData->sfbPe[sfbGrp+sfb] = extract_l((L_mpy_wx(
115b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    (C2_I + C3_I * ldRatio * 2) << 4, nLines4) + 4) >> 3);
116b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            peChanData->sfbConstPart[sfbGrp+sfb] = extract_l(( L_mpy_wx(
117b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber                    (C2_I + C3_I * sfbLDEn * 2) << 4, nLines4) + 4) >> 3);
118b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber            nLines4 = (nLines4 * C3_I + (1024<<1)) >> 10;
119b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          }
120b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2;
121b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
122b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        else {
123b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          peChanData->sfbPe[sfbGrp+sfb] = 0;
124b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          peChanData->sfbConstPart[sfbGrp+sfb] = 0;
125b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber          peChanData->sfbNActiveLines[sfbGrp+sfb] = 0;
126b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        }
127b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        pe = pe + peChanData->sfbPe[sfbGrp+sfb];
128b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        constPart = constPart + peChanData->sfbConstPart[sfbGrp+sfb];
129b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber        nActiveLines = nActiveLines + peChanData->sfbNActiveLines[sfbGrp+sfb];
130b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber      }
131b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    }
132b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
133b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber	peChanData->pe = saturate(pe);
134b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    peChanData->constPart = saturate(constPart);
135b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    peChanData->nActiveLines = saturate(nActiveLines);
136b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
137b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber
138b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber	pe += peData->pe;
139b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber	peData->pe = saturate(pe);
140b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    constPart += peData->constPart;
141b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber	peData->constPart = saturate(constPart);
142b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    nActiveLines += peData->nActiveLines;
143b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber	peData->nActiveLines = saturate(nActiveLines);
144b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber  }
145b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber}
146b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber