1 /*
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR and PS decoding
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
4 **
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
9 **
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ** GNU General Public License for more details.
14 **
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 **
19 ** Any non-GPL usage of this software or parts of this software is strictly
20 ** forbidden.
21 **
22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
24 **
25 ** $Id: drm_dec.c,v 1.5 2004/09/04 14:56:28 menno Exp $
26 **/
27 
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <string.h>
31 #include <math.h>
32 #include "common.h"
33 
34 #ifdef DRM
35 
36 #include "sbr_dec.h"
37 #include "drm_dec.h"
38 #include "bits.h"
39 
40 /* constants */
41 #define DECAY_CUTOFF         3
42 #define DECAY_SLOPE          0.05f
43 
44 /* type definitaions */
45 typedef const int8_t (*drm_ps_huff_tab)[2];
46 
47 
48 /* binary search huffman tables */
49 static const int8_t f_huffman_sa[][2] =
50 {
51     { /*0*/ -15, 1 },             /* index 0: 1 bits:  x */
52     { 2, 3 },                     /* index 1: 2 bits:  1x */
53     { /*7*/ -8, 4 },              /* index 2: 3 bits:  10x */
54     { 5, 6 },                     /* index 3: 3 bits:  11x */
55     { /*1*/ -14, /*-1*/ -16 },    /* index 4: 4 bits:  101x */
56     { /*-2*/ -17, 7 },            /* index 5: 4 bits:  110x */
57     { 8, 9 },                     /* index 6: 4 bits:  111x */
58     { /*2*/ -13, /*-3*/ -18 },    /* index 7: 5 bits:  1101x */
59     { /*3*/ -12, 10 },            /* index 8: 5 bits:  1110x */
60     { 11, 12 },                   /* index 9: 5 bits:  1111x */
61     { /*4*/ -11, /*5*/ -10 },     /* index 10: 6 bits: 11101x */
62     { /*-4*/ -19, /*-5*/ -20 },   /* index 11: 6 bits: 11110x */
63     { /*6*/ -9, 13 },             /* index 12: 6 bits: 11111x */
64     { /*-7*/ -22, /*-6*/ -21 }    /* index 13: 7 bits: 111111x */
65 };
66 
67 static const int8_t t_huffman_sa[][2] =
68 {
69     { /*0*/ -15, 1 },             /* index 0: 1 bits: x */
70     { 2, 3 },                     /* index 1: 2 bits: 1x */
71     { /*-1*/ -16, /*1*/ -14 },    /* index 2: 3 bits: 10x */
72     { 4, 5 },                     /* index 3: 3 bits: 11x */
73     { /*-2*/ -17, /*2*/ -13 },    /* index 4: 4 bits: 110x */
74     { 6, 7 },                     /* index 5: 4 bits: 111x */
75     { /*-3*/ -18, /*3*/ -12 },    /* index 6: 5 bits: 1110x */
76     { 8, 9 },                     /* index 7: 5 bits: 1111x */
77     { /*-4*/ -19, /*4*/ -11 },    /* index 8: 6 bits: 11110x */
78     { 10, 11 },                   /* index 9: 6 bits: 11111x */
79     { /*-5*/ -20, /*5*/ -10 },    /* index 10: 7 bits: 111110x */
80     { /*-6*/ -21, 12 },           /* index 11: 7 bits: 111111x */
81     { /*-7*/ -22, 13 },           /* index 12: 8 bits: 1111111x */
82     { /*6*/ -9, /*7*/ -8 }        /* index 13: 9 bits: 11111111x */
83 };
84 
85 static const int8_t f_huffman_pan[][2] =
86 {
87     { /*0*/ -15, 1 },             /* index 0: 1 bits: x */
88     { /*-1*/ -16, 2 },            /* index 1: 2 bits: 1x */
89     { /*1*/ -14, 3 },             /* index 2: 3 bits: 11x */
90     { 4, 5 },                     /* index 3: 4 bits: 111x */
91     { /*-2*/ -17, /*2*/ -13 },    /* index 4: 5 bits: 1110x */
92     { 6, 7 },                     /* index 5: 5 bits: 1111x */
93     { /*-3*/ -18, /*3*/ -12 },    /* index 6: 6 bits: 11110x */
94     { 8, 9 },                     /* index 7: 6 bits: 11111x */
95     { /*-4*/ -19, /*4*/ -11 },    /* index 8: 7 bits: 111110x */
96     { 10, 11 },                   /* index 9: 7 bits: 111111x */
97     { /*-5*/ -20, /*5*/ -10 },    /* index 10: 8 bits: 1111110x */
98     { 12, 13 },                   /* index 11: 8 bits: 1111111x */
99     { /*-6*/ -21, /*6*/ -9 },     /* index 12: 9 bits: 11111110x */
100     { /*-7*/ -22, 14 },           /* index 13: 9 bits: 11111111x */
101     { /*7*/ -8, 15 },             /* index 14: 10 bits: 111111111x */
102     { 16, 17 },                   /* index 15: 11 bits: 1111111111x */
103     { /*-8*/ -23, /*8*/ -7 },     /* index 16: 12 bits: 11111111110x */
104     { 18, 19 },                   /* index 17: 12 bits: 11111111111x */
105     { /*-10*/ -25, 20 },          /* index 18: 13 bits: 111111111110x */
106     { 21, 22 },                   /* index 19: 13 bits: 111111111111x */
107     { /*-9*/ -24, /*9*/ -6 },     /* index 20: 14 bits: 1111111111101x */
108     { /*10*/ -5, 23 },            /* index 21: 14 bits: 1111111111110x */
109     { 24, 25 },                   /* index 22: 14 bits: 1111111111111x */
110     { /*-13*/ -28, /*-11*/ -26 }, /* index 23: 15 bits: 11111111111101x */
111     { /*11*/ -4, /*13*/ -2 },     /* index 24: 15 bits: 11111111111110x */
112     { 26, 27 },                   /* index 25: 15 bits: 11111111111111x */
113     { /*-14*/ -29, /*-12*/ -27 }, /* index 26: 16 bits: 111111111111110x */
114     { /*12*/ -3, /*14*/ -1 }      /* index 27: 16 bits: 111111111111111x */
115 };
116 
117 static const int8_t t_huffman_pan[][2] =
118 {
119     { /*0*/ -15, 1 },             /* index 0: 1 bits: x */
120     { /*-1*/ -16, 2 },            /* index 1: 2 bits: 1x */
121     { /*1*/ -14, 3 },             /* index 2: 3 bits: 11x */
122     { /*-2*/ -17, 4 },            /* index 3: 4 bits: 111x */
123     { /*2*/ -13, 5 },             /* index 4: 5 bits: 1111x */
124     { /*-3*/ -18, 6 },            /* index 5: 6 bits: 11111x */
125     { /*3*/ -12, 7 },             /* index 6: 7 bits: 111111x */
126     { /*-4*/ -19, 8 },            /* index 7: 8 bits: 1111111x */
127     { /*4*/ -11, 9 },             /* index 8: 9 bits: 11111111x */
128     { 10, 11 },                   /* index 9: 10 bits: 111111111x */
129     { /*-5*/ -20, /*5*/ -10 },    /* index 10: 11 bits: 1111111110x */
130     { 12, 13 },                   /* index 11: 11 bits: 1111111111x */
131     { /*-6*/ -21, /*6*/ -9 },     /* index 12: 12 bits: 11111111110x */
132     { 14, 15 },                   /* index 13: 12 bits: 11111111111x */
133     { /*-7*/ -22, /*7*/ -8 },     /* index 14: 13 bits: 111111111110x */
134     { 16, 17 },                   /* index 15: 13 bits: 111111111111x */
135     { /*-8*/ -23, /*8*/ -7 },     /* index 16: 14 bits: 1111111111110x */
136     { 18, 19 },                   /* index 17: 14 bits: 1111111111111x */
137     { /*-10*/ -25, /*10*/ -5 },   /* index 18: 15 bits: 11111111111110x */
138     { 20, 21 },                   /* index 19: 15 bits: 11111111111111x */
139     { /*-9*/ -24, /*9*/ -6 },     /* index 20: 16 bits: 111111111111110x */
140     { 22, 23 },                   /* index 21: 16 bits: 111111111111111x */
141     { 24, 25 },                   /* index 22: 17 bits: 1111111111111110x */
142     { 26, 27 },                   /* index 23: 17 bits: 1111111111111111x */
143     { /*-14*/ -29, /*-13*/ -28 }, /* index 24: 18 bits: 11111111111111100x */
144     { /*-12*/ -27, /*-11*/ -26 }, /* index 25: 18 bits: 11111111111111101x */
145     { /*11*/ -4, /*12*/ -3 },     /* index 26: 18 bits: 11111111111111110x */
146     { /*13*/ -2, /*14*/ -1 }      /* index 27: 18 bits: 11111111111111111x */
147 };
148 
149 /* There are 3 classes in the standard but the last 2 are identical */
150 static const real_t sa_quant[8][2] =
151 {
152     { FRAC_CONST(0.0000), FRAC_CONST(0.0000) },
153     { FRAC_CONST(0.0501), FRAC_CONST(0.1778) },
154     { FRAC_CONST(0.0706), FRAC_CONST(0.2818) },
155     { FRAC_CONST(0.0995), FRAC_CONST(0.4467) },
156     { FRAC_CONST(0.1399), FRAC_CONST(0.5623) },
157     { FRAC_CONST(0.1957), FRAC_CONST(0.7079) },
158     { FRAC_CONST(0.2713), FRAC_CONST(0.8913) },
159     { FRAC_CONST(0.3699), FRAC_CONST(1.0000) },
160 };
161 
162 /* We don't need the actual quantizer values */
163 #if 0
164 static const real_t pan_quant[8][5] =
165 {
166     { COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000) },
167     { COEF_CONST(0.1661), COEF_CONST(0.1661), COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.3322) },
168     { COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.6644), COEF_CONST(0.8305), COEF_CONST(0.8305) },
169     { COEF_CONST(0.4983), COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(1.6610) },
170     { COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(2.1593), COEF_CONST(2.4914) },
171     { COEF_CONST(0.8305), COEF_CONST(1.3288), COEF_CONST(2.1593), COEF_CONST(2.9897), COEF_CONST(3.4880) },
172     { COEF_CONST(0.9966), COEF_CONST(1.8271), COEF_CONST(2.8236), COEF_CONST(3.8202), COEF_CONST(4.6507) },
173     { COEF_CONST(1.3288), COEF_CONST(2.3253), COEF_CONST(3.4880), COEF_CONST(4.6507), COEF_CONST(5.8134) },
174 };
175 #endif
176 
177 /* 2^(pan_quant[x][y] */
178 static const real_t pan_pow_2_pos[8][5] = {
179     { REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000)  },
180     { REAL_CONST(1.1220021), REAL_CONST(1.1220021), REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.2589312)  },
181     { REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.5849090), REAL_CONST(1.7783016), REAL_CONST(1.7783016)  },
182     { REAL_CONST(1.4125481), REAL_CONST(1.5849090), REAL_CONST(1.9952921), REAL_CONST(2.8184461), REAL_CONST(3.1623565)  },
183     { REAL_CONST(1.5849090), REAL_CONST(1.9952922), REAL_CONST(2.8184461), REAL_CONST(4.4669806), REAL_CONST(5.6232337)  },
184     { REAL_CONST(1.7783016), REAL_CONST(2.5119365), REAL_CONST(4.4669806), REAL_CONST(7.9430881), REAL_CONST(11.219994)  },
185     { REAL_CONST(1.9952921), REAL_CONST(3.5482312), REAL_CONST(7.0792671), REAL_CONST(14.125206), REAL_CONST(25.118876)  },
186     { REAL_CONST(2.5119365), REAL_CONST(5.0116998), REAL_CONST(11.219994), REAL_CONST(25.118876), REAL_CONST(56.235140)  }
187 };
188 
189 /* 2^(-pan_quant[x][y] */
190 static const real_t pan_pow_2_neg[8][5] = {
191     { REAL_CONST(1),         REAL_CONST(1),         REAL_CONST(1),         REAL_CONST(1),         REAL_CONST(1)          },
192     { REAL_CONST(0.8912487), REAL_CONST(0.8912487), REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.7943242)  },
193     { REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.6309511), REAL_CONST(0.5623344), REAL_CONST(0.5623344)  },
194     { REAL_CONST(0.7079405), REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.3162199)  },
195     { REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.2238649), REAL_CONST(0.1778336)  },
196     { REAL_CONST(0.5623343), REAL_CONST(0.3980992), REAL_CONST(0.2238649), REAL_CONST(0.1258956), REAL_CONST(0.0891266)  },
197     { REAL_CONST(0.5011797), REAL_CONST(0.2818306), REAL_CONST(0.1412576), REAL_CONST(0.0707954), REAL_CONST(0.0398107)  },
198     { REAL_CONST(0.3980992), REAL_CONST(0.1995331), REAL_CONST(0.0891267), REAL_CONST(0.0398107), REAL_CONST(0.0177825)  }
199 };
200 
201 /* 2^(pan_quant[x][y]/30) */
202 static const real_t pan_pow_2_30_pos[8][5] = {
203     { COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1)           },
204     { COEF_CONST(1.003845098), COEF_CONST(1.003845098), COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.007704982) },
205     { COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.01546933),  COEF_CONST(1.019373909), COEF_CONST(1.019373909) },
206     { COEF_CONST(1.011579706), COEF_CONST(1.01546933),  COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.039123167) },
207     { COEF_CONST(1.01546933),  COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.051155908), COEF_CONST(1.059252598) },
208     { COEF_CONST(1.019373909), COEF_CONST(1.03117796),  COEF_CONST(1.051155908), COEF_CONST(1.071518432), COEF_CONST(1.0839263)   },
209     { COEF_CONST(1.023293502), COEF_CONST(1.043118698), COEF_CONST(1.067414119), COEF_CONST(1.092277933), COEF_CONST(1.113439626) },
210     { COEF_CONST(1.03117796),  COEF_CONST(1.055195268), COEF_CONST(1.0839263),   COEF_CONST(1.113439626), COEF_CONST(1.143756546) }
211 };
212 
213 /* 2^(-pan_quant[x][y]/30) */
214 static const real_t pan_pow_2_30_neg[8][5] = {
215     { COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1)           },
216     { COEF_CONST(0.99616963),  COEF_CONST(0.99616963),  COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.99235393)  },
217     { COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.984766325), COEF_CONST(0.980994305), COEF_CONST(0.980994305) },
218     { COEF_CONST(0.988552848), COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.962349827) },
219     { COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.951333663), COEF_CONST(0.944061881) },
220     { COEF_CONST(0.980994305), COEF_CONST(0.969764715), COEF_CONST(0.951333663), COEF_CONST(0.933255062), COEF_CONST(0.922571949) },
221     { COEF_CONST(0.977236734), COEF_CONST(0.958663671), COEF_CONST(0.936843519), COEF_CONST(0.915517901), COEF_CONST(0.898117847) },
222     { COEF_CONST(0.969764715), COEF_CONST(0.947691892), COEF_CONST(0.922571949), COEF_CONST(0.898117847), COEF_CONST(0.874311936) }
223 };
224 
225 static const real_t g_decayslope[MAX_SA_BAND] = {
226     FRAC_CONST(1),   FRAC_CONST(1),   FRAC_CONST(1),   FRAC_CONST(0.95),FRAC_CONST(0.9), FRAC_CONST(0.85), FRAC_CONST(0.8),
227     FRAC_CONST(0.75),FRAC_CONST(0.7), FRAC_CONST(0.65),FRAC_CONST(0.6), FRAC_CONST(0.55),FRAC_CONST(0.5),  FRAC_CONST(0.45),
228     FRAC_CONST(0.4), FRAC_CONST(0.35),FRAC_CONST(0.3), FRAC_CONST(0.25),FRAC_CONST(0.2), FRAC_CONST(0.15), FRAC_CONST(0.1),
229     FRAC_CONST(0.05),FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),    FRAC_CONST(0),
230     FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),    FRAC_CONST(0),
231     FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),    FRAC_CONST(0),
232     FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0)
233 };
234 
235 static const real_t sa_sqrt_1_minus[8][2] = {
236     { FRAC_CONST(1),            FRAC_CONST(1)           },
237     { FRAC_CONST(0.998744206),  FRAC_CONST(0.984066644) },
238     { FRAC_CONST(0.997504707),  FRAC_CONST(0.959473168) },
239     { FRAC_CONST(0.995037562),  FRAC_CONST(0.894683804) },
240     { FRAC_CONST(0.990165638),  FRAC_CONST(0.826933317) },
241     { FRAC_CONST(0.980663811),  FRAC_CONST(0.706312672) },
242     { FRAC_CONST(0.962494836),  FRAC_CONST(0.45341406)  },
243     { FRAC_CONST(0.929071574),  FRAC_CONST(0)           }
244 };
245 
246 static const uint8_t sa_freq_scale[9][2] =
247 {
248     { 0, 0},
249     { 1, 1},
250     { 2, 2},
251     { 3, 3},
252     { 5, 5},
253     { 7, 7},
254     {10,10},
255     {13,13},
256     {46,23}
257 };
258 
259 static const uint8_t pan_freq_scale[21] =
260 {
261     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
262     11, 12, 13, 14, 15, 18, 22, 26, 32, 64
263 };
264 
265 static const uint8_t pan_quant_class[20] =
266 {
267     0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
268     2, 2, 2, 2, 3, 3, 3, 4, 4, 4
269 };
270 
271 /* Inverse mapping lookup */
272 static const uint8_t pan_inv_freq[64] = {
273      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
274     15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18,
275     19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
276     19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19
277 };
278 
279 static const uint8_t sa_inv_freq[MAX_SA_BAND] = {
280     0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6,
281     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
282     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
283     7, 7, 7, 7, 7, 7, 7
284 };
285 
286 static const real_t filter_coeff[] =
287 {
288     FRAC_CONST(0.65143905754106),
289     FRAC_CONST(0.56471812200776),
290     FRAC_CONST(0.48954165955695)
291 };
292 
293 static const uint8_t delay_length[][2] =
294 {
295     { 1, 3 }, { 2, 4 }, { 3, 5 }
296 };
297 
298 static const real_t delay_fraction[] =
299 {
300     FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347)
301 };
302 
303 static const real_t peak_decay[2] =
304 {
305     FRAC_CONST(0.58664621951003), FRAC_CONST(0.76592833836465)
306 };
307 
308 static const real_t smooth_coeff[2] =
309 {
310     FRAC_CONST(0.6), FRAC_CONST(0.25)
311 };
312 
313 /* Please note that these are the same tables as in plain PS */
314 static const complex_t Q_Fract_allpass_Qmf[][3] = {
315     { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } },
316     { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } },
317     { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } },
318     { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } },
319     { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } },
320     { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } },
321     { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } },
322     { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } },
323     { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } },
324     { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } },
325     { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } },
326     { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } },
327     { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } },
328     { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } },
329     { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } },
330     { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } },
331     { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } },
332     { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } },
333     { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } },
334     { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } },
335     { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } },
336     { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } },
337     { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } },
338     { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } },
339     { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } },
340     { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } },
341     { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } },
342     { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } },
343     { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } },
344     { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } },
345     { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } },
346     { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } },
347     { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } },
348     { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } },
349     { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } },
350     { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } },
351     { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } },
352     { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } },
353     { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } },
354     { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } },
355     { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } },
356     { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } },
357     { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } },
358     { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } },
359     { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } },
360     { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } },
361     { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } },
362     { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } },
363     { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } },
364     { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } },
365     { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } },
366     { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } },
367     { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } },
368     { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } },
369     { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } },
370     { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } },
371     { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } },
372     { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } },
373     { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } },
374     { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } },
375     { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } },
376     { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } },
377     { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } },
378     { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } }
379 };
380 
381 static const complex_t Phi_Fract_Qmf[] = {
382     { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) },
383     { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) },
384     { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) },
385     { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) },
386     { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) },
387     { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) },
388     { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) },
389     { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) },
390     { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) },
391     { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) },
392     { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) },
393     { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) },
394     { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) },
395     { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) },
396     { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) },
397     { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) },
398     { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) },
399     { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) },
400     { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) },
401     { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) },
402     { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) },
403     { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) },
404     { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) },
405     { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) },
406     { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) },
407     { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) },
408     { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) },
409     { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) },
410     { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) },
411     { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) },
412     { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) },
413     { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) },
414     { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) },
415     { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) },
416     { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) },
417     { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) },
418     { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) },
419     { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) },
420     { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) },
421     { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) },
422     { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) },
423     { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) },
424     { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) },
425     { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) },
426     { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) },
427     { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) },
428     { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) },
429     { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) },
430     { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) },
431     { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) },
432     { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) },
433     { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) },
434     { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) },
435     { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) },
436     { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) },
437     { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) },
438     { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) },
439     { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) },
440     { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) },
441     { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) },
442     { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) },
443     { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) },
444     { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) },
445     { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) }
446 };
447 
448 
449 /* static function declarations */
450 static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld);
451 static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld);
452 static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff);
453 
454 
drm_ps_data(drm_ps_info * ps,bitfile * ld)455 uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld)
456 {
457     uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
458 
459     ps->drm_ps_data_available = 1;
460 
461     ps->bs_enable_sa = faad_get1bit(ld);
462     ps->bs_enable_pan = faad_get1bit(ld);
463 
464     if (ps->bs_enable_sa)
465     {
466         drm_ps_sa_element(ps, ld);
467     }
468 
469     if (ps->bs_enable_pan)
470     {
471         drm_ps_pan_element(ps, ld);
472     }
473 
474     bits = (uint16_t)faad_get_processed_bits(ld) - bits;
475 
476     return bits;
477 }
478 
drm_ps_sa_element(drm_ps_info * ps,bitfile * ld)479 static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
480 {
481     drm_ps_huff_tab huff;
482     uint8_t band;
483 
484     ps->bs_sa_dt_flag = faad_get1bit(ld);
485     if (ps->bs_sa_dt_flag)
486     {
487         huff = t_huffman_sa;
488     } else {
489         huff = f_huffman_sa;
490     }
491 
492     for (band = 0; band < DRM_NUM_SA_BANDS; band++)
493     {
494         ps->bs_sa_data[band] = huff_dec(ld, huff);
495     }
496 }
497 
drm_ps_pan_element(drm_ps_info * ps,bitfile * ld)498 static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
499 {
500     drm_ps_huff_tab huff;
501     uint8_t band;
502 
503     ps->bs_pan_dt_flag = faad_get1bit(ld);
504     if (ps->bs_pan_dt_flag)
505     {
506         huff = t_huffman_pan;
507     } else {
508         huff = f_huffman_pan;
509     }
510 
511     for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
512     {
513         ps->bs_pan_data[band] = huff_dec(ld, huff);
514     }
515 }
516 
517 /* binary search huffman decoding */
huff_dec(bitfile * ld,drm_ps_huff_tab huff)518 static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
519 {
520     uint8_t bit;
521     int16_t index = 0;
522 
523     while (index >= 0)
524     {
525         bit = (uint8_t)faad_get1bit(ld);
526         index = huff[index][bit];
527     }
528 
529     return index + 15;
530 }
531 
532 
sa_delta_clip(drm_ps_info * ps,int8_t i)533 static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
534 {
535     if (i < 0) {
536       /*  printf(" SAminclip %d", i); */
537         ps->sa_decode_error = 1;
538         return 0;
539     } else if (i > 7) {
540      /*   printf(" SAmaxclip %d", i); */
541         ps->sa_decode_error = 1;
542         return 7;
543     } else
544         return i;
545 }
546 
pan_delta_clip(drm_ps_info * ps,int8_t i)547 static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
548 {
549     if (i < -7) {
550         /* printf(" PANminclip %d", i); */
551         ps->pan_decode_error = 1;
552         return -7;
553     } else if (i > 7) {
554        /* printf(" PANmaxclip %d", i);  */
555         ps->pan_decode_error = 1;
556         return 7;
557     } else
558         return i;
559 }
560 
drm_ps_delta_decode(drm_ps_info * ps)561 static void drm_ps_delta_decode(drm_ps_info *ps)
562 {
563     uint8_t band;
564 
565     if (ps->bs_enable_sa)
566     {
567         if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
568         {
569             for (band = 0; band < DRM_NUM_SA_BANDS; band++)
570             {
571                 ps->g_prev_sa_index[band] = 0;
572             }
573         }
574         if (ps->bs_sa_dt_flag)
575         {
576             ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
577 
578         } else {
579             ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
580         }
581 
582         for (band = 1; band < DRM_NUM_SA_BANDS; band++)
583         {
584             if (ps->bs_sa_dt_flag)
585             {
586                 ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
587             } else {
588                 ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
589             }
590         }
591     }
592 
593     /* An error during SA decoding implies PAN data will be undecodable, too */
594     /* Also, we don't like on/off switching in PS, so we force to last settings */
595     if (ps->sa_decode_error) {
596         ps->pan_decode_error = 1;
597         ps->bs_enable_pan = ps->g_last_had_pan;
598         ps->bs_enable_sa = ps->g_last_had_sa;
599     }
600 
601 
602     if (ps->bs_enable_sa)
603     {
604         if (ps->sa_decode_error) {
605             for (band = 0; band < DRM_NUM_SA_BANDS; band++)
606             {
607                 ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
608             }
609         } else {
610             for (band = 0; band < DRM_NUM_SA_BANDS; band++)
611             {
612                 ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
613             }
614         }
615     }
616 
617     if (ps->bs_enable_pan)
618     {
619         if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
620         {
621 /* The DRM PS spec doesn't say anything about this case. (deltacoded in time without a previous frame)
622    AAC PS spec you must tread previous frame as 0, so that's what we try.
623 */
624             for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
625             {
626                 ps->g_prev_pan_index[band] = 0;
627             }
628         }
629 
630         if (ps->bs_pan_dt_flag)
631         {
632              ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
633         } else {
634              ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
635         }
636 
637         for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
638         {
639             if (ps->bs_pan_dt_flag)
640             {
641                 ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
642             } else {
643                 ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
644             }
645         }
646 
647         if (ps->pan_decode_error) {
648             for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
649             {
650                 ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
651             }
652         } else {
653             for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
654             {
655                 ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
656             }
657         }
658     }
659 }
660 
drm_calc_sa_side_signal(drm_ps_info * ps,qmf_t X[38][64],uint8_t rateselect)661 static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64], uint8_t rateselect)
662 {
663     uint8_t s, b, k;
664     complex_t qfrac, tmp0, tmp, in, R0;
665     real_t peakdiff;
666     real_t nrg;
667     real_t power;
668     real_t transratio;
669     real_t new_delay_slopes[NUM_OF_LINKS];
670     uint8_t temp_delay_ser[NUM_OF_LINKS];
671     complex_t Phi_Fract;
672 #ifdef FIXED_POINT
673     uint32_t in_re, in_im;
674 #endif
675 
676     for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
677     {
678         /* set delay indices */
679         for (k = 0; k < NUM_OF_LINKS; k++)
680             temp_delay_ser[k] = ps->delay_buf_index_ser[k];
681 
682         RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
683         IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
684 
685         for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
686         {
687             const real_t gamma = REAL_CONST(1.5);
688             const real_t sigma = REAL_CONST(1.5625);
689 
690             RE(in) = QMF_RE(X[s][b]);
691             IM(in) = QMF_IM(X[s][b]);
692 
693 #ifdef FIXED_POINT
694             /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
695             * meaning that P will be scaled by 2^(-10) compared to floating point version
696             */
697             in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
698             in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
699             power = in_re*in_re + in_im*in_im;
700 #else
701             power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
702 #endif
703 
704             ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay[rateselect]);
705             if (ps->peakdecay_fast[b] < power)
706                 ps->peakdecay_fast[b] = power;
707 
708             peakdiff = ps->prev_peakdiff[b];
709             peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff[rateselect]);
710             ps->prev_peakdiff[b] = peakdiff;
711 
712             nrg = ps->prev_nrg[b];
713             nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff[rateselect]);
714             ps->prev_nrg[b] = nrg;
715 
716             if (MUL_R(peakdiff, gamma) <= nrg) {
717                 transratio = sigma;
718             } else {
719                 transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
720             }
721 
722             for (k = 0; k < NUM_OF_LINKS; k++)
723             {
724                 new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
725             }
726 
727             RE(tmp0) = RE(ps->d_buff[0][b]);
728             IM(tmp0) = IM(ps->d_buff[0][b]);
729 
730             RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
731             IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
732 
733             RE(ps->d_buff[1][b]) = RE(in);
734             IM(ps->d_buff[1][b]) = IM(in);
735 
736             ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
737 
738             RE(R0) = RE(tmp);
739             IM(R0) = IM(tmp);
740 
741             for (k = 0; k < NUM_OF_LINKS; k++)
742             {
743                 RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
744                 IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
745 
746                 RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
747                 IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
748 
749                 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
750 
751                 RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
752                 IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
753 
754                 RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
755                 IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
756 
757                 RE(R0) = RE(tmp);
758                 IM(R0) = IM(tmp);
759             }
760 
761             QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
762             QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
763 
764             for (k = 0; k < NUM_OF_LINKS; k++)
765             {
766                 if (++temp_delay_ser[k] >= delay_length[k][rateselect])
767                     temp_delay_ser[k] = 0;
768             }
769         }
770     }
771 
772     for (k = 0; k < NUM_OF_LINKS; k++)
773         ps->delay_buf_index_ser[k] = temp_delay_ser[k];
774 }
775 
drm_add_ambiance(drm_ps_info * ps,uint8_t rateselect,qmf_t X_left[38][64],qmf_t X_right[38][64])776 static void drm_add_ambiance(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[38][64], qmf_t X_right[38][64])
777 {
778     uint8_t s, b, ifreq, qclass;
779     real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND];
780     real_t new_dir_map, new_sa_map;
781 
782     if (ps->bs_enable_sa)
783     {
784         /* Instead of dequantization and mapping, we use an inverse mapping
785            to look up all the values we need */
786         for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
787         {
788             const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
789 
790             ifreq = sa_inv_freq[b];
791             qclass = (b != 0);
792 
793             sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
794             new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
795 
796             k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
797 
798             sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
799             new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
800 
801             k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
802 
803         }
804 
805         for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
806         {
807             for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
808             {
809                 QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
810                 QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
811                 QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
812                 QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
813 
814                 sa_map[b]     += k_sa_map[b];
815                 sa_dir_map[b] += k_sa_dir_map[b];
816             }
817             for (b = sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b < NUM_OF_QMF_CHANNELS; b++)
818             {
819                 QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
820                 QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
821             }
822         }
823     }
824     else {
825         for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
826         {
827             for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
828             {
829                 QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
830                 QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
831             }
832         }
833     }
834 }
835 
drm_add_pan(drm_ps_info * ps,uint8_t rateselect,qmf_t X_left[38][64],qmf_t X_right[38][64])836 static void drm_add_pan(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[38][64], qmf_t X_right[38][64])
837 {
838     uint8_t s, b, qclass, ifreq;
839     real_t tmp, coeff1, coeff2;
840     real_t pan_base[MAX_PAN_BAND];
841     real_t pan_delta[MAX_PAN_BAND];
842     qmf_t temp_l, temp_r;
843 
844     if (ps->bs_enable_pan)
845     {
846         for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
847         {
848             /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
849                inverse mapping 64->20 and look up the 2^G(x,y) values directly */
850             ifreq = pan_inv_freq[b];
851             qclass = pan_quant_class[ifreq];
852 
853             if (ps->g_prev_pan_index[ifreq] >= 0)
854             {
855                 pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
856             } else {
857                 pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
858             }
859 
860             /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
861             /* a en b can be negative so we may need to inverse parts */
862             if (ps->g_pan_index[ifreq] >= 0)
863             {
864                 if (ps->g_prev_pan_index[ifreq] >= 0)
865                 {
866                     pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
867                                          pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
868                 } else {
869                     pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
870                                          pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
871                 }
872             } else {
873                 if (ps->g_prev_pan_index[ifreq] >= 0)
874                 {
875                     pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
876                                          pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
877                 } else {
878                     pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
879                                          pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
880                 }
881             }
882         }
883 
884         for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
885         {
886             /* PAN always uses all 64 channels */
887             for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
888             {
889                 tmp = pan_base[b];
890 
891                 coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
892                 coeff1 = MUL_R(coeff2, tmp);
893 
894                 QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
895                 QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
896                 QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
897                 QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
898 
899                 QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
900                 QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
901                 QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
902                 QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
903 
904                 /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
905                 /*                   ^^^^^^^^^^^^^^^ k times */
906                 pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
907             }
908         }
909     }
910 }
911 
drm_ps_init(void)912 drm_ps_info *drm_ps_init(void)
913 {
914     drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
915 
916     memset(ps, 0, sizeof(drm_ps_info));
917 
918     return ps;
919 }
920 
drm_ps_free(drm_ps_info * ps)921 void drm_ps_free(drm_ps_info *ps)
922 {
923     faad_free(ps);
924 }
925 
926 /* main DRM PS decoding function */
drm_ps_decode(drm_ps_info * ps,uint8_t guess,uint32_t samplerate,qmf_t X_left[38][64],qmf_t X_right[38][64])927 uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate, qmf_t X_left[38][64], qmf_t X_right[38][64])
928 {
929     uint8_t rateselect = (samplerate >= 24000);
930 
931     if (ps == NULL)
932     {
933         memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
934         return 0;
935     }
936 
937     if (!ps->drm_ps_data_available && !guess)
938     {
939         memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
940         memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index));
941         memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index));
942         return 0;
943     }
944 
945     /* if SBR CRC doesn't match out, we can assume decode errors to start with,
946        and we'll guess what the parameters should be */
947     if (!guess)
948     {
949         ps->sa_decode_error = 0;
950         ps->pan_decode_error = 0;
951         drm_ps_delta_decode(ps);
952     } else
953     {
954         ps->sa_decode_error = 1;
955         ps->pan_decode_error = 1;
956         /* don't even bother decoding */
957     }
958 
959     ps->drm_ps_data_available = 0;
960 
961     drm_calc_sa_side_signal(ps, X_left, rateselect);
962     drm_add_ambiance(ps, rateselect, X_left, X_right);
963 
964     if (ps->bs_enable_sa)
965     {
966         ps->g_last_had_sa = 1;
967 
968         memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
969 
970     } else {
971         ps->g_last_had_sa = 0;
972     }
973 
974     if (ps->bs_enable_pan)
975     {
976         drm_add_pan(ps, rateselect, X_left, X_right);
977 
978         ps->g_last_had_pan = 1;
979 
980         memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
981 
982     } else {
983         ps->g_last_had_pan = 0;
984     }
985 
986 
987     return 0;
988 }
989 
990 #endif
991