Coverage Report

Created: 2025-10-13 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
788k
{
446
788k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
788k
    ps->drm_ps_data_available = 1;
449
450
788k
    ps->bs_enable_sa = faad_get1bit(ld);
451
788k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
788k
    if (ps->bs_enable_sa)
454
16.2k
    {
455
16.2k
        drm_ps_sa_element(ps, ld);
456
16.2k
    }
457
458
788k
    if (ps->bs_enable_pan)
459
14.2k
    {
460
14.2k
        drm_ps_pan_element(ps, ld);
461
14.2k
    }
462
463
788k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
788k
    return bits;
466
788k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
16.2k
{
470
16.2k
    drm_ps_huff_tab huff;
471
16.2k
    uint8_t band;
472
473
16.2k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
16.2k
    if (ps->bs_sa_dt_flag)
475
7.02k
    {
476
7.02k
        huff = t_huffman_sa;
477
9.25k
    } else {
478
9.25k
        huff = f_huffman_sa;
479
9.25k
    }
480
481
146k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
130k
    {
483
130k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
130k
    }
485
16.2k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
14.2k
{
489
14.2k
    drm_ps_huff_tab huff;
490
14.2k
    uint8_t band;
491
492
14.2k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
14.2k
    if (ps->bs_pan_dt_flag)
494
4.18k
    {
495
4.18k
        huff = t_huffman_pan;
496
10.1k
    } else {
497
10.1k
        huff = f_huffman_pan;
498
10.1k
    }
499
500
300k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
285k
    {
502
285k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
285k
    }
504
14.2k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
416k
{
509
416k
    uint8_t bit;
510
416k
    int8_t index = 0;
511
512
1.18M
    while (index >= 0)
513
769k
    {
514
769k
        bit = (uint8_t)faad_get1bit(ld);
515
769k
        index = huff[index][bit];
516
769k
    }
517
518
416k
    return index + 15;
519
416k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
672
{
524
672
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
171
        ps->sa_decode_error = 1;
527
171
        return 0;
528
501
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
79
        ps->sa_decode_error = 1;
531
79
        return 7;
532
79
    } else
533
422
        return i;
534
672
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.18k
{
538
2.18k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
275
        ps->pan_decode_error = 1;
541
275
        return -7;
542
1.90k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
191
        ps->pan_decode_error = 1;
545
191
        return 7;
546
191
    } else
547
1.71k
        return i;
548
2.18k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
132
{
552
132
    uint8_t band;
553
554
132
    if (ps->bs_enable_sa)
555
112
    {
556
112
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
28
        {
558
            /* wait until we get a DT frame */
559
28
            ps->bs_enable_sa = 0;
560
84
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
16
            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
896
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
784
        {
570
784
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
112
            {
572
112
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
672
            } 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
784
        }
577
112
    }
578
579
    /* An error during SA decoding implies PAN data will be undecodable, too */
580
    /* Also, we don't like on/off switching in PS, so we force to last settings */
581
132
    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
132
    if (ps->bs_enable_sa)
589
54
    {
590
54
        if (ps->sa_decode_error) {
591
297
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
264
            {
593
264
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
264
            }
595
33
        } else {
596
189
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
168
            {
598
168
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
168
            }
600
21
        }
601
54
    }
602
603
132
    if (ps->bs_enable_pan)
604
113
    {
605
113
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
4
        {
607
4
            ps->bs_enable_pan = 0;
608
109
        }  else if (ps->bs_pan_dt_flag) {
609
39
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
70
        } else {
611
70
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
70
        }
613
614
2.26k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.14k
        {
616
2.14k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
741
            {
618
741
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.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.14k
        }
623
624
113
        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
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
113
    }
636
132
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
267
{
640
267
    uint8_t s, b, k;
641
267
    complex_t qfrac, tmp0, tmp, in, R0;
642
267
    real_t peakdiff;
643
267
    real_t nrg;
644
267
    real_t power;
645
267
    real_t transratio;
646
267
    real_t new_delay_slopes[NUM_OF_LINKS];
647
267
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
267
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.40k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.14k
    {
655
        /* set delay indices */
656
24.5k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
18.4k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.14k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.14k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
190k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
184k
        {
664
184k
            const real_t gamma = REAL_CONST(1.5);
665
184k
            const real_t sigma = REAL_CONST(1.5625);
666
667
184k
            RE(in) = QMF_RE(X[s][b]);
668
184k
            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
34.5k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
34.5k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
149k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
184k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
184k
            if (ps->peakdecay_fast[b] < power)
683
10.5k
                ps->peakdecay_fast[b] = power;
684
685
184k
            peakdiff = ps->prev_peakdiff[b];
686
184k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
184k
            ps->prev_peakdiff[b] = peakdiff;
688
689
184k
            nrg = ps->prev_nrg[b];
690
184k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
184k
            ps->prev_nrg[b] = nrg;
692
693
184k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
176k
                transratio = sigma;
695
176k
            } else {
696
7.84k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.84k
            }
698
699
736k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
552k
            {
701
552k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
552k
            }
703
704
184k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
184k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
184k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
184k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
184k
            RE(ps->d_buff[1][b]) = RE(in);
711
184k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
184k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
184k
            RE(R0) = RE(tmp);
716
184k
            IM(R0) = IM(tmp);
717
718
736k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
552k
            {
720
552k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
552k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
552k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
552k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
552k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
552k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
552k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
552k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
552k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
552k
                RE(R0) = RE(tmp);
735
552k
                IM(R0) = IM(tmp);
736
552k
            }
737
738
184k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
184k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
736k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
552k
            {
743
552k
                if (++temp_delay_ser[k] >= delay_length[k])
744
143k
                    temp_delay_ser[k] = 0;
745
552k
            }
746
184k
        }
747
6.14k
    }
748
749
1.06k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
801
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
267
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
50
{
640
50
    uint8_t s, b, k;
641
50
    complex_t qfrac, tmp0, tmp, in, R0;
642
50
    real_t peakdiff;
643
50
    real_t nrg;
644
50
    real_t power;
645
50
    real_t transratio;
646
50
    real_t new_delay_slopes[NUM_OF_LINKS];
647
50
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
50
    complex_t Phi_Fract;
649
50
#ifdef FIXED_POINT
650
50
    uint32_t in_re, in_im;
651
50
#endif
652
653
1.20k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.15k
    {
655
        /* set delay indices */
656
4.60k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
3.45k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.15k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.15k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
35.6k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
34.5k
        {
664
34.5k
            const real_t gamma = REAL_CONST(1.5);
665
34.5k
            const real_t sigma = REAL_CONST(1.5625);
666
667
34.5k
            RE(in) = QMF_RE(X[s][b]);
668
34.5k
            IM(in) = QMF_IM(X[s][b]);
669
670
34.5k
#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
34.5k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
34.5k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
34.5k
            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
34.5k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
34.5k
            if (ps->peakdecay_fast[b] < power)
683
3.70k
                ps->peakdecay_fast[b] = power;
684
685
34.5k
            peakdiff = ps->prev_peakdiff[b];
686
34.5k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
34.5k
            ps->prev_peakdiff[b] = peakdiff;
688
689
34.5k
            nrg = ps->prev_nrg[b];
690
34.5k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
34.5k
            ps->prev_nrg[b] = nrg;
692
693
34.5k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
32.9k
                transratio = sigma;
695
32.9k
            } else {
696
1.53k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
1.53k
            }
698
699
138k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
103k
            {
701
103k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
103k
            }
703
704
34.5k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
34.5k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
34.5k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
34.5k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
34.5k
            RE(ps->d_buff[1][b]) = RE(in);
711
34.5k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
34.5k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
34.5k
            RE(R0) = RE(tmp);
716
34.5k
            IM(R0) = IM(tmp);
717
718
138k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
103k
            {
720
103k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
103k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
103k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
103k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
103k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
103k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
103k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
103k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
103k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
103k
                RE(R0) = RE(tmp);
735
103k
                IM(R0) = IM(tmp);
736
103k
            }
737
738
34.5k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
34.5k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
138k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
103k
            {
743
103k
                if (++temp_delay_ser[k] >= delay_length[k])
744
26.6k
                    temp_delay_ser[k] = 0;
745
103k
            }
746
34.5k
        }
747
1.15k
    }
748
749
200
    for (k = 0; k < NUM_OF_LINKS; k++)
750
150
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
50
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
217
{
640
217
    uint8_t s, b, k;
641
217
    complex_t qfrac, tmp0, tmp, in, R0;
642
217
    real_t peakdiff;
643
217
    real_t nrg;
644
217
    real_t power;
645
217
    real_t transratio;
646
217
    real_t new_delay_slopes[NUM_OF_LINKS];
647
217
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
217
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.20k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.99k
    {
655
        /* set delay indices */
656
19.9k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.9k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.99k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.99k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
154k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
149k
        {
664
149k
            const real_t gamma = REAL_CONST(1.5);
665
149k
            const real_t sigma = REAL_CONST(1.5625);
666
667
149k
            RE(in) = QMF_RE(X[s][b]);
668
149k
            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
149k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
149k
#endif
680
681
149k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
149k
            if (ps->peakdecay_fast[b] < power)
683
6.82k
                ps->peakdecay_fast[b] = power;
684
685
149k
            peakdiff = ps->prev_peakdiff[b];
686
149k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
149k
            ps->prev_peakdiff[b] = peakdiff;
688
689
149k
            nrg = ps->prev_nrg[b];
690
149k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
149k
            ps->prev_nrg[b] = nrg;
692
693
149k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
143k
                transratio = sigma;
695
143k
            } else {
696
6.31k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.31k
            }
698
699
598k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
449k
            {
701
449k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
449k
            }
703
704
149k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
149k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
149k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
149k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
149k
            RE(ps->d_buff[1][b]) = RE(in);
711
149k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
149k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
149k
            RE(R0) = RE(tmp);
716
149k
            IM(R0) = IM(tmp);
717
718
598k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
449k
            {
720
449k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
449k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
449k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
449k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
449k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
449k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
449k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
449k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
449k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
449k
                RE(R0) = RE(tmp);
735
449k
                IM(R0) = IM(tmp);
736
449k
            }
737
738
149k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
149k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
598k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
449k
            {
743
449k
                if (++temp_delay_ser[k] >= delay_length[k])
744
116k
                    temp_delay_ser[k] = 0;
745
449k
            }
746
149k
        }
747
4.99k
    }
748
749
868
    for (k = 0; k < NUM_OF_LINKS; k++)
750
651
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
217
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
267
{
755
267
    uint8_t s, b, ifreq, qclass;
756
267
    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
267
    real_t new_dir_map, new_sa_map;
758
759
267
    if (ps->bs_enable_sa)
760
113
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.71k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.59k
        {
765
2.59k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.59k
            ifreq = sa_inv_freq[b];
768
2.59k
            qclass = (b != 0);
769
770
2.59k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.59k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.59k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.59k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.59k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.59k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.59k
        }
781
782
3.50k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.39k
        {
784
81.3k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
77.9k
            {
786
77.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
77.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
77.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
77.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
77.9k
                sa_map[b]     += k_sa_map[b];
792
77.9k
                sa_dir_map[b] += k_sa_dir_map[b];
793
77.9k
            }
794
142k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
138k
            {
796
138k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
138k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
138k
            }
799
3.39k
        }
800
113
    }
801
154
    else {
802
4.77k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.62k
        {
804
300k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
295k
            {
806
295k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
295k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
295k
            }
809
4.62k
        }
810
154
    }
811
267
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
50
{
755
50
    uint8_t s, b, ifreq, qclass;
756
50
    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
50
    real_t new_dir_map, new_sa_map;
758
759
50
    if (ps->bs_enable_sa)
760
23
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
552
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
529
        {
765
529
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
529
            ifreq = sa_inv_freq[b];
768
529
            qclass = (b != 0);
769
770
529
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
529
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
529
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
529
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
529
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
529
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
529
        }
781
782
713
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
690
        {
784
16.5k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
15.8k
            {
786
15.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
15.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
15.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
15.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
15.8k
                sa_map[b]     += k_sa_map[b];
792
15.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
15.8k
            }
794
28.9k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
28.2k
            {
796
28.2k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
28.2k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
28.2k
            }
799
690
        }
800
23
    }
801
27
    else {
802
837
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
810
        {
804
52.6k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
51.8k
            {
806
51.8k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
51.8k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
51.8k
            }
809
810
        }
810
27
    }
811
50
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
217
{
755
217
    uint8_t s, b, ifreq, qclass;
756
217
    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
217
    real_t new_dir_map, new_sa_map;
758
759
217
    if (ps->bs_enable_sa)
760
90
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.16k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.07k
        {
765
2.07k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.07k
            ifreq = sa_inv_freq[b];
768
2.07k
            qclass = (b != 0);
769
770
2.07k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.07k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.07k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.07k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.07k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.07k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.07k
        }
781
782
2.79k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.70k
        {
784
64.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
62.1k
            {
786
62.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
62.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
62.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
62.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
62.1k
                sa_map[b]     += k_sa_map[b];
792
62.1k
                sa_dir_map[b] += k_sa_dir_map[b];
793
62.1k
            }
794
113k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
110k
            {
796
110k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
110k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
110k
            }
799
2.70k
        }
800
90
    }
801
127
    else {
802
3.93k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.81k
        {
804
247k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
243k
            {
806
243k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
243k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
243k
            }
809
3.81k
        }
810
127
    }
811
217
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
188
{
815
188
    uint8_t s, b, qclass, ifreq;
816
188
    real_t tmp, coeff1, coeff2;
817
188
    real_t pan_base[MAX_PAN_BAND];
818
188
    real_t pan_delta[MAX_PAN_BAND];
819
188
    qmf_t temp_l, temp_r;
820
821
188
    if (ps->bs_enable_pan)
822
188
    {
823
12.2k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
12.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
12.0k
            ifreq = pan_inv_freq[b];
828
12.0k
            qclass = pan_quant_class[ifreq];
829
830
12.0k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
11.5k
            {
832
11.5k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
11.5k
            } else {
834
494
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
494
            }
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
12.0k
            if (ps->g_pan_index[ifreq] >= 0)
840
10.6k
            {
841
10.6k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
10.5k
                {
843
10.5k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
10.5k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
10.5k
                } else {
846
95
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
95
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
95
                }
849
10.6k
            } else {
850
1.42k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.02k
                {
852
1.02k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.02k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.02k
                } else {
855
399
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
399
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
399
                }
858
1.42k
            }
859
12.0k
        }
860
861
5.82k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.64k
        {
863
            /* PAN always uses all 64 channels */
864
366k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
360k
            {
866
360k
                tmp = pan_base[b];
867
868
360k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
360k
                coeff1 = MUL_R(coeff2, tmp);
870
871
360k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
360k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
360k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
360k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
360k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
360k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
360k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
360k
                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
360k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
360k
            }
885
5.64k
        }
886
188
    }
887
188
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
27
{
815
27
    uint8_t s, b, qclass, ifreq;
816
27
    real_t tmp, coeff1, coeff2;
817
27
    real_t pan_base[MAX_PAN_BAND];
818
27
    real_t pan_delta[MAX_PAN_BAND];
819
27
    qmf_t temp_l, temp_r;
820
821
27
    if (ps->bs_enable_pan)
822
27
    {
823
1.75k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.72k
        {
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.72k
            ifreq = pan_inv_freq[b];
828
1.72k
            qclass = pan_quant_class[ifreq];
829
830
1.72k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.72k
            {
832
1.72k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.72k
            } 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.72k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.67k
            {
841
1.67k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.67k
                {
843
1.67k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.67k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.67k
                } 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.67k
            } else {
850
50
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
50
                {
852
50
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
50
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
50
                } 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
50
            }
859
1.72k
        }
860
861
837
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
810
        {
863
            /* PAN always uses all 64 channels */
864
52.6k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
51.8k
            {
866
51.8k
                tmp = pan_base[b];
867
868
51.8k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
51.8k
                coeff1 = MUL_R(coeff2, tmp);
870
871
51.8k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
51.8k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
51.8k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
51.8k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
51.8k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
51.8k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
51.8k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
51.8k
                QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
880
881
                /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
882
                /*                   ^^^^^^^^^^^^^^^ k times */
883
51.8k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
51.8k
            }
885
810
        }
886
27
    }
887
27
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
161
{
815
161
    uint8_t s, b, qclass, ifreq;
816
161
    real_t tmp, coeff1, coeff2;
817
161
    real_t pan_base[MAX_PAN_BAND];
818
161
    real_t pan_delta[MAX_PAN_BAND];
819
161
    qmf_t temp_l, temp_r;
820
821
161
    if (ps->bs_enable_pan)
822
161
    {
823
10.4k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
10.3k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
10.3k
            ifreq = pan_inv_freq[b];
828
10.3k
            qclass = pan_quant_class[ifreq];
829
830
10.3k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.81k
            {
832
9.81k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.81k
            } else {
834
494
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
494
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
10.3k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.92k
            {
841
8.92k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.83k
                {
843
8.83k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.83k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.83k
                } else {
846
95
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
95
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
95
                }
849
8.92k
            } else {
850
1.37k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
977
                {
852
977
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
977
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
977
                } else {
855
399
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
399
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
399
                }
858
1.37k
            }
859
10.3k
        }
860
861
4.99k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.83k
        {
863
            /* PAN always uses all 64 channels */
864
313k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
309k
            {
866
309k
                tmp = pan_base[b];
867
868
309k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
309k
                coeff1 = MUL_R(coeff2, tmp);
870
871
309k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
309k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
309k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
309k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
309k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
309k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
309k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
309k
                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
309k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
309k
            }
885
4.83k
        }
886
161
    }
887
161
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.25k
{
891
7.25k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.25k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.25k
    return ps;
896
7.25k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.25k
{
900
7.25k
    faad_free(ps);
901
7.25k
}
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
274
{
906
274
    if (ps == NULL)
907
6
    {
908
6
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
6
        return 0;
910
6
    }
911
912
268
    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
267
    if (!guess)
923
132
    {
924
132
        ps->sa_decode_error = 0;
925
132
        ps->pan_decode_error = 0;
926
132
        drm_ps_delta_decode(ps);
927
132
    } else
928
135
    {
929
135
        ps->sa_decode_error = 1;
930
135
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
135
    }
933
934
267
    ps->drm_ps_data_available = 0;
935
936
267
    drm_calc_sa_side_signal(ps, X_left);
937
267
    drm_add_ambiance(ps, X_left, X_right);
938
939
267
    if (ps->bs_enable_sa)
940
113
    {
941
113
        ps->g_last_had_sa = 1;
942
943
113
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
154
    } else {
946
154
        ps->g_last_had_sa = 0;
947
154
    }
948
949
267
    if (ps->bs_enable_pan)
950
188
    {
951
188
        drm_add_pan(ps, X_left, X_right);
952
953
188
        ps->g_last_had_pan = 1;
954
955
188
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
188
    } else {
958
79
        ps->g_last_had_pan = 0;
959
79
    }
960
961
962
267
    return 0;
963
268
}
964
965
#endif