Coverage Report

Created: 2025-08-29 06:11

/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
878k
{
446
878k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
878k
    ps->drm_ps_data_available = 1;
449
450
878k
    ps->bs_enable_sa = faad_get1bit(ld);
451
878k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
878k
    if (ps->bs_enable_sa)
454
20.3k
    {
455
20.3k
        drm_ps_sa_element(ps, ld);
456
20.3k
    }
457
458
878k
    if (ps->bs_enable_pan)
459
17.9k
    {
460
17.9k
        drm_ps_pan_element(ps, ld);
461
17.9k
    }
462
463
878k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
878k
    return bits;
466
878k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
20.3k
{
470
20.3k
    drm_ps_huff_tab huff;
471
20.3k
    uint8_t band;
472
473
20.3k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
20.3k
    if (ps->bs_sa_dt_flag)
475
9.01k
    {
476
9.01k
        huff = t_huffman_sa;
477
11.3k
    } else {
478
11.3k
        huff = f_huffman_sa;
479
11.3k
    }
480
481
183k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
162k
    {
483
162k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
162k
    }
485
20.3k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
17.9k
{
489
17.9k
    drm_ps_huff_tab huff;
490
17.9k
    uint8_t band;
491
492
17.9k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
17.9k
    if (ps->bs_pan_dt_flag)
494
5.08k
    {
495
5.08k
        huff = t_huffman_pan;
496
12.8k
    } else {
497
12.8k
        huff = f_huffman_pan;
498
12.8k
    }
499
500
375k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
358k
    {
502
358k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
358k
    }
504
17.9k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
520k
{
509
520k
    uint8_t bit;
510
520k
    int8_t index = 0;
511
512
1.44M
    while (index >= 0)
513
928k
    {
514
928k
        bit = (uint8_t)faad_get1bit(ld);
515
928k
        index = huff[index][bit];
516
928k
    }
517
518
520k
    return index + 15;
519
520k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
672
{
524
672
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
180
        ps->sa_decode_error = 1;
527
180
        return 0;
528
492
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
68
        ps->sa_decode_error = 1;
531
68
        return 7;
532
68
    } else
533
424
        return i;
534
672
}
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
192
        ps->pan_decode_error = 1;
541
192
        return -7;
542
2.04k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
192
        ps->pan_decode_error = 1;
545
192
        return 7;
546
192
    } else
547
1.85k
        return i;
548
2.24k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
140
{
552
140
    uint8_t band;
553
554
140
    if (ps->bs_enable_sa)
555
112
    {
556
112
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
28
        {
558
            /* wait until we get a DT frame */
559
28
            ps->bs_enable_sa = 0;
560
84
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
18
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
66
        } else {
564
            /* DF always decodable */
565
66
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
66
        }
567
568
896
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
784
        {
570
784
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
126
            {
572
126
                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
462
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
462
            }
576
784
        }
577
112
    }
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
140
    if (ps->sa_decode_error) {
582
62
        ps->pan_decode_error = 1;
583
62
        ps->bs_enable_pan = ps->g_last_had_pan;
584
62
        ps->bs_enable_sa = ps->g_last_had_sa;
585
62
    }
586
587
588
140
    if (ps->bs_enable_sa)
589
53
    {
590
53
        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
198
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
176
            {
598
176
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
176
            }
600
22
        }
601
53
    }
602
603
140
    if (ps->bs_enable_pan)
604
117
    {
605
117
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
5
        {
607
5
            ps->bs_enable_pan = 0;
608
112
        }  else if (ps->bs_pan_dt_flag) {
609
38
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
74
        } else {
611
74
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
74
        }
613
614
2.34k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.22k
        {
616
2.22k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
722
            {
618
722
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.50k
            } else if (!ps->bs_pan_dt_flag) {
620
1.40k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.40k
            }
622
2.22k
        }
623
624
117
        if (ps->pan_decode_error) {
625
1.40k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.34k
            {
627
1.34k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.34k
            }
629
67
        } else {
630
1.05k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
1.00k
            {
632
1.00k
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
1.00k
            }
634
50
        }
635
117
    }
636
140
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
250
{
640
250
    uint8_t s, b, k;
641
250
    complex_t qfrac, tmp0, tmp, in, R0;
642
250
    real_t peakdiff;
643
250
    real_t nrg;
644
250
    real_t power;
645
250
    real_t transratio;
646
250
    real_t new_delay_slopes[NUM_OF_LINKS];
647
250
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
250
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.00k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.75k
    {
655
        /* set delay indices */
656
23.0k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
17.2k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.75k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.75k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
178k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
172k
        {
664
172k
            const real_t gamma = REAL_CONST(1.5);
665
172k
            const real_t sigma = REAL_CONST(1.5625);
666
667
172k
            RE(in) = QMF_RE(X[s][b]);
668
172k
            IM(in) = QMF_IM(X[s][b]);
669
670
#ifdef FIXED_POINT
671
            /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672
            * meaning that P will be scaled by 2^(-10) compared to floating point version
673
            */
674
19.3k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
19.3k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
153k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
172k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
172k
            if (ps->peakdecay_fast[b] < power)
683
9.98k
                ps->peakdecay_fast[b] = power;
684
685
172k
            peakdiff = ps->prev_peakdiff[b];
686
172k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
172k
            ps->prev_peakdiff[b] = peakdiff;
688
689
172k
            nrg = ps->prev_nrg[b];
690
172k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
172k
            ps->prev_nrg[b] = nrg;
692
693
172k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
165k
                transratio = sigma;
695
165k
            } else {
696
7.27k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.27k
            }
698
699
690k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
517k
            {
701
517k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
517k
            }
703
704
172k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
172k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
172k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
172k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
172k
            RE(ps->d_buff[1][b]) = RE(in);
711
172k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
172k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
172k
            RE(R0) = RE(tmp);
716
172k
            IM(R0) = IM(tmp);
717
718
690k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
517k
            {
720
517k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
517k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
517k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
517k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
517k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
517k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
517k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
517k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
517k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
517k
                RE(R0) = RE(tmp);
735
517k
                IM(R0) = IM(tmp);
736
517k
            }
737
738
172k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
172k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
690k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
517k
            {
743
517k
                if (++temp_delay_ser[k] >= delay_length[k])
744
134k
                    temp_delay_ser[k] = 0;
745
517k
            }
746
172k
        }
747
5.75k
    }
748
749
1.00k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
750
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
250
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
28
{
640
28
    uint8_t s, b, k;
641
28
    complex_t qfrac, tmp0, tmp, in, R0;
642
28
    real_t peakdiff;
643
28
    real_t nrg;
644
28
    real_t power;
645
28
    real_t transratio;
646
28
    real_t new_delay_slopes[NUM_OF_LINKS];
647
28
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
28
    complex_t Phi_Fract;
649
28
#ifdef FIXED_POINT
650
28
    uint32_t in_re, in_im;
651
28
#endif
652
653
672
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
644
    {
655
        /* set delay indices */
656
2.57k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
1.93k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
644
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
644
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
19.9k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
19.3k
        {
664
19.3k
            const real_t gamma = REAL_CONST(1.5);
665
19.3k
            const real_t sigma = REAL_CONST(1.5625);
666
667
19.3k
            RE(in) = QMF_RE(X[s][b]);
668
19.3k
            IM(in) = QMF_IM(X[s][b]);
669
670
19.3k
#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
19.3k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
19.3k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
19.3k
            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
19.3k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
19.3k
            if (ps->peakdecay_fast[b] < power)
683
3.25k
                ps->peakdecay_fast[b] = power;
684
685
19.3k
            peakdiff = ps->prev_peakdiff[b];
686
19.3k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
19.3k
            ps->prev_peakdiff[b] = peakdiff;
688
689
19.3k
            nrg = ps->prev_nrg[b];
690
19.3k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
19.3k
            ps->prev_nrg[b] = nrg;
692
693
19.3k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
18.2k
                transratio = sigma;
695
18.2k
            } else {
696
1.05k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
1.05k
            }
698
699
77.2k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
57.9k
            {
701
57.9k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
57.9k
            }
703
704
19.3k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
19.3k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
19.3k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
19.3k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
19.3k
            RE(ps->d_buff[1][b]) = RE(in);
711
19.3k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
19.3k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
19.3k
            RE(R0) = RE(tmp);
716
19.3k
            IM(R0) = IM(tmp);
717
718
77.2k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
57.9k
            {
720
57.9k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
57.9k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
57.9k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
57.9k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
57.9k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
57.9k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
57.9k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
57.9k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
57.9k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
57.9k
                RE(R0) = RE(tmp);
735
57.9k
                IM(R0) = IM(tmp);
736
57.9k
            }
737
738
19.3k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
19.3k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
77.2k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
57.9k
            {
743
57.9k
                if (++temp_delay_ser[k] >= delay_length[k])
744
14.8k
                    temp_delay_ser[k] = 0;
745
57.9k
            }
746
19.3k
        }
747
644
    }
748
749
112
    for (k = 0; k < NUM_OF_LINKS; k++)
750
84
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
28
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
222
{
640
222
    uint8_t s, b, k;
641
222
    complex_t qfrac, tmp0, tmp, in, R0;
642
222
    real_t peakdiff;
643
222
    real_t nrg;
644
222
    real_t power;
645
222
    real_t transratio;
646
222
    real_t new_delay_slopes[NUM_OF_LINKS];
647
222
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
222
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.32k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.10k
    {
655
        /* set delay indices */
656
20.4k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
15.3k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.10k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.10k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
158k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
153k
        {
664
153k
            const real_t gamma = REAL_CONST(1.5);
665
153k
            const real_t sigma = REAL_CONST(1.5625);
666
667
153k
            RE(in) = QMF_RE(X[s][b]);
668
153k
            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
153k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
153k
#endif
680
681
153k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
153k
            if (ps->peakdecay_fast[b] < power)
683
6.73k
                ps->peakdecay_fast[b] = power;
684
685
153k
            peakdiff = ps->prev_peakdiff[b];
686
153k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
153k
            ps->prev_peakdiff[b] = peakdiff;
688
689
153k
            nrg = ps->prev_nrg[b];
690
153k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
153k
            ps->prev_nrg[b] = nrg;
692
693
153k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
146k
                transratio = sigma;
695
146k
            } else {
696
6.21k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.21k
            }
698
699
612k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
459k
            {
701
459k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
459k
            }
703
704
153k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
153k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
153k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
153k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
153k
            RE(ps->d_buff[1][b]) = RE(in);
711
153k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
153k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
153k
            RE(R0) = RE(tmp);
716
153k
            IM(R0) = IM(tmp);
717
718
612k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
459k
            {
720
459k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
459k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
459k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
459k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
459k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
459k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
459k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
459k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
459k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
459k
                RE(R0) = RE(tmp);
735
459k
                IM(R0) = IM(tmp);
736
459k
            }
737
738
153k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
153k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
612k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
459k
            {
743
459k
                if (++temp_delay_ser[k] >= delay_length[k])
744
119k
                    temp_delay_ser[k] = 0;
745
459k
            }
746
153k
        }
747
5.10k
    }
748
749
888
    for (k = 0; k < NUM_OF_LINKS; k++)
750
666
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
222
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
250
{
755
250
    uint8_t s, b, ifreq, qclass;
756
250
    real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND];
757
250
    real_t new_dir_map, new_sa_map;
758
759
250
    if (ps->bs_enable_sa)
760
104
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.49k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.39k
        {
765
2.39k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.39k
            ifreq = sa_inv_freq[b];
768
2.39k
            qclass = (b != 0);
769
770
2.39k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.39k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.39k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.39k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.39k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.39k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.39k
        }
781
782
3.22k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.12k
        {
784
74.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
71.7k
            {
786
71.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
71.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
71.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
71.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
71.7k
                sa_map[b]     += k_sa_map[b];
792
71.7k
                sa_dir_map[b] += k_sa_dir_map[b];
793
71.7k
            }
794
131k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
127k
            {
796
127k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
127k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
127k
            }
799
3.12k
        }
800
104
    }
801
146
    else {
802
4.52k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.38k
        {
804
284k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
280k
            {
806
280k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
280k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
280k
            }
809
4.38k
        }
810
146
    }
811
250
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
28
{
755
28
    uint8_t s, b, ifreq, qclass;
756
28
    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
28
    real_t new_dir_map, new_sa_map;
758
759
28
    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
18
    else {
802
558
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
540
        {
804
35.1k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
34.5k
            {
806
34.5k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
34.5k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
34.5k
            }
809
540
        }
810
18
    }
811
28
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
222
{
755
222
    uint8_t s, b, ifreq, qclass;
756
222
    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
222
    real_t new_dir_map, new_sa_map;
758
759
222
    if (ps->bs_enable_sa)
760
94
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.25k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.16k
        {
765
2.16k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.16k
            ifreq = sa_inv_freq[b];
768
2.16k
            qclass = (b != 0);
769
770
2.16k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.16k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.16k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.16k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.16k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.16k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.16k
        }
781
782
2.91k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.82k
        {
784
67.6k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
64.8k
            {
786
64.8k
                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
64.8k
                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
64.8k
                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
64.8k
                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
64.8k
                sa_map[b]     += k_sa_map[b];
792
64.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
64.8k
            }
794
118k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
115k
            {
796
115k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
115k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
115k
            }
799
2.82k
        }
800
94
    }
801
128
    else {
802
3.96k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.84k
        {
804
249k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
245k
            {
806
245k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
245k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
245k
            }
809
3.84k
        }
810
128
    }
811
222
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
175
{
815
175
    uint8_t s, b, qclass, ifreq;
816
175
    real_t tmp, coeff1, coeff2;
817
175
    real_t pan_base[MAX_PAN_BAND];
818
175
    real_t pan_delta[MAX_PAN_BAND];
819
175
    qmf_t temp_l, temp_r;
820
821
175
    if (ps->bs_enable_pan)
822
175
    {
823
11.3k
        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
592
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
592
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
11.2k
            if (ps->g_pan_index[ifreq] >= 0)
840
9.50k
            {
841
9.50k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.43k
                {
843
9.43k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.43k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.43k
                } else {
846
69
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
69
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
69
                }
849
9.50k
            } else {
850
1.69k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.17k
                {
852
1.17k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.17k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.17k
                } else {
855
523
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
523
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
523
                }
858
1.69k
            }
859
11.2k
        }
860
861
5.42k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.25k
        {
863
            /* PAN always uses all 64 channels */
864
341k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
336k
            {
866
336k
                tmp = pan_base[b];
867
868
336k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
336k
                coeff1 = MUL_R(coeff2, tmp);
870
871
336k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
336k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
336k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
336k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
336k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
336k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
336k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
336k
                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
336k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
336k
            }
885
5.25k
        }
886
175
    }
887
175
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
15
{
815
15
    uint8_t s, b, qclass, ifreq;
816
15
    real_t tmp, coeff1, coeff2;
817
15
    real_t pan_base[MAX_PAN_BAND];
818
15
    real_t pan_delta[MAX_PAN_BAND];
819
15
    qmf_t temp_l, temp_r;
820
821
15
    if (ps->bs_enable_pan)
822
15
    {
823
975
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
960
        {
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
960
            ifreq = pan_inv_freq[b];
828
960
            qclass = pan_quant_class[ifreq];
829
830
960
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
960
            {
832
960
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
960
            } 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
960
            if (ps->g_pan_index[ifreq] >= 0)
840
842
            {
841
842
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
842
                {
843
842
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
842
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
842
                } 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
842
            } 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
960
        }
860
861
465
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
450
        {
863
            /* PAN always uses all 64 channels */
864
29.2k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
28.8k
            {
866
28.8k
                tmp = pan_base[b];
867
868
28.8k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
28.8k
                coeff1 = MUL_R(coeff2, tmp);
870
871
28.8k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
28.8k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
28.8k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
28.8k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
28.8k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
28.8k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
28.8k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
28.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
28.8k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
28.8k
            }
885
450
        }
886
15
    }
887
15
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
160
{
815
160
    uint8_t s, b, qclass, ifreq;
816
160
    real_t tmp, coeff1, coeff2;
817
160
    real_t pan_base[MAX_PAN_BAND];
818
160
    real_t pan_delta[MAX_PAN_BAND];
819
160
    qmf_t temp_l, temp_r;
820
821
160
    if (ps->bs_enable_pan)
822
160
    {
823
10.4k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
10.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
10.2k
            ifreq = pan_inv_freq[b];
828
10.2k
            qclass = pan_quant_class[ifreq];
829
830
10.2k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.64k
            {
832
9.64k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.64k
            } else {
834
592
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
592
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
10.2k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.66k
            {
841
8.66k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.59k
                {
843
8.59k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.59k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.59k
                } else {
846
69
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
69
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
69
                }
849
8.66k
            } else {
850
1.57k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.05k
                {
852
1.05k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.05k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.05k
                } else {
855
523
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
523
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
523
                }
858
1.57k
            }
859
10.2k
        }
860
861
4.96k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.80k
        {
863
            /* PAN always uses all 64 channels */
864
312k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
307k
            {
866
307k
                tmp = pan_base[b];
867
868
307k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
307k
                coeff1 = MUL_R(coeff2, tmp);
870
871
307k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
307k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
307k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
307k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
307k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
307k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
307k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
307k
                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
307k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
307k
            }
885
4.80k
        }
886
160
    }
887
160
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.46k
{
891
7.46k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.46k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.46k
    return ps;
896
7.46k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.46k
{
900
7.46k
    faad_free(ps);
901
7.46k
}
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
273
{
906
273
    if (ps == NULL)
907
22
    {
908
22
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
22
        return 0;
910
22
    }
911
912
251
    if (!ps->drm_ps_data_available && !guess)
913
1
    {
914
1
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
915
1
        memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index));
916
1
        memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index));
917
1
        return 0;
918
1
    }
919
920
    /* if SBR CRC doesn't match out, we can assume decode errors to start with,
921
       and we'll guess what the parameters should be */
922
250
    if (!guess)
923
140
    {
924
140
        ps->sa_decode_error = 0;
925
140
        ps->pan_decode_error = 0;
926
140
        drm_ps_delta_decode(ps);
927
140
    } else
928
110
    {
929
110
        ps->sa_decode_error = 1;
930
110
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
110
    }
933
934
250
    ps->drm_ps_data_available = 0;
935
936
250
    drm_calc_sa_side_signal(ps, X_left);
937
250
    drm_add_ambiance(ps, X_left, X_right);
938
939
250
    if (ps->bs_enable_sa)
940
104
    {
941
104
        ps->g_last_had_sa = 1;
942
943
104
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
146
    } else {
946
146
        ps->g_last_had_sa = 0;
947
146
    }
948
949
250
    if (ps->bs_enable_pan)
950
175
    {
951
175
        drm_add_pan(ps, X_left, X_right);
952
953
175
        ps->g_last_had_pan = 1;
954
955
175
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
175
    } else {
958
75
        ps->g_last_had_pan = 0;
959
75
    }
960
961
962
250
    return 0;
963
251
}
964
965
#endif