Coverage Report

Created: 2025-10-10 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/proc/self/cwd/libfaad/drm_dec.c
Line
Count
Source
1
/*
2
** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3
** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com
4
**
5
** This program is free software; you can redistribute it and/or modify
6
** it under the terms of the GNU General Public License as published by
7
** the Free Software Foundation; either version 2 of the License, or
8
** (at your option) any later version.
9
**
10
** This program is distributed in the hope that it will be useful,
11
** but WITHOUT ANY WARRANTY; without even the implied warranty of
12
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
** GNU General Public License for more details.
14
**
15
** You should have received a copy of the GNU General Public License
16
** along with this program; if not, write to the Free Software
17
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
**
19
** Any non-GPL usage of this software or parts of this software is strictly
20
** forbidden.
21
**
22
** The "appropriate copyright message" mentioned in section 2c of the GPLv2
23
** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com"
24
**
25
** Commercial non-GPL licensing of this software is possible.
26
** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
27
**
28
** $Id: drm_dec.c,v 1.9 2007/11/01 12:33:30 menno Exp $
29
**/
30
31
#include <stdlib.h>
32
#include <stdio.h>
33
#include <string.h>
34
#include <math.h>
35
#include "common.h"
36
37
#ifdef DRM
38
39
#include "sbr_dec.h"
40
#include "drm_dec.h"
41
#include "bits.h"
42
43
/* constants */
44
#define DECAY_CUTOFF         3
45
#define DECAY_SLOPE          0.05f
46
47
/* type 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
797k
{
446
797k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
797k
    ps->drm_ps_data_available = 1;
449
450
797k
    ps->bs_enable_sa = faad_get1bit(ld);
451
797k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
797k
    if (ps->bs_enable_sa)
454
17.0k
    {
455
17.0k
        drm_ps_sa_element(ps, ld);
456
17.0k
    }
457
458
797k
    if (ps->bs_enable_pan)
459
15.3k
    {
460
15.3k
        drm_ps_pan_element(ps, ld);
461
15.3k
    }
462
463
797k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
797k
    return bits;
466
797k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
17.0k
{
470
17.0k
    drm_ps_huff_tab huff;
471
17.0k
    uint8_t band;
472
473
17.0k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
17.0k
    if (ps->bs_sa_dt_flag)
475
7.51k
    {
476
7.51k
        huff = t_huffman_sa;
477
9.50k
    } else {
478
9.50k
        huff = f_huffman_sa;
479
9.50k
    }
480
481
153k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
136k
    {
483
136k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
136k
    }
485
17.0k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
15.3k
{
489
15.3k
    drm_ps_huff_tab huff;
490
15.3k
    uint8_t band;
491
492
15.3k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
15.3k
    if (ps->bs_pan_dt_flag)
494
4.53k
    {
495
4.53k
        huff = t_huffman_pan;
496
10.7k
    } else {
497
10.7k
        huff = f_huffman_pan;
498
10.7k
    }
499
500
321k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
306k
    {
502
306k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
306k
    }
504
15.3k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
442k
{
509
442k
    uint8_t bit;
510
442k
    int8_t index = 0;
511
512
1.25M
    while (index >= 0)
513
807k
    {
514
807k
        bit = (uint8_t)faad_get1bit(ld);
515
807k
        index = huff[index][bit];
516
807k
    }
517
518
442k
    return index + 15;
519
442k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
664
{
524
664
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
171
        ps->sa_decode_error = 1;
527
171
        return 0;
528
493
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
79
        ps->sa_decode_error = 1;
531
79
        return 7;
532
79
    } else
533
414
        return i;
534
664
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.04k
{
538
2.04k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
227
        ps->pan_decode_error = 1;
541
227
        return -7;
542
1.81k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
188
        ps->pan_decode_error = 1;
545
188
        return 7;
546
188
    } else
547
1.62k
        return i;
548
2.04k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
124
{
552
124
    uint8_t band;
553
554
124
    if (ps->bs_enable_sa)
555
109
    {
556
109
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
26
        {
558
            /* wait until we get a DT frame */
559
26
            ps->bs_enable_sa = 0;
