Coverage Report

Created: 2025-11-09 06:08

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
840k
{
446
840k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
840k
    ps->drm_ps_data_available = 1;
449
450
840k
    ps->bs_enable_sa = faad_get1bit(ld);
451
840k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
840k
    if (ps->bs_enable_sa)
454
16.9k
    {
455
16.9k
        drm_ps_sa_element(ps, ld);
456
16.9k
    }
457
458
840k
    if (ps->bs_enable_pan)
459
15.3k
    {
460
15.3k
        drm_ps_pan_element(ps, ld);
461
15.3k
    }
462
463
840k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
840k
    return bits;
466
840k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
16.9k
{
470
16.9k
    drm_ps_huff_tab huff;
471
16.9k
    uint8_t band;
472
473
16.9k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
16.9k
    if (ps->bs_sa_dt_flag)
475
7.60k
    {
476
7.60k
        huff = t_huffman_sa;
477
9.30k
    } else {
478
9.30k
        huff = f_huffman_sa;
479
9.30k
    }
480
481
152k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
135k
    {
483
135k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
135k
    }
485
16.9k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
15.3k
{
489
15.3k
    drm_ps_huff_tab huff;
490
15.3k
    uint8_t band;
491
492
15.3k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
15.3k
    if (ps->bs_pan_dt_flag)
494
4.48k
    {
495
4.48k
        huff = t_huffman_pan;
496
10.8k
    } else {
497
10.8k
        huff = f_huffman_pan;
498
10.8k
    }
499
500
322k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
306k
    {
502
306k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
306k
    }
504
15.3k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
442k
{
509
442k
    uint8_t bit;
510
442k
    int8_t index = 0;
511
512
1.26M
    while (index >= 0)
513
819k
    {
514
819k
        bit = (uint8_t)faad_get1bit(ld);
515
819k
        index = huff[index][bit];
516
819k
    }
517
518
442k
    return index + 15;
519
442k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
680
{
524
680
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
191
        ps->sa_decode_error = 1;
527
191
        return 0;
528
489
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
65
        ps->sa_decode_error = 1;
531
65
        return 7;
532
65
    } else
533
424
        return i;
534
680
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.06k
{
538
2.06k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
182
        ps->pan_decode_error = 1;
541
182
        return -7;
542
1.87k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
174
        ps->pan_decode_error = 1;
545
174
        return 7;
546
174
    } else
547
1.70k
        return i;
548
2.06k
}
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
104
    {
556
104
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
19
        {
558
            /* wait until we get a DT frame */
559
19
            ps->bs_enable_sa = 0;
560
85
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
17
            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
832
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
728
        {
570
728
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
119
            {
572
119
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
609
            } 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
728
        }
577
104
    }
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
59
    {
590
59
        if (ps->sa_decode_error) {
591
333
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
296
            {
593
296
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
296
            }
595
37
        } else {
596
198
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
176
            {
598
176
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
176
            }
600
22
        }
601
59
    }
602
603
132
    if (ps->bs_enable_pan)
604
108
    {
605
108
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
5
        {
607
5
            ps->bs_enable_pan = 0;
608
103
        }  else if (ps->bs_pan_dt_flag) {
609
34
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
69
        } else {
611
69
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
69
        }
613
614
2.16k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.05k
        {
616
2.05k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
646
            {
618
646
                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.31k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.31k
            }
622
2.05k
        }
623
624
108
        if (ps->pan_decode_error) {
625
1.23k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.18k
            {
627
1.18k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.18k
            }
629
59
        } else {
630
1.02k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
980
            {
632
980
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
980
            }
634
49
        }
635
108
    }
636
132
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
277
{
640
277
    uint8_t s, b, k;
641
277
    complex_t qfrac, tmp0, tmp, in, R0;
642
277
    real_t peakdiff;
643
277
    real_t nrg;
644
277
    real_t power;
645
277
    real_t transratio;
646
277
    real_t new_delay_slopes[NUM_OF_LINKS];
647
277
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
277
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.64k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.37k
    {
655
        /* set delay indices */
656
25.4k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
19.1k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.37k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.37k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
197k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
191k
        {
664
191k
            const real_t gamma = REAL_CONST(1.5);
665
191k
            const real_t sigma = REAL_CONST(1.5625);
666
667
191k
            RE(in) = QMF_RE(X[s][b]);
668
191k
            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
42.7k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
42.7k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
148k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
191k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
191k
            if (ps->peakdecay_fast[b] < power)
683
13.3k
                ps->peakdecay_fast[b] = power;
684
685
191k
            peakdiff = ps->prev_peakdiff[b];
686
191k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
191k
            ps->prev_peakdiff[b] = peakdiff;
688
689
191k
            nrg = ps->prev_nrg[b];
690
191k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
191k
            ps->prev_nrg[b] = nrg;
692
693
191k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
181k
                transratio = sigma;
695
181k
            } else {
696
10.0k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
10.0k
            }
698
699
764k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
573k
            {
701
573k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
573k
            }
703
704
191k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
191k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
191k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
191k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
191k
            RE(ps->d_buff[1][b]) = RE(in);
711
191k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
191k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
191k
            RE(R0) = RE(tmp);
716
191k
            IM(R0) = IM(tmp);
717
718
764k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
573k
            {
720
573k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
573k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
573k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
573k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
573k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
573k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
573k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
573k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
573k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
573k
                RE(R0) = RE(tmp);
735
573k
                IM(R0) = IM(tmp);
736
573k
            }
737
738
191k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
191k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
764k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
573k
            {
743
573k
                if (++temp_delay_ser[k] >= delay_length[k])
744
148k
                    temp_delay_ser[k] = 0;
745
573k
            }
746
191k
        }
747
6.37k
    }
748
749
1.10k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
831
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
277
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
62
{
640
62
    uint8_t s, b, k;
641
62
    complex_t qfrac, tmp0, tmp, in, R0;
642
62
    real_t peakdiff;
643
62
    real_t nrg;
644
62
    real_t power;
645
62
    real_t transratio;
646
62
    real_t new_delay_slopes[NUM_OF_LINKS];
647
62
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
62
    complex_t Phi_Fract;
649
62
#ifdef FIXED_POINT
650
62
    uint32_t in_re, in_im;
651
62
#endif
652
653
1.48k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.42k
    {
655
        /* set delay indices */
656
5.70k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
4.27k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.42k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.42k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
44.2k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
42.7k
        {
664
42.7k
            const real_t gamma = REAL_CONST(1.5);
665
42.7k
            const real_t sigma = REAL_CONST(1.5625);
666
667
42.7k
            RE(in) = QMF_RE(X[s][b]);
668
42.7k
            IM(in) = QMF_IM(X[s][b]);
669
670
42.7k
#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
42.7k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
42.7k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
42.7k
            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
42.7k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
42.7k
            if (ps->peakdecay_fast[b] < power)
683
5.36k
                ps->peakdecay_fast[b] = power;
684
685
42.7k
            peakdiff = ps->prev_peakdiff[b];
686
42.7k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
42.7k
            ps->prev_peakdiff[b] = peakdiff;
688
689
42.7k
            nrg = ps->prev_nrg[b];
690
42.7k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
42.7k
            ps->prev_nrg[b] = nrg;
692
693
42.7k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
40.2k
                transratio = sigma;
695
40.2k
            } else {
696
2.57k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.57k
            }
698
699
171k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
128k
            {
701
128k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
128k
            }
703
704
42.7k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
42.7k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
42.7k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
42.7k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
42.7k
            RE(ps->d_buff[1][b]) = RE(in);
711
42.7k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
42.7k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
42.7k
            RE(R0) = RE(tmp);
716
42.7k
            IM(R0) = IM(tmp);
717
718
171k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
128k
            {
720
128k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
128k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
128k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
128k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
128k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
128k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
128k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
128k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
128k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
128k
                RE(R0) = RE(tmp);
735
128k
                IM(R0) = IM(tmp);
736
128k
            }
737
738
42.7k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
42.7k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
171k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
128k
            {
743
128k
                if (++temp_delay_ser[k] >= delay_length[k])
744
32.8k
                    temp_delay_ser[k] = 0;
745
128k
            }
746
42.7k
        }
747
1.42k
    }
748
749
248
    for (k = 0; k < NUM_OF_LINKS; k++)
750
186
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
62
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
215
{
640
215
    uint8_t s, b, k;
641
215
    complex_t qfrac, tmp0, tmp, in, R0;
642
215
    real_t peakdiff;
643
215
    real_t nrg;
644
215
    real_t power;
645
215
    real_t transratio;
646
215
    real_t new_delay_slopes[NUM_OF_LINKS];
647
215
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
215
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.16k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.94k
    {
655
        /* set delay indices */
656
19.7k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.8k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.94k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.94k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
153k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
148k
        {
664
148k
            const real_t gamma = REAL_CONST(1.5);
665
148k
            const real_t sigma = REAL_CONST(1.5625);
666
667
148k
            RE(in) = QMF_RE(X[s][b]);
668
148k
            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
148k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
148k
#endif
680
681
148k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
148k
            if (ps->peakdecay_fast[b] < power)
683
8.00k
                ps->peakdecay_fast[b] = power;
684
685
148k
            peakdiff = ps->prev_peakdiff[b];
686
148k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
148k
            ps->prev_peakdiff[b] = peakdiff;
688
689
148k
            nrg = ps->prev_nrg[b];
690
148k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
148k
            ps->prev_nrg[b] = nrg;
692
693
148k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
140k
                transratio = sigma;
695
140k
            } else {
696
7.45k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.45k
            }
698
699
593k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
445k
            {
701
445k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
445k
            }
703
704
148k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
148k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
148k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
148k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
148k
            RE(ps->d_buff[1][b]) = RE(in);
711
148k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
148k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
148k
            RE(R0) = RE(tmp);
716
148k
            IM(R0) = IM(tmp);
717
718
593k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
445k
            {
720
445k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
445k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
445k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
445k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
445k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
445k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
445k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
445k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
445k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
445k
                RE(R0) = RE(tmp);
735
445k
                IM(R0) = IM(tmp);
736
445k
            }
737
738
148k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
148k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
593k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
445k
            {
743
445k
                if (++temp_delay_ser[k] >= delay_length[k])
744
115k
                    temp_delay_ser[k] = 0;
745
445k
            }
746
148k
        }
747
4.94k
    }
748
749
860
    for (k = 0; k < NUM_OF_LINKS; k++)
750
645
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
215
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
277
{
755
277
    uint8_t s, b, ifreq, qclass;
756
277
    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
277
    real_t new_dir_map, new_sa_map;
758
759
277
    if (ps->bs_enable_sa)
760
121
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.90k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.78k
        {
765
2.78k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.78k
            ifreq = sa_inv_freq[b];
768
2.78k
            qclass = (b != 0);
769
770
2.78k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.78k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.78k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.78k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.78k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.78k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.78k
        }
781
782
3.75k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.63k
        {
784
87.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
83.4k
            {
786
83.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
83.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
83.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
83.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
83.4k
                sa_map[b]     += k_sa_map[b];
792
83.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
83.4k
            }
794
152k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
148k
            {
796
148k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
148k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
148k
            }
799
3.63k
        }
800
121
    }
801
156
    else {
802
4.83k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.68k
        {
804
304k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
299k
            {
806
299k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
299k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
299k
            }
809
4.68k
        }
810
156
    }
811
277
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
62
{
755
62
    uint8_t s, b, ifreq, qclass;
756
62
    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
62
    real_t new_dir_map, new_sa_map;
758
759
62
    if (ps->bs_enable_sa)
760
18
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
432
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
414
        {
765
414
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
414
            ifreq = sa_inv_freq[b];
768
414
            qclass = (b != 0);
769
770
414
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
414
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
414
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
414
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
414
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
414
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
414
        }
781
782
558
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
540
        {
784
12.9k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
12.4k
            {
786
12.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
12.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
12.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
12.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
12.4k
                sa_map[b]     += k_sa_map[b];
792
12.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
12.4k
            }
794
22.6k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
22.1k
            {
796
22.1k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
22.1k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
22.1k
            }
799
540
        }
800
18
    }
801
44
    else {
802
1.36k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.32k
        {
804
85.8k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
84.4k
            {
806
84.4k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
84.4k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
84.4k
            }
809
1.32k
        }
810
44
    }
811
62
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
215
{
755
215
    uint8_t s, b, ifreq, qclass;
756
215
    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
215
    real_t new_dir_map, new_sa_map;
758
759
215
    if (ps->bs_enable_sa)
760
103
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.47k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.36k
        {
765
2.36k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.36k
            ifreq = sa_inv_freq[b];
768
2.36k
            qclass = (b != 0);
769
770
2.36k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.36k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.36k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.36k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.36k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.36k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.36k
        }
781
782
3.19k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.09k
        {
784
74.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
71.0k
            {
786
71.0k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
71.0k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
71.0k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
71.0k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
71.0k
                sa_map[b]     += k_sa_map[b];
792
71.0k
                sa_dir_map[b] += k_sa_dir_map[b];
793
71.0k
            }
794
129k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
126k
            {
796
126k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
126k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
126k
            }
799
3.09k
        }
800
103
    }
801
112
    else {
802
3.47k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.36k
        {
804
218k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
215k
            {
806
215k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
215k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
215k
            }
809
3.36k
        }
810
112
    }
811
215
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
189
{
815
189
    uint8_t s, b, qclass, ifreq;
816
189
    real_t tmp, coeff1, coeff2;
817
189
    real_t pan_base[MAX_PAN_BAND];
818
189
    real_t pan_delta[MAX_PAN_BAND];
819
189
    qmf_t temp_l, temp_r;
820
821
189
    if (ps->bs_enable_pan)
822
189
    {
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
543
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
543
            }
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.2k
            {
841
10.2k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
10.1k
                {
843
10.1k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
10.1k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
10.1k
                } else {
846
91
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
91
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
91
                }
849
10.2k
            } else {
850
1.86k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.41k
                {
852
1.41k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.41k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.41k
                } else {
855
452
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
452
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
452
                }
858
1.86k
            }
859
12.0k
        }
860
861
5.85k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.67k
        {
863
            /* PAN always uses all 64 channels */
864
368k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
362k
            {
866
362k
                tmp = pan_base[b];
867
868
362k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
362k
                coeff1 = MUL_R(coeff2, tmp);
870
871
362k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
362k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
362k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
362k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
362k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
362k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
362k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
362k
                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
362k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
362k
            }
885
5.67k
        }
886
189
    }
887
189
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
40
{
815
40
    uint8_t s, b, qclass, ifreq;
816
40
    real_t tmp, coeff1, coeff2;
817
40
    real_t pan_base[MAX_PAN_BAND];
818
40
    real_t pan_delta[MAX_PAN_BAND];
819
40
    qmf_t temp_l, temp_r;
820
821
40
    if (ps->bs_enable_pan)
822
40
    {
823
2.60k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
2.56k
        {
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
2.56k
            ifreq = pan_inv_freq[b];
828
2.56k
            qclass = pan_quant_class[ifreq];
829
830
2.56k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
2.56k
            {
832
2.56k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
2.56k
            } 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
2.56k
            if (ps->g_pan_index[ifreq] >= 0)
840
2.11k
            {
841
2.11k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
2.11k
                {
843
2.11k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
2.11k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
2.11k
                } 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
2.11k
            } else {
850
441
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
441
                {
852
441
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
441
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
441
                } 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
441
            }
859
2.56k
        }
860
861
1.24k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
1.20k
        {
863
            /* PAN always uses all 64 channels */
864
78.0k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
76.8k
            {
866
76.8k
                tmp = pan_base[b];
867
868
76.8k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
76.8k
                coeff1 = MUL_R(coeff2, tmp);
870
871
76.8k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
76.8k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
76.8k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
76.8k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
76.8k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
76.8k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
76.8k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
76.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
76.8k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
76.8k
            }
885
1.20k
        }
886
40
    }
887
40
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
149
{
815
149
    uint8_t s, b, qclass, ifreq;
816
149
    real_t tmp, coeff1, coeff2;
817
149
    real_t pan_base[MAX_PAN_BAND];
818
149
    real_t pan_delta[MAX_PAN_BAND];
819
149
    qmf_t temp_l, temp_r;
820
821
149
    if (ps->bs_enable_pan)
822
149
    {
823
9.68k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.53k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
9.53k
            ifreq = pan_inv_freq[b];
828
9.53k
            qclass = pan_quant_class[ifreq];
829
830
9.53k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
8.99k
            {
832
8.99k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
8.99k
            } else {
834
543
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
543
            }
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.53k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.10k
            {
841
8.10k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.01k
                {
843
8.01k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.01k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.01k
                } else {
846
91
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
91
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
91
                }
849
8.10k
            } else {
850
1.42k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
976
                {
852
976
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
976
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
976
                } else {
855
452
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
452
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
452
                }
858
1.42k
            }
859
9.53k
        }
860
861
4.61k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.47k
        {
863
            /* PAN always uses all 64 channels */
864
290k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
286k
            {
866
286k
                tmp = pan_base[b];
867
868
286k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
286k
                coeff1 = MUL_R(coeff2, tmp);
870
871
286k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
286k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
286k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
286k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
286k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
286k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
286k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
286k
                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
286k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
286k
            }
885
4.47k
        }
886
149
    }
887
149
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.37k
{
891
7.37k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.37k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.37k
    return ps;
896
7.37k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.37k
{
900
7.37k
    faad_free(ps);
901
7.37k
}
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
285
{
906
285
    if (ps == NULL)
907
7
    {
908
7
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
7
        return 0;
910
7
    }
911
912
278
    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
277
    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
145
    {
929
145
        ps->sa_decode_error = 1;
930
145
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
145
    }
933
934
277
    ps->drm_ps_data_available = 0;
935
936
277
    drm_calc_sa_side_signal(ps, X_left);
937
277
    drm_add_ambiance(ps, X_left, X_right);
938
939
277
    if (ps->bs_enable_sa)
940
121
    {
941
121
        ps->g_last_had_sa = 1;
942
943
121
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
156
    } else {
946
156
        ps->g_last_had_sa = 0;
947
156
    }
948
949
277
    if (ps->bs_enable_pan)
950
189
    {
951
189
        drm_add_pan(ps, X_left, X_right);
952
953
189
        ps->g_last_had_pan = 1;
954
955
189
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
189
    } else {
958
88
        ps->g_last_had_pan = 0;
959
88
    }
960
961
962
277
    return 0;
963
278
}
964
965
#endif