Coverage Report

Created: 2025-12-14 06:24

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
878k
{
446
878k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
878k
    ps->drm_ps_data_available = 1;
449
450
878k
    ps->bs_enable_sa = faad_get1bit(ld);
451
878k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
878k
    if (ps->bs_enable_sa)
454
18.5k
    {
455
18.5k
        drm_ps_sa_element(ps, ld);
456
18.5k
    }
457
458
878k
    if (ps->bs_enable_pan)
459
16.1k
    {
460
16.1k
        drm_ps_pan_element(ps, ld);
461
16.1k
    }
462
463
878k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
878k
    return bits;
466
878k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
18.5k
{
470
18.5k
    drm_ps_huff_tab huff;
471
18.5k
    uint8_t band;
472
473
18.5k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
18.5k
    if (ps->bs_sa_dt_flag)
475
9.41k
    {
476
9.41k
        huff = t_huffman_sa;
477
9.41k
    } else {
478
9.11k
        huff = f_huffman_sa;
479
9.11k
    }
480
481
166k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
148k
    {
483
148k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
148k
    }
485
18.5k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
16.1k
{
489
16.1k
    drm_ps_huff_tab huff;
490
16.1k
    uint8_t band;
491
492
16.1k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
16.1k
    if (ps->bs_pan_dt_flag)
494
4.33k
    {
495
4.33k
        huff = t_huffman_pan;
496
11.7k
    } else {
497
11.7k
        huff = f_huffman_pan;
498
11.7k
    }
499
500
338k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
322k
    {
502
322k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
322k
    }
504
16.1k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
470k
{
509
470k
    uint8_t bit;
510
470k
    int8_t index = 0;
511
512
1.33M
    while (index >= 0)
513
866k
    {
514
866k
        bit = (uint8_t)faad_get1bit(ld);
515
866k
        index = huff[index][bit];
516
866k
    }
517
518
470k
    return index + 15;
519
470k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
632
{
524
632
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
174
        ps->sa_decode_error = 1;
527
174
        return 0;
528
458
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
61
        ps->sa_decode_error = 1;
531
61
        return 7;
532
61
    } else
533
397
        return i;
534
632
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.18k
{
538
2.18k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
250
        ps->pan_decode_error = 1;
541
250
        return -7;
542
1.93k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
206
        ps->pan_decode_error = 1;
545
206
        return 7;
546
206
    } else
547
1.72k
        return i;
548
2.18k
}
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
102
    {
556
102
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
23
        {
558
            /* wait until we get a DT frame */
559
23
            ps->bs_enable_sa = 0;
560
79
        } 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
66
        } else {
564
            /* DF always decodable */
565
66
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
66
        }
567
568
816
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
714
        {
570
714
            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
623
            } else if (!ps->bs_sa_dt_flag) {
574
462
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
462
            }
576
714
        }
577
102
    }
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
58
        ps->pan_decode_error = 1;
583
58
        ps->bs_enable_pan = ps->g_last_had_pan;
584
58
        ps->bs_enable_sa = ps->g_last_had_sa;
585
58
    }
586
587
588
134
    if (ps->bs_enable_sa)
589
45
    {
590
45
        if (ps->sa_decode_error) {
591
216
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
192
            {
593
192
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
192
            }
595
24
        } else {
596
189
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
168
            {
598
168
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
168
            }
600
21
        }
601
45
    }
602
603
134
    if (ps->bs_enable_pan)
604
112
    {
605
112
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
109
        }  else if (ps->bs_pan_dt_flag) {
609
32
            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.24k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.12k
        {
616
2.12k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
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.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.12k
        }
623
624
112
        if (ps->pan_decode_error) {
625
1.44k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.38k
            {
627
1.38k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.38k
            }
629
69
        } 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
112
    }
