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_data.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     mp3SideInfo     *si,                    side information
39     int32           gr,                     granule
40     int32           ch,                     channel
41     mp3Header       *info,                  mp3 header information
42     uint32          *scalefac_buffer,
43     uint32          *scalefac_IIP_buffer,
44     tbits           *pMainData               bit stream Data
45 
46  Returns
47 
48     uint32          *scalefac_buffer,       acquired scale band data
49     uint32          *scalefac_IIP_buffer,   auxiliary scale data
50 
51 
52 ------------------------------------------------------------------------------
53  FUNCTION DESCRIPTION
54 
55     get scale data for mpeg2 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_data.h"
79 #include "pvmp3_getbits.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 const uint32 nr_of_sfb_block[6][3][4] =
105 {   {{ 6,  5, 5, 5}, {  9,  9,  9, 9}, { 6,  9,  9, 9}},
106     {{ 6,  5, 7, 3}, {  9,  9, 12, 6}, { 6,  9, 12, 6}},
107     {{11, 10, 0, 0}, { 18, 18,  0, 0}, {15, 18,  0, 0}},
108     {{ 7,  7, 7, 0}, { 12, 12, 12, 0}, { 6, 15, 12, 0}},
109     {{ 6,  6, 6, 3}, { 12,  9,  9, 6}, { 6, 12,  9, 6}},
110     {{ 8,  8, 5, 0}, { 15, 12,  9, 0}, { 6, 18,  9, 0}}
111 };
112 
113 /*----------------------------------------------------------------------------
114 ; EXTERNAL FUNCTION REFERENCES
115 ; Declare functions defined elsewhere and referenced in this module
116 ----------------------------------------------------------------------------*/
117 
118 /*----------------------------------------------------------------------------
119 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
120 ; Declare variables used in this module but defined elsewhere
121 ----------------------------------------------------------------------------*/
122 
123 /*----------------------------------------------------------------------------
124 ; FUNCTION CODE
125 ----------------------------------------------------------------------------*/
126 
pvmp3_mpeg2_get_scale_data(mp3SideInfo * si,int32 gr,int32 ch,mp3Header * info,uint32 * scalefac_buffer,uint32 * scalefac_IIP_buffer,tmp3Bits * pMainData)127 void pvmp3_mpeg2_get_scale_data(mp3SideInfo *si,
128                                 int32        gr,
129                                 int32        ch,
130                                 mp3Header   *info,
131                                 uint32      *scalefac_buffer,
132                                 uint32      *scalefac_IIP_buffer,
133                                 tmp3Bits    *pMainData)
134 {
135     int16 i;
136     int16 j;
137     int16 k;
138     int16 blocktypenumber = 0;
139     int16 blocknumber = 0;
140 
141     granuleInfo *gr_info = &(si->ch[ch].gran[gr]);
142     uint32 scalefac_comp, int_scalefac_comp, new_slen[4] = { 0,0,0,0 };
143 
144     scalefac_comp =  gr_info->scalefac_compress;
145 
146 
147 
148     if ((((info->mode_ext &1)) && (ch == 1)))
149     {
150         /*   intensity_scale = scalefac_comp %2; */
151         int_scalefac_comp = scalefac_comp >> 1;
152 
153         if (int_scalefac_comp  < 180)
154         {
155             new_slen[0] = int_scalefac_comp  / 36;
156             new_slen[1] = (int_scalefac_comp % 36) / 6;
157             new_slen[2] = int_scalefac_comp % 6;
158             blocknumber = 3;
159         }
160         else if (int_scalefac_comp  < 244)
161         {
162             int_scalefac_comp -= 180;
163             new_slen[0] = (int_scalefac_comp & 63) >> 4;
164             new_slen[1] = (int_scalefac_comp & 15) >> 2;
165             new_slen[2] =  int_scalefac_comp &  3;
166             blocknumber = 4;
167         }
168         else if (int_scalefac_comp  <= 255)
169         {
170             int_scalefac_comp -= 244;
171             new_slen[0] = (int_scalefac_comp) / 3;
172             new_slen[1] = (int_scalefac_comp) % 3;
173             new_slen[2] = 0;
174             blocknumber = 5;
175         }
176         new_slen[3] = 0;
177         si->ch[ch].gran[gr].preflag = 0;
178     }
179     else
180     {
181         if (scalefac_comp < 400)
182         {
183             new_slen[0] = (scalefac_comp >> 4) / 5;
184             new_slen[1] = (scalefac_comp >> 4) % 5;
185             new_slen[2] = (scalefac_comp & 15) >> 2 ;
186             new_slen[3] = (scalefac_comp & 3);
187             si->ch[ch].gran[gr].preflag = 0;
188 
189             blocknumber = 0;
190         }
191         else if (scalefac_comp  < 500)
192         {
193             scalefac_comp -= 400;
194             new_slen[0] = (scalefac_comp >> 2) / 5;
195             new_slen[1] = (scalefac_comp >> 2) % 5;
196             new_slen[2] = scalefac_comp  & 3;
197             new_slen[3] = 0;
198             si->ch[ch].gran[gr].preflag = 0;
199             blocknumber = 1;
200         }
201         else if (scalefac_comp  < 512)
202         {
203             scalefac_comp -= 500;
204             new_slen[0] = scalefac_comp / 3;
205             new_slen[1] = scalefac_comp % 3;
206             new_slen[2] = 0 ;
207             new_slen[3] = 0;
208             si->ch[ch].gran[gr].preflag = 1;
209             blocknumber = 2;
210         }
211     }
212 
213     if (gr_info->block_type == 2)
214     {
215         if (gr_info->mixed_block_flag)
216         {
217             blocktypenumber = 2;
218         }
219         else
220         {
221             blocktypenumber = 1;
222         }
223     }
224 
225     k = 0;
226     for (i = 0; i < 4; i++)
227     {
228         if (new_slen[i])
229         {
230             for (j = 0; j < (int16)nr_of_sfb_block[blocknumber][blocktypenumber][i]; j++)
231             {
232                 scalefac_buffer[k] =  getNbits(pMainData, new_slen[i]);
233                 scalefac_IIP_buffer[k] = (1L << new_slen[i]) - 1;
234                 k++;
235             }
236         }
237         else
238         {
239             for (j = 0; j < (int16)nr_of_sfb_block[blocknumber][blocktypenumber][i]; j++)
240             {
241                 scalefac_buffer[k]     = 0;
242                 scalefac_IIP_buffer[k] = 0;
243                 k++;
244             }
245         }
246     }
247 }
248