Coverage Report

Created: 2026-01-09 06:48

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
907k
{
446
907k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
907k
    ps->drm_ps_data_available = 1;
449
450
907k
    ps->bs_enable_sa = faad_get1bit(ld);
451
907k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
907k
    if (ps->bs_enable_sa)
454
17.6k
    {
455
17.6k
        drm_ps_sa_element(ps, ld);
456
17.6k
    }
457
458
907k
    if (ps->bs_enable_pan)
459
14.6k
    {
460
14.6k
        drm_ps_pan_element(ps, ld);
461
14.6k
    }
462
463
907k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
907k
    return bits;
466
907k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
17.6k
{
470
17.6k
    drm_ps_huff_tab huff;
471
17.6k
    uint8_t band;
472
473
17.6k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
17.6k
    if (ps->bs_sa_dt_flag)
475
8.97k
    {
476
8.97k
        huff = t_huffman_sa;
477
8.97k
    } else {
478
8.64k
        huff = f_huffman_sa;
479
8.64k
    }
480
481
158k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
140k
    {
483
140k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
140k
    }
485
17.6k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
14.6k
{
489
14.6k
    drm_ps_huff_tab huff;
490
14.6k
    uint8_t band;
491
492
14.6k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
14.6k
    if (ps->bs_pan_dt_flag)
494
3.95k
    {
495
3.95k
        huff = t_huffman_pan;
496
10.6k
    } else {
497
10.6k
        huff = f_huffman_pan;
498
10.6k
    }
499
500
307k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
292k
    {
502
292k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
292k
    }
504
14.6k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
433k
{
509
433k
    uint8_t bit;
510
433k
    int8_t index = 0;
511
512
1.23M
    while (index >= 0)
513
799k
    {
514
799k
        bit = (uint8_t)faad_get1bit(ld);
515
799k
        index = huff[index][bit];
516
799k
    }
517
518
433k
    return index + 15;
519
433k
}
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
191
        ps->sa_decode_error = 1;
527
191
        return 0;
528
497
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
76
        ps->sa_decode_error = 1;
531
76
        return 7;
532
76
    } else
533
421
        return i;
534
688
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.20k
{
538
2.20k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
214
        ps->pan_decode_error = 1;
541
214
        return -7;
542
1.98k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
237
        ps->pan_decode_error = 1;
545
237
        return 7;
546
237
    } else
547
1.74k
        return i;
548
2.20k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
140
{
552
140
    uint8_t band;
553
554
140
    if (ps->bs_enable_sa)
555
111
    {
556
111
        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
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
888
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
777
        {
570
777
            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
686
            } 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
777
        }
577
111
    }
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
140
    if (ps->sa_decode_error) {
582
66
        ps->pan_decode_error = 1;
583
66
        ps->bs_enable_pan = ps->g_last_had_pan;
584
66
        ps->bs_enable_sa = ps->g_last_had_sa;
585
66
    }
586
587
588
140
    if (ps->bs_enable_sa)
589
49
    {
590
49
        if (ps->sa_decode_error) {
591
261
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
232
            {
593
232
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
232
            }
595
29
        } 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
49
    }
602
603
140
    if (ps->bs_enable_pan)
604
113
    {
605
113
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
110
        }  else if (ps->bs_pan_dt_flag) {
609
33
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
77
        } else {
611
77
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
77
        }
613
614
2.26k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.14k
        {
616
2.14k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
627
            {
618
627
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.52k
            } else if (!ps->bs_pan_dt_flag) {
620
1.46k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.46k
            }
622
2.14k
        }
623
624
113
        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
903
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
860
            {
632
860
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
860
            }
634
43
        }
635
113
    }
636
140
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
266
{
640
266
    uint8_t s, b, k;
641
266
    complex_t qfrac, tmp0, tmp, in, R0;
642
266
    real_t peakdiff;
643
266
    real_t nrg;
644
266
    real_t power;
645
266
    real_t transratio;
646
266
    real_t new_delay_slopes[NUM_OF_LINKS];
647
266
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
266
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.38k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.11k
    {
655
        /* set delay indices */
656
24.4k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
18.3k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.11k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.11k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
189k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
183k
        {
664
183k
            const real_t gamma = REAL_CONST(1.5);
665
183k
            const real_t sigma = REAL_CONST(1.5625);
666
667
183k
            RE(in) = QMF_RE(X[s][b]);
668
183k
            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
36.5k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
36.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
146k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
183k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
183k
            if (ps->peakdecay_fast[b] < power)
683
12.3k
                ps->peakdecay_fast[b] = power;
684
685
183k
            peakdiff = ps->prev_peakdiff[b];
686
183k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
183k
            ps->prev_peakdiff[b] = peakdiff;
688
689
183k
            nrg = ps->prev_nrg[b];
690
183k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
183k
            ps->prev_nrg[b] = nrg;
692
693
183k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
173k
                transratio = sigma;
695
173k
            } else {
696
9.61k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
9.61k
            }
698
699
734k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
550k
            {
701
550k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
550k
            }
703
704
183k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
183k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
183k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
183k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
183k
            RE(ps->d_buff[1][b]) = RE(in);
711
183k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
183k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
183k
            RE(R0) = RE(tmp);
716
183k
            IM(R0) = IM(tmp);
717
718
734k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
550k
            {
720
550k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
550k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
550k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
550k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
550k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
550k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
550k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
550k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
550k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
550k
                RE(R0) = RE(tmp);
735
550k
                IM(R0) = IM(tmp);
736
550k
            }
737
738
183k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
183k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
734k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
550k
            {
743
550k
                if (++temp_delay_ser[k] >= delay_length[k])
744
142k
                    temp_delay_ser[k] = 0;
745
550k
            }
746
183k
        }
747
6.11k
    }
