Coverage Report

Created: 2025-08-26 06:13

/proc/self/cwd/libfaad/drm_dec.c
Line
Count
Source
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
874k
{
446
874k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
874k
    ps->drm_ps_data_available = 1;
449
450
874k
    ps->bs_enable_sa = faad_get1bit(ld);
451
874k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
874k
    if (ps->bs_enable_sa)
454
20.1k
    {
455
20.1k
        drm_ps_sa_element(ps, ld);
456
20.1k
    }
457
458
874k
    if (ps->bs_enable_pan)
459
17.6k
    {
460
17.6k
        drm_ps_pan_element(ps, ld);
461
17.6k
    }
462
463
874k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
874k
    return bits;
466
874k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
20.1k
{
470
20.1k
    drm_ps_huff_tab huff;
471
20.1k
    uint8_t band;
472
473
20.1k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
20.1k
    if (ps->bs_sa_dt_flag)
475
8.97k
    {
476
8.97k
        huff = t_huffman_sa;
477
11.2k
    } else {
478
11.2k
        huff = f_huffman_sa;
479
11.2k
    }
480
481
181k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
161k
    {
483
161k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
161k
    }
485
20.1k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
17.6k
{
489
17.6k
    drm_ps_huff_tab huff;
490
17.6k
    uint8_t band;
491
492
17.6k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
17.6k
    if (ps->bs_pan_dt_flag)
494
5.15k
    {
495
5.15k
        huff = t_huffman_pan;
496
12.4k
    } else {
497
12.4k
        huff = f_huffman_pan;
498
12.4k
    }
499
500
370k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
352k
    {
502
352k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
352k
    }
504
17.6k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
514k
{
509
514k
    uint8_t bit;
510
514k
    int8_t index = 0;
511
512
1.43M
    while (index >= 0)
513
919k
    {
514
919k
        bit = (uint8_t)faad_get1bit(ld);
515
919k
        index = huff[index][bit];
516
919k
    }
517
518
514k
    return index + 15;
519
514k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
640
{
524
640
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
173
        ps->sa_decode_error = 1;
527
173
        return 0;
528
467
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
59
        ps->sa_decode_error = 1;
531
59
        return 7;
532
59
    } else
533
408
        return i;
534
640
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.16k
{
538
2.16k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
196
        ps->pan_decode_error = 1;
541
196
        return -7;
542
1.96k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
180
        ps->pan_decode_error = 1;
545
180
        return 7;
546
180
    } else
547
1.78k
        return i;
548
2.16k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
136
{
552
136
    uint8_t band;
553
554
136
    if (ps->bs_enable_sa)
555
109
    {
556
109
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
29
        {
558
            /* wait until we get a DT frame */
559
29
            ps->bs_enable_sa = 0;
560
80
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
17
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
63
        } else {
564
            /* DF always decodable */
565
63
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
63
        }
567
568
872
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
763
        {
570
763
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
119
            {
572
119
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
644
            } else if (!ps->bs_sa_dt_flag) {
574
441
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
441
            }
576
763
        }
577
109
    }
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
136
    if (ps->sa_decode_error) {
582
57
        ps->pan_decode_error = 1;
583
57
        ps->bs_enable_pan = ps->g_last_had_pan;
584
57
        ps->bs_enable_sa = ps->g_last_had_sa;
585
57
    }
586
587
588
136
    if (ps->bs_enable_sa)
589
52
    {
590
52
        if (ps->sa_decode_error) {
591
261
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
232
            {
593
232
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
232
            }
595
29
        } else {
596
207
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
184
            {
598
184
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
184
            }
600
23
        }
601
52
    }
602
603
136
    if (ps->bs_enable_pan)
604
113
    {
605
113
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
5
        {
607
5
            ps->bs_enable_pan = 0;
608
108
        }  else if (ps->bs_pan_dt_flag) {
609
35
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
73
        } else {
611
73
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
73
        }
613
614
2.26k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.14k
        {
616
2.14k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
665
            {
618
665
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.48k
            } else if (!ps->bs_pan_dt_flag) {
620
1.38k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.38k
            }
622
2.14k
        }
623
624
113
        if (ps->pan_decode_error) {
625
1.32k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.26k
            {
627
1.26k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.26k
            }
629
63
        } else {
630
1.05k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
1.00k
            {
632
1.00k
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
1.00k
            }
634
50
        }
635
113
    }
636
136
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
250
{
640
250
    uint8_t s, b, k;
641
250
    complex_t qfrac, tmp0, tmp, in, R0;
642
250
    real_t peakdiff;
643
250
    real_t nrg;
644
250
    real_t power;
645
250
    real_t transratio;
646
250
    real_t new_delay_slopes[NUM_OF_LINKS];
647
250
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
250
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.00k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.75k
    {
655
        /* set delay indices */
656
23.0k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
17.2k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.75k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.75k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
178k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
172k
        {
664
172k
            const real_t gamma = REAL_CONST(1.5);
665
172k
            const real_t sigma = REAL_CONST(1.5625);
666
667
172k
            RE(in) = QMF_RE(X[s][b]);
668
172k
            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
24.1k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
24.1k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
148k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
172k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
172k
            if (ps->peakdecay_fast[b] < power)
683
11.8k
                ps->peakdecay_fast[b] = power;
684
685
172k
            peakdiff = ps->prev_peakdiff[b];
686
172k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
172k
            ps->prev_peakdiff[b] = peakdiff;
688
689
172k
            nrg = ps->prev_nrg[b];
690
172k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
172k
            ps->prev_nrg[b] = nrg;
692
693
172k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
164k
                transratio = sigma;
695
164k
            } else {
696
7.95k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.95k
            }
698
699
690k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
517k
            {
701
517k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
517k
            }
703
704
172k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
172k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
172k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
172k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
172k
            RE(ps->d_buff[1][b]) = RE(in);
711
172k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
172k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
172k
            RE(R0) = RE(tmp);
716
172k
            IM(R0) = IM(tmp);
717
718
690k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
517k
            {
720
517k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
517k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
517k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
517k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
517k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
517k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
517k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
517k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
517k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
517k
                RE(R0) = RE(tmp);
735
517k
                IM(R0) = IM(tmp);
736
517k
            }
737
738
172k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
172k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
690k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
517k
            {
743
517k
                if (++temp_delay_ser[k] >= delay_length[k])
744
134k
                    temp_delay_ser[k] = 0;
745
517k
            }
746
172k
        }
747
5.75k
    }
748
749
1.00k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
750
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
250
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
35
{
640
35
    uint8_t s, b, k;
641
35
    complex_t qfrac, tmp0, tmp, in, R0;
642
35
    real_t peakdiff;
643
35
    real_t nrg;
644
35
    real_t power;
645
35
    real_t transratio;
646
35
    real_t new_delay_slopes[NUM_OF_LINKS];
647
35
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
35
    complex_t Phi_Fract;
649
35
#ifdef FIXED_POINT
650
35
    uint32_t in_re, in_im;
651
35
#endif
652
653
840
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
805
    {
655
        /* set delay indices */
656
3.22k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
2.41k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
805
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
805
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
24.9k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
24.1k
        {
664
24.1k
            const real_t gamma = REAL_CONST(1.5);
665
24.1k
            const real_t sigma = REAL_CONST(1.5625);
666
667
24.1k
            RE(in) = QMF_RE(X[s][b]);
668
24.1k
            IM(in) = QMF_IM(X[s][b]);
669
670
24.1k
#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
24.1k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
24.1k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
24.1k
            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
24.1k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
24.1k
            if (ps->peakdecay_fast[b] < power)
683
4.56k
                ps->peakdecay_fast[b] = power;
684
685
24.1k
            peakdiff = ps->prev_peakdiff[b];
686
24.1k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
24.1k
            ps->prev_peakdiff[b] = peakdiff;
688
689
24.1k
            nrg = ps->prev_nrg[b];
690
24.1k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
24.1k
            ps->prev_nrg[b] = nrg;
692
693
24.1k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
22.7k
                transratio = sigma;
695
22.7k
            } else {
696
1.44k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
1.44k
            }
698
699
96.6k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
72.4k
            {
701
72.4k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
72.4k
            }
703
704
24.1k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
24.1k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
24.1k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
24.1k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
24.1k
            RE(ps->d_buff[1][b]) = RE(in);
711
24.1k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
24.1k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
24.1k
            RE(R0) = RE(tmp);
716
24.1k
            IM(R0) = IM(tmp);
717
718
96.6k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
72.4k
            {
720
72.4k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
72.4k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
72.4k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
72.4k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
72.4k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
72.4k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
72.4k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
72.4k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
72.4k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
72.4k
                RE(R0) = RE(tmp);
735
72.4k
                IM(R0) = IM(tmp);
736
72.4k
            }
737
738
24.1k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
24.1k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
96.6k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
72.4k
            {
743
72.4k
                if (++temp_delay_ser[k] >= delay_length[k])
744
18.5k
                    temp_delay_ser[k] = 0;
745
72.4k
            }
746
24.1k
        }
747
805
    }
748
749
140
    for (k = 0; k < NUM_OF_LINKS; k++)
750
105
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
35
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
215
{
640
215
    uint8_t s, b, k;
641
215
    complex_t qfrac, tmp0, tmp, in, R0;
642
215
    real_t peakdiff;
643
215
    real_t nrg;
644
215
    real_t power;
645
215
    real_t transratio;
646
215
    real_t new_delay_slopes[NUM_OF_LINKS];
647
215
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
215
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.16k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.94k
    {
655
        /* set delay indices */
656
19.7k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.8k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.94k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.94k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
153k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
148k
        {
664
148k
            const real_t gamma = REAL_CONST(1.5);
665
148k
            const real_t sigma = REAL_CONST(1.5625);
666
667
148k
            RE(in) = QMF_RE(X[s][b]);
668
148k
            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
148k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
148k
#endif
680
681
148k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
148k
            if (ps->peakdecay_fast[b] < power)
683
7.24k
                ps->peakdecay_fast[b] = power;
684
685
148k
            peakdiff = ps->prev_peakdiff[b];
686
148k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
148k
            ps->prev_peakdiff[b] = peakdiff;
688
689
148k
            nrg = ps->prev_nrg[b];
690
148k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
148k
            ps->prev_nrg[b] = nrg;
692
693
148k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
141k
                transratio = sigma;
695
141k
            } else {
696
6.50k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.50k
            }
698
699
593k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
445k
            {
701
445k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
445k
            }
703
704
148k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
148k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
148k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
148k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
148k
            RE(ps->d_buff[1][b]) = RE(in);
711
148k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
148k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
148k
            RE(R0) = RE(tmp);
716
148k
            IM(R0) = IM(tmp);
717
718
593k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
445k
            {
720
445k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
445k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
445k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
445k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
445k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
445k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
445k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
445k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
445k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
445k
                RE(R0) = RE(tmp);
735
445k
                IM(R0) = IM(tmp);
736
445k
            }
737
738
148k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
148k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
593k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
445k
            {
743
445k
                if (++temp_delay_ser[k] >= delay_length[k])
744
115k
                    temp_delay_ser[k] = 0;
745
445k
            }
746
148k
        }
747
4.94k
    }
748
749
860
    for (k = 0; k < NUM_OF_LINKS; k++)
750
645
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
215
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
250
{
755
250
    uint8_t s, b, ifreq, qclass;
756
250
    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
250
    real_t new_dir_map, new_sa_map;
758
759
250
    if (ps->bs_enable_sa)
760
105
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.52k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.41k
        {
765
2.41k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.41k
            ifreq = sa_inv_freq[b];
768
2.41k
            qclass = (b != 0);
769
770
2.41k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.41k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.41k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.41k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.41k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.41k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.41k
        }
781
782
3.25k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.15k
        {
784
75.6k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
72.4k
            {
786
72.4k
                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
72.4k
                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
72.4k
                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
72.4k
                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
72.4k
                sa_map[b]     += k_sa_map[b];
792
72.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
72.4k
            }
794
132k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
129k
            {
796
129k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
129k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
129k
            }
799
3.15k
        }
800
105
    }
801
145
    else {
802
4.49k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.35k
        {
804
282k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
278k
            {
806
278k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
278k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
278k
            }
809
4.35k
        }
810
145
    }
811
250
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
35
{
755
35
    uint8_t s, b, ifreq, qclass;
756
35
    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
35
    real_t new_dir_map, new_sa_map;
758
759
35
    if (ps->bs_enable_sa)
760
15
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
360
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
345
        {
765
345
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
345
            ifreq = sa_inv_freq[b];
768
345
            qclass = (b != 0);
769
770
345
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
345
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
345
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
345
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
345
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
345
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
345
        }
781
782
465
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
450
        {
784
10.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
10.3k
            {
786
10.3k
                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
10.3k
                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
10.3k
                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
10.3k
                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
10.3k
                sa_map[b]     += k_sa_map[b];
792
10.3k
                sa_dir_map[b] += k_sa_dir_map[b];
793
10.3k
            }
794
18.9k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
18.4k
            {
796
18.4k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
18.4k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
18.4k
            }
799
450
        }
800
15
    }
801
20
    else {
802
620
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
600
        {
804
39.0k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
38.4k
            {
806
38.4k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
38.4k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
38.4k
            }
809
600
        }
810
20
    }
811
35
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
215
{
755
215
    uint8_t s, b, ifreq, qclass;
756
215
    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
215
    real_t new_dir_map, new_sa_map;
758
759
215
    if (ps->bs_enable_sa)
760
90
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.16k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.07k
        {
765
2.07k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.07k
            ifreq = sa_inv_freq[b];
768
2.07k
            qclass = (b != 0);
769
770
2.07k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.07k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.07k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.07k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.07k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.07k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.07k
        }
781
782
2.79k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.70k
        {
784
64.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
62.1k
            {
786
62.1k
                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
62.1k
                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
62.1k
                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
62.1k
                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
62.1k
                sa_map[b]     += k_sa_map[b];
792
62.1k
                sa_dir_map[b] += k_sa_dir_map[b];
793
62.1k
            }
794
113k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
110k
            {
796
110k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
110k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
110k
            }
799
2.70k
        }
800
90
    }
801
125
    else {
802
3.87k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.75k
        {
804
243k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
240k
            {
806
240k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
240k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
240k
            }
809
3.75k
        }
810
125
    }
811
215
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
162
{
815
162
    uint8_t s, b, qclass, ifreq;
816
162
    real_t tmp, coeff1, coeff2;
817
162
    real_t pan_base[MAX_PAN_BAND];
818
162
    real_t pan_delta[MAX_PAN_BAND];
819
162
    qmf_t temp_l, temp_r;
820
821
162
    if (ps->bs_enable_pan)
822
162
    {
823
10.5k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
10.3k
        {
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
10.3k
            ifreq = pan_inv_freq[b];
828
10.3k
            qclass = pan_quant_class[ifreq];
829
830
10.3k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.77k
            {
832
9.77k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.77k
            } else {
834
592
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
592
            }
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
10.3k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.68k
            {
841
8.68k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.61k
                {
843
8.61k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.61k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.61k
                } else {
846
69
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
69
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
69
                }
849
8.68k
            } else {
850
1.68k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.16k
                {
852
1.16k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.16k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.16k
                } else {
855
523
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
523
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
523
                }
858
1.68k
            }
859
10.3k
        }
860
861
5.02k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.86k
        {
863
            /* PAN always uses all 64 channels */
864
315k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
311k
            {
866
311k
                tmp = pan_base[b];
867
868
311k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
311k
                coeff1 = MUL_R(coeff2, tmp);
870
871
311k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
311k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
311k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
311k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
311k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
311k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
311k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
311k
                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
311k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
311k
            }
885
4.86k
        }
886
162
    }
887
162
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
11
{
815
11
    uint8_t s, b, qclass, ifreq;
816
11
    real_t tmp, coeff1, coeff2;
817
11
    real_t pan_base[MAX_PAN_BAND];
818
11
    real_t pan_delta[MAX_PAN_BAND];
819
11
    qmf_t temp_l, temp_r;
820
821
11
    if (ps->bs_enable_pan)
822
11
    {
823
715
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
704
        {
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
704
            ifreq = pan_inv_freq[b];
828
704
            qclass = pan_quant_class[ifreq];
829
830
704
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
704
            {
832
704
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
704
            } else {
834
0
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
0
            }
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
704
            if (ps->g_pan_index[ifreq] >= 0)
840
586
            {
841
586
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
586
                {
843
586
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
586
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
586
                } else {
846
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
0
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
0
                }
849
586
            } else {
850
118
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
118
                {
852
118
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
118
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
118
                } else {
855
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
0
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
0
                }
858
118
            }
859
704
        }
860
861
341
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
330
        {
863
            /* PAN always uses all 64 channels */
864
21.4k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
21.1k
            {
866
21.1k
                tmp = pan_base[b];
867
868
21.1k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
21.1k
                coeff1 = MUL_R(coeff2, tmp);
870
871
21.1k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
21.1k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
21.1k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
21.1k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
21.1k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
21.1k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
21.1k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
21.1k
                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
21.1k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
21.1k
            }
885
330
        }
886
11
    }
887
11
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
151
{
815
151
    uint8_t s, b, qclass, ifreq;
816
151
    real_t tmp, coeff1, coeff2;
817
151
    real_t pan_base[MAX_PAN_BAND];
818
151
    real_t pan_delta[MAX_PAN_BAND];
819
151
    qmf_t temp_l, temp_r;
820
821
151
    if (ps->bs_enable_pan)
822
151
    {
823
9.81k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.66k
        {
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
9.66k
            ifreq = pan_inv_freq[b];
828
9.66k
            qclass = pan_quant_class[ifreq];
829
830
9.66k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.07k
            {
832
9.07k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.07k
            } else {
834
592
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
592
            }
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
9.66k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.09k
            {
841
8.09k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.02k
                {
843
8.02k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.02k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.02k
                } else {
846
69
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
69
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
69
                }
849
8.09k
            } else {
850
1.56k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.04k
                {
852
1.04k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.04k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.04k
                } else {
855
523
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
523
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
523
                }
858
1.56k
            }
859
9.66k
        }
860
861
4.68k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.53k
        {
863
            /* PAN always uses all 64 channels */
864
294k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
289k
            {
866
289k
                tmp = pan_base[b];
867
868
289k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
289k
                coeff1 = MUL_R(coeff2, tmp);
870
871
289k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
289k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
289k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
289k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
289k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
289k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
289k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
289k
                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
289k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
289k
            }
885
4.53k
        }
886
151
    }
887
151
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.40k
{
891
7.40k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.40k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.40k
    return ps;
896
7.40k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.40k
{
900
7.40k
    faad_free(ps);
901
7.40k
}
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
270
{
906
270
    if (ps == NULL)
907
19
    {
908
19
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
19
        return 0;
910
19
    }
911
912
251
    if (!ps->drm_ps_data_available && !guess)
913
1
    {
914
1
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
915
1
        memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index));
916
1
        memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index));
917
1
        return 0;
918
1
    }
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
250
    if (!guess)
923
136
    {
924
136
        ps->sa_decode_error = 0;
925
136
        ps->pan_decode_error = 0;
926
136
        drm_ps_delta_decode(ps);
927
136
    } else
928
114
    {
929
114
        ps->sa_decode_error = 1;
930
114
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
114
    }
933
934
250
    ps->drm_ps_data_available = 0;
935
936
250
    drm_calc_sa_side_signal(ps, X_left);
937
250
    drm_add_ambiance(ps, X_left, X_right);
938
939
250
    if (ps->bs_enable_sa)
940
105
    {
941
105
        ps->g_last_had_sa = 1;
942
943
105
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
145
    } else {
946
145
        ps->g_last_had_sa = 0;
947
145
    }
948
949
250
    if (ps->bs_enable_pan)
950
162
    {
951
162
        drm_add_pan(ps, X_left, X_right);
952
953
162
        ps->g_last_had_pan = 1;
954
955
162
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
162
    } else {
958
88
        ps->g_last_had_pan = 0;
959
88
    }
960
961
962
250
    return 0;
963
251
}
964
965
#endif