Coverage Report

Created: 2026-01-17 06:46

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
909k
{
446
909k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
909k
    ps->drm_ps_data_available = 1;
449
450
909k
    ps->bs_enable_sa = faad_get1bit(ld);
451
909k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
909k
    if (ps->bs_enable_sa)
454
16.8k
    {
455
16.8k
        drm_ps_sa_element(ps, ld);
456
16.8k
    }
457
458
909k
    if (ps->bs_enable_pan)
459
14.2k
    {
460
14.2k
        drm_ps_pan_element(ps, ld);
461
14.2k
    }
462
463
909k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
909k
    return bits;
466
909k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
16.8k
{
470
16.8k
    drm_ps_huff_tab huff;
471
16.8k
    uint8_t band;
472
473
16.8k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
16.8k
    if (ps->bs_sa_dt_flag)
475
8.32k
    {
476
8.32k
        huff = t_huffman_sa;
477
8.54k
    } else {
478
8.54k
        huff = f_huffman_sa;
479
8.54k
    }
480
481
151k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
134k
    {
483
134k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
134k
    }
485
16.8k
}
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
3.92k
    {
495
3.92k
        huff = t_huffman_pan;
496
10.3k
    } else {
497
10.3k
        huff = f_huffman_pan;
498
10.3k
    }
499
500
299k
    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
420k
{
509
420k
    uint8_t bit;
510
420k
    int8_t index = 0;
511
512
1.19M
    while (index >= 0)
513
774k
    {
514
774k
        bit = (uint8_t)faad_get1bit(ld);
515
774k
        index = huff[index][bit];
516
774k
    }
517
518
420k
    return index + 15;
519
420k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
648
{
524
648
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
179
        ps->sa_decode_error = 1;
527
179
        return 0;
528
469
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
68
        ps->sa_decode_error = 1;
531
68
        return 7;
532
68
    } else
533
401
        return i;
534
648
}
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
222
        ps->pan_decode_error = 1;
541
222
        return -7;
542
1.95k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
218
        ps->pan_decode_error = 1;
545
218
        return 7;
546
218
    } else
547
1.74k
        return i;
548
2.18k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
136
{
552
136
    uint8_t band;
553
554
136
    if (ps->bs_enable_sa)
555
106
    {
556
106
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
25
        {
558
            /* wait until we get a DT frame */
559
25
            ps->bs_enable_sa = 0;
560
81
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
14
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
67
        } else {
564
            /* DF always decodable */
565
67
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
67
        }
567
568
848
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
742
        {
570
742
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
98
            {
572
98
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
644
            } else if (!ps->bs_sa_dt_flag) {
574
469
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
469
            }
576
742
        }
577
106
    }
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
136
    if (ps->sa_decode_error) {
582
61
        ps->pan_decode_error = 1;
583
61
        ps->bs_enable_pan = ps->g_last_had_pan;
584
61
        ps->bs_enable_sa = ps->g_last_had_sa;
585
61
    }
586
587
588
136
    if (ps->bs_enable_sa)
589
45
    {
590
45
        if (ps->sa_decode_error) {
591
225
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
200
            {
593
200
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
200
            }
595
25
        } else {
596
180
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
160
            {
598
160
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
160
            }
600
20
        }
601
45
    }
602
603
136
    if (ps->bs_enable_pan)
604
112
    {
605
112
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
109
        }  else if (ps->bs_pan_dt_flag) {
609
30
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
79
        } else {
611
79
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
79
        }
613
614
2.24k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.12k
        {
616
2.12k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
570
            {
618
570
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.55k
            } else if (!ps->bs_pan_dt_flag) {
620
1.50k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.50k
            }
622
2.12k
        }
623
624
112
        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
924
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
880
            {
632
880
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
880
            }
634
44
        }
635
112
    }
