Coverage Report

Created: 2025-08-03 06:05

/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
824k
{
446
824k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
824k
    ps->drm_ps_data_available = 1;
449
450
824k
    ps->bs_enable_sa = faad_get1bit(ld);
451
824k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
824k
    if (ps->bs_enable_sa)
454
16.9k
    {
455
16.9k
        drm_ps_sa_element(ps, ld);
456
16.9k
    }
457
458
824k
    if (ps->bs_enable_pan)
459
15.1k
    {
460
15.1k
        drm_ps_pan_element(ps, ld);
461
15.1k
    }
462
463
824k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
824k
    return bits;
466
824k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
16.9k
{
470
16.9k
    drm_ps_huff_tab huff;
471
16.9k
    uint8_t band;
472
473
16.9k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
16.9k
    if (ps->bs_sa_dt_flag)
475
7.96k
    {
476
7.96k
        huff = t_huffman_sa;
477
8.98k
    } else {
478
8.98k
        huff = f_huffman_sa;
479
8.98k
    }
480
481
152k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
135k
    {
483
135k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
135k
    }
485
16.9k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
15.1k
{
489
15.1k
    drm_ps_huff_tab huff;
490
15.1k
    uint8_t band;
491
492
15.1k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
15.1k
    if (ps->bs_pan_dt_flag)
494
4.44k
    {
495
4.44k
        huff = t_huffman_pan;
496
10.6k
    } else {
497
10.6k
        huff = f_huffman_pan;
498
10.6k
    }
499
500
317k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
302k
    {
502
302k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
302k
    }
504
15.1k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
438k
{
509
438k
    uint8_t bit;
510
438k
    int8_t index = 0;
511
512
1.22M
    while (index >= 0)
513
790k
    {
514
790k
        bit = (uint8_t)faad_get1bit(ld);
515
790k
        index = huff[index][bit];
516
790k
    }
517
518
438k
    return index + 15;
519
438k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
704
{
524
704
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
183
        ps->sa_decode_error = 1;
527
183
        return 0;
528
521
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
67
        ps->sa_decode_error = 1;
531
67
        return 7;
532
67
    } else
533
454
        return i;
534
704
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.22k
{
538
2.22k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
199
        ps->pan_decode_error = 1;
541
199
        return -7;
542
2.02k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
197
        ps->pan_decode_error = 1;
545
197
        return 7;
546
197
    } else
547
1.82k
        return i;
548
2.22k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
141
{
552
141
    uint8_t band;
553
554
141
    if (ps->bs_enable_sa)
555
113
    {
556
113
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
25
        {
558
            /* wait until we get a DT frame */
559
25
            ps->bs_enable_sa = 0;
560
88
        } 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
68
        } else {
564
            /* DF always decodable */
565
68
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
68
        }
567
568
904
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
791
        {
570
791
            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
651
            } else if (!ps->bs_sa_dt_flag) {
574
476
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
476
            }
576
791
        }
577
113
    }
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
141
    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
141
    if (ps->bs_enable_sa)
589
60
    {
590
60
        if (ps->sa_decode_error) {
591
315
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
280
            {
593
280
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
280
            }
595
35
        } else {
596
225
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
200
            {
598
200
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
200
            }
600
25
        }
601
60
    }
602
603
141
    if (ps->bs_enable_pan)
604
116
    {
605
116
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
5
        {
607
5
            ps->bs_enable_pan = 0;
608
111
        }  else if (ps->bs_pan_dt_flag) {
609
36
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
75
        } else {
611
75
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
75
        }
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
684
            {
618
684
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.52k
            } else if (!ps->bs_pan_dt_flag) {
620
1.42k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.42k
            }
622
2.20k
        }
623
624
116
        if (ps->pan_decode_error) {
625
1.42k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.36k
            {
627
1.36k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.36k
            }
629
68
        } else {
630
1.00k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
960
            {
632
960
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
960
            }
634
48
        }
635
116
    }
636
141
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
269
{
640
269
    uint8_t s, b, k;
641
269
    complex_t qfrac, tmp0, tmp, in, R0;
642
269
    real_t peakdiff;
643
269
    real_t nrg;
644
269
    real_t power;
645
269
    real_t transratio;
646
269
    real_t new_delay_slopes[NUM_OF_LINKS];
647
269
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
269
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.45k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.18k
    {
655
        /* set delay indices */
656
24.7k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
18.5k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.18k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.18k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
191k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
185k
        {
664
185k
            const real_t gamma = REAL_CONST(1.5);
665
185k
            const real_t sigma = REAL_CONST(1.5625);
666
667
185k
            RE(in) = QMF_RE(X[s][b]);
668
185k
            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
30.3k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
30.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
155k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
185k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
185k
            if (ps->peakdecay_fast[b] < power)
683
12.1k
                ps->peakdecay_fast[b] = power;
684
685
185k
            peakdiff = ps->prev_peakdiff[b];
686
185k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
185k
            ps->prev_peakdiff[b] = peakdiff;
688
689
185k
            nrg = ps->prev_nrg[b];
690
185k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
185k
            ps->prev_nrg[b] = nrg;
692
693
185k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
176k
                transratio = sigma;
695
176k
            } else {
696
8.99k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
8.99k
            }
698
699
742k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
556k
            {
701
556k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
556k
            }
703
704
185k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
185k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
185k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
185k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
185k
            RE(ps->d_buff[1][b]) = RE(in);
711
185k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
185k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
185k
            RE(R0) = RE(tmp);
716
185k
            IM(R0) = IM(tmp);
717
718
742k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
556k
            {
720
556k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
556k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
556k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
556k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
556k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
556k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
556k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
556k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
556k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
556k
                RE(R0) = RE(tmp);
735
556k
                IM(R0) = IM(tmp);
736
556k
            }
737
738
185k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
185k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
742k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
556k
            {
743
556k
                if (++temp_delay_ser[k] >= delay_length[k])
744
144k
                    temp_delay_ser[k] = 0;
745
556k
            }
746
185k
        }
747
6.18k
    }
748
749
1.07k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
807
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
269
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
44
{
640
44
    uint8_t s, b, k;
641
44
    complex_t qfrac, tmp0, tmp, in, R0;
642
44
    real_t peakdiff;
643
44
    real_t nrg;
644
44
    real_t power;
645
44
    real_t transratio;
646
44
    real_t new_delay_slopes[NUM_OF_LINKS];
647
44
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
44
    complex_t Phi_Fract;
649
44
#ifdef FIXED_POINT
650
44
    uint32_t in_re, in_im;
651
44
#endif
652
653
1.05k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.01k
    {
655
        /* set delay indices */
656
4.04k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
3.03k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.01k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.01k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
31.3k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
30.3k
        {
664
30.3k
            const real_t gamma = REAL_CONST(1.5);
665
30.3k
            const real_t sigma = REAL_CONST(1.5625);
666
667
30.3k
            RE(in) = QMF_RE(X[s][b]);
668
30.3k
            IM(in) = QMF_IM(X[s][b]);
669
670
30.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
30.3k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
30.3k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
30.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
30.3k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
30.3k
            if (ps->peakdecay_fast[b] < power)
683
3.44k
                ps->peakdecay_fast[b] = power;
684
685
30.3k
            peakdiff = ps->prev_peakdiff[b];
686
30.3k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
30.3k
            ps->prev_peakdiff[b] = peakdiff;
688
689
30.3k
            nrg = ps->prev_nrg[b];
690
30.3k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
30.3k
            ps->prev_nrg[b] = nrg;
692
693
30.3k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
28.5k
                transratio = sigma;
695
28.5k
            } else {
696
1.78k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
1.78k
            }
698
699
121k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
91.0k
            {
701
91.0k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
91.0k
            }
703
704
30.3k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
30.3k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
30.3k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
30.3k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
30.3k
            RE(ps->d_buff[1][b]) = RE(in);
711
30.3k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
30.3k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
30.3k
            RE(R0) = RE(tmp);
716
30.3k
            IM(R0) = IM(tmp);
717
718
121k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
91.0k
            {
720
91.0k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
91.0k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
91.0k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
91.0k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
91.0k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
91.0k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
91.0k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
91.0k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
91.0k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
91.0k
                RE(R0) = RE(tmp);
735
91.0k
                IM(R0) = IM(tmp);
736
91.0k
            }
737
738
30.3k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
30.3k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
121k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
91.0k
            {
743
91.0k
                if (++temp_delay_ser[k] >= delay_length[k])
744
23.3k
                    temp_delay_ser[k] = 0;
745
91.0k
            }
746
30.3k
        }
747
1.01k
    }
748
749
176
    for (k = 0; k < NUM_OF_LINKS; k++)
750
132
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
44
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
225
{
640
225
    uint8_t s, b, k;
641
225
    complex_t qfrac, tmp0, tmp, in, R0;
642
225
    real_t peakdiff;
643
225
    real_t nrg;
644
225
    real_t power;
645
225
    real_t transratio;
646
225
    real_t new_delay_slopes[NUM_OF_LINKS];
647
225
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
225
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.40k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.17k
    {
655
        /* set delay indices */
656
20.7k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
15.5k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.17k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.17k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
160k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
155k
        {
664
155k
            const real_t gamma = REAL_CONST(1.5);
665
155k
            const real_t sigma = REAL_CONST(1.5625);
666
667
155k
            RE(in) = QMF_RE(X[s][b]);
668
155k
            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
155k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
155k
#endif
680
681
155k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
155k
            if (ps->peakdecay_fast[b] < power)
683
8.69k
                ps->peakdecay_fast[b] = power;
684
685
155k
            peakdiff = ps->prev_peakdiff[b];
686
155k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
155k
            ps->prev_peakdiff[b] = peakdiff;
688
689
155k
            nrg = ps->prev_nrg[b];
690
155k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
155k
            ps->prev_nrg[b] = nrg;
692
693
155k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
148k
                transratio = sigma;
695
148k
            } else {
696
7.21k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.21k
            }
698
699
621k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
465k
            {
701
465k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
465k
            }
703
704
155k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
155k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
155k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
155k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
155k
            RE(ps->d_buff[1][b]) = RE(in);
711
155k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
155k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
155k
            RE(R0) = RE(tmp);
716
155k
            IM(R0) = IM(tmp);
717
718
621k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
465k
            {
720
465k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
465k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
465k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
465k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
465k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
465k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
465k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
465k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
465k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
465k
                RE(R0) = RE(tmp);
735
465k
                IM(R0) = IM(tmp);
736
465k
            }
737
738
155k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
155k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
621k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
465k
            {
743
465k
                if (++temp_delay_ser[k] >= delay_length[k])
744
120k
                    temp_delay_ser[k] = 0;
745
465k
            }
746
155k
        }
747
5.17k
    }
748
749
900
    for (k = 0; k < NUM_OF_LINKS; k++)
750
675
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
225
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
269
{
755
269
    uint8_t s, b, ifreq, qclass;
756
269
    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
269
    real_t new_dir_map, new_sa_map;
758
759
269
    if (ps->bs_enable_sa)
760
123
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.95k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.82k
        {
765
2.82k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.82k
            ifreq = sa_inv_freq[b];
768
2.82k
            qclass = (b != 0);
769
770
2.82k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.82k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.82k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.82k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.82k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.82k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.82k
        }
781
782
3.81k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.69k
        {
784
88.5k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
84.8k
            {
786
84.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
84.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
84.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
84.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
84.8k
                sa_map[b]     += k_sa_map[b];
792
84.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
84.8k
            }
794
154k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
151k
            {
796
151k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
151k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
151k
            }
799
3.69k
        }
800
123
    }
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
269
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
44
{
755
44
    uint8_t s, b, ifreq, qclass;
756
44
    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
44
    real_t new_dir_map, new_sa_map;
758
759
44
    if (ps->bs_enable_sa)
760
22
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
528
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
506
        {
765
506
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
506
            ifreq = sa_inv_freq[b];
768
506
            qclass = (b != 0);
769
770
506
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
506
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
506
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
506
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
506
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
506
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
506
        }
781
782
682
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
660
        {
784
15.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
15.1k
            {
786
15.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
15.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
15.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
15.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
15.1k
                sa_map[b]     += k_sa_map[b];
792
15.1k
                sa_dir_map[b] += k_sa_dir_map[b];
793
15.1k
            }
794
27.7k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
27.0k
            {
796
27.0k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
27.0k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
27.0k
            }
799
660
        }
800
22
    }
801
22
    else {
802
682
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
660
        {
804
42.9k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
42.2k
            {
806
42.2k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
42.2k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
42.2k
            }
809
660
        }
810
22
    }
811
44
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
225
{
755
225
    uint8_t s, b, ifreq, qclass;
756
225
    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
225
    real_t new_dir_map, new_sa_map;
758
759
225
    if (ps->bs_enable_sa)
760
101
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.42k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.32k
        {
765
2.32k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.32k
            ifreq = sa_inv_freq[b];
768
2.32k
            qclass = (b != 0);
769
770
2.32k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.32k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.32k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.32k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.32k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.32k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.32k
        }
781
782
3.13k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.03k
        {
784
72.7k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
69.6k
            {
786
69.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
69.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
69.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
69.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
69.6k
                sa_map[b]     += k_sa_map[b];
792
69.6k
                sa_dir_map[b] += k_sa_dir_map[b];
793
69.6k
            }
794
127k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
124k
            {
796
124k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
124k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
124k
            }
799
3.03k
        }
800
101
    }
801
124
    else {
802
3.84k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.72k
        {
804
241k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
238k
            {
806
238k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
238k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
238k
            }
809
3.72k
        }
810
124
    }
811
225
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
180
{
815
180
    uint8_t s, b, qclass, ifreq;
816
180
    real_t tmp, coeff1, coeff2;
817
180
    real_t pan_base[MAX_PAN_BAND];
818
180
    real_t pan_delta[MAX_PAN_BAND];
819
180
    qmf_t temp_l, temp_r;
820
821
180
    if (ps->bs_enable_pan)
822
180
    {
823
11.7k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
11.5k
        {
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.5k
            ifreq = pan_inv_freq[b];
828
11.5k
            qclass = pan_quant_class[ifreq];
829
830
11.5k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
10.9k
            {
832
10.9k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
10.9k
            } else {
834
609
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
609
            }
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.5k
            if (ps->g_pan_index[ifreq] >= 0)
840
9.84k
            {
841
9.84k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.74k
                {
843
9.74k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.74k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.74k
                } 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.84k
            } else {
850
1.67k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.16k
                {
852
1.16k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.16k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.16k
                } else {
855
515
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
515
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
515
                }
858
1.67k
            }
859
11.5k
        }
860
861
5.58k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.40k
        {
863
            /* PAN always uses all 64 channels */
864
351k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
345k
            {
866
345k
                tmp = pan_base[b];
867
868
345k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
345k
                coeff1 = MUL_R(coeff2, tmp);
870
871
345k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
345k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
345k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
345k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
345k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
345k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
345k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
345k
                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
345k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
345k
            }
885
5.40k
        }
886
180
    }
887
180
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
24
{
815
24
    uint8_t s, b, qclass, ifreq;
816
24
    real_t tmp, coeff1, coeff2;
817
24
    real_t pan_base[MAX_PAN_BAND];
818
24
    real_t pan_delta[MAX_PAN_BAND];
819
24
    qmf_t temp_l, temp_r;
820
821
24
    if (ps->bs_enable_pan)
822
24
    {
823
1.56k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.53k
        {
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.53k
            ifreq = pan_inv_freq[b];
828
1.53k
            qclass = pan_quant_class[ifreq];
829
830
1.53k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.53k
            {
832
1.53k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.53k
            } 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.53k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.41k
            {
841
1.41k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.41k
                {
843
1.41k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.41k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.41k
                } 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
1.41k
            } 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
1.53k
        }
860
861
744
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
720
        {
863
            /* PAN always uses all 64 channels */
864
46.8k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
46.0k
            {
866
46.0k
                tmp = pan_base[b];
867
868
46.0k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
46.0k
                coeff1 = MUL_R(coeff2, tmp);
870
871
46.0k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
46.0k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
46.0k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
46.0k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
46.0k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
46.0k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
46.0k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
46.0k
                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
46.0k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
46.0k
            }
885
720
        }
886
24
    }
887
24
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
156
{
815
156
    uint8_t s, b, qclass, ifreq;
816
156
    real_t tmp, coeff1, coeff2;
817
156
    real_t pan_base[MAX_PAN_BAND];
818
156
    real_t pan_delta[MAX_PAN_BAND];
819
156
    qmf_t temp_l, temp_r;
820
821
156
    if (ps->bs_enable_pan)
822
156
    {
823
10.1k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.98k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
9.98k
            ifreq = pan_inv_freq[b];
828
9.98k
            qclass = pan_quant_class[ifreq];
829
830
9.98k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.37k
            {
832
9.37k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.37k
            } else {
834
609
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
609
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
9.98k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.42k
            {
841
8.42k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.32k
                {
843
8.32k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.32k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.32k
                } 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.42k
            } else {
850
1.56k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.04k
                {
852
1.04k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.04k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.04k
                } else {
855
515
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
515
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
515
                }
858
1.56k
            }
859
9.98k
        }
860
861
4.83k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.68k
        {
863
            /* PAN always uses all 64 channels */
864
304k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
299k
            {
866
299k
                tmp = pan_base[b];
867
868
299k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
299k
                coeff1 = MUL_R(coeff2, tmp);
870
871
299k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
299k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
299k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
299k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
299k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
299k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
299k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
299k
                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
299k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
299k
            }
885
4.68k
        }
886
156
    }
887
156
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.59k
{
891
7.59k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.59k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.59k
    return ps;
896
7.59k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.59k
{
900
7.59k
    faad_free(ps);
901
7.59k
}
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
281
{
906
281
    if (ps == NULL)
907
11
    {
908
11
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
11
        return 0;
910
11
    }
911
912
270
    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
269
    if (!guess)
923
141
    {
924
141
        ps->sa_decode_error = 0;
925
141
        ps->pan_decode_error = 0;
926
141
        drm_ps_delta_decode(ps);
927
141
    } else
928
128
    {
929
128
        ps->sa_decode_error = 1;
930
128
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
128
    }
933
934
269
    ps->drm_ps_data_available = 0;
935
936
269
    drm_calc_sa_side_signal(ps, X_left);
937
269
    drm_add_ambiance(ps, X_left, X_right);
938
939
269
    if (ps->bs_enable_sa)
940
123
    {
941
123
        ps->g_last_had_sa = 1;
942
943
123
        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
269
    if (ps->bs_enable_pan)
950
180
    {
951
180
        drm_add_pan(ps, X_left, X_right);
952
953
180
        ps->g_last_had_pan = 1;
954
955
180
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
180
    } else {
958
89
        ps->g_last_had_pan = 0;
959
89
    }
960
961
962
269
    return 0;
963
270
}
964
965
#endif