Coverage Report

Created: 2026-08-13 06:50

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 definitions */
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
989k
{
446
989k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
989k
    ps->drm_ps_data_available = 1;
449
450
989k
    ps->bs_enable_sa = faad_get1bit(ld);
451
989k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
989k
    if (ps->bs_enable_sa)
454
26.2k
    {
455
26.2k
        drm_ps_sa_element(ps, ld);
456
26.2k
    }
457
458
989k
    if (ps->bs_enable_pan)
459
16.7k
    {
460
16.7k
        drm_ps_pan_element(ps, ld);
461
16.7k
    }
462
463
989k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
989k
    return bits;
466
989k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
26.2k
{
470
26.2k
    drm_ps_huff_tab huff;
471
26.2k
    uint8_t band;
472
473
26.2k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
26.2k
    if (ps->bs_sa_dt_flag)
475
10.8k
    {
476
10.8k
        huff = t_huffman_sa;
477
15.4k
    } else {
478
15.4k
        huff = f_huffman_sa;
479
15.4k
    }
480
481
236k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
210k
    {
483
210k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
210k
    }
485
26.2k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
16.7k
{
489
16.7k
    drm_ps_huff_tab huff;
490
16.7k
    uint8_t band;
491
492
16.7k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
16.7k
    if (ps->bs_pan_dt_flag)
494
4.62k
    {
495
4.62k
        huff = t_huffman_pan;
496
12.1k
    } else {
497
12.1k
        huff = f_huffman_pan;
498
12.1k
    }
499
500
352k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
335k
    {
502
335k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
335k
    }
504
16.7k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
545k
{
509
545k
    uint8_t bit;
510
545k
    int8_t index = 0;
511
512
1.55M
    while (index >= 0)
513
1.00M
    {
514
1.00M
        bit = (uint8_t)faad_get1bit(ld);
515
1.00M
        index = huff[index][bit];
516
1.00M
    }
517
518
545k
    return index + 15;
519
545k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
688
{
524
688
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
224
        ps->sa_decode_error = 1;
527
224
        return 0;
528
464
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
70
        ps->sa_decode_error = 1;
531
70
        return 7;
532
70
    } else
533
394
        return i;
534
688
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.02k
{
538
2.02k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
227
        ps->pan_decode_error = 1;
541
227
        return -7;
542
1.79k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
229
        ps->pan_decode_error = 1;
545
229
        return 7;
546
229
    } else
547
1.56k
        return i;
548
2.02k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
134
{
552
134
    uint8_t band;
553
554
134
    if (ps->bs_enable_sa)
555
112
    {
556
112
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
26
        {
558
            /* wait until we get a DT frame */
559
26
            ps->bs_enable_sa = 0;
560
86
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
13
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
73
        } else {
564
            /* DF always decodable */
565
73
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
73
        }
567
568
896
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
784
        {
570
784
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
91
            {
572
91
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
693
            } else if (!ps->bs_sa_dt_flag) {
574
511
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
511
            }
576
784
        }
577
112
    }
578
579
    /* An error during SA decoding implies PAN data will be undecodable, too */
580
    /* Also, we don't like on/off switching in PS, so we force to last settings */
581
134
    if (ps->sa_decode_error) {
582
70
        ps->pan_decode_error = 1;
583
70
        ps->bs_enable_pan = ps->g_last_had_pan;
584
70
        ps->bs_enable_sa = ps->g_last_had_sa;
585
70
    }
586
587
588
134
    if (ps->bs_enable_sa)
589
41
    {
590
41
        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
144
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
128
            {
598
128
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
128
            }
600
16
        }
601
41
    }
602
603
134
    if (ps->bs_enable_pan)
604
106
    {
605
106
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
5
        {
607
5
            ps->bs_enable_pan = 0;
608
101
        }  else if (ps->bs_pan_dt_flag) {
609
32
            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.12k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.01k
        {
616
2.01k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
608
            {
618
608
                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.01k
        }
623
624
106
        if (ps->pan_decode_error) {
625
1.47k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.40k
            {
627
1.40k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.40k
            }
629
70
        } else {
630
756
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
720
            {
632
720
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
720
            }
634
36
        }
635
106
    }
636
134
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
250
{
640
250
    uint8_t s, b, k;
641
250
    complex_t qfrac, tmp0, tmp, in, R0;
642
250
    real_t peakdiff;
643
250
    real_t nrg;
644
250
    real_t power;
645
250
    real_t transratio;
646
250
    real_t new_delay_slopes[NUM_OF_LINKS];
647
250
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
250
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.00k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.75k
    {
655
        /* set delay indices */
656
23.0k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
17.2k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.75k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.75k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
178k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
172k
        {
664
172k
            const real_t gamma = REAL_CONST(1.5);
665
172k
            const real_t sigma = REAL_CONST(1.5625);
666
667
172k
            RE(in) = QMF_RE(X[s][b]);
668
172k
            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
37.9k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
37.9k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
134k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
172k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
172k
            if (ps->peakdecay_fast[b] < power)
683
11.4k
                ps->peakdecay_fast[b] = power;
684
685
172k
            peakdiff = ps->prev_peakdiff[b];
686
172k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
172k
            ps->prev_peakdiff[b] = peakdiff;
688
689
172k
            nrg = ps->prev_nrg[b];
690
172k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
172k
            ps->prev_nrg[b] = nrg;
692
693
172k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
164k
                transratio = sigma;
695
164k
            } else {
696
8.04k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
8.04k
            }
698
699
690k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
517k
            {
701
517k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
517k
            }
703
704
172k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
172k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
172k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
172k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
172k
            RE(ps->d_buff[1][b]) = RE(in);
711
172k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
172k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
172k
            RE(R0) = RE(tmp);
716
172k
            IM(R0) = IM(tmp);
717
718
690k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
517k
            {
720
517k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
517k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
517k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
517k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
517k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
517k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
517k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
517k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
517k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
517k
                RE(R0) = RE(tmp);
735
517k
                IM(R0) = IM(tmp);
736
517k
            }
737
738
172k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
172k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
690k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
517k
            {
743
517k
                if (++temp_delay_ser[k] >= delay_length[k])
744
133k
                    temp_delay_ser[k] = 0;
745
517k
            }
746
172k
        }
747
5.75k
    }
748
749
1.00k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
750
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
250
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
55
{
640
55
    uint8_t s, b, k;
641
55
    complex_t qfrac, tmp0, tmp, in, R0;
642
55
    real_t peakdiff;
643
55
    real_t nrg;
644
55
    real_t power;
645
55
    real_t transratio;
646
55
    real_t new_delay_slopes[NUM_OF_LINKS];
647
55
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
55
    complex_t Phi_Fract;
649
55
#ifdef FIXED_POINT
650
55
    uint32_t in_re, in_im;
651
55
#endif
652
653
1.32k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.26k
    {
655
        /* set delay indices */
656
5.06k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
3.79k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.26k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.26k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
39.2k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
37.9k
        {
664
37.9k
            const real_t gamma = REAL_CONST(1.5);
665
37.9k
            const real_t sigma = REAL_CONST(1.5625);
666
667
37.9k
            RE(in) = QMF_RE(X[s][b]);
668
37.9k
            IM(in) = QMF_IM(X[s][b]);
669
670
37.9k
#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
37.9k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
37.9k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
37.9k
            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
37.9k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
37.9k
            if (ps->peakdecay_fast[b] < power)
683
4.67k
                ps->peakdecay_fast[b] = power;
684
685
37.9k
            peakdiff = ps->prev_peakdiff[b];
686
37.9k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
37.9k
            ps->prev_peakdiff[b] = peakdiff;
688
689
37.9k
            nrg = ps->prev_nrg[b];
690
37.9k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
37.9k
            ps->prev_nrg[b] = nrg;
692
693
37.9k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
35.5k
                transratio = sigma;
695
35.5k
            } else {
696
2.43k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.43k
            }
698
699
151k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
113k
            {
701
113k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
113k
            }
703
704
37.9k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
37.9k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
37.9k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
37.9k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
37.9k
            RE(ps->d_buff[1][b]) = RE(in);
711
37.9k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
37.9k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
37.9k
            RE(R0) = RE(tmp);
716
37.9k
            IM(R0) = IM(tmp);
717
718
151k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
113k
            {
720
113k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
113k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
113k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
113k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
113k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
113k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
113k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
113k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
113k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
113k
                RE(R0) = RE(tmp);
735
113k
                IM(R0) = IM(tmp);
736
113k
            }
737
738
37.9k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
37.9k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
151k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
113k
            {
743
113k
                if (++temp_delay_ser[k] >= delay_length[k])
744
29.1k
                    temp_delay_ser[k] = 0;
745
113k
            }
746
37.9k
        }
747
1.26k
    }
748
749
220
    for (k = 0; k < NUM_OF_LINKS; k++)
750
165
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
55
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
195
{
640
195
    uint8_t s, b, k;
641
195
    complex_t qfrac, tmp0, tmp, in, R0;
642
195
    real_t peakdiff;
643
195
    real_t nrg;
644
195
    real_t power;
645
195
    real_t transratio;
646
195
    real_t new_delay_slopes[NUM_OF_LINKS];
647
195
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
195
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.68k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.48k
    {
655
        /* set delay indices */
656
17.9k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
13.4k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.48k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.48k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
139k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
134k
        {
664
134k
            const real_t gamma = REAL_CONST(1.5);
665
134k
            const real_t sigma = REAL_CONST(1.5625);
666
667
134k
            RE(in) = QMF_RE(X[s][b]);
668
134k
            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
134k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
134k
#endif
680
681
134k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
134k
            if (ps->peakdecay_fast[b] < power)
683
6.80k
                ps->peakdecay_fast[b] = power;
684
685
134k
            peakdiff = ps->prev_peakdiff[b];
686
134k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
134k
            ps->prev_peakdiff[b] = peakdiff;
688
689
134k
            nrg = ps->prev_nrg[b];
690
134k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
134k
            ps->prev_nrg[b] = nrg;
692
693
134k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
128k
                transratio = sigma;
695
128k
            } else {
696
5.61k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
5.61k
            }
698
699
538k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
403k
            {
701
403k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
403k
            }
703
704
134k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
134k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
134k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
134k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
134k
            RE(ps->d_buff[1][b]) = RE(in);
711
134k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
134k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
134k
            RE(R0) = RE(tmp);
716
134k
            IM(R0) = IM(tmp);
717
718
538k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
403k
            {
720
403k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
403k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
403k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
403k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
403k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
403k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
403k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
403k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
403k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
403k
                RE(R0) = RE(tmp);
735
403k
                IM(R0) = IM(tmp);
736
403k
            }
737
738
134k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
134k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
538k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
403k
            {
743
403k
                if (++temp_delay_ser[k] >= delay_length[k])
744
104k
                    temp_delay_ser[k] = 0;
745
403k
            }
746
134k
        }
747
4.48k
    }
748
749
780
    for (k = 0; k < NUM_OF_LINKS; k++)
750
585
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
195
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
250
{
755
250
    uint8_t s, b, ifreq, qclass;
756
250
    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
250
    real_t new_dir_map, new_sa_map;
758
759
250
    if (ps->bs_enable_sa)
760
85
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.04k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.95k
        {
765
1.95k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.95k
            ifreq = sa_inv_freq[b];
768
1.95k
            qclass = (b != 0);
769
770
1.95k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.95k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.95k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.95k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.95k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.95k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.95k
        }
781
782
2.63k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.55k
        {
784
61.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
58.6k
            {
786
58.6k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
58.6k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
58.6k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
58.6k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
58.6k
                sa_map[b]     += k_sa_map[b];
792
58.6k
                sa_dir_map[b] += k_sa_dir_map[b];
793
58.6k
            }
794
107k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
104k
            {
796
104k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
104k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
104k
            }
799
2.55k
        }
800
85
    }
801
165
    else {
802
5.11k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.95k
        {
804
321k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
316k
            {
806
316k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
316k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
316k
            }
809
4.95k
        }
810
165
    }
811
250
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
55
{
755
55
    uint8_t s, b, ifreq, qclass;
756
55
    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
55
    real_t new_dir_map, new_sa_map;
758
759
55
    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
37
    else {
802
1.14k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.11k
        {
804
72.1k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
71.0k
            {
806
71.0k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
71.0k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
71.0k
            }
809
1.11k
        }
810
37
    }
811
55
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
195
{
755
195
    uint8_t s, b, ifreq, qclass;
756
195
    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
195
    real_t new_dir_map, new_sa_map;
758
759
195
    if (ps->bs_enable_sa)
760
67
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.60k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.54k
        {
765
1.54k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.54k
            ifreq = sa_inv_freq[b];
768
1.54k
            qclass = (b != 0);
769
770
1.54k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.54k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.54k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.54k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.54k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.54k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.54k
        }
781
782
2.07k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.01k
        {
784
48.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
46.2k
            {
786
46.2k
                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
46.2k
                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
46.2k
                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
46.2k
                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
46.2k
                sa_map[b]     += k_sa_map[b];
792
46.2k
                sa_dir_map[b] += k_sa_dir_map[b];
793
46.2k
            }
794
84.4k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
82.4k
            {
796
82.4k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
82.4k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
82.4k
            }
799
2.01k
        }
800
67
    }
801
128
    else {
802
3.96k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.84k
        {
804
249k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
245k
            {
806
245k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
245k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
245k
            }
809
3.84k
        }
810
128
    }
811
195
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
169
{
815
169
    uint8_t s, b, qclass, ifreq;
816
169
    real_t tmp, coeff1, coeff2;
817
169
    real_t pan_base[MAX_PAN_BAND];
818
169
    real_t pan_delta[MAX_PAN_BAND];
819
169
    qmf_t temp_l, temp_r;
820
821
169
    if (ps->bs_enable_pan)
822
169
    {
823
10.9k
        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
526
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
526
            }
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.49k
            {
841
9.49k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.39k
                {
843
9.39k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.39k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.39k
                } else {
846
98
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
98
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
98
                }
849
9.49k
            } else {
850
1.32k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
894
                {
852
894
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
894
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
894
                } else {
855
428
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
428
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
428
                }
858
1.32k
            }
859
10.8k
        }
860
861
5.23k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.07k
        {
863
            /* PAN always uses all 64 channels */
864
329k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
324k
            {
866
324k
                tmp = pan_base[b];
867
868
324k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
324k
                coeff1 = MUL_R(coeff2, tmp);
870
871
324k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
324k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
324k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
324k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
324k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
324k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
324k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
324k
                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
324k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
324k
            }
885
5.07k
        }
886
169
    }
887
169
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
27
{
815
27
    uint8_t s, b, qclass, ifreq;
816
27
    real_t tmp, coeff1, coeff2;
817
27
    real_t pan_base[MAX_PAN_BAND];
818
27
    real_t pan_delta[MAX_PAN_BAND];
819
27
    qmf_t temp_l, temp_r;
820
821
27
    if (ps->bs_enable_pan)
822
27
    {
823
1.75k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.72k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
1.72k
            ifreq = pan_inv_freq[b];
828
1.72k
            qclass = pan_quant_class[ifreq];
829
830
1.72k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.72k
            {
832
1.72k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.72k
            } else {
834
0
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
0
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
1.72k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.72k
            {
841
1.72k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.72k
                {
843
1.72k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.72k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.72k
                } 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.72k
            } else {
850
0
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
0
                {
852
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
0
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
0
                } 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
0
            }
859
1.72k
        }
860
861
837
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
810
        {
863
            /* PAN always uses all 64 channels */
864
52.6k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
51.8k
            {
866
51.8k
                tmp = pan_base[b];
867
868
51.8k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
51.8k
                coeff1 = MUL_R(coeff2, tmp);
870
871
51.8k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
51.8k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
51.8k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
51.8k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
51.8k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
51.8k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
51.8k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
51.8k
                QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
880
881
                /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
882
                /*                   ^^^^^^^^^^^^^^^ k times */
883
51.8k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
51.8k
            }
885
810
        }
886
27
    }
887
27
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
142
{
815
142
    uint8_t s, b, qclass, ifreq;
816
142
    real_t tmp, coeff1, coeff2;
817
142
    real_t pan_base[MAX_PAN_BAND];
818
142
    real_t pan_delta[MAX_PAN_BAND];
819
142
    qmf_t temp_l, temp_r;
820
821
142
    if (ps->bs_enable_pan)
822
142
    {
823
9.23k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.08k
        {
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.08k
            ifreq = pan_inv_freq[b];
828
9.08k
            qclass = pan_quant_class[ifreq];
829
830
9.08k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
8.56k
            {
832
8.56k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
8.56k
            } else {
834
526
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
526
            }
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.08k
            if (ps->g_pan_index[ifreq] >= 0)
840
7.76k
            {
841
7.76k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
7.66k
                {
843
7.66k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
7.66k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
7.66k
                } else {
846
98
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
98
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
98
                }
849
7.76k
            } else {
850
1.32k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
894
                {
852
894
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
894
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
894
                } else {
855
428
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
428
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
428
                }
858
1.32k
            }
859
9.08k
        }
860
861
4.40k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.26k
        {
863
            /* PAN always uses all 64 channels */
864
276k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
272k
            {
866
272k
                tmp = pan_base[b];
867
868
272k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
272k
                coeff1 = MUL_R(coeff2, tmp);
870
871
272k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
272k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
272k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
272k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
272k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
272k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
272k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
272k
                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
272k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
272k
            }
885
4.26k
        }
886
142
    }
887
142
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.64k
{
891
7.64k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.64k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.64k
    return ps;
896
7.64k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.64k
{
900
7.64k
    faad_free(ps);
901
7.64k
}
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
4
    {
908
4
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
4
        return 0;
910
4
    }
911
912
251
    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
250
    if (!guess)
923
134
    {
924
134
        ps->sa_decode_error = 0;
925
134
        ps->pan_decode_error = 0;
926
134
        drm_ps_delta_decode(ps);
927
134
    } else
928
116
    {
929
116
        ps->sa_decode_error = 1;
930
116
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
116
    }
933
934
250
    ps->drm_ps_data_available = 0;
935
936
250
    drm_calc_sa_side_signal(ps, X_left);
937
250
    drm_add_ambiance(ps, X_left, X_right);
938
939
250
    if (ps->bs_enable_sa)
940
85
    {
941
85
        ps->g_last_had_sa = 1;
942
943
85
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
165
    } else {
946
165
        ps->g_last_had_sa = 0;
947
165
    }
948
949
250
    if (ps->bs_enable_pan)
950
169
    {
951
169
        drm_add_pan(ps, X_left, X_right);
952
953
169
        ps->g_last_had_pan = 1;
954
955
169
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
169
    } else {
958
81
        ps->g_last_had_pan = 0;
959
81
    }
960
961
962
250
    return 0;
963
251
}
964
965
#endif