636
136
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
248
{
640
248
    uint8_t s, b, k;
641
248
    complex_t qfrac, tmp0, tmp, in, R0;
642
248
    real_t peakdiff;
643
248
    real_t nrg;
644
248
    real_t power;
645
248
    real_t transratio;
646
248
    real_t new_delay_slopes[NUM_OF_LINKS];
647
248
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
248
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.95k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.70k
    {
655
        /* set delay indices */
656
22.8k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
17.1k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.70k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.70k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
176k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
171k
        {
664
171k
            const real_t gamma = REAL_CONST(1.5);
665
171k
            const real_t sigma = REAL_CONST(1.5625);
666
667
171k
            RE(in) = QMF_RE(X[s][b]);
668
171k
            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
136k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
171k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
171k
            if (ps->peakdecay_fast[b] < power)
683
10.9k
                ps->peakdecay_fast[b] = power;
684
685
171k
            peakdiff = ps->prev_peakdiff[b];
686
171k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
171k
            ps->prev_peakdiff[b] = peakdiff;
688
689
171k
            nrg = ps->prev_nrg[b];
690
171k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
171k
            ps->prev_nrg[b] = nrg;
692
693
171k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
162k
                transratio = sigma;
695
162k
            } else {
696
8.74k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
8.74k
            }
698
699
684k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
513k
            {
701
513k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
513k
            }
703
704
171k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
171k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
171k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
171k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
171k
            RE(ps->d_buff[1][b]) = RE(in);
711
171k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
171k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
171k
            RE(R0) = RE(tmp);
716
171k
            IM(R0) = IM(tmp);
717
718
684k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
513k
            {
720
513k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
513k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
513k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
513k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
513k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
513k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
513k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
513k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
513k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
513k
                RE(R0) = RE(tmp);
735
513k
                IM(R0) = IM(tmp);
736
513k
            }
737
738
171k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
171k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
684k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
513k
            {
743
513k
                if (++temp_delay_ser[k] >= delay_length[k])
744
132k
                    temp_delay_ser[k] = 0;
745
513k
            }
746
171k
        }
747
5.70k
    }
748
749
992
    for (k = 0; k < NUM_OF_LINKS; k++)
750
744
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
248
}
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
4.16k
                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
31.8k
                transratio = sigma;
695
31.8k
            } else {
696
2.62k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.62k
            }
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.5k
                    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
198
{
640
198
    uint8_t s, b, k;
641
198
    complex_t qfrac, tmp0, tmp, in, R0;
642
198
    real_t peakdiff;
643
198
    real_t nrg;
644
198
    real_t power;
645
198
    real_t transratio;
646
198
    real_t new_delay_slopes[NUM_OF_LINKS];
647
198
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
198
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.75k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.55k
    {
655
        /* set delay indices */
656
18.2k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
13.6k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.55k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.55k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
141k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
136k
        {
664
136k
            const real_t gamma = REAL_CONST(1.5);
665
136k
            const real_t sigma = REAL_CONST(1.5625);
666
667
136k
            RE(in) = QMF_RE(X[s][b]);
668
136k
            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
136k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
136k
#endif
680
681
136k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
136k
            if (ps->peakdecay_fast[b] < power)
683
6.76k
                ps->peakdecay_fast[b] = power;
684
685
136k
            peakdiff = ps->prev_peakdiff[b];
686
136k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
136k
            ps->prev_peakdiff[b] = peakdiff;
688
689
136k
            nrg = ps->prev_nrg[b];
690
136k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
136k
            ps->prev_nrg[b] = nrg;
692
693
136k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
130k
                transratio = sigma;
695
130k
            } else {
696
6.12k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.12k
            }
698
699
546k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
409k
            {
701
409k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
409k
            }
703
704
136k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
136k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
136k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
136k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
136k
            RE(ps->d_buff[1][b]) = RE(in);
711
136k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
136k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
136k
            RE(R0) = RE(tmp);
716
136k
            IM(R0) = IM(tmp);
717
718
546k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
409k
            {
720
409k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
409k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
409k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
409k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
409k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
409k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
409k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
409k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
409k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
409k
                RE(R0) = RE(tmp);
735
409k
                IM(R0) = IM(tmp);
736
409k
            }
737
738
136k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
136k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
546k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
409k
            {
743
409k
                if (++temp_delay_ser[k] >= delay_length[k])
744
106k
                    temp_delay_ser[k] = 0;
745
409k
            }
746
136k
        }
747
4.55k
    }
