1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------
2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License.
6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at
7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied.
14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions
15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License.
16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -------------------------------------------------------------------
17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pathname: pns_intensity_right.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    hasmask    = mask status for the frame. Enumerated.
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pFrameInfo = Pointer to structure that holds information about each group.
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 (long block flag, number of windows, scalefactor bands
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                  per group, etc.)
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 [const pFrameInfo * const]
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    group      = Array that contains indexes of the
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 first window in the next group.
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 [const Int *, length num_win]
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    mask_map   = Array that denotes whether M/S stereo is turned on for
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 each grouped scalefactor band.
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 [const Int *, length MAX_SFB]
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    codebook_map = Array that denotes which Huffman codebook was used for
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                   the encoding of each grouped scalefactor band.
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                   [const Int *, length MAX_SFB]
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    factorsL     =  Array of grouped scalefactors for left chan.
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    [const Int *, length MAX_SFB]
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    factorsR     =  Array of scalefactors for right chan.
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    [const Int *, length MAX_SFB]
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sfb_prediction_used =  Flag that denotes the activation of long term prediction
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                           on a per-scalefactor band, non-grouped basis.
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                           [const Int *, length MAX_SFB]
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ltp_data_present = Flag that indicates whether LTP is enbaled for this frame.
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                       [const Bool]
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coefLeft = Array containing the fixed-point spectral coefficients
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                       for the left channel.
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                       [Int32 *, length 1024]
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coefRight = Array containing the fixed-point spectral coefficients
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for the right channel.
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        [Int32 *, length 1024]
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    q_formatLeft = The Q-format for the left channel's fixed-point spectral
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                   coefficients, on a per-scalefactor band, non-grouped basis.
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                   [Int *, length MAX_SFB]
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    q_formatRight = The Q-format for the right channel's fixed-point spectral
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    coefficients, on a per-scalefactor band, non-grouped basis.
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    [Int *, length MAX_SFB]
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pCurrentSeed  = Pointer to the current seed for the random number
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    generator in the function gen_rand_vector().
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    [Int32 * const]
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed:
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coefLeft  = Contains the new spectral information.
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coefRight = Contains the new spectral information.
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    q_formatLeft      = Q-format may be updated with changed to fixed-point
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        data in coefLeft.
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    q_formatRight     = Q-format may be updated with changed to fixed-point
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        data in coefRight.
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pCurrentSeed      = Value pointed to by pCurrentSeed updated by calls
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        to gen_rand_vector().
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified:
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified:
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function steps through all of the scalefactor bands, looking for
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber either PNS or IS to be enabled on the right channel.
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber If the codebook used is >= NOISE_HCB, the code then checks for the use
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of Huffman codebooks NOISE_HCB, INTENSITY_HCB, or INTENSITY_HCB2.
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber When a SFB utilizing the codebook NOISE_HCB is detected, a check is made to
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber see if M/S has also been enabled for that SFB.
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber If M/S is not enabled, the band's spectral information is filled with
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber scaled random data.   The scaled random data is generated by the function
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber gen_rand_vector.  This is done across all windows in the group.
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber If M/S is enabled, the band's spectral information is derived from the data
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber residing in the same band on the left channel.  The information on the right
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber channel has independent scaling, so this is a bit more involved than a
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber direct copy of the information on the left channel.  This is done by calling
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the inline function pns_corr().
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber When a SFB utilizing an intensity codebook is detected, the band's spectral
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber information is generated from the information on the left channel.
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This is done across all windows in the group.  M/S being enabled has the
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber effect of reversing the sign of the data on the right channel.  This code
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber resides in the inline function intensity_right().
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) ISO/IEC 14496-3:1999(E)
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     Part 3
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Subpart 4.6.7.1   M/S stereo
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Subpart 4.6.7.2.3 Decoding Process (Intensity Stereo)
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Subpart 4.6.12.3  Decoding Process (PNS)
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Subpart 4.6.2     ScaleFactors
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) MPEG-2 NBC Audio Decoder
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   "This software module was originally developed by AT&T, Dolby
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   3. This software module is an implementation of a part of one or more
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   standards free license to this software module or modifications thereof
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for use in hardware or software products claiming conformance to the
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module in hardware or software products are advised that this use may
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   infringe existing patents. The original developer of this software
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module and his/her company, the subsequent editors and their companies,
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   and ISO/IEC have no liability for use of this software module or
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   modifications thereof in an implementation. Copyright is not released
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   developer retains full right to use the code for his/her own purpose,
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   assign or donate the code to a third party and to inhibit third party
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   This copyright notice must be included in all copies or derivative
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   works."
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Copyright(c)1996.
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pCoefRight = coefRight;
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pCoefLeft = coefLeft;
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    window_start = 0;
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tot_sfb = 0;
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    start_indx = 0;
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coef_per_win = pFrameInfo->coef_per_win[0];
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sfb_per_win = pFrameInfo->sfb_per_win[0];
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    DO
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pBand     = pFrameInfo->win_sfb_top[window_start];
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        partition = *pGroup;
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pGroup = pGroup + 1;
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        band_start = 0;
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        wins_in_group = (partition - window_start);
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        FOR (sfb = sfb_per_win; sfb > 0; sfb--)
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            band_stop = *(pBand);
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pBand = pBand + 1;
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            codebook = *(pCodebookMap);
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pCodebookMap = pCodebookMap + 1;
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            mask_enabled = *(pMaskMap);
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pMaskMap = pMaskMap + 1;
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            band_length = band_stop - band_start;
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            IF (codebook == NOISE_HCB)
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                sfb_prediction_used[tot_sfb] &= ltp_data_present;
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                IF (sfb_prediction_used[tot_sfb] == FALSE)
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    mask_enabled = mask_enabled AND hasmask;
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    IF (mask_enabled == FALSE)
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pWindow_CoefR = &(pCoefRight[band_start]);
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        start_indx = tot_sfb;
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        FOR (win_indx = wins_in_group;
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                             win_indx > 0;
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                             win_indx--)
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            CALL
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            q_formatRight[start_indx] =
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                 gen_rand_vector(
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                     pWindow_CoefR,
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                     band_length,
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                     pCurrentSeed,
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                     *(pFactorsRight));
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            MODIFYING
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                pCoefRight[band_start]
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            RETURNING
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                q_formatRight[start_indx]
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pWindow_CoefR += coef_per_win;
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            start_indx = start_indx + sfb_per_win;
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        ENDFOR
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ELSE
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        CALL
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pns_corr(
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                             (*(pFactorsRight) -
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                              *(pFactorsLeft) ),
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                             coef_per_win,
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                             sfb_per_win,
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                             wins_in_group,
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                             band_length,
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                             q_formatLeft[tot_sfb],
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            &(q_formatRight[tot_sfb]),
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            &(pCoefLeft[band_start]),
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            &(pCoefRight[band_start]));
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        MODIFYING
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pCoefRightt[band_start]
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            q_formatRight[tot_sfb]
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        RETURNING
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                NONE
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    ENDIF
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                ENDIF
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ELSE IF (codebook >= INTENSITY_HCB2)
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                mask_enabled = mask_enabled AND hasmask;
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                CALL
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    intensity_right(
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        *(pFactorsRight),
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        coef_per_win,
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        sfb_per_win,
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        wins_in_group,
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        band_length,
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        codebook,
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        mask_enabled,
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                       &(q_formatLeft[tot_sfb]),
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                       &(q_formatRight[tot_sfb]),
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                       &(pCoefLeft[band_start]),
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                       &(pCoefRight[band_start]));
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                MODIFYING
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    pCoefRightt[band_start]
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    q_formatRight[tot_sfb]
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                RETURNING
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    NONE
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDIF
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            band_start = band_stop;
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tot_sfb = tot_sfb + 1;
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDFOR
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        coef_per_win = coef_per_win * (wins_in_group);
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        wins_in_group = wins_in_group - 1;
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tot_sfb = tot_sfb + sfb_per_win * wins_in_group;
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFactorsRight = pFactorsRight + sfb_per_win * wins_in_group;
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFactorsLeft  = pFactorsLeft + sfb_per_win * wins_in_group;
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pCoefRight = pCoefRight + coef_per_win;
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pCoefLeft  = pCoefLeft + coef_per_win;
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        window_start = partition;
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    WHILE (partition < pFrameInfo->num_win);
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return;
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor the
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     resources used should be documented below.
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pns_intensity_right.h"
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_huffmanconst.h"
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "gen_rand_vector.h"
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "intensity_right.h"
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pns_corr.h"
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid pns_intensity_right(
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int        hasmask,
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const FrameInfo * const pFrameInfo,
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int        group[],
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Bool       mask_map[],
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int        codebook_map[],
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int        factorsL[],
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int        factorsR[],
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int        sfb_prediction_used[],
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Bool       ltp_data_present,
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32      coefLeft[],
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32      coefRight[],
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int        q_formatLeft[MAXBANDS],
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int        q_formatRight[MAXBANDS],
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 * const pCurrentSeed)
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   *pCoefRight;
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   *pWindow_CoefR;
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   *pCoefLeft;
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     tot_sfb;
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     start_indx;
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     sfb;
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     band_length;
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     band_start;
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     band_stop;
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     coef_per_win;
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     codebook;
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     partition;
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     window_start;
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     sfb_per_win;
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     wins_in_group;
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int     win_indx;
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int16 *pBand;
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int   *pFactorsLeft  = factorsL;
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int   *pFactorsRight = factorsR;
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int   *pCodebookMap  = codebook_map;
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int   *pGroup        = group;
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Bool  *pMaskMap      = mask_map;
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Bool mask_enabled;
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pCoefRight = coefRight;
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    pCoefLeft = coefLeft;
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    window_start = 0;
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    tot_sfb = 0;
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    start_indx = 0;
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * Each window in the frame should have the same number of coef's,
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * so coef_per_win is constant in all the loops
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    coef_per_win = pFrameInfo->coef_per_win[0];
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * Because the number of scalefactor bands per window should be
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * constant for each frame, sfb_per_win can be determined outside
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * of the loop.
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     * For 44.1 kHz sampling rate   sfb_per_win = 14 for short windows
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *                              sfb_per_win = 49 for long  windows
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sfb_per_win = pFrameInfo->sfb_per_win[0];
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    do
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pBand     = pFrameInfo->win_sfb_top[window_start];
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*----------------------------------------------------------
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Partition is equal to the first window in the next group
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        { Group 0    }{      Group 1      }{    Group 2 }{Group 3}
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        [win 0][win 1][win 2][win 3][win 4][win 5][win 6][win 7]
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pGroup[0] = 2
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pGroup[1] = 5
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pGroup[2] = 7
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pGroup[3] = 8
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        -----------------------------------------------------------*/
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        partition = *(pGroup++);
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        band_start = 0;
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        wins_in_group = (partition - window_start);
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (sfb = sfb_per_win; sfb > 0; sfb--)
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /* band is offset table, band_stop is last coef in band */
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            band_stop = *(pBand++);
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            codebook = *(pCodebookMap++);
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            mask_enabled = *(pMaskMap++);
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * When a tool utilizing sfb is found, apply the correct tool
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * to that sfb in each window in the group
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * Example...  sfb[3] == NOISE_HCB
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * [ Group 1                                      ]
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * [win 0                 ][win 1                 ]
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * [0][1][2][X][4][5][6][7][0][1][2][X][4][5][6][7]
500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * The for(sfb) steps through the sfb's 0-7 in win 0.
502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * Finding sfb[3]'s codebook == NOISE_HCB, the code
504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * steps through all the windows in the group (they share
505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * the same scalefactors) and replaces that sfb with noise.
506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            /*
509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * Experimental results suggest that ms_synt is the most
510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             * commonly used tool, so check for it first.
511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             *
512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber             */
513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            band_length = band_stop - band_start;
515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (codebook == NOISE_HCB)
517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                sfb_prediction_used[tot_sfb] &= ltp_data_present;
519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                if (sfb_prediction_used[tot_sfb] == FALSE)
521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    /*
523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * The branch and the logical AND interact in the
524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * following manner...
525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     *
526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * mask_enabled == 0 hasmask == X -- gen_rand_vector
527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * mask_enabled == 1 hasmask == 1 -- pns_corr
528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * mask_enabled == 0 hasmask == 1 -- gen_rand_vector
529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * mask_enabled == 1 hasmask == 2 -- gen_rand_vector
530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     * mask_enabled == 0 hasmask == 2 -- gen_rand_vector
531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                     */
532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    mask_enabled &= hasmask;
534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    if (mask_enabled == FALSE)
536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pWindow_CoefR = &(pCoefRight[band_start]);
538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        /*
540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * Step through all the windows in this group,
541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * replacing this band in each window's
542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         * spectrum with random noise
543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                         */
544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        start_indx = tot_sfb;
545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        for (win_indx = wins_in_group;
547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                win_indx > 0;
548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                win_indx--)
549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        {
550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            /* generate random noise */
552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            q_formatRight[start_indx] =
553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                gen_rand_vector(
554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    pWindow_CoefR,
555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    band_length,
556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    pCurrentSeed,
557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *(pFactorsRight));
558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            pWindow_CoefR += coef_per_win;
560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            start_indx += sfb_per_win;
562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        }
563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    }
565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    else
566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    {
567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                        pns_corr(
568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            (*(pFactorsRight) -
569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                             *(pFactorsLeft)),
570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            coef_per_win,
571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            sfb_per_win,
572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            wins_in_group,
573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            band_length,
574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            q_formatLeft[tot_sfb],
575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            &(q_formatRight[tot_sfb]),
576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            &(pCoefLeft[band_start]),
577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            &(pCoefRight[band_start]));
578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    } /* if (mask_map == FALSE) */
580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                } /* if (sfb_prediction_used[tot_sfb] == FALSE) */
582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* if (codebook == 0) */
584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else if (codebook >= INTENSITY_HCB2)
585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                /*
587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * The logical AND flags the inversion of intensity
588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * in the following manner.
589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 *
590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * mask_enabled == X hasmask == 0 -- DO NOT INVERT
591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * mask_enabled == 0 hasmask == X -- DO NOT INVERT
592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * mask_enabled == 1 hasmask == 1 -- DO     INVERT
593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * mask_enabled == 0 hasmask == 1 -- DO NOT INVERT
594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * mask_enabled == 1 hasmask == 2 -- DO NOT INVERT
595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 * mask_enabled == 0 hasmask == 2 -- DO NOT INVERT
596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                 */
597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                mask_enabled &= hasmask;
599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                intensity_right(
601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    *(pFactorsRight),
602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    coef_per_win,
603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    sfb_per_win,
604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    wins_in_group,
605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    band_length,
606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    codebook,
607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    mask_enabled,
608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    &(q_formatLeft[tot_sfb]),
609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    &(q_formatRight[tot_sfb]),
610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    &(pCoefLeft[band_start]),
611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    &(pCoefRight[band_start]));
612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            } /* END else codebook must be INTENSITY_HCB or ... */
614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            band_start = band_stop;
616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tot_sfb++;
618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFactorsLeft++;
620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pFactorsRight++;
621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        } /* for (sfb) */
623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * Increment pCoefRight and pCoefLeft by
626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * coef_per_win * the number of windows
627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pCoefRight += coef_per_win * wins_in_group;
630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pCoefLeft  += coef_per_win * wins_in_group--;
631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * Increase tot_sfb by sfb_per_win times the number of windows minus 1.
634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * The minus 1 comes from the fact that tot_sfb is already pointing
635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         * to the first sfb in the 2nd window of the group.
636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tot_sfb += sfb_per_win * wins_in_group;
638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFactorsRight += sfb_per_win * wins_in_group;
640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pFactorsLeft  += sfb_per_win * wins_in_group;
641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        window_start = partition;
643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    while (partition < pFrameInfo->num_win);
646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* pFrameInfo->num_win = 1 for long windows, 8 for short_windows */
648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return;
650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* pns_intensity_right() */
652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
654