560
83
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
16
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
67
        } else {
564
            /* DF always decodable */
565
67
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
67
        }
567
568
872
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
763
        {
570
763
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
112
            {
572
112
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
651
            } else if (!ps->bs_sa_dt_flag) {
574
469
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
469
            }
576
763
        }
577
109
    }
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
124
    if (ps->sa_decode_error) {
582
63
        ps->pan_decode_error = 1;
583
63
        ps->bs_enable_pan = ps->g_last_had_pan;
584
63
        ps->bs_enable_sa = ps->g_last_had_sa;
585
63
    }
586
587
588
124
    if (ps->bs_enable_sa)
589
53
    {
590
53
        if (ps->sa_decode_error) {
591
297
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
264
            {
593
264
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
264
            }
595
33
        } 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
53
    }
602
603
124
    if (ps->bs_enable_pan)
604
105
    {
605
105
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
102
        }  else if (ps->bs_pan_dt_flag) {
609
38
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
64
        } else {
611
64
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
64
        }
613
614
2.10k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
1.99k
        {
616
1.99k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
722
            {
618
722
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.27k
            } else if (!ps->bs_pan_dt_flag) {
620
1.21k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.21k
            }
622
1.99k
        }
623
624
105
        if (ps->pan_decode_error) {
625
1.34k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.28k
            {
627
1.28k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.28k
            }
629
64
        } else {
630
861
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
820
            {
632
820
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
820
            }
634
41
        }
635
105
    }
636
124
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
252
{
640
252
    uint8_t s, b, k;
641
252
    complex_t qfrac, tmp0, tmp, in, R0;
642
252
    real_t peakdiff;
643
252
    real_t nrg;
644
252
    real_t power;
645
252
    real_t transratio;
646
252
    real_t new_delay_slopes[NUM_OF_LINKS];
647
252
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
252
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.04k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.79k
    {
655
        /* set delay indices */
656
23.1k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
17.3k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.79k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.79k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
179k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
173k
        {
664
173k
            const real_t gamma = REAL_CONST(1.5);
665
173k
            const real_t sigma = REAL_CONST(1.5625);
666
667
173k
            RE(in) = QMF_RE(X[s][b]);
668
173k
            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
26.2k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
26.2k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
147k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
173k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
173k
            if (ps->peakdecay_fast[b] < power)
683
10.3k
                ps->peakdecay_fast[b] = power;
684
685
173k
            peakdiff = ps->prev_peakdiff[b];
686
173k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
173k
            ps->prev_peakdiff[b] = peakdiff;
688
689
173k
            nrg = ps->prev_nrg[b];
690
173k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
173k
            ps->prev_nrg[b] = nrg;
692
693
173k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
165k
                transratio = sigma;
695
165k
            } else {
696
7.89k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.89k
            }
698
699
695k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
521k
            {
701
521k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
521k
            }
703
704
173k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
173k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
173k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
173k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
173k
            RE(ps->d_buff[1][b]) = RE(in);
711
173k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
173k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
173k
            RE(R0) = RE(tmp);
716
173k
            IM(R0) = IM(tmp);
717
718
695k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
521k
            {
720
521k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
521k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
521k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
521k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
521k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
521k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
521k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
521k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
521k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
521k
                RE(R0) = RE(tmp);
735
521k
                IM(R0) = IM(tmp);
736
521k
            }
737
738
173k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
173k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
695k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
521k
            {
743
521k
                if (++temp_delay_ser[k] >= delay_length[k])
744
135k
                    temp_delay_ser[k] = 0;
745
521k
            }
746
173k
        }
747
5.79k
    }
