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