Coverage Report

Created: 2025-07-11 06:40

/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
793k
{
446
793k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
793k
    ps->drm_ps_data_available = 1;
449
450
793k
    ps->bs_enable_sa = faad_get1bit(ld);
451
793k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
793k
    if (ps->bs_enable_sa)
454
17.3k
    {
455
17.3k
        drm_ps_sa_element(ps, ld);
456
17.3k
    }
457
458
793k
    if (ps->bs_enable_pan)
459
16.1k
    {
460
16.1k
        drm_ps_pan_element(ps, ld);
461
16.1k
    }
462
463
793k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
793k
    return bits;
466
793k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
17.3k
{
470
17.3k
    drm_ps_huff_tab huff;
471
17.3k
    uint8_t band;
472
473
17.3k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
17.3k
    if (ps->bs_sa_dt_flag)
475
8.06k
    {
476
8.06k
        huff = t_huffman_sa;
477
9.25k
    } else {
478
9.25k
        huff = f_huffman_sa;
479
9.25k
    }
480
481
155k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
138k
    {
483
138k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
138k
    }
485
17.3k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
16.1k
{
489
16.1k
    drm_ps_huff_tab huff;
490
16.1k
    uint8_t band;
491
492
16.1k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
16.1k
    if (ps->bs_pan_dt_flag)
494
4.81k
    {
495
4.81k
        huff = t_huffman_pan;
496
11.3k
    } else {
497
11.3k
        huff = f_huffman_pan;
498
11.3k
    }
499
500
339k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
323k
    {
502
323k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
323k
    }
504
16.1k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
461k
{
509
461k
    uint8_t bit;
510
461k
    int8_t index = 0;
511
512
1.27M
    while (index >= 0)
513
817k
    {
514
817k
        bit = (uint8_t)faad_get1bit(ld);
515
817k
        index = huff[index][bit];
516
817k
    }
517
518
461k
    return index + 15;
519
461k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
688
{
524
688
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
163
        ps->sa_decode_error = 1;
527
163
        return 0;
528
525
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
73
        ps->sa_decode_error = 1;
531
73
        return 7;
532
73
    } else
533
452
        return i;
534
688
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
1.96k
{
538
1.96k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
192
        ps->pan_decode_error = 1;
541
192
        return -7;
542
1.76k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
191
        ps->pan_decode_error = 1;
545
191
        return 7;
546
191
    } else
547
1.57k
        return i;
548
1.96k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
129
{
552
129
    uint8_t band;
553
554
129
    if (ps->bs_enable_sa)
555
110
    {
556
110
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
24
        {
558
            /* wait until we get a DT frame */
559
24
            ps->bs_enable_sa = 0;
560
86
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
19
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
67
        } else {
564
            /* DF always decodable */
565
67
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
67
        }
567
568
880
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
770
        {
570
770
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
133
            {
572
133
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
637
            } else if (!ps->bs_sa_dt_flag) {
574
469
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
469
            }
576
770
        }
577
110
    }
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
129
    if (ps->sa_decode_error) {
582
61
        ps->pan_decode_error = 1;
583
61
        ps->bs_enable_pan = ps->g_last_had_pan;
584
61
        ps->bs_enable_sa = ps->g_last_had_sa;
585
61
    }
586
587
588
129
    if (ps->bs_enable_sa)
589
61
    {
590
61
        if (ps->sa_decode_error) {
591
324
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
288
            {
593
288
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
288
            }
595
36
        } else {
596
225
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
200
            {
598
200
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
200
            }
600
25
        }
601
61
    }
602
603
129
    if (ps->bs_enable_pan)
604
103
    {
605
103
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
5
        {
607
5
            ps->bs_enable_pan = 0;
608
98
        }  else if (ps->bs_pan_dt_flag) {
609
34
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
64
        } else {
611
64
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
64
        }
613
614
2.06k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
1.95k
        {
616
1.95k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
646
            {
618
646
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.31k
            } else if (!ps->bs_pan_dt_flag) {
620
1.21k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.21k
            }
622
1.95k
        }
623
624
103
        if (ps->pan_decode_error) {
625
1.30k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.24k
            {
627
1.24k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.24k
            }
629
62
        } else {
630
861
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
820
            {
632
820
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
820
            }
634
41
        }
635
103
    }
636
129
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
237
{
640
237
    uint8_t s, b, k;
641
237
    complex_t qfrac, tmp0, tmp, in, R0;
642
237
    real_t peakdiff;
643
237
    real_t nrg;
644
237
    real_t power;
645
237
    real_t transratio;
646
237
    real_t new_delay_slopes[NUM_OF_LINKS];
647
237
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
237
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.68k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.45k
    {
655
        /* set delay indices */
656
21.8k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
16.3k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.45k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.45k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
168k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
163k
        {
664
163k
            const real_t gamma = REAL_CONST(1.5);
665
163k
            const real_t sigma = REAL_CONST(1.5625);
666
667
163k
            RE(in) = QMF_RE(X[s][b]);
668
163k
            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
18.6k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
18.6k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
144k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
163k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
163k
            if (ps->peakdecay_fast[b] < power)
683
10.0k
                ps->peakdecay_fast[b] = power;
684
685
163k
            peakdiff = ps->prev_peakdiff[b];
686
163k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
163k
            ps->prev_peakdiff[b] = peakdiff;
688
689
163k
            nrg = ps->prev_nrg[b];
690
163k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
163k
            ps->prev_nrg[b] = nrg;
692
693
163k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
156k
                transratio = sigma;
695
156k
            } else {
696
7.49k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.49k
            }
698
699
654k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
490k
            {
701
490k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
490k
            }
703
704
163k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
163k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
163k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
163k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
163k
            RE(ps->d_buff[1][b]) = RE(in);
711
163k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
163k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
163k
            RE(R0) = RE(tmp);
716
163k
            IM(R0) = IM(tmp);
717
718
654k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
490k
            {
720
490k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
490k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
490k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
490k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
490k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
490k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
490k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
490k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
490k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
490k
                RE(R0) = RE(tmp);
735
490k
                IM(R0) = IM(tmp);
736
490k
            }
737
738
163k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
163k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
654k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
490k
            {
743
490k
                if (++temp_delay_ser[k] >= delay_length[k])
744
127k
                    temp_delay_ser[k] = 0;
745
490k
            }
746
163k
        }
747
5.45k
    }
748
749
948
    for (k = 0; k < NUM_OF_LINKS; k++)
750
711
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
237
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
27
{
640
27
    uint8_t s, b, k;
641
27
    complex_t qfrac, tmp0, tmp, in, R0;
642
27
    real_t peakdiff;
643
27
    real_t nrg;
644
27
    real_t power;
645
27
    real_t transratio;
646
27
    real_t new_delay_slopes[NUM_OF_LINKS];
647
27
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
27
    complex_t Phi_Fract;
649
27
#ifdef FIXED_POINT
650
27
    uint32_t in_re, in_im;
651
27
#endif
652
653
648
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
621
    {
655
        /* set delay indices */
656
2.48k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
1.86k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
621
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
621
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
19.2k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
18.6k
        {
664
18.6k
            const real_t gamma = REAL_CONST(1.5);
665
18.6k
            const real_t sigma = REAL_CONST(1.5625);
666
667
18.6k
            RE(in) = QMF_RE(X[s][b]);
668
18.6k
            IM(in) = QMF_IM(X[s][b]);
669
670
18.6k
#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
18.6k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
18.6k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
18.6k
            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
18.6k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
18.6k
            if (ps->peakdecay_fast[b] < power)
683
2.13k
                ps->peakdecay_fast[b] = power;
684
685
18.6k
            peakdiff = ps->prev_peakdiff[b];
686
18.6k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
18.6k
            ps->prev_peakdiff[b] = peakdiff;
688
689
18.6k
            nrg = ps->prev_nrg[b];
690
18.6k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
18.6k
            ps->prev_nrg[b] = nrg;
692
693
18.6k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
17.6k
                transratio = sigma;
695
17.6k
            } else {
696
1.02k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
1.02k
            }
698
699
74.5k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
55.8k
            {
701
55.8k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
55.8k
            }
703
704
18.6k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
18.6k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
18.6k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
18.6k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
18.6k
            RE(ps->d_buff[1][b]) = RE(in);
711
18.6k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
18.6k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
18.6k
            RE(R0) = RE(tmp);
716
18.6k
            IM(R0) = IM(tmp);
717
718
74.5k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
55.8k
            {
720
55.8k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
55.8k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
55.8k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
55.8k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
55.8k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
55.8k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
55.8k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
55.8k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
55.8k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
55.8k
                RE(R0) = RE(tmp);
735
55.8k
                IM(R0) = IM(tmp);
736
55.8k
            }
737
738
18.6k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
18.6k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
74.5k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
55.8k
            {
743
55.8k
                if (++temp_delay_ser[k] >= delay_length[k])
744
14.3k
                    temp_delay_ser[k] = 0;
745
55.8k
            }
746
18.6k
        }
747
621
    }
748
749
108
    for (k = 0; k < NUM_OF_LINKS; k++)
750
81
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
27
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
210
{
640
210
    uint8_t s, b, k;
641
210
    complex_t qfrac, tmp0, tmp, in, R0;
642
210
    real_t peakdiff;
643
210
    real_t nrg;
644
210
    real_t power;
645
210
    real_t transratio;
646
210
    real_t new_delay_slopes[NUM_OF_LINKS];
647
210
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
210
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.04k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.83k
    {
655
        /* set delay indices */
656
19.3k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.4k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.83k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.83k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
149k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
144k
        {
664
144k
            const real_t gamma = REAL_CONST(1.5);
665
144k
            const real_t sigma = REAL_CONST(1.5625);
666
667
144k
            RE(in) = QMF_RE(X[s][b]);
668
144k
            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
144k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
144k
#endif
680
681
144k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
144k
            if (ps->peakdecay_fast[b] < power)
683
7.91k
                ps->peakdecay_fast[b] = power;
684
685
144k
            peakdiff = ps->prev_peakdiff[b];
686
144k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
144k
            ps->prev_peakdiff[b] = peakdiff;
688
689
144k
            nrg = ps->prev_nrg[b];
690
144k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
144k
            ps->prev_nrg[b] = nrg;
692
693
144k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
138k
                transratio = sigma;
695
138k
            } else {
696
6.47k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.47k
            }
698
699
579k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
434k
            {
701
434k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
434k
            }
703
704
144k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
144k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
144k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
144k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
144k
            RE(ps->d_buff[1][b]) = RE(in);
711
144k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
144k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
144k
            RE(R0) = RE(tmp);
716
144k
            IM(R0) = IM(tmp);
717
718
579k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
434k
            {
720
434k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
434k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
434k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
434k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
434k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
434k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
434k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
434k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
434k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
434k
                RE(R0) = RE(tmp);
735
434k
                IM(R0) = IM(tmp);
736
434k
            }
737
738
144k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
144k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
579k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
434k
            {
743
434k
                if (++temp_delay_ser[k] >= delay_length[k])
744
112k
                    temp_delay_ser[k] = 0;
745
434k
            }
746
144k
        }
747
4.83k
    }
748
749
840
    for (k = 0; k < NUM_OF_LINKS; k++)
750
630
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
210
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
237
{
755
237
    uint8_t s, b, ifreq, qclass;
756
237
    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
237
    real_t new_dir_map, new_sa_map;
758
759
237
    if (ps->bs_enable_sa)
760
116
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.78k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.66k
        {
765
2.66k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.66k
            ifreq = sa_inv_freq[b];
768
2.66k
            qclass = (b != 0);
769
770
2.66k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.66k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.66k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.66k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.66k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.66k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.66k
        }
781
782
3.59k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.48k
        {
784
83.5k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
80.0k
            {
786
80.0k
                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
80.0k
                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
80.0k
                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
80.0k
                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
80.0k
                sa_map[b]     += k_sa_map[b];
792
80.0k
                sa_dir_map[b] += k_sa_dir_map[b];
793
80.0k
            }
794
146k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
142k
            {
796
142k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
142k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
142k
            }
799
3.48k
        }
800
116
    }
801
121
    else {
802
3.75k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.63k
        {
804
235k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
232k
            {
806
232k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
232k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
232k
            }
809
3.63k
        }
810
121
    }
811
237
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
27
{
755
27
    uint8_t s, b, ifreq, qclass;
756
27
    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
27
    real_t new_dir_map, new_sa_map;
758
759
27
    if (ps->bs_enable_sa)
760
10
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
240
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
230
        {
765
230
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
230
            ifreq = sa_inv_freq[b];
768
230
            qclass = (b != 0);
769
770
230
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
230
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
230
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
230
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
230
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
230
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
230
        }
781
782
310
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
300
        {
784
7.20k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
6.90k
            {
786
6.90k
                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
6.90k
                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
6.90k
                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
6.90k
                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
6.90k
                sa_map[b]     += k_sa_map[b];
792
6.90k
                sa_dir_map[b] += k_sa_dir_map[b];
793
6.90k
            }
794
12.6k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
12.3k
            {
796
12.3k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
12.3k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
12.3k
            }
799
300
        }
800
10
    }
801
17
    else {
802
527
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
510
        {
804
33.1k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
32.6k
            {
806
32.6k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
32.6k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
32.6k
            }
809
510
        }
810
17
    }
811
27
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
210
{
755
210
    uint8_t s, b, ifreq, qclass;
756
210
    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
210
    real_t new_dir_map, new_sa_map;
758
759
210
    if (ps->bs_enable_sa)
760
106
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.54k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.43k
        {
765
2.43k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.43k
            ifreq = sa_inv_freq[b];
768
2.43k
            qclass = (b != 0);
769
770
2.43k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.43k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.43k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.43k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.43k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.43k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.43k
        }
781
782
3.28k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.18k
        {
784
76.3k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
73.1k
            {
786
73.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
73.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
73.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
73.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
73.1k
                sa_map[b]     += k_sa_map[b];
792
73.1k
                sa_dir_map[b] += k_sa_dir_map[b];
793
73.1k
            }
794
133k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
130k
            {
796
130k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
130k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
130k
            }
799
3.18k
        }
800
106
    }
801
104
    else {
802
3.22k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.12k
        {
804
202k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
199k
            {
806
199k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
199k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
199k
            }
809
3.12k
        }
810
104
    }
811
210
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
154
{
815
154
    uint8_t s, b, qclass, ifreq;
816
154
    real_t tmp, coeff1, coeff2;
817
154
    real_t pan_base[MAX_PAN_BAND];
818
154
    real_t pan_delta[MAX_PAN_BAND];
819
154
    qmf_t temp_l, temp_r;
820
821
154
    if (ps->bs_enable_pan)
822
154
    {
823
10.0k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.85k
        {
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.85k
            ifreq = pan_inv_freq[b];
828
9.85k
            qclass = pan_quant_class[ifreq];
829
830
9.85k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.32k
            {
832
9.32k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.32k
            } else {
834
536
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
536
            }
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.85k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.42k
            {
841
8.42k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.33k
                {
843
8.33k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.33k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.33k
                } else {
846
91
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
91
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
91
                }
849
8.42k
            } else {
850
1.43k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
985
                {
852
985
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
985
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
985
                } else {
855
445
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
445
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
445
                }
858
1.43k
            }
859
9.85k
        }
860
861
4.77k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.62k
        {
863
            /* PAN always uses all 64 channels */
864
300k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
295k
            {
866
295k
                tmp = pan_base[b];
867
868
295k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
295k
                coeff1 = MUL_R(coeff2, tmp);
870
871
295k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
295k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
295k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
295k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
295k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
295k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
295k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
295k
                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
295k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
295k
            }
885
4.62k
        }
886
154
    }
887
154
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
14
{
815
14
    uint8_t s, b, qclass, ifreq;
816
14
    real_t tmp, coeff1, coeff2;
817
14
    real_t pan_base[MAX_PAN_BAND];
818
14
    real_t pan_delta[MAX_PAN_BAND];
819
14
    qmf_t temp_l, temp_r;
820
821
14
    if (ps->bs_enable_pan)
822
14
    {
823
910
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
896
        {
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
896
            ifreq = pan_inv_freq[b];
828
896
            qclass = pan_quant_class[ifreq];
829
830
896
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
896
            {
832
896
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
896
            } 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
896
            if (ps->g_pan_index[ifreq] >= 0)
840
778
            {
841
778
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
778
                {
843
778
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
778
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
778
                } 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
778
            } 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
896
        }
860
861
434
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
420
        {
863
            /* PAN always uses all 64 channels */
864
27.3k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
26.8k
            {
866
26.8k
                tmp = pan_base[b];
867
868
26.8k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
26.8k
                coeff1 = MUL_R(coeff2, tmp);
870
871
26.8k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
26.8k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
26.8k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
26.8k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
26.8k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
26.8k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
26.8k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
26.8k
                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
26.8k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
26.8k
            }
885
420
        }
886
14
    }
887
14
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
140
{
815
140
    uint8_t s, b, qclass, ifreq;
816
140
    real_t tmp, coeff1, coeff2;
817
140
    real_t pan_base[MAX_PAN_BAND];
818
140
    real_t pan_delta[MAX_PAN_BAND];
819
140
    qmf_t temp_l, temp_r;
820
821
140
    if (ps->bs_enable_pan)
822
140
    {
823
9.10k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
8.96k
        {
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
8.96k
            ifreq = pan_inv_freq[b];
828
8.96k
            qclass = pan_quant_class[ifreq];
829
830
8.96k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
8.42k
            {
832
8.42k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
8.42k
            } else {
834
536
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
536
            }
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
8.96k
            if (ps->g_pan_index[ifreq] >= 0)
840
7.64k
            {
841
7.64k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
7.55k
                {
843
7.55k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
7.55k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
7.55k
                } else {
846
91
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
91
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
91
                }
849
7.64k
            } else {
850
1.31k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
867
                {
852
867
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
867
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
867
                } else {
855
445
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
445
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
445
                }
858
1.31k
            }
859
8.96k
        }
860
861
4.34k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.20k
        {
863
            /* PAN always uses all 64 channels */
864
273k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
268k
            {
866
268k
                tmp = pan_base[b];
867
868
268k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
268k
                coeff1 = MUL_R(coeff2, tmp);
870
871
268k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
268k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
268k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
268k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
268k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
268k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
268k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
268k
                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
268k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
268k
            }
885
4.20k
        }
886
140
    }
887
140
}
888
889
drm_ps_info *drm_ps_init(void)
890
6.48k
{
891
6.48k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
6.48k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
6.48k
    return ps;
896
6.48k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
6.48k
{
900
6.48k
    faad_free(ps);
901
6.48k
}
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
251
{
906
251
    if (ps == NULL)
907
13
    {
908
13
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
13
        return 0;
910
13
    }
911
912
238
    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
237
    if (!guess)
923
129
    {
924
129
        ps->sa_decode_error = 0;
925
129
        ps->pan_decode_error = 0;
926
129
        drm_ps_delta_decode(ps);
927
129
    } else
928
108
    {
929
108
        ps->sa_decode_error = 1;
930
108
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
108
    }
933
934
237
    ps->drm_ps_data_available = 0;
935
936
237
    drm_calc_sa_side_signal(ps, X_left);
937
237
    drm_add_ambiance(ps, X_left, X_right);
938
939
237
    if (ps->bs_enable_sa)
940
116
    {
941
116
        ps->g_last_had_sa = 1;
942
943
116
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
121
    } else {
946
121
        ps->g_last_had_sa = 0;
947
121
    }
948
949
237
    if (ps->bs_enable_pan)
950
154
    {
951
154
        drm_add_pan(ps, X_left, X_right);
952
953
154
        ps->g_last_had_pan = 1;
954
955
154
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
154
    } else {
958
83
        ps->g_last_had_pan = 0;
959
83
    }
960
961
962
237
    return 0;
963
238
}
964
965
#endif