748
749
1.00k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
756
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
252
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
38
{
640
38
    uint8_t s, b, k;
641
38
    complex_t qfrac, tmp0, tmp, in, R0;
642
38
    real_t peakdiff;
643
38
    real_t nrg;
644
38
    real_t power;
645
38
    real_t transratio;
646
38
    real_t new_delay_slopes[NUM_OF_LINKS];
647
38
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
38
    complex_t Phi_Fract;
649
38
#ifdef FIXED_POINT
650
38
    uint32_t in_re, in_im;
651
38
#endif
652
653
912
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
874
    {
655
        /* set delay indices */
656
3.49k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
2.62k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
874
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
874
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
27.0k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
26.2k
        {
664
26.2k
            const real_t gamma = REAL_CONST(1.5);
665
26.2k
            const real_t sigma = REAL_CONST(1.5625);
666
667
26.2k
            RE(in) = QMF_RE(X[s][b]);
668
26.2k
            IM(in) = QMF_IM(X[s][b]);
669
670
26.2k
#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
26.2k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
26.2k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
26.2k
            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
26.2k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
26.2k
            if (ps->peakdecay_fast[b] < power)
683
3.15k
                ps->peakdecay_fast[b] = power;
684
685
26.2k
            peakdiff = ps->prev_peakdiff[b];
686
26.2k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
26.2k
            ps->prev_peakdiff[b] = peakdiff;
688
689
26.2k
            nrg = ps->prev_nrg[b];
690
26.2k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
26.2k
            ps->prev_nrg[b] = nrg;
692
693
26.2k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
25.2k
                transratio = sigma;
695
25.2k
            } else {
696
968
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
968
            }
698
699
104k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
78.6k
            {
701
78.6k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
78.6k
            }
703
704
26.2k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
26.2k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
26.2k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
26.2k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
26.2k
            RE(ps->d_buff[1][b]) = RE(in);
711
26.2k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
26.2k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
26.2k
            RE(R0) = RE(tmp);
716
26.2k
            IM(R0) = IM(tmp);
717
718
104k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
78.6k
            {
720
78.6k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
78.6k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
78.6k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
78.6k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
78.6k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
78.6k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
78.6k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
78.6k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
78.6k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
78.6k
                RE(R0) = RE(tmp);
735
78.6k
                IM(R0) = IM(tmp);
736
78.6k
            }
737
738
26.2k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
26.2k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
104k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
78.6k
            {
743
78.6k
                if (++temp_delay_ser[k] >= delay_length[k])
744
20.2k
                    temp_delay_ser[k] = 0;
745
78.6k
            }
746
26.2k
        }
747
874
    }
748
749
152
    for (k = 0; k < NUM_OF_LINKS; k++)
750
114
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
38
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
214
{
640
214
    uint8_t s, b, k;
641
214
    complex_t qfrac, tmp0, tmp, in, R0;
642
214
    real_t peakdiff;
643
214
    real_t nrg;
644
214
    real_t power;
645
214
    real_t transratio;
646
214
    real_t new_delay_slopes[NUM_OF_LINKS];
647
214
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
214
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.13k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.92k
    {
655
        /* set delay indices */
656
19.6k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.7k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.92k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.92k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
152k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
147k
        {
664
147k
            const real_t gamma = REAL_CONST(1.5);
665
147k
            const real_t sigma = REAL_CONST(1.5625);
666
667
147k
            RE(in) = QMF_RE(X[s][b]);
668
147k
            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
147k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
147k
#endif
680
681
147k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
147k
            if (ps->peakdecay_fast[b] < power)
683
7.20k
                ps->peakdecay_fast[b] = power;
684
685
147k
            peakdiff = ps->prev_peakdiff[b];
686
147k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
147k
            ps->prev_peakdiff[b] = peakdiff;
688
689
147k
            nrg = ps->prev_nrg[b];
690
147k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
147k
            ps->prev_nrg[b] = nrg;
692
693
147k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
140k
                transratio = sigma;
695
140k
            } else {
696
6.92k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.92k
            }
698
699
590k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
442k
            {
701
442k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
442k
            }
703
704
147k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
147k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
147k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
147k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
147k
            RE(ps->d_buff[1][b]) = RE(in);
711
147k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
147k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
147k
            RE(R0) = RE(tmp);
716
147k
            IM(R0) = IM(tmp);
717
718
590k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
442k
            {
720
442k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
442k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
442k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
442k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
442k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
442k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
442k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
442k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
442k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
442k
                RE(R0) = RE(tmp);
735
442k
                IM(R0) = IM(tmp);
736
442k
            }
737
738
147k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
147k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
590k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
442k
            {
743
442k
                if (++temp_delay_ser[k] >= delay_length[k])
744
115k
                    temp_delay_ser[k] = 0;
745
442k
            }
746
147k
        }
747
4.92k
    }