636
134
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
258
{
640
258
    uint8_t s, b, k;
641
258
    complex_t qfrac, tmp0, tmp, in, R0;
642
258
    real_t peakdiff;
643
258
    real_t nrg;
644
258
    real_t power;
645
258
    real_t transratio;
646
258
    real_t new_delay_slopes[NUM_OF_LINKS];
647
258
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
258
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.19k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.93k
    {
655
        /* set delay indices */
656
23.7k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
17.8k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.93k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.93k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
183k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
178k
        {
664
178k
            const real_t gamma = REAL_CONST(1.5);
665
178k
            const real_t sigma = REAL_CONST(1.5625);
666
667
178k
            RE(in) = QMF_RE(X[s][b]);
668
178k
            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
141k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
178k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
178k
            if (ps->peakdecay_fast[b] < power)
683
13.9k
                ps->peakdecay_fast[b] = power;
684
685
178k
            peakdiff = ps->prev_peakdiff[b];
686
178k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
178k
            ps->prev_peakdiff[b] = peakdiff;
688
689
178k
            nrg = ps->prev_nrg[b];
690
178k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
178k
            ps->prev_nrg[b] = nrg;
692
693
178k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
166k
                transratio = sigma;
695
166k
            } else {
696
11.0k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
11.0k
            }
698
699
712k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
534k
            {
701
534k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
534k
            }
703
704
178k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
178k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
178k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
178k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
178k
            RE(ps->d_buff[1][b]) = RE(in);
711
178k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
178k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
178k
            RE(R0) = RE(tmp);
716
178k
            IM(R0) = IM(tmp);
717
718
712k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
534k
            {
720
534k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
534k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
534k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
534k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
534k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
534k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
534k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
534k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
534k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
534k
                RE(R0) = RE(tmp);
735
534k
                IM(R0) = IM(tmp);
736
534k
            }
737
738
178k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
178k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
712k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
534k
            {
743
534k
                if (++temp_delay_ser[k] >= delay_length[k])
744
138k
                    temp_delay_ser[k] = 0;
745
534k
            }
746
178k
        }
747
5.93k
    }
748
749
1.03k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
774
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
258
}
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
5.01k
                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
34.0k
                transratio = sigma;
695
34.0k
            } else {
696
2.54k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.54k
            }
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
205
{
640
205
    uint8_t s, b, k;
641
205
    complex_t qfrac, tmp0, tmp, in, R0;
642
205
    real_t peakdiff;
643
205
    real_t nrg;
644
205
    real_t power;
645
205
    real_t transratio;
646
205
    real_t new_delay_slopes[NUM_OF_LINKS];
647
205
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
205
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.92k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.71k
    {
655
        /* set delay indices */
656
18.8k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.1k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.71k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.71k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
146k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
141k
        {
664
141k
            const real_t gamma = REAL_CONST(1.5);
665
141k
            const real_t sigma = REAL_CONST(1.5625);
666
667
141k
            RE(in) = QMF_RE(X[s][b]);
668
141k
            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
141k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
141k
#endif
680
681
141k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
141k
            if (ps->peakdecay_fast[b] < power)
683
8.97k
                ps->peakdecay_fast[b] = power;
684
685
141k
            peakdiff = ps->prev_peakdiff[b];
686
141k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
141k
            ps->prev_peakdiff[b] = peakdiff;
688
689
141k
            nrg = ps->prev_nrg[b];
690
141k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
141k
            ps->prev_nrg[b] = nrg;
692
693
141k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
132k
                transratio = sigma;
695
132k
            } else {
696
8.51k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
8.51k
            }
698
699
565k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
424k
            {
701
424k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
424k
            }
703
704
141k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
141k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
141k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
141k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
141k
            RE(ps->d_buff[1][b]) = RE(in);
711
141k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
141k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
141k
            RE(R0) = RE(tmp);
716
141k
            IM(R0) = IM(tmp);
717
718
565k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
424k
            {
720
424k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
424k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
424k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
424k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
424k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
424k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
424k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
424k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
424k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
424k
                RE(R0) = RE(tmp);
735
424k
                IM(R0) = IM(tmp);
736
424k
            }
737
738
141k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
141k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
565k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
424k
            {
743
424k
                if (++temp_delay_ser[k] >= delay_length[k])
744
110k
                    temp_delay_ser[k] = 0;
745
424k
            }
746
141k
        }
747
4.71k
    }
748
749
820
    for (k = 0; k < NUM_OF_LINKS; k++)