748
749
792
    for (k = 0; k < NUM_OF_LINKS; k++)
750
594
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
198
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
248
{
755
248
    uint8_t s, b, ifreq, qclass;
756
248
    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
248
    real_t new_dir_map, new_sa_map;
758
759
248
    if (ps->bs_enable_sa)
760
92
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.20k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.11k
        {
765
2.11k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.11k
            ifreq = sa_inv_freq[b];
768
2.11k
            qclass = (b != 0);
769
770
2.11k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.11k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.11k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.11k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.11k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.11k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.11k
        }
781
782
2.85k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.76k
        {
784
66.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
63.4k
            {
786
63.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
63.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
63.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
63.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
63.4k
                sa_map[b]     += k_sa_map[b];
792
63.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
63.4k
            }
794
115k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
113k
            {
796
113k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
113k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
113k
            }
799
2.76k
        }
800
92
    }
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
248
}
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
21
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
504
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
483
        {
765
483
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
483
            ifreq = sa_inv_freq[b];
768
483
            qclass = (b != 0);
769
770
483
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
483
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
483
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
483
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
483
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
483
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
483
        }
781
782
651
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
630
        {
784
15.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
14.4k
            {
786
14.4k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
14.4k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
14.4k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
14.4k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
14.4k
                sa_map[b]     += k_sa_map[b];
792
14.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
14.4k
            }
794
26.4k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
25.8k
            {
796
25.8k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
25.8k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
25.8k
            }
799
630
        }
800
21
    }
801
29
    else {
802
899
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
870
        {
804
56.5k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
55.6k
            {
806
55.6k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
55.6k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
55.6k
            }
809
870
        }
810
29
    }
