Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
165 | serge | 1 | #include "layer3.h" |
2 | |||
3 | #include |
||
4 | #include |
||
5 | |||
6 | extern SIDE_INFO m_side_info; |
||
7 | extern SCALE_FACTOR m_scale_fac[2][2]; // [gr][ch] |
||
8 | extern CB_INFO m_cb_info[2][2]; // [gr][ch] |
||
9 | |||
10 | extern int m_nsamp[2][2]; |
||
11 | extern int m_nBand[2][22]; |
||
12 | extern int m_ncbl_mixed; |
||
13 | |||
14 | #define GLOBAL_GAIN_SCALE (4*15) |
||
15 | |||
16 | static const int pretab[2][22] = |
||
17 | { |
||
18 | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
||
19 | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0}, |
||
20 | }; |
||
21 | |||
22 | /* 8 bit plus 2 lookup x = pow(2.0, 0.25*(global_gain-210)) */ |
||
23 | /* two extra slots to do 1/sqrt(2) scaling for ms */ |
||
24 | /* 4 extra slots to do 1/2 scaling for cvt to mono */ |
||
25 | static float look_global[256 + 2 + 4]; |
||
26 | |||
27 | /*-------- scaling lookup |
||
28 | x = pow(2.0, -0.5*(1+scalefact_scale)*scalefac + preemp) |
||
29 | look_scale[scalefact_scale][preemp][scalefac] |
||
30 | -----------------------*/ |
||
31 | static float look_scale[2][4][32]; |
||
32 | |||
33 | /*--- iSample**(4/3) lookup, -32<=i<=31 ---*/ |
||
34 | #define ISMAX 32 |
||
35 | static float look_pow[2 * ISMAX]; |
||
36 | |||
37 | /*-- pow(2.0, -0.25*8.0*subblock_gain) --*/ |
||
38 | static float look_subblock[8]; |
||
39 | |||
40 | /*-- reorder buffer ---*/ |
||
41 | static float re_buf[192][3]; |
||
42 | typedef float ARRAY3[3]; |
||
43 | |||
44 | void quant_init() |
||
45 | { |
||
46 | int i; |
||
47 | int scalefact_scale, preemp, scalefac; |
||
48 | double tmp; |
||
49 | |||
50 | /* 8 bit plus 2 lookup x = pow(2.0, 0.25*(global_gain-210)) */ |
||
51 | /* extra 2 for ms scaling by 1/sqrt(2) */ |
||
52 | /* extra 4 for cvt to mono scaling by 1/2 */ |
||
53 | for (i = 0; i < 256 + 2 + 4; i++) |
||
54 | look_global[i] = (float) pow_test(2.0, 0.25 * ((i - (2 + 4)) - 210 + GLOBAL_GAIN_SCALE)); |
||
55 | |||
56 | /* x = pow(2.0, -0.5*(1+scalefact_scale)*scalefac + preemp) */ |
||
57 | for (scalefact_scale = 0; scalefact_scale < 2; scalefact_scale++) |
||
58 | { |
||
59 | for (preemp = 0; preemp < 4; preemp++) |
||
60 | { |
||
61 | for (scalefac = 0; scalefac < 32; scalefac++) |
||
62 | { |
||
63 | look_scale[scalefact_scale][preemp][scalefac] = |
||
64 | (float) pow_test(2.0, -0.5 * (1 + scalefact_scale) * (scalefac + preemp)); |
||
65 | } |
||
66 | } |
||
67 | } |
||
68 | |||
69 | /*--- iSample**(4/3) lookup, -32<=i<=31 ---*/ |
||
70 | for (i = 0; i < 64; i++) |
||
71 | { |
||
72 | tmp = i - 32; |
||
73 | look_pow[i] = (float) (tmp * pow_test(fabs(tmp), (1.0 / 3.0))); |
||
74 | } |
||
75 | |||
76 | /*-- pow(2.0, -0.25*8.0*subblock_gain) 3 bits --*/ |
||
77 | for (i = 0; i < 8; i++) |
||
78 | { |
||
79 | look_subblock[i] = (float) pow_test(2.0, 0.25 * -8.0 * i); |
||
80 | } |
||
81 | // quant_init_sf_band(sr_index); replaced by code in sup.c |
||
82 | } |
||
83 | |||
84 | void dequant(SAMPLE Sample[], int gr, int ch) |
||
85 | { |
||
86 | SCALE_FACTOR* sf = &m_scale_fac[gr][ch]; |
||
87 | GR_INFO* gr_info = &m_side_info.gr[gr][ch]; |
||
88 | CB_INFO* cb_info = &m_cb_info[gr][ch]; |
||
89 | int* nsamp = &m_nsamp[gr][ch]; |
||
90 | |||
91 | int i, j; |
||
92 | int cb, n, w; |
||
93 | float x0, xs; |
||
94 | float xsb[3]; |
||
95 | double tmp; |
||
96 | int ncbl; |
||
97 | int cbs0; |
||
98 | ARRAY3 *buf; /* short block reorder */ |
||
99 | int nbands; |
||
100 | int i0; |
||
101 | int non_zero; |
||
102 | int cbmax[3]; |
||
103 | |||
104 | nbands = *nsamp; |
||
105 | |||
106 | |||
107 | ncbl = 22; /* long block cb end */ |
||
108 | cbs0 = 12; /* short block cb start */ |
||
109 | /* ncbl_mixed = 8 or 6 mpeg1 or 2 */ |
||
110 | if (gr_info->block_type == 2) |
||
111 | { |
||
112 | ncbl = 0; |
||
113 | cbs0 = 0; |
||
114 | if (gr_info->mixed_block_flag) |
||
115 | { |
||
116 | ncbl = m_ncbl_mixed; |
||
117 | cbs0 = 3; |
||
118 | } |
||
119 | } |
||
120 | /* fill in cb_info -- */ |
||
121 | cb_info->lb_type = gr_info->block_type; |
||
122 | if (gr_info->block_type == 2) |
||
123 | cb_info->lb_type; |
||
124 | cb_info->cbs0 = cbs0; |
||
125 | cb_info->ncbl = ncbl; |
||
126 | |||
127 | cbmax[2] = cbmax[1] = cbmax[0] = 0; |
||
128 | /* global gain pre-adjusted by 2 if ms_mode, 0 otherwise */ |
||
129 | x0 = look_global[(2 + 4) + gr_info->global_gain]; |
||
130 | i = 0; |
||
131 | /*----- long blocks ---*/ |
||
132 | for (cb = 0; cb < ncbl; cb++) |
||
133 | { |
||
134 | non_zero = 0; |
||
135 | xs = x0 * look_scale[gr_info->scalefac_scale][pretab[gr_info->preflag][cb]][sf->l[cb]]; |
||
136 | n = m_nBand[0][cb]; |
||
137 | for (j = 0; j < n; j++, i++) |
||
138 | { |
||
139 | if (Sample[i].s == 0) |
||
140 | Sample[i].x = 0.0F; |
||
141 | else |
||
142 | { |
||
143 | non_zero = 1; |
||
144 | if ((Sample[i].s >= (-ISMAX)) && (Sample[i].s < ISMAX)) |
||
145 | Sample[i].x = xs * look_pow[ISMAX + Sample[i].s]; |
||
146 | else |
||
147 | { |
||
148 | tmp = (double) Sample[i].s; |
||
149 | Sample[i].x = (float) (xs * tmp * pow_test(fabs(tmp), (1.0 / 3.0))); |
||
150 | } |
||
151 | } |
||
152 | } |
||
153 | if (non_zero) |
||
154 | cbmax[0] = cb; |
||
155 | if (i >= nbands) |
||
156 | break; |
||
157 | } |
||
158 | |||
159 | cb_info->cbmax = cbmax[0]; |
||
160 | cb_info->cbtype = 0; // type = long |
||
161 | |||
162 | if (cbs0 >= 12) |
||
163 | return; |
||
164 | /*--------------------------- |
||
165 | block type = 2 short blocks |
||
166 | ----------------------------*/ |
||
167 | cbmax[2] = cbmax[1] = cbmax[0] = cbs0; |
||
168 | i0 = i; /* save for reorder */ |
||
169 | buf = re_buf; |
||
170 | for (w = 0; w < 3; w++) |
||
171 | xsb[w] = x0 * look_subblock[gr_info->subblock_gain[w]]; |
||
172 | for (cb = cbs0; cb < 13; cb++) |
||
173 | { |
||
174 | n = m_nBand[1][cb]; |
||
175 | for (w = 0; w < 3; w++) |
||
176 | { |
||
177 | non_zero = 0; |
||
178 | xs = xsb[w] * look_scale[gr_info->scalefac_scale][0][sf->s[w][cb]]; |
||
179 | for (j = 0; j < n; j++, i++) |
||
180 | { |
||
181 | if (Sample[i].s == 0) |
||
182 | buf[j][w] = 0.0F; |
||
183 | else |
||
184 | { |
||
185 | non_zero = 1; |
||
186 | if ((Sample[i].s >= (-ISMAX)) && (Sample[i].s < ISMAX)) |
||
187 | buf[j][w] = xs * look_pow[ISMAX + Sample[i].s]; |
||
188 | else |
||
189 | { |
||
190 | tmp = (double) Sample[i].s; |
||
191 | buf[j][w] = (float) (xs * tmp * pow_test(fabs(tmp), (1.0 / 3.0))); |
||
192 | } |
||
193 | } |
||
194 | } |
||
195 | if (non_zero) |
||
196 | cbmax[w] = cb; |
||
197 | } |
||
198 | if (i >= nbands) |
||
199 | break; |
||
200 | buf += n; |
||
201 | } |
||
202 | |||
203 | |||
204 | memmove(&Sample[i0].x, &re_buf[0][0], sizeof(float) * (i - i0)); |
||
205 | |||
206 | *nsamp = i; /* update nsamp */ |
||
207 | cb_info->cbmax_s[0] = cbmax[0]; |
||
208 | cb_info->cbmax_s[1] = cbmax[1]; |
||
209 | cb_info->cbmax_s[2] = cbmax[2]; |
||
210 | if (cbmax[1] > cbmax[0]) |
||
211 | cbmax[0] = cbmax[1]; |
||
212 | if (cbmax[2] > cbmax[0]) |
||
213 | cbmax[0] = cbmax[2]; |
||
214 | |||
215 | cb_info->cbmax = cbmax[0]; |
||
216 | cb_info->cbtype = 1; /* type = short */ |
||
217 | }>>>>>>>>>>=31>=i<=31>>>>>=31>=i<=31> |