Coverage Report

Created: 2025-07-18 06:36

/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
853k
{
446
853k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
853k
    ps->drm_ps_data_available = 1;
449
450
853k
    ps->bs_enable_sa = faad_get1bit(ld);
451
853k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
853k
    if (ps->bs_enable_sa)
454
18.5k
    {
455
18.5k
        drm_ps_sa_element(ps, ld);
456
18.5k
    }
457
458
853k
    if (ps->bs_enable_pan)
459
17.2k
    {
460
17.2k
        drm_ps_pan_element(ps, ld);
461
17.2k
    }
462
463
853k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
853k
    return bits;
466
853k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
18.5k
{
470
18.5k
    drm_ps_huff_tab huff;
471
18.5k
    uint8_t band;
472
473
18.5k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
18.5k
    if (ps->bs_sa_dt_flag)
475
9.21k
    {
476
9.21k
        huff = t_huffman_sa;
477
9.29k
    } else {
478
9.29k
        huff = f_huffman_sa;
479
9.29k
    }
480
481
166k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
148k
    {
483
148k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
148k
    }
485
18.5k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
17.2k
{
489
17.2k
    drm_ps_huff_tab huff;
490
17.2k
    uint8_t band;
491
492
17.2k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
17.2k
    if (ps->bs_pan_dt_flag)
494
5.08k
    {
495
5.08k
        huff = t_huffman_pan;
496
12.1k
    } else {
497
12.1k
        huff = f_huffman_pan;
498
12.1k
    }
499
500
361k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
344k
    {
502
344k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
344k
    }
504
17.2k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
492k
{
509
492k
    uint8_t bit;
510
492k
    int8_t index = 0;
511
512
1.37M
    while (index >= 0)
513
882k
    {
514
882k
        bit = (uint8_t)faad_get1bit(ld);
515
882k
        index = huff[index][bit];
516
882k
    }
517
518
492k
    return index + 15;
519
492k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
728
{
524
728
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
170
        ps->sa_decode_error = 1;
527
170
        return 0;
528
558
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
73
        ps->sa_decode_error = 1;
531
73
        return 7;
532
73
    } else
533
485
        return i;
534
728
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.24k
{
538
2.24k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
202
        ps->pan_decode_error = 1;
541
202
        return -7;
542
2.03k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
226
        ps->pan_decode_error = 1;
545
226
        return 7;
546
226
    } else
547
1.81k
        return i;
548
2.24k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
138
{
552
138
    uint8_t band;
553
554
138
    if (ps->bs_enable_sa)
555
114
    {
556
114
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
23
        {
558
            /* wait until we get a DT frame */
559
23
            ps->bs_enable_sa = 0;
560
91
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
20
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
71
        } else {
564
            /* DF always decodable */
565
71
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
71
        }
567
568
912
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
798
        {
570
798
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
140
            {
572
140
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
658
            } else if (!ps->bs_sa_dt_flag) {
574
497
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
497
            }
576
798
        }
577
114
    }
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
138
    if (ps->sa_decode_error) {
582
63
        ps->pan_decode_error = 1;
583
63
        ps->bs_enable_pan = ps->g_last_had_pan;
584
63
        ps->bs_enable_sa = ps->g_last_had_sa;
585
63
    }
586
587
588
138
    if (ps->bs_enable_sa)
589
59
    {
590
59
        if (ps->sa_decode_error) {
591
279
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
248
            {
593
248
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
248
            }
595
31
        } else {
596
252
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
224
            {
598
224
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
224
            }
600
28
        }
601
59
    }
602
603
138
    if (ps->bs_enable_pan)
604
116
    {
605
116
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
4
        {
607
4
            ps->bs_enable_pan = 0;
608
112
        }  else if (ps->bs_pan_dt_flag) {
609
39
            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.32k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.20k
        {
616
2.20k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
741
            {
618
741
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.46k
            } 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.20k
        }
623
624
116
        if (ps->pan_decode_error) {
625
1.44k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.38k
            {
627
1.38k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.38k
            }
629
69
        } else {
630
987
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
940
            {
632
940
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
940
            }
634
47
        }
635
116
    }
636
138
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
259
{
640
259
    uint8_t s, b, k;
641
259
    complex_t qfrac, tmp0, tmp, in, R0;
642
259
    real_t peakdiff;
643
259
    real_t nrg;
644
259
    real_t power;
645
259
    real_t transratio;
646
259
    real_t new_delay_slopes[NUM_OF_LINKS];
647
259
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
259
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.21k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.95k
    {
655
        /* set delay indices */
656
23.8k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
17.8k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.95k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.95k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
184k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
178k
        {
664
178k
            const real_t gamma = REAL_CONST(1.5);
665
178k
            const real_t sigma = REAL_CONST(1.5625);
666
667
178k
            RE(in) = QMF_RE(X[s][b]);
668
178k
            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
26.2k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
26.2k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
152k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
178k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
178k
            if (ps->peakdecay_fast[b] < power)
683
11.2k
                ps->peakdecay_fast[b] = power;
684
685
178k
            peakdiff = ps->prev_peakdiff[b];
686
178k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
178k
            ps->prev_peakdiff[b] = peakdiff;
688
689
178k
            nrg = ps->prev_nrg[b];
690
178k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
178k
            ps->prev_nrg[b] = nrg;
692
693
178k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
170k
                transratio = sigma;
695
170k
            } else {
696
8.57k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
8.57k
            }
698
699
714k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
536k
            {
701
536k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
536k
            }
703
704
178k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
178k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
178k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
178k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
178k
            RE(ps->d_buff[1][b]) = RE(in);
711
178k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
178k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
178k
            RE(R0) = RE(tmp);
716
178k
            IM(R0) = IM(tmp);
717
718
714k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
536k
            {
720
536k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
536k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
536k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
536k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
536k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
536k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
536k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
536k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
536k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
536k
                RE(R0) = RE(tmp);
735
536k
                IM(R0) = IM(tmp);
736
536k
            }
737
738
178k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
178k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
714k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
536k
            {
743
536k
                if (++temp_delay_ser[k] >= delay_length[k])
744
138k
                    temp_delay_ser[k] = 0;
745
536k
            }
746
178k
        }
747
5.95k
    }
748
749
1.03k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
777
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
259
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
38
{
640
38
    uint8_t s, b, k;
641
38
    complex_t qfrac, tmp0, tmp, in, R0;
642
38
    real_t peakdiff;
643
38
    real_t nrg;
644
38
    real_t power;
645
38
    real_t transratio;
646
38
    real_t new_delay_slopes[NUM_OF_LINKS];
647
38
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
38
    complex_t Phi_Fract;
649
38
#ifdef FIXED_POINT
650
38
    uint32_t in_re, in_im;
651
38
#endif
652
653
912
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
874
    {
655
        /* set delay indices */
656
3.49k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
2.62k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
874
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
874
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
27.0k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
26.2k
        {
664
26.2k
            const real_t gamma = REAL_CONST(1.5);
665
26.2k
            const real_t sigma = REAL_CONST(1.5625);
666
667
26.2k
            RE(in) = QMF_RE(X[s][b]);
668
26.2k
            IM(in) = QMF_IM(X[s][b]);
669
670
26.2k
#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
26.2k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
26.2k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
26.2k
            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
26.2k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
26.2k
            if (ps->peakdecay_fast[b] < power)
683
3.24k
                ps->peakdecay_fast[b] = power;
684
685
26.2k
            peakdiff = ps->prev_peakdiff[b];
686
26.2k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
26.2k
            ps->prev_peakdiff[b] = peakdiff;
688
689
26.2k
            nrg = ps->prev_nrg[b];
690
26.2k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
26.2k
            ps->prev_nrg[b] = nrg;
692
693
26.2k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
24.5k
                transratio = sigma;
695
24.5k
            } else {
696
1.68k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
1.68k
            }
698
699
104k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
78.6k
            {
701
78.6k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
78.6k
            }
703
704
26.2k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
26.2k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
26.2k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
26.2k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
26.2k
            RE(ps->d_buff[1][b]) = RE(in);
711
26.2k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
26.2k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
26.2k
            RE(R0) = RE(tmp);
716
26.2k
            IM(R0) = IM(tmp);
717
718
104k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
78.6k
            {
720
78.6k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
78.6k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
78.6k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
78.6k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
78.6k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
78.6k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
78.6k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
78.6k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
78.6k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
78.6k
                RE(R0) = RE(tmp);
735
78.6k
                IM(R0) = IM(tmp);
736
78.6k
            }
737
738
26.2k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
26.2k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
104k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
78.6k
            {
743
78.6k
                if (++temp_delay_ser[k] >= delay_length[k])
744
20.2k
                    temp_delay_ser[k] = 0;
745
78.6k
            }
746
26.2k
        }
747
874
    }
748
749
152
    for (k = 0; k < NUM_OF_LINKS; k++)
750
114
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
38
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
221
{
640
221
    uint8_t s, b, k;
641
221
    complex_t qfrac, tmp0, tmp, in, R0;
642
221
    real_t peakdiff;
643
221
    real_t nrg;
644
221
    real_t power;
645
221
    real_t transratio;
646
221
    real_t new_delay_slopes[NUM_OF_LINKS];
647
221
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
221
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.30k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.08k
    {
655
        /* set delay indices */
656
20.3k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
15.2k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.08k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.08k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
157k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
152k
        {
664
152k
            const real_t gamma = REAL_CONST(1.5);
665
152k
            const real_t sigma = REAL_CONST(1.5625);
666
667
152k
            RE(in) = QMF_RE(X[s][b]);
668
152k
            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
152k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
152k
#endif
680
681
152k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
152k
            if (ps->peakdecay_fast[b] < power)
683
8.03k
                ps->peakdecay_fast[b] = power;
684
685
152k
            peakdiff = ps->prev_peakdiff[b];
686
152k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
152k
            ps->prev_peakdiff[b] = peakdiff;
688
689
152k
            nrg = ps->prev_nrg[b];
690
152k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
152k
            ps->prev_nrg[b] = nrg;
692
693
152k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
145k
                transratio = sigma;
695
145k
            } else {
696
6.88k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.88k
            }
698
699
609k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
457k
            {
701
457k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
457k
            }
703
704
152k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
152k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
152k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
152k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
152k
            RE(ps->d_buff[1][b]) = RE(in);
711
152k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
152k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
152k
            RE(R0) = RE(tmp);
716
152k
            IM(R0) = IM(tmp);
717
718
609k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
457k
            {
720
457k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
457k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
457k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
457k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
457k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
457k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
457k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
457k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
457k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
457k
                RE(R0) = RE(tmp);
735
457k
                IM(R0) = IM(tmp);
736
457k
            }
737
738
152k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
152k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
609k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
457k
            {
743
457k
                if (++temp_delay_ser[k] >= delay_length[k])
744
118k
                    temp_delay_ser[k] = 0;
745
457k
            }
746
152k
        }
747
5.08k
    }
748
749
884
    for (k = 0; k < NUM_OF_LINKS; k++)
750
663
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
221
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
259
{
755
259
    uint8_t s, b, ifreq, qclass;
756
259
    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
259
    real_t new_dir_map, new_sa_map;
758
759
259
    if (ps->bs_enable_sa)
760
117
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.80k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.69k
        {
765
2.69k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.69k
            ifreq = sa_inv_freq[b];
768
2.69k
            qclass = (b != 0);
769
770
2.69k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.69k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.69k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.69k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.69k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.69k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.69k
        }
781
782
3.62k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.51k
        {
784
84.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
80.7k
            {
786
80.7k
                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.7k
                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.7k
                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.7k
                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.7k
                sa_map[b]     += k_sa_map[b];
792
80.7k
                sa_dir_map[b] += k_sa_dir_map[b];
793
80.7k
            }
794
147k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
143k
            {
796
143k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
143k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
143k
            }
799
3.51k
        }
800
117
    }
801
142
    else {
802
4.40k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.26k
        {
804
276k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
272k
            {
806
272k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
272k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
272k
            }
809
4.26k
        }
810
142
    }
811
259
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
38
{
755
38
    uint8_t s, b, ifreq, qclass;
756
38
    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
38
    real_t new_dir_map, new_sa_map;
758
759
38
    if (ps->bs_enable_sa)
760
19
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
456
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
437
        {
765
437
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
437
            ifreq = sa_inv_freq[b];
768
437
            qclass = (b != 0);
769
770
437
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
437
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
437
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
437
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
437
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
437
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
437
        }
781
782
589
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
570
        {
784
13.6k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
13.1k
            {
786
13.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
13.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
13.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
13.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
13.1k
                sa_map[b]     += k_sa_map[b];
792
13.1k
                sa_dir_map[b] += k_sa_dir_map[b];
793
13.1k
            }
794
23.9k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
23.3k
            {
796
23.3k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
23.3k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
23.3k
            }
799
570
        }
800
19
    }
801
19
    else {
802
589
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
570
        {
804
37.0k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
36.4k
            {
806
36.4k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
36.4k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
36.4k
            }
809
570
        }
810
19
    }
811
38
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
221
{
755
221
    uint8_t s, b, ifreq, qclass;
756
221
    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
221
    real_t new_dir_map, new_sa_map;
758
759
221
    if (ps->bs_enable_sa)
760
98
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.35k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.25k
        {
765
2.25k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.25k
            ifreq = sa_inv_freq[b];
768
2.25k
            qclass = (b != 0);
769
770
2.25k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.25k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.25k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.25k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.25k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.25k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.25k
        }
781
782
3.03k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.94k
        {
784
70.5k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
67.6k
            {
786
67.6k
                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
67.6k
                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
67.6k
                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
67.6k
                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
67.6k
                sa_map[b]     += k_sa_map[b];
792
67.6k
                sa_dir_map[b] += k_sa_dir_map[b];
793
67.6k
            }
794
123k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
120k
            {
796
120k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
120k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
120k
            }
799
2.94k
        }
800
98
    }
801
123
    else {
802
3.81k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.69k
        {
804
239k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
236k
            {
806
236k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
236k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
236k
            }
809
3.69k
        }
810
123
    }
811
221
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
176
{
815
176
    uint8_t s, b, qclass, ifreq;
816
176
    real_t tmp, coeff1, coeff2;
817
176
    real_t pan_base[MAX_PAN_BAND];
818
176
    real_t pan_delta[MAX_PAN_BAND];
819
176
    qmf_t temp_l, temp_r;
820
821
176
    if (ps->bs_enable_pan)
822
176
    {
823
11.4k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
11.2k
        {
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
11.2k
            ifreq = pan_inv_freq[b];
828
11.2k
            qclass = pan_quant_class[ifreq];
829
830
11.2k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
10.6k
            {
832
10.6k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
10.6k
            } else {
834
658
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
658
            }
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
11.2k
            if (ps->g_pan_index[ifreq] >= 0)
840
9.42k
            {
841
9.42k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.33k
                {
843
9.33k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.33k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.33k
                } else {
846
94
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
94
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
94
                }
849
9.42k
            } else {
850
1.84k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.27k
                {
852
1.27k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.27k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.27k
                } else {
855
564
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
564
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
564
                }
858
1.84k
            }
859
11.2k
        }
860
861
5.45k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.28k
        {
863
            /* PAN always uses all 64 channels */
864
343k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
337k
            {
866
337k
                tmp = pan_base[b];
867
868
337k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
337k
                coeff1 = MUL_R(coeff2, tmp);
870
871
337k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
337k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
337k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
337k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
337k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
337k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
337k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
337k
                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
337k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
337k
            }
885
5.28k
        }
886
176
    }
887
176
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
18
{
815
18
    uint8_t s, b, qclass, ifreq;
816
18
    real_t tmp, coeff1, coeff2;
817
18
    real_t pan_base[MAX_PAN_BAND];
818
18
    real_t pan_delta[MAX_PAN_BAND];
819
18
    qmf_t temp_l, temp_r;
820
821
18
    if (ps->bs_enable_pan)
822
18
    {
823
1.17k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.15k
        {
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
1.15k
            ifreq = pan_inv_freq[b];
828
1.15k
            qclass = pan_quant_class[ifreq];
829
830
1.15k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.15k
            {
832
1.15k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.15k
            } 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
1.15k
            if (ps->g_pan_index[ifreq] >= 0)
840
975
            {
841
975
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
975
                {
843
975
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
975
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
975
                } 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
975
            } else {
850
177
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
177
                {
852
177
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
177
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
177
                } 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
177
            }
859
1.15k
        }
860
861
558
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
540
        {
863
            /* PAN always uses all 64 channels */
864
35.1k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
34.5k
            {
866
34.5k
                tmp = pan_base[b];
867
868
34.5k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
34.5k
                coeff1 = MUL_R(coeff2, tmp);
870
871
34.5k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
34.5k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
34.5k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
34.5k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
34.5k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
34.5k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
34.5k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
34.5k
                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
34.5k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
34.5k
            }
885
540
        }
886
18
    }
887
18
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
158
{
815
158
    uint8_t s, b, qclass, ifreq;
816
158
    real_t tmp, coeff1, coeff2;
817
158
    real_t pan_base[MAX_PAN_BAND];
818
158
    real_t pan_delta[MAX_PAN_BAND];
819
158
    qmf_t temp_l, temp_r;
820
821
158
    if (ps->bs_enable_pan)
822
158
    {
823
10.2k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
10.1k
        {
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.1k
            ifreq = pan_inv_freq[b];
828
10.1k
            qclass = pan_quant_class[ifreq];
829
830
10.1k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.45k
            {
832
9.45k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.45k
            } else {
834
658
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
658
            }
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.1k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.44k
            {
841
8.44k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.35k
                {
843
8.35k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.35k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.35k
                } else {
846
94
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
94
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
94
                }
849
8.44k
            } else {
850
1.66k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.09k
                {
852
1.09k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.09k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.09k
                } else {
855
564
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
564
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
564
                }
858
1.66k
            }
859
10.1k
        }
860
861
4.89k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.74k
        {
863
            /* PAN always uses all 64 channels */
864
308k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
303k
            {
866
303k
                tmp = pan_base[b];
867
868
303k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
303k
                coeff1 = MUL_R(coeff2, tmp);
870
871
303k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
303k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
303k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
303k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
303k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
303k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
303k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
303k
                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
303k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
303k
            }
885
4.74k
        }
886
158
    }
887
158
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.44k
{
891
7.44k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.44k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.44k
    return ps;
896
7.44k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.44k
{
900
7.44k
    faad_free(ps);
901
7.44k
}
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
10
    {
908
10
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
10
        return 0;
910
10
    }
911
912
260
    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
259
    if (!guess)
923
138
    {
924
138
        ps->sa_decode_error = 0;
925
138
        ps->pan_decode_error = 0;
926
138
        drm_ps_delta_decode(ps);
927
138
    } else
928
121
    {
929
121
        ps->sa_decode_error = 1;
930
121
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
121
    }
933
934
259
    ps->drm_ps_data_available = 0;
935
936
259
    drm_calc_sa_side_signal(ps, X_left);
937
259
    drm_add_ambiance(ps, X_left, X_right);
938
939
259
    if (ps->bs_enable_sa)
940
117
    {
941
117
        ps->g_last_had_sa = 1;
942
943
117
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
142
    } else {
946
142
        ps->g_last_had_sa = 0;
947
142
    }
948
949
259
    if (ps->bs_enable_pan)
950
176
    {
951
176
        drm_add_pan(ps, X_left, X_right);
952
953
176
        ps->g_last_had_pan = 1;
954
955
176
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
176
    } else {
958
83
        ps->g_last_had_pan = 0;
959
83
    }
960
961
962
259
    return 0;
963
260
}
964
965
#endif