748
749
1.06k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
798
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
266
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
53
{
640
53
    uint8_t s, b, k;
641
53
    complex_t qfrac, tmp0, tmp, in, R0;
642
53
    real_t peakdiff;
643
53
    real_t nrg;
644
53
    real_t power;
645
53
    real_t transratio;
646
53
    real_t new_delay_slopes[NUM_OF_LINKS];
647
53
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
53
    complex_t Phi_Fract;
649
53
#ifdef FIXED_POINT
650
53
    uint32_t in_re, in_im;
651
53
#endif
652
653
1.27k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.21k
    {
655
        /* set delay indices */
656
4.87k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
3.65k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.21k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.21k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
37.7k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
36.5k
        {
664
36.5k
            const real_t gamma = REAL_CONST(1.5);
665
36.5k
            const real_t sigma = REAL_CONST(1.5625);
666
667
36.5k
            RE(in) = QMF_RE(X[s][b]);
668
36.5k
            IM(in) = QMF_IM(X[s][b]);
669
670
36.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
36.5k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
36.5k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
36.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
36.5k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
36.5k
            if (ps->peakdecay_fast[b] < power)
683
4.52k
                ps->peakdecay_fast[b] = power;
684
685
36.5k
            peakdiff = ps->prev_peakdiff[b];
686
36.5k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
36.5k
            ps->prev_peakdiff[b] = peakdiff;
688
689
36.5k
            nrg = ps->prev_nrg[b];
690
36.5k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
36.5k
            ps->prev_nrg[b] = nrg;
692
693
36.5k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
33.9k
                transratio = sigma;
695
33.9k
            } else {
696
2.57k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.57k
            }
698
699
146k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
109k
            {
701
109k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
109k
            }
703
704
36.5k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
36.5k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
36.5k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
36.5k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
36.5k
            RE(ps->d_buff[1][b]) = RE(in);
711
36.5k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
36.5k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
36.5k
            RE(R0) = RE(tmp);
716
36.5k
            IM(R0) = IM(tmp);
717
718
146k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
109k
            {
720
109k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
109k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
109k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
109k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
109k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
109k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
109k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
109k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
109k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
109k
                RE(R0) = RE(tmp);
735
109k
                IM(R0) = IM(tmp);
736
109k
            }
737
738
36.5k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
36.5k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
146k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
109k
            {
743
109k
                if (++temp_delay_ser[k] >= delay_length[k])
744
28.1k
                    temp_delay_ser[k] = 0;
745
109k
            }
746
36.5k
        }
747
1.21k
    }
748
749
212
    for (k = 0; k < NUM_OF_LINKS; k++)
750
159
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
53
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
213
{
640
213
    uint8_t s, b, k;
641
213
    complex_t qfrac, tmp0, tmp, in, R0;
642
213
    real_t peakdiff;
643
213
    real_t nrg;
644
213
    real_t power;
645
213
    real_t transratio;
646
213
    real_t new_delay_slopes[NUM_OF_LINKS];
647
213
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
213
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.11k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.89k
    {
655
        /* set delay indices */
656
19.5k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.6k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.89k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.89k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
151k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
146k
        {
664
146k
            const real_t gamma = REAL_CONST(1.5);
665
146k
            const real_t sigma = REAL_CONST(1.5625);
666
667
146k
            RE(in) = QMF_RE(X[s][b]);
668
146k
            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
146k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
146k
#endif
680
681
146k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
146k
            if (ps->peakdecay_fast[b] < power)
683
7.81k
                ps->peakdecay_fast[b] = power;
684
685
146k
            peakdiff = ps->prev_peakdiff[b];
686
146k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
146k
            ps->prev_peakdiff[b] = peakdiff;
688
689
146k
            nrg = ps->prev_nrg[b];
690
146k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
146k
            ps->prev_nrg[b] = nrg;
692
693
146k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
139k
                transratio = sigma;
695
139k
            } else {
696
7.03k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.03k
            }
698
699
587k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
440k
            {
701
440k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
440k
            }
703
704
146k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
146k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
146k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
146k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
146k
            RE(ps->d_buff[1][b]) = RE(in);
711
146k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
146k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
146k
            RE(R0) = RE(tmp);
716
146k
            IM(R0) = IM(tmp);
717
718
587k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
440k
            {
720
440k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
440k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
440k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
440k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
440k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
440k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
440k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
440k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
440k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
440k
                RE(R0) = RE(tmp);
735
440k
                IM(R0) = IM(tmp);
736
440k
            }
737
738
146k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
146k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
587k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
440k
            {
743
440k
                if (++temp_delay_ser[k] >= delay_length[k])
744
114k
                    temp_delay_ser[k] = 0;
745
440k
            }
746
146k
        }
747
4.89k
    }
