|
1 /* |
|
2 * Copyright (c) 2010 Ixonos Plc. |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of the "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - Initial contribution |
|
11 * |
|
12 * Contributors: |
|
13 * Ixonos Plc |
|
14 * |
|
15 * Description: |
|
16 * |
|
17 */ |
|
18 |
|
19 |
|
20 /************************************************************************** |
|
21 sfbdata.cpp - Sfb table definitions for AAC. |
|
22 |
|
23 Author(s): Juha Ojanpera |
|
24 Copyright (c) 2000-2004 by Nokia Research Center, Speech and Audio Systems. |
|
25 *************************************************************************/ |
|
26 |
|
27 /*-- Project Headers. --*/ |
|
28 #include "aacdef.h" |
|
29 |
|
30 /* |
|
31 Purpose: Sfb widths (long and short block) for each sampling rate. |
|
32 Explanation: Supports frame lengths 1024 and 960. */ |
|
33 |
|
34 const int16 sfb_96_1024[] = { |
|
35 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 96, |
|
36 108, 120, 132, 144, 156, 172, 188, 212, 240, 276, 320, 384, 448, 512, 576, |
|
37 640, 704, 768, 832, 896, 960, 1024}; |
|
38 |
|
39 const int16 sfb_96_128[] = {4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128}; |
|
40 const int16 sfb_96_120[] = {4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 120}; |
|
41 |
|
42 const int16 sfb_64_1024[] = { |
|
43 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 100, |
|
44 112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344, 384, 424, 464, 504, |
|
45 544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024}; |
|
46 const int16 sfb_64_960[] = { |
|
47 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 100, |
|
48 112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344, 384, 424, 464, 504, |
|
49 544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 960}; |
|
50 |
|
51 const int16 sfb_64_128[] = {4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128}; |
|
52 const int16 sfb_64_120[] = {4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 120}; |
|
53 |
|
54 const int16 sfb_48_1024[] = { |
|
55 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, |
|
56 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, |
|
57 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024}; |
|
58 const int16 sfb_48_960[] = { |
|
59 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, |
|
60 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, |
|
61 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 0}; |
|
62 |
|
63 const int16 sfb_48_128[] = |
|
64 {4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128}; |
|
65 const int16 sfb_48_120[] = |
|
66 {4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 120}; |
|
67 |
|
68 const int16 sfb_32_1024[] = { |
|
69 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, |
|
70 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, |
|
71 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, |
|
72 992, 1024}; |
|
73 const int16 sfb_32_960[] = |
|
74 { 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, |
|
75 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, |
|
76 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 0}; |
|
77 |
|
78 const int16 sfb_24_1024[] = { |
|
79 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, 84, 92, 100, 108, |
|
80 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260, 284, 308, 336, 364, |
|
81 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024}; |
|
82 |
|
83 const int16 sfb_24_128[] = |
|
84 { 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128}; |
|
85 const int16 sfb_24_120[] = |
|
86 { 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 120}; |
|
87 |
|
88 const int16 sfb_16_1024[] = { |
|
89 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, 136, 148, 160, |
|
90 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368, 396, 424, 456, |
|
91 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024}; |
|
92 |
|
93 const int16 sfb_16_128[] = |
|
94 { 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128}; |
|
95 const int16 sfb_16_120[] = |
|
96 { 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 120}; |
|
97 |
|
98 const int16 sfb_8_1024[] = { |
|
99 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, 188, 204, 220, |
|
100 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, 476, 508, 544, 580, |
|
101 620, 664, 712, 764, 820, 880, 944, 1024}; |
|
102 const int16 sfb_8_960[] = |
|
103 { 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, 188, 204, |
|
104 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, 476, 508, 544, |
|
105 580, 620, 664, 712, 764, 820, 880, 944, 960}; |
|
106 |
|
107 const int16 sfb_8_128[] = |
|
108 { 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128}; |
|
109 const int16 sfb_8_120[] = |
|
110 { 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 120}; |
|
111 |
|
112 /* |
|
113 Purpose: Block parameters for each sampling rate. |
|
114 Explanation: - */ |
|
115 const SR_Info AAC_sampleRateInfo[(1 << LEN_SAMP_IDX)] = { |
|
116 |
|
117 /* 96000 */ |
|
118 {96000, 41, sfb_96_1024, 12, sfb_96_128, 40, sfb_96_1024, 12, sfb_96_120}, |
|
119 |
|
120 /* 88200 */ |
|
121 {88200, 41, sfb_96_1024, 12, sfb_96_128, 40, sfb_96_1024, 12, sfb_96_120}, |
|
122 |
|
123 /* 64000 */ |
|
124 {64000, 47, sfb_64_1024, 12, sfb_64_128, 46, sfb_64_960, 12, sfb_64_120}, |
|
125 |
|
126 /* 48000 */ |
|
127 {48000, 49, sfb_48_1024, 14, sfb_48_128, 49, sfb_48_960, 14, sfb_48_120}, |
|
128 |
|
129 /* 44100 */ |
|
130 {44100, 49, sfb_48_1024, 14, sfb_48_128, 49, sfb_48_960, 14, sfb_48_120}, |
|
131 |
|
132 /* 32000 */ |
|
133 {32000, 51, sfb_32_1024, 14, sfb_48_128, 49, sfb_32_960, 14, sfb_48_120}, |
|
134 |
|
135 /* 24000 */ |
|
136 {24000, 47, sfb_24_1024, 15, sfb_24_128, 46, sfb_24_1024, 15, sfb_24_120}, |
|
137 |
|
138 /* 22050 */ |
|
139 {22050, 47, sfb_24_1024, 15, sfb_24_128, 46, sfb_24_1024, 15, sfb_24_120}, |
|
140 |
|
141 /* 16000 */ |
|
142 {16000, 43, sfb_16_1024, 15, sfb_16_128, 42, sfb_16_1024, 15, sfb_16_120}, |
|
143 |
|
144 /* 12000 */ |
|
145 {12000, 43, sfb_16_1024, 15, sfb_16_128, 42, sfb_16_1024, 15, sfb_16_120}, |
|
146 |
|
147 /* 11025 */ |
|
148 {11025, 43, sfb_16_1024, 15, sfb_16_128, 42, sfb_16_1024, 15, sfb_16_120}, |
|
149 |
|
150 /* 8000 */ |
|
151 { 8000, 40, sfb_8_1024, 15, sfb_8_128, 40, sfb_8_960, 15, sfb_8_120}, |
|
152 |
|
153 {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}}; |
|
154 |
|
155 /* |
|
156 * Retrieves AAC sample rate corresponding to the specified sample rate index. |
|
157 */ |
|
158 int32 |
|
159 AACSampleRate(uint8 sampleRateIdx) |
|
160 { |
|
161 int32 sampleRate = 0; |
|
162 |
|
163 if(sampleRateIdx > 0 && sampleRateIdx < 12) |
|
164 sampleRate = AAC_sampleRateInfo[sampleRateIdx].samp_rate; |
|
165 |
|
166 return (sampleRate); |
|
167 } |
|
168 |
|
169 /* |
|
170 * Initializes SFB and sample rate tables for the specified AAC encoder. |
|
171 */ |
|
172 void |
|
173 AACSfbInfoInit(CSfb_Info *sfb, uint8 sIndex, uint8 is960) |
|
174 { |
|
175 CInfo *ip; |
|
176 const SR_Info *sip; |
|
177 const int16 *sfbands; |
|
178 int16 i, j, k, n, ws; |
|
179 |
|
180 sip = &AAC_sampleRateInfo[sIndex]; |
|
181 |
|
182 /*-- Long block info. --*/ |
|
183 ip = sfb->only_long_info; |
|
184 sfb->winmap[ONLY_LONG_WND] = ip; |
|
185 |
|
186 ip->nsbk = 1; |
|
187 ip->islong = 1; |
|
188 ip->bins_per_bk = (int16) ((is960) ? LN2_960 : LN2); |
|
189 for(i = 0; i < ip->nsbk; i++) |
|
190 { |
|
191 if(is960) |
|
192 { |
|
193 ip->sfb_per_sbk[i] = sip->nsfb960; |
|
194 ip->sbk_sfb_top[i] = sip->SFbands960; |
|
195 } |
|
196 else |
|
197 { |
|
198 ip->sfb_per_sbk[i] = sip->nsfb1024; |
|
199 ip->sbk_sfb_top[i] = sip->SFbands1024; |
|
200 } |
|
201 } |
|
202 ip->sfb_width_128 = NULL; |
|
203 ip->num_groups = 1; |
|
204 ip->group_len[0] = 1; |
|
205 ip->group_offs[0] = 0; |
|
206 |
|
207 /*-- Short block info. --*/ |
|
208 ip = sfb->eight_short_info; |
|
209 sfb->winmap[ONLY_SHORT_WND] = ip; |
|
210 |
|
211 ip->islong = 0; |
|
212 ip->nsbk = NSHORT; |
|
213 ip->bins_per_bk = (int16) ((is960) ? LN2_960 : LN2); |
|
214 for(i = 0; i < ip->nsbk; i++) |
|
215 { |
|
216 if(is960) |
|
217 { |
|
218 ip->sfb_per_sbk[i] = sip->nsfb120; |
|
219 ip->sbk_sfb_top[i] = sip->SFbands120; |
|
220 } |
|
221 else |
|
222 { |
|
223 ip->sfb_per_sbk[i] = sip->nsfb128; |
|
224 ip->sbk_sfb_top[i] = sip->SFbands128; |
|
225 } |
|
226 } |
|
227 |
|
228 /*-- Construct sfb width table. --*/ |
|
229 ip->sfb_width_128 = sfb->sfbwidth128; |
|
230 for(i = 0, j = 0, n = ip->sfb_per_sbk[0]; i < n; i++) |
|
231 { |
|
232 k = ip->sbk_sfb_top[0][i]; |
|
233 ip->sfb_width_128[i] = (int16) (k - j); |
|
234 j = k; |
|
235 } |
|
236 |
|
237 /*-- Common to long and short. --*/ |
|
238 for(ws = 0; ws < NUM_WIN_SEQ; ws++) |
|
239 { |
|
240 if(ws == 1 || ws == 3) |
|
241 continue; |
|
242 |
|
243 ip = sfb->winmap[ws]; |
|
244 ip->sfb_per_bk = 0; |
|
245 for(i = 0, k= 0, n = 0; i < ip->nsbk; i++) |
|
246 { |
|
247 /*-- Compute bins_per_sbk. --*/ |
|
248 ip->bins_per_sbk[i] = (int16) (ip->bins_per_bk / ip->nsbk); |
|
249 |
|
250 /*-- Compute sfb_per_bk. --*/ |
|
251 ip->sfb_per_bk = (int16) (ip->sfb_per_bk + ip->sfb_per_sbk[i]); |
|
252 |
|
253 /*-- Construct default (non-interleaved) bk_sfb_top[]. --*/ |
|
254 sfbands = ip->sbk_sfb_top[i]; |
|
255 for(j = 0; j < ip->sfb_per_sbk[i]; j++) |
|
256 ip->bk_sfb_top[j + k] = (int16) (sfbands[j] + n); |
|
257 |
|
258 n = (int16) (n + ip->bins_per_sbk[i]); |
|
259 k = (int16) (k + ip->sfb_per_sbk[i]); |
|
260 } |
|
261 } |
|
262 |
|
263 sfb->winmap[1] = sfb->winmap[ONLY_LONG_WND]; |
|
264 sfb->winmap[3] = sfb->winmap[ONLY_LONG_WND]; |
|
265 } |