1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /*
19 ------------------------------------------------------------------------------
20 
21    PacketVideo Corp.
22    MP3 Decoder Library
23 
24    Filename: pvmp3_mpeg2_get_scale_factors.cpp
25 
26      Date: 09/21/2007
27 
28 ------------------------------------------------------------------------------
29  REVISION HISTORY
30 
31 
32  Description:
33 
34 ------------------------------------------------------------------------------
35  INPUT AND OUTPUT DEFINITIONS
36 
37 Input
38 
39     mp3ScaleFactors *scalefac,
40     mp3SideInfo     *si,                    side information
41     int32           gr,                     granule
42     int32           ch,                     channel
43     mp3Header       *info,                  mp3 header information
44     uint32          *scalefac_IIP_buffer,   auxiliary scale data
45     tbits           *pMainData               bit stream Data
46 
47  Returns
48 
49     III_scalefac_t  *scalefac,              scale factor
50 
51 
52 ------------------------------------------------------------------------------
53  FUNCTION DESCRIPTION
54 
55     get scale factor for mpe2 layer III LSF extension
56 
57 ------------------------------------------------------------------------------
58  REQUIREMENTS
59 
60 
61 ------------------------------------------------------------------------------
62  REFERENCES
63 
64  [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
65      ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
66 
67 ------------------------------------------------------------------------------
68  PSEUDO-CODE
69 
70 ------------------------------------------------------------------------------
71 */
72 
73 
74 /*----------------------------------------------------------------------------
75 ; INCLUDES
76 ----------------------------------------------------------------------------*/
77 
78 #include "pvmp3_mpeg2_get_scale_factors.h"
79 #include "pvmp3_mpeg2_get_scale_data.h"
80 
81 
82 /*----------------------------------------------------------------------------
83 ; MACROS
84 ; Define module specific macros here
85 ----------------------------------------------------------------------------*/
86 
87 
88 /*----------------------------------------------------------------------------
89 ; DEFINES
90 ; Include all pre-processor statements here. Include conditional
91 ; compile variables also.
92 ----------------------------------------------------------------------------*/
93 
94 /*----------------------------------------------------------------------------
95 ; LOCAL FUNCTION DEFINITIONS
96 ; Function Prototype declaration
97 ----------------------------------------------------------------------------*/
98 
99 /*----------------------------------------------------------------------------
100 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
101 ; Variable declaration - defined here and used outside this module
102 ----------------------------------------------------------------------------*/
103 
104 /*----------------------------------------------------------------------------
105 ; EXTERNAL FUNCTION REFERENCES
106 ; Declare functions defined elsewhere and referenced in this module
107 ----------------------------------------------------------------------------*/
108 
109 /*----------------------------------------------------------------------------
110 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
111 ; Declare variables used in this module but defined elsewhere
112 ----------------------------------------------------------------------------*/
113 
114 /*----------------------------------------------------------------------------
115 ; FUNCTION CODE
116 ----------------------------------------------------------------------------*/
117 
pvmp3_mpeg2_get_scale_factors(mp3ScaleFactors * scalefac,mp3SideInfo * si,int32 gr,int32 ch,mp3Header * info,uint32 * scalefac_IIP_buffer,tmp3Bits * pMainData)118 void pvmp3_mpeg2_get_scale_factors(mp3ScaleFactors *scalefac,
119                                    mp3SideInfo     *si,
120                                    int32           gr,
121                                    int32           ch,
122                                    mp3Header       *info,
123                                    uint32          *scalefac_IIP_buffer,
124                                    tmp3Bits        *pMainData)
125 {
126 
127     int32 sfb;
128     int32 k = 0;
129     int32 window;
130     uint32 *scalefac_buffer     = &scalefac_IIP_buffer[56];
131 
132     granuleInfo *gr_info = &(si->ch[ch].gran[gr]);
133 
134     pvmp3_mpeg2_get_scale_data(si,
135                                gr,
136                                ch,
137                                info,
138                                (uint32 *)scalefac_buffer,
139                                (uint32 *)scalefac_IIP_buffer,
140                                pMainData);
141 
142 
143     if (gr_info->window_switching_flag && (gr_info->block_type == 2))
144     {
145         if (gr_info->mixed_block_flag)
146         {
147             for (sfb = 0; sfb < 6; sfb++)
148             {
149                 scalefac->l[sfb] = scalefac_buffer[sfb];
150             }
151 
152 
153             k = 6;
154             for (sfb = 3; sfb < 12; sfb++)
155             {
156                 for (window = 0; window < 3; window++)
157                 {
158                     scalefac->s[window][sfb] = scalefac_buffer[k];
159                     k++;
160                 }
161             }
162 
163 
164             /* adjust position of "illegal position" information in scalefac_IIP_buffer[] */
165             /* in mixed blocks mode for short sfb, move them 3 places up. efs 3002-07-04  */
166             for (sfb = 11; sfb >= 3; sfb--)
167             {
168                 scalefac_IIP_buffer[3*sfb + 2] = scalefac_IIP_buffer[3*sfb - 1];
169                 scalefac_IIP_buffer[3*sfb + 1] = scalefac_IIP_buffer[3*sfb - 2];
170                 scalefac_IIP_buffer[3*sfb    ] = scalefac_IIP_buffer[3*sfb - 3];
171 
172             }
173         }
174         else
175         {  /* SHORT*/
176             for (sfb = 0; sfb < 12; sfb++)
177             {
178                 for (window = 0; window < 3; window++)
179                 {
180                     scalefac->s[window][sfb] = scalefac_buffer[k];
181                     k++;
182                 }
183             }
184         }
185 
186         scalefac->s[0][12] = 0;
187         scalefac->s[1][12] = 0;
188         scalefac->s[2][12] = 0;
189 
190     }
191     else
192     {   /* LONG types 0,1,3 */
193         for (sfb = 0; sfb < 21; sfb++)
194         {
195             scalefac->l[sfb] = scalefac_buffer[sfb];
196         }
197         scalefac->l[21] = 0;
198         scalefac->l[22] = 0;
199 
200     }
201 }
202 
203