748
749
852
    for (k = 0; k < NUM_OF_LINKS; k++)
750
639
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
213
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
266
{
755
266
    uint8_t s, b, ifreq, qclass;
756
266
    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
266
    real_t new_dir_map, new_sa_map;
758
759
266
    if (ps->bs_enable_sa)
760
104
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.49k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.39k
        {
765
2.39k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.39k
            ifreq = sa_inv_freq[b];
768
2.39k
            qclass = (b != 0);
769
770
2.39k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.39k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.39k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.39k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.39k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.39k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.39k
        }
781
782
3.22k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.12k
        {
784
74.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
71.7k
            {
786
71.7k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
71.7k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
71.7k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
71.7k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
71.7k
                sa_map[b]     += k_sa_map[b];
792
71.7k
                sa_dir_map[b] += k_sa_dir_map[b];
793
71.7k
            }
794
131k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
127k
            {
796
127k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
127k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
127k
            }
799
3.12k
        }
800
104
    }
801
162
    else {
802
5.02k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.86k
        {
804
315k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
311k
            {
806
311k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
311k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
311k
            }
809
4.86k
        }
810
162
    }
811
266
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
53
{
755
53
    uint8_t s, b, ifreq, qclass;
756
53
    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
53
    real_t new_dir_map, new_sa_map;
758
759
53
    if (ps->bs_enable_sa)
760
20
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
480
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
460
        {
765
460
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
460
            ifreq = sa_inv_freq[b];
768
460
            qclass = (b != 0);
769
770
460
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
460
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
460
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
460
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
460
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
460
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
460
        }
781
782
620
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
600
        {
784
14.4k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
13.8k
            {
786
13.8k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
13.8k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
13.8k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
13.8k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
13.8k
                sa_map[b]     += k_sa_map[b];
792
13.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
13.8k
            }
794
25.2k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
24.6k
            {
796
24.6k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
24.6k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
24.6k
            }
799
600
        }
800
20
    }
801
33
    else {
802
1.02k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
990
        {
804
64.3k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
63.3k
            {
806
63.3k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
63.3k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
63.3k
            }
809
990
        }
810
33
    }
811
53
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
213
{
755
213
    uint8_t s, b, ifreq, qclass;
756
213
    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
213
    real_t new_dir_map, new_sa_map;
758
759
213
    if (ps->bs_enable_sa)
760
84
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.01k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.93k
        {
765
1.93k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.93k
            ifreq = sa_inv_freq[b];
768
1.93k
            qclass = (b != 0);
769
770
1.93k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.93k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.93k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.93k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.93k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.93k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.93k
        }
781
782
2.60k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.52k
        {
784
60.4k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
57.9k
            {
786
57.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
57.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
57.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
57.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
57.9k
                sa_map[b]     += k_sa_map[b];
792
57.9k
                sa_dir_map[b] += k_sa_dir_map[b];
793
57.9k
            }
794
105k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
103k
            {
796
103k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
103k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
103k
            }
799
2.52k
        }
800
84
    }
801
129
    else {
802
3.99k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.87k
        {
804
251k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
247k
            {
806
247k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
247k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
247k
            }
809
3.87k
        }
810
129
    }
