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