OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / frameworks / base / media / libstagefright / codecs / mp3dec / src / pvmp3_mpeg2_get_scale_factors.cpp
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
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