1 #include "common.h"
2 #include "decoder.h"
3 #include "decode_ml.h"
4
5 /* these arrays are in decode.c */
6 extern double c[17];
7 extern double d[17];
8
II_decode_bitalloc_ml(Bit_stream * bs,frame_params * fr_ps,unsigned int bit_alloc_ml[7][SBLIMIT],int * m)9 void II_decode_bitalloc_ml (Bit_stream * bs,
10 frame_params * fr_ps,
11 unsigned int bit_alloc_ml[7][SBLIMIT], int *m)
12 {
13 int i, j;
14 int sblimit_ml = fr_ps->sblimit_ml;
15 al_table *alloc_ml = fr_ps->alloc_ml;
16
17 /* JR: no dynamic crosstalk for multilingual channels */
18 /* JR: no phantom center coding for multilingual channels */
19 /* JR: no joint coding for multilingual channels */
20 /* JR: they're really simple, aren't they? */
21
22 for (i = 0; i < sblimit_ml; i++)
23 for (j = 0; j < *m; j++)
24 bit_alloc_ml[j][i] = (char) getbits (bs, (*alloc_ml)[i][0].bits);
25 for (i = sblimit_ml; i < SBLIMIT; i++)
26 for (j = 0; j < *m; j++)
27 bit_alloc_ml[j][i] = 0;
28 }
29
II_decode_scale_ml(Bit_stream * bs,frame_params * fr_ps,unsigned int scfsi[7][SBLIMIT],unsigned int bit_alloc[7][SBLIMIT],unsigned int scale_index[7][3][SBLIMIT],int * m)30 void II_decode_scale_ml (Bit_stream * bs,
31 frame_params * fr_ps,
32 unsigned int scfsi[7][SBLIMIT],
33 unsigned int bit_alloc[7][SBLIMIT],
34 unsigned int scale_index[7][3][SBLIMIT], int *m)
35 {
36 int i, j;
37 //MFC int px, pci;
38 int sblimit_ml = fr_ps->sblimit_ml;
39
40
41 for (i = 0; i < sblimit_ml; i++)
42 for (j = 0; j < *m; j++) /* 2 bit scfsi */
43 if (bit_alloc[j][i]) {
44 scfsi[j][i] = (char) getbits (bs, 2);
45 } else
46 scfsi[j][i] = 4;
47 for (i = sblimit_ml; i < SBLIMIT; i++)
48 for (j = 0; j < *m; j++)
49 scfsi[j][i] = 4;
50
51 for (i = 0; i < sblimit_ml; i++)
52 for (j = 0; j < *m; j++) {
53 if (bit_alloc[j][i])
54 switch (scfsi[j][i]) {
55 /* all three scale factors transmitted */
56 case 0:
57 scale_index[j][0][i] = getbits (bs, 6);
58 scale_index[j][1][i] = getbits (bs, 6);
59 scale_index[j][2][i] = getbits (bs, 6);
60 break;
61 /* scale factor 1 & 3 transmitted */
62 case 1:
63 scale_index[j][0][i] = scale_index[j][1][i] = getbits (bs, 6);
64 scale_index[j][2][i] = getbits (bs, 6);
65 break;
66 /* scale factor 1 & 2 transmitted */
67 case 3:
68 scale_index[j][0][i] = getbits (bs, 6);
69 scale_index[j][1][i] = scale_index[j][2][i] = getbits (bs, 6);
70 break;
71 /* only one scale factor transmitted */
72 case 2:
73 scale_index[j][0][i] =
74 scale_index[j][1][i] = scale_index[j][2][i] = getbits (bs, 6);
75 break;
76 default:
77 scale_index[j][0][i] =
78 scale_index[j][1][i] = scale_index[j][2][i] = SCALE_RANGE - 1;
79 break;
80 } else {
81 scale_index[j][0][i] = scale_index[j][1][i] =
82 scale_index[j][2][i] = SCALE_RANGE - 1;
83 }
84 }
85
86 for (i = sblimit_ml; i < SBLIMIT; i++)
87 for (j = 0; j < *m; j++) {
88 scale_index[j][0][i] = scale_index[j][1][i] =
89 scale_index[j][2][i] = SCALE_RANGE - 1;
90 }
91 }
92
93
II_buffer_sample_ml(Bit_stream * bs,frame_params * fr_ps,unsigned int sample_ml[7][3][SBLIMIT],unsigned int bit_alloc_ml[7][SBLIMIT],int * n_ml_ch)94 void II_buffer_sample_ml (Bit_stream * bs,
95 frame_params * fr_ps,
96 unsigned int sample_ml[7][3][SBLIMIT],
97 unsigned int bit_alloc_ml[7][SBLIMIT], int *n_ml_ch)
98 {
99 int i, j, k, m;
100 unsigned int nlevels, c = 0;
101 int sblimit_ml = fr_ps->sblimit_ml;
102 al_table *alloc_ml = fr_ps->alloc_ml;
103
104 for (i = 0; i < sblimit_ml; i++) {
105 for (j = 0; j < *n_ml_ch; j++) {
106 if (bit_alloc_ml[j][i]) {
107 /* JR: no dynamic crosstalk for multilingual channels */
108 /* check for grouping in subband */
109 if ((*alloc_ml)[i][bit_alloc_ml[j][i]].group == 3) {
110
111 for (m = 0; m < 3; m++) {
112 k = (*alloc_ml)[i][bit_alloc_ml[j][i]].bits;
113 sample_ml[j][m][i] = (unsigned int) getbits (bs, k);
114 }
115
116 } else { /* bit_alloc = 3, 5, 9 */
117 nlevels = (*alloc_ml)[i][bit_alloc_ml[j][i]].steps;
118 k = (*alloc_ml)[i][bit_alloc_ml[j][i]].bits;
119 c = (unsigned int) getbits (bs, k);
120 for (k = 0; k < 3; k++) {
121 sample_ml[j][k][i] = c % nlevels;
122 c /= nlevels;
123 }
124 }
125 } else { /* for no sample transmitted */
126 for (k = 0; k < 3; k++)
127 sample_ml[j][k][i] = 0;
128 }
129 }
130 }
131
132 for (i = sblimit_ml; i < SBLIMIT; i++)
133 for (j = 0; j < *n_ml_ch; j++)
134 for (k = 0; k < 3; k++)
135 sample_ml[j][k][i] = 0;
136 }
137
138
II_dequantize_sample_ml(unsigned int sample_ml[7][3][SBLIMIT],unsigned int bit_alloc_ml[7][SBLIMIT],double fraction_ml[7][SBLIMIT][3][12],frame_params * fr_ps,int * n_ml_ch,int * z)139 void II_dequantize_sample_ml (unsigned int sample_ml[7][3][SBLIMIT],
140 unsigned int bit_alloc_ml[7][SBLIMIT],
141 double fraction_ml[7][SBLIMIT][3][12],
142 frame_params * fr_ps, int *n_ml_ch, int *z)
143 {
144 int i, j, k, x;
145 int sblimit_ml = fr_ps->sblimit_ml;
146 al_table *alloc_ml = fr_ps->alloc_ml;
147
148 for (i = 0; i < sblimit_ml; i++) {
149 for (j = 0; j < 3; j++)
150 for (k = 0; k < *n_ml_ch; k++)
151 if (bit_alloc_ml[k][i]) {
152 /* JR: ditto */
153 /* locate MSB in the sample */
154 x = 0;
155 while ((1L << x) < (*alloc_ml)[i][bit_alloc_ml[k][i]].steps)
156 x++;
157 /* MSB inversion */
158 if (((sample_ml[k][j][i] >> (x - 1)) & 1) == 1)
159 fraction_ml[k][i][j][*z] = 0.0;
160 else
161 fraction_ml[k][i][j][*z] = -1.0;
162
163 /* Form a 2's complement sample */
164 fraction_ml[k][i][j][*z] +=
165 (double) (sample_ml[k][j][i] & ((1 << (x - 1)) - 1)) /
166 (double) (1L << (x - 1));
167
168 /* Dequantize the sample */
169 fraction_ml[k][i][j][*z] +=
170 d[(*alloc_ml)[i][bit_alloc_ml[k][i]].quant];
171 fraction_ml[k][i][j][*z] *=
172 c[(*alloc_ml)[i][bit_alloc_ml[k][i]].quant];
173 } /* if bit_alloc */
174 else
175 fraction_ml[k][i][j][*z] = 0.0;
176 }
177 for (i = sblimit_ml; i < SBLIMIT; i++)
178 for (j = 0; j < 3; j++)
179 for (k = 0; k < *n_ml_ch; k++)
180 fraction_ml[k][i][j][*z] = 0.0;
181 }
182
183
II_denormalize_sample_ml(double fraction_ml[7][SBLIMIT][3][12],unsigned int scale_index_ml[7][3][SBLIMIT],frame_params * fr_ps,int x,int * n_ml_ch,int * z)184 void II_denormalize_sample_ml (double fraction_ml[7][SBLIMIT][3][12],
185 unsigned int scale_index_ml[7][3][SBLIMIT],
186 frame_params * fr_ps,
187 int x, int *n_ml_ch, int *z)
188 {
189 int i, j;
190 int sblimit_ml = fr_ps->sblimit_ml;
191
192 for (i = 0; i < sblimit_ml; i++)
193 for (j = 0; j < *n_ml_ch; j++) {
194 fraction_ml[j][i][0][*z] *= multiple[scale_index_ml[j][x][i]];
195 fraction_ml[j][i][1][*z] *= multiple[scale_index_ml[j][x][i]];
196 fraction_ml[j][i][2][*z] *= multiple[scale_index_ml[j][x][i]];
197 }
198 }
199