748
749
856
    for (k = 0; k < NUM_OF_LINKS; k++)
750
642
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
214
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
252
{
755
252
    uint8_t s, b, ifreq, qclass;
756
252
    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
252
    real_t new_dir_map, new_sa_map;
758
759
252
    if (ps->bs_enable_sa)
760
101
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.42k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.32k
        {
765
2.32k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.32k
            ifreq = sa_inv_freq[b];
768
2.32k
            qclass = (b != 0);
769
770
2.32k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.32k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.32k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.32k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.32k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.32k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.32k
        }
781
782
3.13k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.03k
        {
784
72.7k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
69.6k
            {
786
69.6k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
69.6k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
69.6k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
69.6k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
69.6k
                sa_map[b]     += k_sa_map[b];
792
69.6k
                sa_dir_map[b] += k_sa_dir_map[b];
793
69.6k
            }
794
127k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
124k
            {
796
124k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
124k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
124k
            }
799
3.03k
        }
800
101
    }
801
151
    else {
802
4.68k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.53k
        {
804
294k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
289k
            {
806
289k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
289k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
289k
            }
809
4.53k
        }
810
151
    }
811
252
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
38
{
755
38
    uint8_t s, b, ifreq, qclass;
756
38
    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
38
    real_t new_dir_map, new_sa_map;
758
759
38
    if (ps->bs_enable_sa)
760
11
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
264
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
253
        {
765
253
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
253
            ifreq = sa_inv_freq[b];
768
253
            qclass = (b != 0);
769
770
253
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
253
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
253
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
253
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
253
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
253
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
253
        }
781
782
341
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
330
        {
784
7.92k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
7.59k
            {
786
7.59k
                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
7.59k
                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
7.59k
                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
7.59k
                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
7.59k
                sa_map[b]     += k_sa_map[b];
792
7.59k
                sa_dir_map[b] += k_sa_dir_map[b];
793
7.59k
            }
794
13.8k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
13.5k
            {
796
13.5k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
13.5k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
13.5k
            }
799
330
        }
800
11
    }
801
27
    else {
802
837
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
810
        {
804
52.6k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
51.8k
            {
806
51.8k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
51.8k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
51.8k
            }
809
810
        }
810
27
    }
811
38
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
214
{
755
214
    uint8_t s, b, ifreq, qclass;
756
214
    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
214
    real_t new_dir_map, new_sa_map;
758
759
214
    if (ps->bs_enable_sa)
760
90
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.16k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.07k
        {
765
2.07k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.07k
            ifreq = sa_inv_freq[b];
768
2.07k
            qclass = (b != 0);
769
770
2.07k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.07k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.07k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.07k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.07k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.07k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.07k
        }
781
782
2.79k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.70k
        {
784
64.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
62.1k
            {
786
62.1k
                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
62.1k
                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
62.1k
                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
62.1k
                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
62.1k
                sa_map[b]     += k_sa_map[b];
792
62.1k
                sa_dir_map[b] += k_sa_dir_map[b];
793
62.1k
            }
794
113k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
110k
            {
796
110k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
110k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
110k
            }
799
2.70k
        }
800
90
    }
801
124
    else {
802
3.84k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.72k
        {
804
241k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
238k
            {
806
238k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
238k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
238k
            }
809
3.72k
        }
810
124
    }
