Coverage Report

Created: 2025-07-23 06:30

/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
831k
{
446
831k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
831k
    ps->drm_ps_data_available = 1;
449
450
831k
    ps->bs_enable_sa = faad_get1bit(ld);
451
831k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
831k
    if (ps->bs_enable_sa)
454
17.1k
    {
455
17.1k
        drm_ps_sa_element(ps, ld);
456
17.1k
    }
457
458
831k
    if (ps->bs_enable_pan)
459
15.9k
    {
460
15.9k
        drm_ps_pan_element(ps, ld);
461
15.9k
    }
462
463
831k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
831k
    return bits;
466
831k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
17.1k
{
470
17.1k
    drm_ps_huff_tab huff;
471
17.1k
    uint8_t band;
472
473
17.1k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
17.1k
    if (ps->bs_sa_dt_flag)
475
8.13k
    {
476
8.13k
        huff = t_huffman_sa;
477
8.98k
    } else {
478
8.98k
        huff = f_huffman_sa;
479
8.98k
    }
480
481
154k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
136k
    {
483
136k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
136k
    }
485
17.1k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
15.9k
{
489
15.9k
    drm_ps_huff_tab huff;
490
15.9k
    uint8_t band;
491
492
15.9k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
15.9k
    if (ps->bs_pan_dt_flag)
494
4.86k
    {
495
4.86k
        huff = t_huffman_pan;
496
11.0k
    } else {
497
11.0k
        huff = f_huffman_pan;
498
11.0k
    }
499
500
334k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
318k
    {
502
318k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
318k
    }
504
15.9k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
455k
{
509
455k
    uint8_t bit;
510
455k
    int8_t index = 0;
511
512
1.26M
    while (index >= 0)
513
813k
    {
514
813k
        bit = (uint8_t)faad_get1bit(ld);
515
813k
        index = huff[index][bit];
516
813k
    }
517
518
455k
    return index + 15;
519
455k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
696
{
524
696
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
163
        ps->sa_decode_error = 1;
527
163
        return 0;
528
533
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
71
        ps->sa_decode_error = 1;
531
71
        return 7;
532
71
    } else
533
462
        return i;
534
696
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.16k
{
538
2.16k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
205
        ps->pan_decode_error = 1;
541
205
        return -7;
542
1.95k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
225
        ps->pan_decode_error = 1;
545
225
        return 7;
546
225
    } else
547
1.73k
        return i;
548
2.16k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
134
{
552
134
    uint8_t band;
553
554
134
    if (ps->bs_enable_sa)
555
110
    {
556
110
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
23
        {
558
            /* wait until we get a DT frame */
559
23
            ps->bs_enable_sa = 0;
560
87
        } 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
69
        } else {
564
            /* DF always decodable */
565
69
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
69
        }
567
568
880
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
770
        {
570
770
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
126
            {
572
126
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
644
            } else if (!ps->bs_sa_dt_flag) {
574
483
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
483
            }
576
770
        }
577
110
    }
578
579
    /* An error during SA decoding implies PAN data will be undecodable, too */
580
    /* Also, we don't like on/off switching in PS, so we force to last settings */
581
134
    if (ps->sa_decode_error) {
582
60
        ps->pan_decode_error = 1;
583
60
        ps->bs_enable_pan = ps->g_last_had_pan;
584
60
        ps->bs_enable_sa = ps->g_last_had_sa;
585
60
    }
586
587
588
134
    if (ps->bs_enable_sa)
589
61
    {
590
61
        if (ps->sa_decode_error) {
591
306
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
272
            {
593
272
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
272
            }
595
34
        } else {
596
243
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
216
            {
598
216
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
216
            }
600
27
        }
601
61
    }
602
603
134
    if (ps->bs_enable_pan)
604
112
    {
605
112
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
4
        {
607
4
            ps->bs_enable_pan = 0;
608
108
        }  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
70
        } else {
611
70
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
70
        }
613
614
2.24k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.12k
        {
616
2.12k
            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.40k
            } else if (!ps->bs_pan_dt_flag) {
620
1.33k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.33k
            }
622
2.12k
        }
623
624
112
        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
945
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
900
            {
632
900
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
900
            }
634
45
        }
635
112
    }
636
134
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
258
{
640
258
    uint8_t s, b, k;
641
258
    complex_t qfrac, tmp0, tmp, in, R0;
642
258
    real_t peakdiff;
643
258
    real_t nrg;
644
258
    real_t power;
645
258
    real_t transratio;
646
258
    real_t new_delay_slopes[NUM_OF_LINKS];
647
258
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
258
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.19k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.93k
    {
655
        /* set delay indices */
656
23.7k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
17.8k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.93k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.93k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
183k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
178k
        {
664
178k
            const real_t gamma = REAL_CONST(1.5);
665
178k
            const real_t sigma = REAL_CONST(1.5625);
666
667
178k
            RE(in) = QMF_RE(X[s][b]);
668
178k
            IM(in) = QMF_IM(X[s][b]);
669
670
#ifdef FIXED_POINT
671
            /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672
            * meaning that P will be scaled by 2^(-10) compared to floating point version
673
            */
674
26.2k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
26.2k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
151k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
178k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
178k
            if (ps->peakdecay_fast[b] < power)
683
11.8k
                ps->peakdecay_fast[b] = power;
684
685
178k
            peakdiff = ps->prev_peakdiff[b];
686
178k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
178k
            ps->prev_peakdiff[b] = peakdiff;
688
689
178k
            nrg = ps->prev_nrg[b];
690
178k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
178k
            ps->prev_nrg[b] = nrg;
692
693
178k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
169k
                transratio = sigma;
695
169k
            } else {
696
8.57k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
8.57k
            }
698
699
712k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
534k
            {
701
534k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
534k
            }
703
704
178k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
178k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
178k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
178k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
178k
            RE(ps->d_buff[1][b]) = RE(in);
711
178k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
178k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
178k
            RE(R0) = RE(tmp);
716
178k
            IM(R0) = IM(tmp);
717
718
712k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
534k
            {
720
534k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
534k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
534k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
534k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
534k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
534k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
534k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
534k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
534k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
534k
                RE(R0) = RE(tmp);
735
534k
                IM(R0) = IM(tmp);
736
534k
            }
737
738
178k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
178k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
712k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
534k
            {
743
534k
                if (++temp_delay_ser[k] >= delay_length[k])
744
138k
                    temp_delay_ser[k] = 0;
745
534k
            }
746
178k
        }
747
5.93k
    }
748
749
1.03k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
774
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
258
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
38
{
640
38
    uint8_t s, b, k;
641
38
    complex_t qfrac, tmp0, tmp, in, R0;
642
38
    real_t peakdiff;
643
38
    real_t nrg;
644
38
    real_t power;
645
38
    real_t transratio;
646
38
    real_t new_delay_slopes[NUM_OF_LINKS];
647
38
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
38
    complex_t Phi_Fract;
649
38
#ifdef FIXED_POINT
650
38
    uint32_t in_re, in_im;
651
38
#endif
652
653
912
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
874
    {
655
        /* set delay indices */
656
3.49k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
2.62k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
874
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
874
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
27.0k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
26.2k
        {
664
26.2k
            const real_t gamma = REAL_CONST(1.5);
665
26.2k
            const real_t sigma = REAL_CONST(1.5625);
666
667
26.2k
            RE(in) = QMF_RE(X[s][b]);
668
26.2k
            IM(in) = QMF_IM(X[s][b]);
669
670
26.2k
#ifdef FIXED_POINT
671
            /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672
            * meaning that P will be scaled by 2^(-10) compared to floating point version
673
            */
674
26.2k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
26.2k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
26.2k
            power = in_re*in_re + in_im*in_im;
677
#else
678
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
26.2k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
26.2k
            if (ps->peakdecay_fast[b] < power)
683
3.38k
                ps->peakdecay_fast[b] = power;
684
685
26.2k
            peakdiff = ps->prev_peakdiff[b];
686
26.2k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
26.2k
            ps->prev_peakdiff[b] = peakdiff;
688
689
26.2k
            nrg = ps->prev_nrg[b];
690
26.2k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
26.2k
            ps->prev_nrg[b] = nrg;
692
693
26.2k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
24.6k
                transratio = sigma;
695
24.6k
            } else {
696
1.57k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
1.57k
            }
698
699
104k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
78.6k
            {
701
78.6k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
78.6k
            }
703
704
26.2k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
26.2k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
26.2k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
26.2k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
26.2k
            RE(ps->d_buff[1][b]) = RE(in);
711
26.2k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
26.2k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
26.2k
            RE(R0) = RE(tmp);
716
26.2k
            IM(R0) = IM(tmp);
717
718
104k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
78.6k
            {
720
78.6k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
78.6k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
78.6k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
78.6k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
78.6k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
78.6k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
78.6k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
78.6k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
78.6k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
78.6k
                RE(R0) = RE(tmp);
735
78.6k
                IM(R0) = IM(tmp);
736
78.6k
            }
737
738
26.2k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
26.2k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
104k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
78.6k
            {
743
78.6k
                if (++temp_delay_ser[k] >= delay_length[k])
744
20.2k
                    temp_delay_ser[k] = 0;
745
78.6k
            }
746
26.2k
        }
747
874
    }
748
749
152
    for (k = 0; k < NUM_OF_LINKS; k++)
750
114
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
38
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
220
{
640
220
    uint8_t s, b, k;
641
220
    complex_t qfrac, tmp0, tmp, in, R0;
642
220
    real_t peakdiff;
643
220
    real_t nrg;
644
220
    real_t power;
645
220
    real_t transratio;
646
220
    real_t new_delay_slopes[NUM_OF_LINKS];
647
220
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
220
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.28k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.06k
    {
655
        /* set delay indices */
656
20.2k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
15.1k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.06k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.06k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
156k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
151k
        {
664
151k
            const real_t gamma = REAL_CONST(1.5);
665
151k
            const real_t sigma = REAL_CONST(1.5625);
666
667
151k
            RE(in) = QMF_RE(X[s][b]);
668
151k
            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
151k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
151k
#endif
680
681
151k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
151k
            if (ps->peakdecay_fast[b] < power)
683
8.44k
                ps->peakdecay_fast[b] = power;
684
685
151k
            peakdiff = ps->prev_peakdiff[b];
686
151k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
151k
            ps->prev_peakdiff[b] = peakdiff;
688
689
151k
            nrg = ps->prev_nrg[b];
690
151k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
151k
            ps->prev_nrg[b] = nrg;
692
693
151k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
144k
                transratio = sigma;
695
144k
            } else {
696
7.00k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.00k
            }
698
699
607k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
455k
            {
701
455k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
455k
            }
703
704
151k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
151k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
151k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
151k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
151k
            RE(ps->d_buff[1][b]) = RE(in);
711
151k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
151k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
151k
            RE(R0) = RE(tmp);
716
151k
            IM(R0) = IM(tmp);
717
718
607k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
455k
            {
720
455k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
455k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
455k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
455k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
455k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
455k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
455k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
455k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
455k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
455k
                RE(R0) = RE(tmp);
735
455k
                IM(R0) = IM(tmp);
736
455k
            }
737
738
151k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
151k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
607k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
455k
            {
743
455k
                if (++temp_delay_ser[k] >= delay_length[k])
744
118k
                    temp_delay_ser[k] = 0;
745
455k
            }
746
151k
        }
747
5.06k
    }
748
749
880
    for (k = 0; k < NUM_OF_LINKS; k++)
750
660
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
220
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
258
{
755
258
    uint8_t s, b, ifreq, qclass;
756
258
    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
258
    real_t new_dir_map, new_sa_map;
758
759
258
    if (ps->bs_enable_sa)
760
126
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
3.02k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.89k
        {
765
2.89k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.89k
            ifreq = sa_inv_freq[b];
768
2.89k
            qclass = (b != 0);
769
770
2.89k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.89k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.89k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.89k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.89k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.89k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.89k
        }
781
782
3.90k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.78k
        {
784
90.7k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
86.9k
            {
786
86.9k
                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
86.9k
                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
86.9k
                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
86.9k
                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
86.9k
                sa_map[b]     += k_sa_map[b];
792
86.9k
                sa_dir_map[b] += k_sa_dir_map[b];
793
86.9k
            }
794
158k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
154k
            {
796
154k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
154k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
154k
            }
799
3.78k
        }
800
126
    }
801
132
    else {
802
4.09k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.96k
        {
804
257k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
253k
            {
806
253k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
253k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
253k
            }
809
3.96k
        }
810
132
    }
811
258
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
38
{
755
38
    uint8_t s, b, ifreq, qclass;
756
38
    real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND];
757
38
    real_t new_dir_map, new_sa_map;
758
759
38
    if (ps->bs_enable_sa)
760
21
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
504
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
483
        {
765
483
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
483
            ifreq = sa_inv_freq[b];
768
483
            qclass = (b != 0);
769
770
483
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
483
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
483
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
483
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
483
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
483
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
483
        }
781
782
651
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
630
        {
784
15.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
14.4k
            {
786
14.4k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
14.4k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
14.4k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
14.4k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
14.4k
                sa_map[b]     += k_sa_map[b];
792
14.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
14.4k
            }
794
26.4k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
25.8k
            {
796
25.8k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
25.8k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
25.8k
            }
799
630
        }
800
21
    }
