1250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/* ------------------------------------------------------------------
2250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
4250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * you may not use this file except in compliance with the License.
6250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * You may obtain a copy of the License at
7250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
8250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
10250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Unless required by applicable law or agreed to in writing, software
11250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * express or implied.
14250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * See the License for the specific language governing permissions
15250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * and limitations under the License.
16250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * -------------------------------------------------------------------
17250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */
18250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*
19250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
20250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
21250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   PacketVideo Corp.
22250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   MP3 Decoder Library
23250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
24250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   Filename: pvmp3_mpeg2_stereo_proc.cpp
25250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
26250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   Functions:
27250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
28250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     pvmp3_st_intensity_ver2
29250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     pvmp3_mpeg2_stereo_proc
30250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
31250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     Date: 09/21/2007
32250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
33250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
34250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REVISION HISTORY
35250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
36250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
37250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Description:
38250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
39250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
40250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
41250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
42250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberpvmp3_st_intensity_ver2
43250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
44250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber INPUT AND OUTPUT DEFINITIONS
45250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
46250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas HuberInput
47250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
48250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   int32 xr[],      input channel
49250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   int32 xl[],
50250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   int32 m,         selecting index: io = 2(1/4) (m=0), io = 2(1/8) (m=1)
51250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   int32 is_pos,    index on table  is_pos_pow_eitgh_root_of_2
52250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   int32 Start,     Location of first element where stereo intensity is applied
53250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   int32 Number     number of elements affected
54250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
55250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Returns
56250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
57250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   int32 xl[],      generated stereo channel
58250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
59250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
60250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
61250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
62250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
63250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
64250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberpvmp3_mpeg2_stereo_proc
65250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
66250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber INPUT AND OUTPUT DEFINITIONS
67250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
68250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas HuberInput
69250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
70250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   int32 xr[],                     input channel
71250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   int32 xl[],
72250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   mp3ScaleFactors *scalefac,      scale factors structure for Right channel
73250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   granuleInfo *gr_info_l,         granule structure for the left channel
74250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   granuleInfo *gr_info_r,         granule structure for the rigth channel
75250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   uint32 *scalefac_IIP_buffer,    auxiliary scale factor vector
76250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   mp3Header *info                 mp3 header info
77250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Returns
78250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
79250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   int32 xl[],      generated stereo channel
80250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
81250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
82250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
83250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber FUNCTION DESCRIPTION
84250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
85250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    stereo processing for mpeg2 layer III LSF extension
86250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
87250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
88250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REQUIREMENTS
89250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
90250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
91250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
92250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REFERENCES
93250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
94250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
95250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
96250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
97250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
98250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber PSEUDO-CODE
99250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
100250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
101250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber*/
102250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
103250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
104250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
105250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; INCLUDES
106250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
107250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
108250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_mpeg2_stereo_proc.h"
109250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_stereo_proc.h"
110250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pv_mp3dec_fxd_op.h"
111250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_tables.h"
112250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "mp3_mem_funcs.h"
113250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
114250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
115250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; MACROS
116250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Define module specific macros here
117250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
118250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
119250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
120250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
121250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; DEFINES
122250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Include all pre-processor statements here. Include conditional
123250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; compile variables also.
124250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
125250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
126250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#define Q31_fmt(a)    (int32(double(0x7FFFFFFF)*a))
127250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
128250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
129250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL FUNCTION DEFINITIONS
130250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Function Prototype declaration
131250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
132250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
133250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
134250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
135250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Variable declaration - defined here and used outside this module
136250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
137250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberconst int32 is_pos_pow_eitgh_root_of_2[8] =
138250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
139250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /*   --- 2^(1/8) ----- */
140250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Q31_fmt(1.00000000000000),   Q31_fmt(0.91700404320467),   Q31_fmt(0.84089641525371),
141250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Q31_fmt(0.77110541270397),   Q31_fmt(0.70710678118655),   Q31_fmt(0.64841977732550),
142250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Q31_fmt(0.59460355750136),   Q31_fmt(0.54525386633263)
143250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber};
144250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
145250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
146250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL FUNCTION REFERENCES
147250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare functions defined elsewhere and referenced in this module
148250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
149250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
150250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
151250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
152250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare variables used in this module but defined elsewhere
153250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
154250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
155250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
156250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE
157250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
158250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
159250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Hubervoid pvmp3_st_intensity_ver2(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
160250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
161250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             int32 m,
162250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             int32 is_pos,
163250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             int32 Start,
164250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             int32 Number)
165250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
166250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 k[2];
167250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
168250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* pow(io, ((is_pos + 1)>>1)); io = 2(1/4) (m=0), io = 2(1/8) (m=1) */
169250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    k[0] = is_pos_pow_eitgh_root_of_2[((is_pos+1)&(3+(m<<2)))<<(1-m)] >> ((is_pos + 1) >> (2 + m));
170250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* pow(io, (is_pos>>1)); io = 2(1/4) (m=0), io = 2(1/8) (m=1)  */
171250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    k[1] = is_pos_pow_eitgh_root_of_2[(is_pos&(3+(m<<2)))<<(1-m)] >> (is_pos >> (2 + m));
172250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
173250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
174250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 *pt_xr  = &xr[Start];
175250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 *pt_xl  = &xl[Start];
176250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
177250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    if (is_pos == 0)    /* 0 < is_pos < 31 */
178250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
179250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        pv_memcpy(pt_xl, pt_xr, Number*sizeof(*pt_xr));
180250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
181250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    else if (is_pos & 1)
182250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
183250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        for (int32 i = Number >> 1; i != 0; i--)
184250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
185250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            *(pt_xl++) = (*pt_xr);
186250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            *(pt_xr) = fxp_mul32_Q32((*pt_xr) << 1, k[0]);
187250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            pt_xr++;
188250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            *(pt_xl++) = (*pt_xr);
189250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            *(pt_xr) = fxp_mul32_Q32((*pt_xr) << 1, k[0]);
190250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            pt_xr++;
191250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
192250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        if (Number&1)
193250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
194250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            *(pt_xl) = (*pt_xr);
195250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            *(pt_xr) = fxp_mul32_Q32((*pt_xr) << 1, k[0]);
196250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
197250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
198250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    else
199250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
200250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        for (int32 i = Number >> 1; i != 0; i--)
201250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
202250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            *(pt_xl++) = fxp_mul32_Q32((*(pt_xr++)) << 1, k[1]);
203250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            *(pt_xl++) = fxp_mul32_Q32((*(pt_xr++)) << 1, k[1]);
204250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
205250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        if (Number&1)
206250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
207250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            *(pt_xl) = fxp_mul32_Q32((*pt_xr) << 1, k[1]);
208250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
209250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
210250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
211250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
212250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
213250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
214250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
215250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
216250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE
217250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
218250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Hubervoid pvmp3_mpeg2_stereo_proc(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
219250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
220250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             mp3ScaleFactors *scalefac_R,
221250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             granuleInfo *gr_info_l,
222250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             granuleInfo *gr_info_r,
223250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             uint32 *scalefac_IIP_buffer,
224250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             int32 used_freq_lines,
225250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                             mp3Header *info)
226250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
227250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
228250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 sfreq;
229250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 sb;
230250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 ss;
231250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 sfbNo;
232250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 sfbStart;
233250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 sfb;
234250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 sfbTemp;
235250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 i;
236250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 j;
237250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 io;
238250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
239250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
240250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 i_stereo  = (info->mode == MPG_MD_JOINT_STEREO) &&
241250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                      (info->mode_ext & 0x1);
242250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
243250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 ms_stereo = (info->mode == MPG_MD_JOINT_STEREO) &&
244250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                      (info->mode_ext & 0x2);
245250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
246250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
247250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    if (i_stereo)
248250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
249250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        if (gr_info_r->scalefac_compress & 1)
250250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
251250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            io = 0;  /* 2^(-1/4) */
252250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
253250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        else
254250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
255250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            io = 1;  /* 2^(-1/8) */
256250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
257250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
258250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        sfreq =  info->version_x + (info->version_x << 1);
259250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        sfreq += info->sampling_frequency;
260250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
261250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        if (gr_info_l->window_switching_flag && (gr_info_l->block_type == 2))
262250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
263250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            if (gr_info_l->mixed_block_flag)
264250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
265250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                /*
266250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                 * mixed blocks processing
267250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                 */
268250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                i = 31;
269250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                ss = 17;
270250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                sb = -1;
271250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
272250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                while (i >= 0)
273250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
274250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    if (xl[(i*FILTERBANK_BANDS) + ss])
275250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
276250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        sb = (i << 4) + (i << 1) + ss;
277250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        i = -1;
278250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
279250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    else
280250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
281250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        ss--;
282250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        if (ss < 0)
283250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
284250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            i--;
285250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            ss = 17;
286250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
287250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
288250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }   /* now sb is the number of highest line with value != 0      */
289250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                /* can be between -1 (all lines zero) and 575 (no line zero) */
290250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
291250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                if (sb < 36)    /*  was (sb <= 36)  */
292250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
293250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /*
294250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     *  mixed blocks processing: intensity bound inside long blocks
295250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     */
296250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* 1. long blocks up to intensity border: Stereo or M/S */
297250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    if (mp3_sfBandIndex[sfreq].l[4] <= sb)
298250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
299250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        i = 4;
300250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
301250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    else
302250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
303250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        i = 0;
304250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
305250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
306250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    while (mp3_sfBandIndex[sfreq].l[i] <= sb)
307250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
308250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        i++;
309250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
310250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    sfbTemp = i;  /* from that (long) sfb on we have intensity stereo */
311250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
312250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    sfbNo = mp3_sfBandIndex[sfreq].l[sfbTemp]; /* number of lines to process */
313250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
314250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* from sfbStart up sfbNo lines do ms_stereo or normal stereo */
315250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    if (ms_stereo)
316250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
317250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        pvmp3_st_mid_side(xr, xl, 0, sfbNo);
318250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
319250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
320250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* 2. long blocks from intensity border up to sfb band 6: intensity */
321250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* calc. MPEG_1_2_Factor[0], MPEG_1_2_Factor[1] */
322250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
323250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    for (sfb = sfbTemp; sfb < 6; sfb++)
324250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
325250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        sfbStart = mp3_sfBandIndex[sfreq].l[sfb];  /* = Start in 0 ... 575 */
326250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        sfbNo = mp3_sfBandIndex[sfreq].l[sfb+1] - mp3_sfBandIndex[sfreq].l[sfb]; /* No of lines to process */
327250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
328250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        if ((uint32)(scalefac_R->l[sfb]) != scalefac_IIP_buffer[sfb])
329250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
330250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->l[sfb], sfbStart, sfbNo);
331250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
332250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        else if (ms_stereo)
333250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
334250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
335250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
336250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
337250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
338250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* 3. now process all sfb with short blocks (3...12), all in intensity mode */
339250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
340250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    for (j = 0; j < 3; j++)
341250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
342250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /*   first calculate directional factors for intensity stereo,
343250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                         *   for all sfb in intensity mode, but only
344250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                         *   if they do not have "illegal" position:
345250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                         */
346250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* to do this for all sfb we have to get information for last scale factor band:
347250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                         * here we clearly have more than one sfb in intensity mode,
348250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                         *  so copy factors and legal/illegal information from sfb11 to sfb12
349250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                         */
350250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        (scalefac_R->s[j][12]) = (scalefac_R->s[j][11]);
351250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        scalefac_IIP_buffer[36 + j] = scalefac_IIP_buffer[33 + j];  /* legal/illegal in sfb 12 same as in sfb 11 */
352250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
353250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        for (sfb = 3; sfb < 13; sfb++)
354250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
355250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; /* No of lines to process */
356250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
357250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
358250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            if ((uint32)(scalefac_R->s[j][sfb]) != scalefac_IIP_buffer[3*sfb + j])
359250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            {
360250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->s[j][sfb], sfbStart, sfbNo);
361250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            }
362250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            else if (ms_stereo)
363250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            {
364250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
365250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            }
366250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
367250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    } /* for (j = 0; j < 3; j++) */
368250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
369250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                else  /*  else then (sb >= 36)  */
370250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
371250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /*
372250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     *   mixed blocks processing: intensity bound outside long blocks
373250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                     */
374250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
375250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* 2. short blocks, do for all 3  */
376250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* ------------------------------ */
377250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    for (j = 0; j < 3; j++)
378250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
379250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        int32 sfbcnt = -1;
380250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
381250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        for (sfb = 12; sfb >= 3; sfb--)
382250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
383250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            int32 lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
384250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
385250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1;
386250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
387250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            while (lines > 0)
388250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            {
389250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                if (xl[i])
390250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                {
391250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                    sfbcnt = sfb;
392250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                    sfb = -10;
393250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                    lines = -10;
394250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                }
395250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                lines--;
396250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                i--;
397250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            }
398250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
399250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
400250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        sfbcnt += 1;
401250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        if (sfbcnt < 3)
402250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
403250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            sfbcnt = 3;   /* should not be necessary */
404250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
405250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
406250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        sfbTemp = sfbcnt; /* from this (short) sfb on we have intensity mode        */
407250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* can have values between 3 (all short sfb in intensity) */
408250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* and 13 (no short sfb in intensity mode)                */
409250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
410250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* 3. from sfbTemp to last sfb calculate is_ratio values:    */
411250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* first calculate directional factors for intensity stereo, */
412250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* for all sfb in intensity mode, but only                   */
413250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* if they do not have "illegal" position:                   */
414250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
415250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* to do this for all sfb we have to get information for last scale factor band: */
416250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /*  get factors for last scale factor band: */
417250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* more than one sfb in intensity mode,
418250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        copy factors and legal/illegal information from sfb11 to sfb12 */
419250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        if (sfbTemp < 12)
420250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
421250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            (scalefac_R->s[j][12]) = (scalefac_R->s[j][11]);
422250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            scalefac_IIP_buffer[36 + j] = scalefac_IIP_buffer[33 + j];   /* legal/illegal in sfb 12 same as in sfb 11 */
423250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
424250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        else if (sfbTemp == sfb)
425250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            /* only sfb 12 in intensity mode, use factors corresponding to is_pos[12] == 0 */
426250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
427250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            (scalefac_R->s[j][12]) = 0;
428250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            scalefac_IIP_buffer[36 + j] = 1;    /* the scf value 0 in sfb12 is "legal" */
429250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
430250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* if sfbTemp > sfb (no sfb in intensity mode): do nothing */
431250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
432250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
433250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* 4. do normal stereo or MS stereo from sfb 3 to < sfbTemp: */
434250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        for (sfb = 3; sfb < sfbTemp; sfb++)
435250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
436250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
437250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
438250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
439250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            if (ms_stereo)
440250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            {
441250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
442250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            }
443250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
444250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
445250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* 5. now intensity stereo processing of the remaining sfb's: */
446250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
447250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        for (sfb = sfbTemp; sfb < 13; sfb++)
448250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
449250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; /* No of lines to process */
450250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
451250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            if ((uint32)(scalefac_R->s[j][sfb]) != scalefac_IIP_buffer[3*sfb + j])
452250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            {
453250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->s[j][sfb], sfbStart, sfbNo);
454250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            }
455250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            else if (ms_stereo)
456250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            {
457250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
458250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            }
459250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
460250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /*  end of correction by efs 2003-07-04 */
461250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    } /* for (j = 0; j < 3; j++) */
462250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
463250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
464250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* long blocks 0 up to sfb band 6: no intensity */
465250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
466250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    sfbNo = mp3_sfBandIndex[sfreq].l[6];        /* number of lines to process */
467250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    if (ms_stereo)
468250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
469250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        pvmp3_st_mid_side(xr, xl, 0, sfbNo);
470250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
471250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
472250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }  /* if intensity bound inside or outside long blocks */
473250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }  /* if (gr_info->mixed_block_flag) */
474250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            else
475250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
476250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                /*
477250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                 *  short block processing
478250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                 */
479250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                for (j = 0; j < 3; j++)
480250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
481250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    int32 sfbcnt = -1;
482250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
483250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    for (sfb = 12; sfb >= 0; sfb--)
484250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
485250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        int32 lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
486250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1;
487250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
488250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        while (lines > 0)
489250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
490250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            if (xl[i])
491250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            {
492250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                sfbcnt = sfb;
493250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                sfb = -10;
494250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                                lines = -10;
495250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            }
496250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            lines--;
497250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            i--;
498250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
499250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
500250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
501250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    sfbcnt += 1;
502250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
503250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /*  start of corrected version by efs 2003-07-04  */
504250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    sfbTemp = sfbcnt; /* from this (short) sfb on we have intensity mode        */
505250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* can have values between 3 (all short sfb in intensity) */
506250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* and 13 (no short sfb in intensity mode)                */
507250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
508250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* first calculate directional factors for intensity stereo,
509250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    for all sfb in intensity mode, but only
510250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    if they do not have "illegal" position: */
511250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
512250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* to do this for all sfb we have to get information for last scale factor band: */
513250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* get factors for last scale factor band: */
514250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* more than one sfb in intensity mode,
515250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    copy factors and legal/illegal information from sfb11 to sfb12 */
516250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    if (sfbTemp < 12)
517250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
518250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        (scalefac_R->s[j][12]) = (scalefac_R->s[j][11]);
519250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        scalefac_IIP_buffer[36 + j] = scalefac_IIP_buffer[33 + j];  /* legal/illegal in sfb 12 same as in sfb 11 */
520250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
521250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    else if (sfbTemp == 12)
522250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        /* only sfb 12 in intensity mode, use factors corresponding to is_pos[12] == 0 */
523250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
524250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        (scalefac_R->s[j][12]) = 0;
525250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        scalefac_IIP_buffer[36 + j] = 1;    /* the scf value 0 in sfb12 is "legal" */
526250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
527250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* if sfbTemp > sfb (no sfb in intensity mode): do nothing */
528250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
529250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
530250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* Now process audio samples */
531250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* first process lower sfb's not in intensity mode */
532250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    for (sfb = 0; sfb < sfbTemp; sfb++)
533250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
534250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
535250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
536250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
537250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        if (ms_stereo)
538250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
539250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
540250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
541250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
542250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
543250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /* now intensity stereo processing of the remaining sfb's: */
544250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    for (sfb = sfbTemp; sfb < 13; sfb++)
545250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
546250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; /* No of lines to process */
547250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
548250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
549250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        if ((uint32)(scalefac_R->s[j][sfb]) != scalefac_IIP_buffer[3*sfb + j])
550250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
551250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->s[j][sfb], sfbStart, sfbNo);
552250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
553250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        else if (ms_stereo)
554250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        {
555250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
556250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        }
557250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
558250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
559250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                } /* for (j = 0; j < 3; j++) */
560250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
561250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            } /* end of else ( gr_info->mixed_block_flag) */
562250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
563250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }  /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */
564250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        else
565250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
566250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /*
567250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber             *  long block processing
568250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber             */
569250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            i = 31;
570250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            ss = 17;
571250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            sb = 0;
572250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
573250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            while (i >= 0)
574250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
575250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                if (xl[(i*FILTERBANK_BANDS) + ss])
576250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
577250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    sb = (i << 4) + (i << 1) + ss;
578250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /*  i = -1     patched RF    24-09-2002   */
579250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    i = -2;
580250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
581250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                else
582250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
583250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    ss--;
584250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    if (ss < 0)
585250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    {
586250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        i--;
587250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        ss = 17;
588250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    }
589250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
590250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
591250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
592250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /*  patched RF    24-09-2002   */
593250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            if (sb)
594250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
595250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                if (mp3_sfBandIndex[sfreq].l[14] <= sb)
596250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
597250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    i = 14;
598250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
599250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                else if (mp3_sfBandIndex[sfreq].l[7] <= sb)
600250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
601250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    i = 7;
602250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
603250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                else
604250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
605250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    i = 0;
606250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
607250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
608250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                while (mp3_sfBandIndex[sfreq].l[i] <= sb)
609250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
610250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    i++;
611250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
612250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
613250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
614250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            else
615250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
616250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                if (i == -1)
617250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
618250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /*  all xr[1][][] are 0: set IS bound sfb to 0  */
619250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    i = 0;
620250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
621250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                else
622250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
623250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    /*  xr[1][0][0] is unequal 0 and all others are 0: set IS bound sfb to 1 */
624250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    i = 1;
625250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
626250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
627250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /*  corrected version by efs 2003-07-04  */
628250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            sfbTemp = i;  /* from this (long) sfb on we have intensity mode        */
629250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /* can have values between 0 (all long sfb in intensity) */
630250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /* and 22 (no long sfb in intensity mode)                */
631250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
632250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /* first calculate directional factors for intensity stereo,
633250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            for all sfb in intensity mode, but only if they
634250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            do not have "illegal" position: */
635250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
636250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /* to do this for all sfb we have to get information for last scale factor band: */
637250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            if (sfbTemp < 21)
638250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                /* more than one sfb in intensity mode, */
639250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                /* copy factors and legal/illegal information from sfb20 to sfb21 */
640250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
641250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                (scalefac_R->l[21]) = (scalefac_R->l[20]);
642250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                scalefac_IIP_buffer[21] = scalefac_IIP_buffer[20];  /* legal/illegal in sfb 21 same as in sfb 20 */
643250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
644250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            else if (sfbTemp == 21)
645250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                /* only sfb 21 in intensity mode, is_pos[21] = 0 */
646250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
647250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                (scalefac_R->l[21]) = 0;
648250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                scalefac_IIP_buffer[21] = 1;    /* the scf value 0 in sfb21 is "legal" */
649250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
650250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /* if sfbTemp > 21 (no sfb in intensity mode): do nothing */
651250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
652250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
653250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /* Now process audio samples */
654250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /* first process lower sfb's not in intensity mode */
655250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
656250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            sfbNo = mp3_sfBandIndex[sfreq].l[sfbTemp] - mp3_sfBandIndex[sfreq].l[0];
657250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            sfbStart = mp3_sfBandIndex[sfreq].l[0];
658250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
659250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            if (ms_stereo)
660250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
661250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
662250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }
663250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
664250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            /* now intensity stereo processing of the remaining sfb's: */
665250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            for (sfb = sfbTemp; sfb < 22; sfb++)
666250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            {
667250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                sfbNo = mp3_sfBandIndex[sfreq].l[sfb+1] - mp3_sfBandIndex[sfreq].l[sfb]; /* number of lines to process */
668250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                sfbStart = mp3_sfBandIndex[sfreq].l[sfb];                          /* start of sfb */
669250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
670250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                if ((uint32)(scalefac_R->l[sfb]) != scalefac_IIP_buffer[sfb]) /* "legal" position ? */
671250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
672250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->l[sfb], sfbStart, sfbNo);
673250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
674250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                else if (ms_stereo)
675250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                {
676250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                    pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
677250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                }
678250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
679250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            }  /* for (sfb = sfbTemp; sfb < 22; sfb++) */
680250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
681250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }  /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */
682250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
683250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }  /* if (i_stereo) */
684250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    else
685250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
686250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        /*
687250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber         *  normal or ms stereo processing
688250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber         */
689250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        if (ms_stereo)
690250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        {
691250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber            pvmp3_st_mid_side(xr, xl, 0, used_freq_lines);
692250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        }
693250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
694250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    } /* if (i_stereo) */
695250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
696250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
697250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
698250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
699250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
700250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
701