811
50
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
198
{
755
198
    uint8_t s, b, ifreq, qclass;
756
198
    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
198
    real_t new_dir_map, new_sa_map;
758
759
198
    if (ps->bs_enable_sa)
760
71
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.70k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.63k
        {
765
1.63k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.63k
            ifreq = sa_inv_freq[b];
768
1.63k
            qclass = (b != 0);
769
770
1.63k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.63k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.63k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.63k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.63k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.63k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.63k
        }
781
782
2.20k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.13k
        {
784
51.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
48.9k
            {
786
48.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
48.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
48.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
48.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
48.9k
                sa_map[b]     += k_sa_map[b];
792
48.9k
                sa_dir_map[b] += k_sa_dir_map[b];
793
48.9k
            }
794
89.4k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
87.3k
            {
796
87.3k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
87.3k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
87.3k
            }
799
2.13k
        }
800
71
    }
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
198
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
170
{
815
170
    uint8_t s, b, qclass, ifreq;
816
170
    real_t tmp, coeff1, coeff2;
817
170
    real_t pan_base[MAX_PAN_BAND];
818
170
    real_t pan_delta[MAX_PAN_BAND];
819
170
    qmf_t temp_l, temp_r;
820
821
170
    if (ps->bs_enable_pan)
822
170
    {
823
11.0k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
10.8k
        {
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.8k
            ifreq = pan_inv_freq[b];
828
10.8k
            qclass = pan_quant_class[ifreq];
829
830
10.8k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
10.2k
            {
832
10.2k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
10.2k
            } else {
834
595
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
595
            }
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.8k
            if (ps->g_pan_index[ifreq] >= 0)
840
9.15k
            {
841
9.15k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.06k
                {
843
9.06k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.06k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.06k
                } 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
9.15k
            } else {
850
1.72k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.22k
                {
852
1.22k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.22k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.22k
                } else {
855
500
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
500
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
500
                }
858
1.72k
            }
859
10.8k
        }
860
861
5.27k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.10k
        {
863
            /* PAN always uses all 64 channels */
864
331k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
326k
            {
866
326k
                tmp = pan_base[b];
867
868
326k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
326k
                coeff1 = MUL_R(coeff2, tmp);
870
871
326k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
326k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
326k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
326k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
326k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
326k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
326k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
326k
                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
326k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
326k
            }
885
5.10k
        }
886
170
    }
887
170
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
24
{
815
24
    uint8_t s, b, qclass, ifreq;
816
24
    real_t tmp, coeff1, coeff2;
817
24
    real_t pan_base[MAX_PAN_BAND];
818
24
    real_t pan_delta[MAX_PAN_BAND];
819
24
    qmf_t temp_l, temp_r;
820
821
24
    if (ps->bs_enable_pan)
822
24
    {
823
1.56k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.53k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
1.53k
            ifreq = pan_inv_freq[b];
828
1.53k
            qclass = pan_quant_class[ifreq];
829
830
1.53k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.53k
            {
832
1.53k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.53k
            } else {
834
0
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
0
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
1.53k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.34k
            {
841
1.34k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.34k
                {
843
1.34k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.34k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.34k
                } 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.34k
            } else {
850
189
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
189
                {
852
189
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
189
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
189
                } 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
189
            }
859
1.53k
        }
860
861
744
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
720
        {
863
            /* PAN always uses all 64 channels */
864
46.8k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
46.0k
            {
866
46.0k
                tmp = pan_base[b];
867
868
46.0k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
46.0k
                coeff1 = MUL_R(coeff2, tmp);
870
871
46.0k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
46.0k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
46.0k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
46.0k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
46.0k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
46.0k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
46.0k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
46.0k
                QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
880
881
                /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
882
                /*                   ^^^^^^^^^^^^^^^ k times */
883
46.0k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
46.0k
            }
885
720
        }
886
24
    }
887
24
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
146
{
815
146
    uint8_t s, b, qclass, ifreq;
816
146
    real_t tmp, coeff1, coeff2;
817
146
    real_t pan_base[MAX_PAN_BAND];
818
146
    real_t pan_delta[MAX_PAN_BAND];
819
146
    qmf_t temp_l, temp_r;
820
821
146
    if (ps->bs_enable_pan)
822
146
    {
823
9.49k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.34k
        {
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.34k
            ifreq = pan_inv_freq[b];
828
9.34k
            qclass = pan_quant_class[ifreq];
829
830
9.34k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
8.74k
            {
832
8.74k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
8.74k
            } else {
834
595
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
595
            }
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.34k
            if (ps->g_pan_index[ifreq] >= 0)
840
7.81k
            {
841
7.81k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
7.71k
                {
843
7.71k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
7.71k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
7.71k
                } 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
7.81k
            } else {
850
1.53k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.03k
                {
852
1.03k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.03k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.03k
                } else {
855
500
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
500
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
500
                }
858
1.53k
            }
859
9.34k
        }
860
861
4.52k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.38k
        {
863
            /* PAN always uses all 64 channels */
864
284k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
280k
            {
866
280k
                tmp = pan_base[b];
867
868
280k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
280k
                coeff1 = MUL_R(coeff2, tmp);
870
871
280k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
280k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
280k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
280k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
280k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
280k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
280k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
280k
                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
280k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
280k
            }
885
4.38k
        }
886
146
    }
887
146
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.77k
{
891
7.77k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.77k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.77k
    return ps;
896
7.77k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.77k
{
900
7.77k
    faad_free(ps);
901
7.77k
}
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
255
{
906
255
    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
249
    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
248
    if (!guess)
923
136
    {
924
136
        ps->sa_decode_error = 0;
925
136
        ps->pan_decode_error = 0;
926
136
        drm_ps_delta_decode(ps);
927
136
    } else
928
112
    {
929
112
        ps->sa_decode_error = 1;
930
112
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
112
    }
933
934
248
    ps->drm_ps_data_available = 0;
935
936
248
    drm_calc_sa_side_signal(ps, X_left);
937
248
    drm_add_ambiance(ps, X_left, X_right);
938
939
248
    if (ps->bs_enable_sa)
940
92
    {
941
92
        ps->g_last_had_sa = 1;
942
943
92
        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
248
    if (ps->bs_enable_pan)
950
170
    {
951
170
        drm_add_pan(ps, X_left, X_right);
952
953
170
        ps->g_last_had_pan = 1;
954
955
170
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
170
    } else {
958
78
        ps->g_last_had_pan = 0;
959
78
    }
960
961
962
248
    return 0;
963
249
}
964
965
#endif