801
17
    else {
802
527
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
510
        {
804
33.1k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
32.6k
            {
806
32.6k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
32.6k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
32.6k
            }
809
510
        }
810
17
    }
811
38
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
220
{
755
220
    uint8_t s, b, ifreq, qclass;
756
220
    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
220
    real_t new_dir_map, new_sa_map;
758
759
220
    if (ps->bs_enable_sa)
760
105
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.52k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.41k
        {
765
2.41k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.41k
            ifreq = sa_inv_freq[b];
768
2.41k
            qclass = (b != 0);
769
770
2.41k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.41k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.41k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.41k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.41k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.41k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.41k
        }
781
782
3.25k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.15k
        {
784
75.6k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
72.4k
            {
786
72.4k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
72.4k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
72.4k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
72.4k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
72.4k
                sa_map[b]     += k_sa_map[b];
792
72.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
72.4k
            }
794
132k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
129k
            {
796
129k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
129k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
129k
            }
799
3.15k
        }
800
105
    }
801
115
    else {
802
3.56k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.45k
        {
804
224k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
220k
            {
806
220k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
220k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
220k
            }
809
3.45k
        }
810
115
    }
811
220
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
173
{
815
173
    uint8_t s, b, qclass, ifreq;
816
173
    real_t tmp, coeff1, coeff2;
817
173
    real_t pan_base[MAX_PAN_BAND];
818
173
    real_t pan_delta[MAX_PAN_BAND];
819
173
    qmf_t temp_l, temp_r;
820
821
173
    if (ps->bs_enable_pan)
822
173
    {
823
11.2k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
11.0k
        {
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.0k
            ifreq = pan_inv_freq[b];
828
11.0k
            qclass = pan_quant_class[ifreq];
829
830
11.0k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
10.4k
            {
832
10.4k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
10.4k
            } else {
834
598
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
598
            }
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.0k
            if (ps->g_pan_index[ifreq] >= 0)
840
9.41k
            {
841
9.41k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.31k
                {
843
9.31k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.31k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.31k
                } 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.41k
            } else {
850
1.66k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.15k
                {
852
1.15k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.15k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.15k
                } else {
855
504
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
504
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
504
                }
858
1.66k
            }
859
11.0k
        }
860
861
5.36k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.19k
        {
863
            /* PAN always uses all 64 channels */
864
337k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
332k
            {
866
332k
                tmp = pan_base[b];
867
868
332k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
332k
                coeff1 = MUL_R(coeff2, tmp);
870
871
332k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
332k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
332k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
332k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
332k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
332k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
332k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
332k
                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
332k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
332k
            }
885
5.19k
        }
886
173
    }
887
173
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
18
{
815
18
    uint8_t s, b, qclass, ifreq;
816
18
    real_t tmp, coeff1, coeff2;
817
18
    real_t pan_base[MAX_PAN_BAND];
818
18
    real_t pan_delta[MAX_PAN_BAND];
819
18
    qmf_t temp_l, temp_r;
820
821
18
    if (ps->bs_enable_pan)
822
18
    {
823
1.17k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.15k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
1.15k
            ifreq = pan_inv_freq[b];
828
1.15k
            qclass = pan_quant_class[ifreq];
829
830
1.15k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.15k
            {
832
1.15k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.15k
            } else {
834
0
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
0
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
1.15k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.03k
            {
841
1.03k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.03k
                {
843
1.03k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.03k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.03k
                } 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.03k
            } 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.15k
        }
860
861
558
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
540
        {
863
            /* PAN always uses all 64 channels */
864
35.1k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
34.5k
            {
866
34.5k
                tmp = pan_base[b];
867
868
34.5k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
34.5k
                coeff1 = MUL_R(coeff2, tmp);
870
871
34.5k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
34.5k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
34.5k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
34.5k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
34.5k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
34.5k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
34.5k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
34.5k
                QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
880
881
                /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
882
                /*                   ^^^^^^^^^^^^^^^ k times */
883
34.5k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
34.5k
            }
885
540
        }
886
18
    }
887
18
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
155
{
815
155
    uint8_t s, b, qclass, ifreq;
816
155
    real_t tmp, coeff1, coeff2;
817
155
    real_t pan_base[MAX_PAN_BAND];
818
155
    real_t pan_delta[MAX_PAN_BAND];
819
155
    qmf_t temp_l, temp_r;
820
821
155
    if (ps->bs_enable_pan)
822
155
    {
823
10.0k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.92k
        {
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.92k
            ifreq = pan_inv_freq[b];
828
9.92k
            qclass = pan_quant_class[ifreq];
829
830
9.92k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.32k
            {
832
9.32k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.32k
            } else {
834
598
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
598
            }
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.92k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.37k
            {
841
8.37k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.28k
                {
843
8.28k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.28k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.28k
                } 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.37k
            } else {
850
1.54k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.03k
                {
852
1.03k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.03k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.03k
                } else {
855
504
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
504
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
504
                }
858
1.54k
            }
859
9.92k
        }
860
861
4.80k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.65k
        {
863
            /* PAN always uses all 64 channels */
864
302k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
297k
            {
866
297k
                tmp = pan_base[b];
867
868
297k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
297k
                coeff1 = MUL_R(coeff2, tmp);
870
871
297k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
297k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
297k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
297k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
297k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
297k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
297k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
297k
                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
297k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
297k
            }
885
4.65k
        }
886
155
    }
887
155
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.33k
{
891
7.33k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.33k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.33k
    return ps;
896
7.33k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.33k
{
900
7.33k
    faad_free(ps);
901
7.33k
}
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
268
{
906
268
    if (ps == NULL)
907
9
    {
908
9
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
9
        return 0;
910
9
    }
911
912
259
    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
258
    if (!guess)
923
134
    {
924
134
        ps->sa_decode_error = 0;
925
134
        ps->pan_decode_error = 0;
926
134
        drm_ps_delta_decode(ps);
927
134
    } else
928
124
    {
929
124
        ps->sa_decode_error = 1;
930
124
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
124
    }
933
934
258
    ps->drm_ps_data_available = 0;
935
936
258
    drm_calc_sa_side_signal(ps, X_left);
937
258
    drm_add_ambiance(ps, X_left, X_right);
938
939
258
    if (ps->bs_enable_sa)
940
126
    {
941
126
        ps->g_last_had_sa = 1;
942
943
126
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
132
    } else {
946
132
        ps->g_last_had_sa = 0;
947
132
    }
948
949
258
    if (ps->bs_enable_pan)
950
173
    {
951
173
        drm_add_pan(ps, X_left, X_right);
952
953
173
        ps->g_last_had_pan = 1;
954
955
173
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
173
    } else {
958
85
        ps->g_last_had_pan = 0;
959
85
    }
960
961
962
258
    return 0;
963
259
}
964
965
#endif