811
214
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
167
{
815
167
    uint8_t s, b, qclass, ifreq;
816
167
    real_t tmp, coeff1, coeff2;
817
167
    real_t pan_base[MAX_PAN_BAND];
818
167
    real_t pan_delta[MAX_PAN_BAND];
819
167
    qmf_t temp_l, temp_r;
820
821
167
    if (ps->bs_enable_pan)
822
167
    {
823
10.8k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
10.6k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
10.6k
            ifreq = pan_inv_freq[b];
828
10.6k
            qclass = pan_quant_class[ifreq];
829
830
10.6k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
10.1k
            {
832
10.1k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
10.1k
            } else {
834
494
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
494
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
10.6k
            if (ps->g_pan_index[ifreq] >= 0)
840
9.31k
            {
841
9.31k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.22k
                {
843
9.22k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.22k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.22k
                } 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.31k
            } else {
850
1.37k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
974
                {
852
974
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
974
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
974
                } else {
855
399
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
399
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
399
                }
858
1.37k
            }
859
10.6k
        }
860
861
5.17k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.01k
        {
863
            /* PAN always uses all 64 channels */
864
325k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
320k
            {
866
320k
                tmp = pan_base[b];
867
868
320k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
320k
                coeff1 = MUL_R(coeff2, tmp);
870
871
320k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
320k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
320k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
320k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
320k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
320k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
320k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
320k
                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
320k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
320k
            }
885
5.01k
        }
886
167
    }
887
167
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
14
{
815
14
    uint8_t s, b, qclass, ifreq;
816
14
    real_t tmp, coeff1, coeff2;
817
14
    real_t pan_base[MAX_PAN_BAND];
818
14
    real_t pan_delta[MAX_PAN_BAND];
819
14
    qmf_t temp_l, temp_r;
820
821
14
    if (ps->bs_enable_pan)
822
14
    {
823
910
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
896
        {
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
896
            ifreq = pan_inv_freq[b];
828
896
            qclass = pan_quant_class[ifreq];
829
830
896
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
896
            {
832
896
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
896
            } 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
896
            if (ps->g_pan_index[ifreq] >= 0)
840
896
            {
841
896
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
896
                {
843
896
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
896
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
896
                } 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
896
            } else {
850
0
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
0
                {
852
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
0
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
0
                } else {
855
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
0
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
0
                }
858
0
            }
859
896
        }
860
861
434
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
420
        {
863
            /* PAN always uses all 64 channels */
864
27.3k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
26.8k
            {
866
26.8k
                tmp = pan_base[b];
867
868
26.8k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
26.8k
                coeff1 = MUL_R(coeff2, tmp);
870
871
26.8k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
26.8k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
26.8k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
26.8k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
26.8k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
26.8k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
26.8k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
26.8k
                QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
880
881
                /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
882
                /*                   ^^^^^^^^^^^^^^^ k times */
883
26.8k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
26.8k
            }
885
420
        }
886
14
    }
887
14
}
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.29k
            {
832
9.29k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.29k
            } else {
834
494
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
494
            }
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.41k
            {
841
8.41k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.32k
                {
843
8.32k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.32k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.32k
                } 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.41k
            } else {
850
1.37k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
974
                {
852
974
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
974
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
974
                } else {
855
399
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
399
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
399
                }
858
1.37k
            }
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.18k
{
891
7.18k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.18k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.18k
    return ps;
896
7.18k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.18k
{
900
7.18k
    faad_free(ps);
901
7.18k
}
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
258
{
906
258
    if (ps == NULL)
907
5
    {
908
5
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
5
        return 0;
910
5
    }
911
912
253
    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
252
    if (!guess)
923
124
    {
924
124
        ps->sa_decode_error = 0;
925
124
        ps->pan_decode_error = 0;
926
124
        drm_ps_delta_decode(ps);
927
124
    } else
928
128
    {
929
128
        ps->sa_decode_error = 1;
930
128
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
128
    }
933
934
252
    ps->drm_ps_data_available = 0;
935
936
252
    drm_calc_sa_side_signal(ps, X_left);
937
252
    drm_add_ambiance(ps, X_left, X_right);
938
939
252
    if (ps->bs_enable_sa)
940
101
    {
941
101
        ps->g_last_had_sa = 1;
942
943
101
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
151
    } else {
946
151
        ps->g_last_had_sa = 0;
947
151
    }
948
949
252
    if (ps->bs_enable_pan)
950
167
    {
951
167
        drm_add_pan(ps, X_left, X_right);
952
953
167
        ps->g_last_had_pan = 1;
954
955
167
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
167
    } else {
958
85
        ps->g_last_had_pan = 0;
959
85
    }
960
961
962
252
    return 0;
963
253
}
964
965
#endif