811
213
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
179
{
815
179
    uint8_t s, b, qclass, ifreq;
816
179
    real_t tmp, coeff1, coeff2;
817
179
    real_t pan_base[MAX_PAN_BAND];
818
179
    real_t pan_delta[MAX_PAN_BAND];
819
179
    qmf_t temp_l, temp_r;
820
821
179
    if (ps->bs_enable_pan)
822
179
    {
823
11.6k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
11.4k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
11.4k
            ifreq = pan_inv_freq[b];
828
11.4k
            qclass = pan_quant_class[ifreq];
829
830
11.4k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
10.8k
            {
832
10.8k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
10.8k
            } else {
834
593
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
593
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
11.4k
            if (ps->g_pan_index[ifreq] >= 0)
840
9.80k
            {
841
9.80k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.70k
                {
843
9.70k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.70k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.70k
                } 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.80k
            } else {
850
1.65k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.15k
                {
852
1.15k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.15k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.15k
                } else {
855
498
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
498
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
498
                }
858
1.65k
            }
859
11.4k
        }
860
861
5.54k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.37k
        {
863
            /* PAN always uses all 64 channels */
864
349k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
343k
            {
866
343k
                tmp = pan_base[b];
867
868
343k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
343k
                coeff1 = MUL_R(coeff2, tmp);
870
871
343k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
343k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
343k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
343k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
343k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
343k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
343k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
343k
                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
343k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
343k
            }
885
5.37k
        }
886
179
    }
887
179
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
26
{
815
26
    uint8_t s, b, qclass, ifreq;
816
26
    real_t tmp, coeff1, coeff2;
817
26
    real_t pan_base[MAX_PAN_BAND];
818
26
    real_t pan_delta[MAX_PAN_BAND];
819
26
    qmf_t temp_l, temp_r;
820
821
26
    if (ps->bs_enable_pan)
822
26
    {
823
1.69k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.66k
        {
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.66k
            ifreq = pan_inv_freq[b];
828
1.66k
            qclass = pan_quant_class[ifreq];
829
830
1.66k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.66k
            {
832
1.66k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.66k
            } 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.66k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.53k
            {
841
1.53k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.53k
                {
843
1.53k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.53k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.53k
                } 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.53k
            } else {
850
126
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
126
                {
852
126
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
126
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
126
                } 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
126
            }
859
1.66k
        }
860
861
806
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
780
        {
863
            /* PAN always uses all 64 channels */
864
50.7k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
49.9k
            {
866
49.9k
                tmp = pan_base[b];
867
868
49.9k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
49.9k
                coeff1 = MUL_R(coeff2, tmp);
870
871
49.9k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
49.9k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
49.9k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
49.9k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
49.9k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
49.9k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
49.9k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
49.9k
                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
49.9k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
49.9k
            }
885
780
        }
886
26
    }
887
26
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
153
{
815
153
    uint8_t s, b, qclass, ifreq;
816
153
    real_t tmp, coeff1, coeff2;
817
153
    real_t pan_base[MAX_PAN_BAND];
818
153
    real_t pan_delta[MAX_PAN_BAND];
819
153
    qmf_t temp_l, temp_r;
820
821
153
    if (ps->bs_enable_pan)
822
153
    {
823
9.94k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.79k
        {
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.79k
            ifreq = pan_inv_freq[b];
828
9.79k
            qclass = pan_quant_class[ifreq];
829
830
9.79k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.19k
            {
832
9.19k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.19k
            } else {
834
593
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
593
            }
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.79k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.26k
            {
841
8.26k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.16k
                {
843
8.16k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.16k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.16k
                } else {
846
95
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
95
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
95
                }
849
8.26k
            } else {
850
1.52k
                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
498
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
498
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
498
                }
858
1.52k
            }
859
9.79k
        }
860
861
4.74k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.59k
        {
863
            /* PAN always uses all 64 channels */
864
298k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
293k
            {
866
293k
                tmp = pan_base[b];
867
868
293k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
293k
                coeff1 = MUL_R(coeff2, tmp);
870
871
293k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
293k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
293k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
293k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
293k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
293k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
293k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
293k
                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
293k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
293k
            }
885
4.59k
        }
886
153
    }
887
153
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.90k
{
891
7.90k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.90k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.90k
    return ps;
896
7.90k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.90k
{
900
7.90k
    faad_free(ps);
901
7.90k
}
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
273
{
906
273
    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
267
    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
266
    if (!guess)
923
140
    {
924
140
        ps->sa_decode_error = 0;
925
140
        ps->pan_decode_error = 0;
926
140
        drm_ps_delta_decode(ps);
927
140
    } else
928
126
    {
929
126
        ps->sa_decode_error = 1;
930
126
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
126
    }
933
934
266
    ps->drm_ps_data_available = 0;
935
936
266
    drm_calc_sa_side_signal(ps, X_left);
937
266
    drm_add_ambiance(ps, X_left, X_right);
938
939
266
    if (ps->bs_enable_sa)
940
104
    {
941
104
        ps->g_last_had_sa = 1;
942
943
104
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
162
    } else {
946
162
        ps->g_last_had_sa = 0;
947
162
    }
948
949
266
    if (ps->bs_enable_pan)
950
179
    {
951
179
        drm_add_pan(ps, X_left, X_right);
952
953
179
        ps->g_last_had_pan = 1;
954
955
179
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
179
    } else {
958
87
        ps->g_last_had_pan = 0;
959
87
    }
960
961
962
266
    return 0;
963
267
}
964
965
#endif