750
615
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
205
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
258
{
755
258
    uint8_t s, b, ifreq, qclass;
756
258
    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
258
    real_t new_dir_map, new_sa_map;
758
759
258
    if (ps->bs_enable_sa)
760
99
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.37k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.27k
        {
765
2.27k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.27k
            ifreq = sa_inv_freq[b];
768
2.27k
            qclass = (b != 0);
769
770
2.27k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.27k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.27k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.27k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.27k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.27k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.27k
        }
781
782
3.06k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.97k
        {
784
71.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
68.3k
            {
786
68.3k
                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
68.3k
                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
68.3k
                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
68.3k
                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
68.3k
                sa_map[b]     += k_sa_map[b];
792
68.3k
                sa_dir_map[b] += k_sa_dir_map[b];
793
68.3k
            }
794
124k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
121k
            {
796
121k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
121k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
121k
            }
799
2.97k
        }
800
99
    }
801
159
    else {
802
4.92k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.77k
        {
804
310k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
305k
            {
806
305k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
305k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
305k
            }
809
4.77k
        }
810
159
    }
811
258
}
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
21
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
504
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
483
        {
765
483
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
483
            ifreq = sa_inv_freq[b];
768
483
            qclass = (b != 0);
769
770
483
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
483
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
483
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
483
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
483
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
483
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
483
        }
781
782
651
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
630
        {
784
15.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
14.4k
            {
786
14.4k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
14.4k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
14.4k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
14.4k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
14.4k
                sa_map[b]     += k_sa_map[b];
792
14.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
14.4k
            }
794
26.4k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
25.8k
            {
796
25.8k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
25.8k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
25.8k
            }
799
630
        }
800
21
    }
801
32
    else {
802
992
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
960
        {
804
62.4k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
61.4k
            {
806
61.4k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
61.4k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
61.4k
            }
809
960
        }
810
32
    }
811
53
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
205
{
755
205
    uint8_t s, b, ifreq, qclass;
756
205
    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
205
    real_t new_dir_map, new_sa_map;
758
759
205
    if (ps->bs_enable_sa)
760
78
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.87k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.79k
        {
765
1.79k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.79k
            ifreq = sa_inv_freq[b];
768
1.79k
            qclass = (b != 0);
769
770
1.79k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.79k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.79k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.79k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.79k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.79k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.79k
        }
781
782
2.41k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.34k
        {
784
56.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
53.8k
            {
786
53.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
53.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
53.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
53.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
53.8k
                sa_map[b]     += k_sa_map[b];
792
53.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
53.8k
            }
794
98.2k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
95.9k
            {
796
95.9k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
95.9k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
95.9k
            }
799
2.34k
        }
800
78
    }
801
127
    else {
802
3.93k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.81k
        {
804
247k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
243k
            {
806
243k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
243k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
243k
            }
809
3.81k
        }
810
127
    }
811
205
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
184
{
815
184
    uint8_t s, b, qclass, ifreq;
816
184
    real_t tmp, coeff1, coeff2;
817
184
    real_t pan_base[MAX_PAN_BAND];
818
184
    real_t pan_delta[MAX_PAN_BAND];
819
184
    qmf_t temp_l, temp_r;
820
821
184
    if (ps->bs_enable_pan)
822
184
    {
823
11.9k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
11.7k
        {
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.7k
            ifreq = pan_inv_freq[b];
828
11.7k
            qclass = pan_quant_class[ifreq];
829
830
11.7k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
11.2k
            {
832
11.2k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
11.2k
            } else {
834
482
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
482
            }
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.7k
            if (ps->g_pan_index[ifreq] >= 0)
840
10.3k
            {
841
10.3k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
10.2k
                {
843
10.2k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
10.2k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
10.2k
                } else {
846
94
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
94
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
94
                }
849
10.3k
            } else {
850
1.43k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.04k
                {
852
1.04k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.04k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.04k
                } else {
855
388
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
388
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
388
                }
858
1.43k
            }
859
11.7k
        }
860
861
5.70k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.52k
        {
863
            /* PAN always uses all 64 channels */
864
358k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
353k
            {
866
353k
                tmp = pan_base[b];
867
868
353k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
353k
                coeff1 = MUL_R(coeff2, tmp);
870
871
353k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
353k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
353k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
353k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
353k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
353k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
353k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
353k
                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
353k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
353k
            }
885
5.52k
        }
886
184
    }
887
184
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
32
{
815
32
    uint8_t s, b, qclass, ifreq;
816
32
    real_t tmp, coeff1, coeff2;
817
32
    real_t pan_base[MAX_PAN_BAND];
818
32
    real_t pan_delta[MAX_PAN_BAND];
819
32
    qmf_t temp_l, temp_r;
820
821
32
    if (ps->bs_enable_pan)
822
32
    {
823
2.08k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
2.04k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
2.04k
            ifreq = pan_inv_freq[b];
828
2.04k
            qclass = pan_quant_class[ifreq];
829
830
2.04k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
2.04k
            {
832
2.04k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
2.04k
            } else {
834
0
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
0
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
2.04k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.94k
            {
841
1.94k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.94k
                {
843
1.94k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.94k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.94k
                } 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.94k
            } else {
850
101
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
101
                {
852
101
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
101
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
101
                } 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
101
            }
859
2.04k
        }
860
861
992
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
960
        {
863
            /* PAN always uses all 64 channels */
864
62.4k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
61.4k
            {
866
61.4k
                tmp = pan_base[b];
867
868
61.4k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
61.4k
                coeff1 = MUL_R(coeff2, tmp);
870
871
61.4k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
61.4k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
61.4k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
61.4k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
61.4k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
61.4k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
61.4k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
61.4k
                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
61.4k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
61.4k
            }
885
960
        }
886
32
    }
887
32
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
152
{
815
152
    uint8_t s, b, qclass, ifreq;
816
152
    real_t tmp, coeff1, coeff2;
817
152
    real_t pan_base[MAX_PAN_BAND];
818
152
    real_t pan_delta[MAX_PAN_BAND];
819
152
    qmf_t temp_l, temp_r;
820
821
152
    if (ps->bs_enable_pan)
822
152
    {
823
9.88k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.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
9.72k
            ifreq = pan_inv_freq[b];
828
9.72k
            qclass = pan_quant_class[ifreq];
829
830
9.72k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.24k
            {
832
9.24k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.24k
            } else {
834
482
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
482
            }
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.72k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.39k
            {
841
8.39k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.30k
                {
843
8.30k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.30k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.30k
                } else {
846
94
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
94
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
94
                }
849
8.39k
            } else {
850
1.33k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
944
                {
852
944
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
944
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
944
                } else {
855
388
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
388
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
388
                }
858
1.33k
            }
859
9.72k
        }
860
861
4.71k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.56k
        {
863
            /* PAN always uses all 64 channels */
864
296k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
291k
            {
866
291k
                tmp = pan_base[b];
867
868
291k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
291k
                coeff1 = MUL_R(coeff2, tmp);
870
871
291k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
291k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
291k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
291k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
291k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
291k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
291k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
291k
                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
291k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
291k
            }
885
4.56k
        }
886
152
    }
887
152
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.48k
{
891
7.48k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.48k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.48k
    return ps;
896
7.48k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.48k
{
900
7.48k
    faad_free(ps);
901
7.48k
}
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
265
{
906
265
    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
259
    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
258
    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
124
    {
929
124
        ps->sa_decode_error = 1;
930
124
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
124
    }
933
934
258
    ps->drm_ps_data_available = 0;
935
936
258
    drm_calc_sa_side_signal(ps, X_left);
937
258
    drm_add_ambiance(ps, X_left, X_right);
938
939
258
    if (ps->bs_enable_sa)
940
99
    {
941
99
        ps->g_last_had_sa = 1;
942
943
99
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
159
    } else {
946
159
        ps->g_last_had_sa = 0;
947
159
    }
948
949
258
    if (ps->bs_enable_pan)
950
184
    {
951
184
        drm_add_pan(ps, X_left, X_right);
952
953
184
        ps->g_last_had_pan = 1;
954
955
184
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
184
    } else {
958
74
        ps->g_last_had_pan = 0;
959
74
    }
960
961
962
258
    return 0;
963
259
}
964
965
#endif