Coverage Report

Created: 2026-04-12 06:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/proc/self/cwd/libfaad/drm_dec.c
Line
Count
Source
1
/*
2
** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3
** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com
4
**
5
** This program is free software; you can redistribute it and/or modify
6
** it under the terms of the GNU General Public License as published by
7
** the Free Software Foundation; either version 2 of the License, or
8
** (at your option) any later version.
9
**
10
** This program is distributed in the hope that it will be useful,
11
** but WITHOUT ANY WARRANTY; without even the implied warranty of
12
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
** GNU General Public License for more details.
14
**
15
** You should have received a copy of the GNU General Public License
16
** along with this program; if not, write to the Free Software
17
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
**
19
** Any non-GPL usage of this software or parts of this software is strictly
20
** forbidden.
21
**
22
** The "appropriate copyright message" mentioned in section 2c of the GPLv2
23
** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com"
24
**
25
** Commercial non-GPL licensing of this software is possible.
26
** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
27
**
28
** $Id: drm_dec.c,v 1.9 2007/11/01 12:33:30 menno Exp $
29
**/
30
31
#include <stdlib.h>
32
#include <stdio.h>
33
#include <string.h>
34
#include <math.h>
35
#include "common.h"
36
37
#ifdef DRM
38
39
#include "sbr_dec.h"
40
#include "drm_dec.h"
41
#include "bits.h"
42
43
/* constants */
44
#define DECAY_CUTOFF         3
45
#define DECAY_SLOPE          0.05f
46
47
/* type definitions */
48
typedef const int8_t (*drm_ps_huff_tab)[2];
49
50
51
/* binary search huffman tables */
52
static const int8_t f_huffman_sa[][2] =
53
{
54
    { /*0*/ -15, 1 },             /* index 0: 1 bits:  x */
55
    { 2, 3 },                     /* index 1: 2 bits:  1x */
56
    { /*7*/ -8, 4 },              /* index 2: 3 bits:  10x */
57
    { 5, 6 },                     /* index 3: 3 bits:  11x */
58
    { /*1*/ -14, /*-1*/ -16 },    /* index 4: 4 bits:  101x */
59
    { /*-2*/ -17, 7 },            /* index 5: 4 bits:  110x */
60
    { 8, 9 },                     /* index 6: 4 bits:  111x */
61
    { /*2*/ -13, /*-3*/ -18 },    /* index 7: 5 bits:  1101x */
62
    { /*3*/ -12, 10 },            /* index 8: 5 bits:  1110x */
63
    { 11, 12 },                   /* index 9: 5 bits:  1111x */
64
    { /*4*/ -11, /*5*/ -10 },     /* index 10: 6 bits: 11101x */
65
    { /*-4*/ -19, /*-5*/ -20 },   /* index 11: 6 bits: 11110x */
66
    { /*6*/ -9, 13 },             /* index 12: 6 bits: 11111x */
67
    { /*-7*/ -22, /*-6*/ -21 }    /* index 13: 7 bits: 111111x */
68
};
69
70
static const int8_t t_huffman_sa[][2] =
71
{
72
    { /*0*/ -15, 1 },             /* index 0: 1 bits: x */
73
    { 2, 3 },                     /* index 1: 2 bits: 1x */
74
    { /*-1*/ -16, /*1*/ -14 },    /* index 2: 3 bits: 10x */
75
    { 4, 5 },                     /* index 3: 3 bits: 11x */
76
    { /*-2*/ -17, /*2*/ -13 },    /* index 4: 4 bits: 110x */
77
    { 6, 7 },                     /* index 5: 4 bits: 111x */
78
    { /*-3*/ -18, /*3*/ -12 },    /* index 6: 5 bits: 1110x */
79
    { 8, 9 },                     /* index 7: 5 bits: 1111x */
80
    { /*-4*/ -19, /*4*/ -11 },    /* index 8: 6 bits: 11110x */
81
    { 10, 11 },                   /* index 9: 6 bits: 11111x */
82
    { /*-5*/ -20, /*5*/ -10 },    /* index 10: 7 bits: 111110x */
83
    { /*-6*/ -21, 12 },           /* index 11: 7 bits: 111111x */
84
    { /*-7*/ -22, 13 },           /* index 12: 8 bits: 1111111x */
85
    { /*6*/ -9, /*7*/ -8 }        /* index 13: 9 bits: 11111111x */
86
};
87
88
static const int8_t f_huffman_pan[][2] =
89
{
90
    { /*0*/ -15, 1 },             /* index 0: 1 bits: x */
91
    { /*-1*/ -16, 2 },            /* index 1: 2 bits: 1x */
92
    { /*1*/ -14, 3 },             /* index 2: 3 bits: 11x */
93
    { 4, 5 },                     /* index 3: 4 bits: 111x */
94
    { /*-2*/ -17, /*2*/ -13 },    /* index 4: 5 bits: 1110x */
95
    { 6, 7 },                     /* index 5: 5 bits: 1111x */
96
    { /*-3*/ -18, /*3*/ -12 },    /* index 6: 6 bits: 11110x */
97
    { 8, 9 },                     /* index 7: 6 bits: 11111x */
98
    { /*-4*/ -19, /*4*/ -11 },    /* index 8: 7 bits: 111110x */
99
    { 10, 11 },                   /* index 9: 7 bits: 111111x */
100
    { /*-5*/ -20, /*5*/ -10 },    /* index 10: 8 bits: 1111110x */
101
    { 12, 13 },                   /* index 11: 8 bits: 1111111x */
102
    { /*-6*/ -21, /*6*/ -9 },     /* index 12: 9 bits: 11111110x */
103
    { /*-7*/ -22, 14 },           /* index 13: 9 bits: 11111111x */
104
    { /*7*/ -8, 15 },             /* index 14: 10 bits: 111111111x */
105
    { 16, 17 },                   /* index 15: 11 bits: 1111111111x */
106
    { /*-8*/ -23, /*8*/ -7 },     /* index 16: 12 bits: 11111111110x */
107
    { 18, 19 },                   /* index 17: 12 bits: 11111111111x */
108
    { /*-10*/ -25, 20 },          /* index 18: 13 bits: 111111111110x */
109
    { 21, 22 },                   /* index 19: 13 bits: 111111111111x */
110
    { /*-9*/ -24, /*9*/ -6 },     /* index 20: 14 bits: 1111111111101x */
111
    { /*10*/ -5, 23 },            /* index 21: 14 bits: 1111111111110x */
112
    { 24, 25 },                   /* index 22: 14 bits: 1111111111111x */
113
    { /*-13*/ -28, /*-11*/ -26 }, /* index 23: 15 bits: 11111111111101x */
114
    { /*11*/ -4, /*13*/ -2 },     /* index 24: 15 bits: 11111111111110x */
115
    { 26, 27 },                   /* index 25: 15 bits: 11111111111111x */
116
    { /*-14*/ -29, /*-12*/ -27 }, /* index 26: 16 bits: 111111111111110x */
117
    { /*12*/ -3, /*14*/ -1 }      /* index 27: 16 bits: 111111111111111x */
118
};
119
120
static const int8_t t_huffman_pan[][2] =
121
{
122
    { /*0*/ -15, 1 },             /* index 0: 1 bits: x */
123
    { /*-1*/ -16, 2 },            /* index 1: 2 bits: 1x */
124
    { /*1*/ -14, 3 },             /* index 2: 3 bits: 11x */
125
    { /*-2*/ -17, 4 },            /* index 3: 4 bits: 111x */
126
    { /*2*/ -13, 5 },             /* index 4: 5 bits: 1111x */
127
    { /*-3*/ -18, 6 },            /* index 5: 6 bits: 11111x */
128
    { /*3*/ -12, 7 },             /* index 6: 7 bits: 111111x */
129
    { /*-4*/ -19, 8 },            /* index 7: 8 bits: 1111111x */
130
    { /*4*/ -11, 9 },             /* index 8: 9 bits: 11111111x */
131
    { 10, 11 },                   /* index 9: 10 bits: 111111111x */
132
    { /*-5*/ -20, /*5*/ -10 },    /* index 10: 11 bits: 1111111110x */
133
    { 12, 13 },                   /* index 11: 11 bits: 1111111111x */
134
    { /*-6*/ -21, /*6*/ -9 },     /* index 12: 12 bits: 11111111110x */
135
    { 14, 15 },                   /* index 13: 12 bits: 11111111111x */
136
    { /*-7*/ -22, /*7*/ -8 },     /* index 14: 13 bits: 111111111110x */
137
    { 16, 17 },                   /* index 15: 13 bits: 111111111111x */
138
    { /*-8*/ -23, /*8*/ -7 },     /* index 16: 14 bits: 1111111111110x */
139
    { 18, 19 },                   /* index 17: 14 bits: 1111111111111x */
140
    { /*-10*/ -25, /*10*/ -5 },   /* index 18: 15 bits: 11111111111110x */
141
    { 20, 21 },                   /* index 19: 15 bits: 11111111111111x */
142
    { /*-9*/ -24, /*9*/ -6 },     /* index 20: 16 bits: 111111111111110x */
143
    { 22, 23 },                   /* index 21: 16 bits: 111111111111111x */
144
    { 24, 25 },                   /* index 22: 17 bits: 1111111111111110x */
145
    { 26, 27 },                   /* index 23: 17 bits: 1111111111111111x */
146
    { /*-14*/ -29, /*-13*/ -28 }, /* index 24: 18 bits: 11111111111111100x */
147
    { /*-12*/ -27, /*-11*/ -26 }, /* index 25: 18 bits: 11111111111111101x */
148
    { /*11*/ -4, /*12*/ -3 },     /* index 26: 18 bits: 11111111111111110x */
149
    { /*13*/ -2, /*14*/ -1 }      /* index 27: 18 bits: 11111111111111111x */
150
};
151
152
/* There are 3 classes in the standard but the last 2 are identical */
153
static const real_t sa_quant[8][2] =
154
{
155
    { FRAC_CONST(0.0000), FRAC_CONST(0.0000) },
156
    { FRAC_CONST(0.0501), FRAC_CONST(0.1778) },
157
    { FRAC_CONST(0.0706), FRAC_CONST(0.2818) },
158
    { FRAC_CONST(0.0995), FRAC_CONST(0.4467) },
159
    { FRAC_CONST(0.1399), FRAC_CONST(0.5623) },
160
    { FRAC_CONST(0.1957), FRAC_CONST(0.7079) },
161
    { FRAC_CONST(0.2713), FRAC_CONST(0.8913) },
162
    { FRAC_CONST(0.3699), FRAC_CONST(1.0000) },
163
};
164
165
/* We don't need the actual quantizer values */
166
#if 0
167
static const real_t pan_quant[8][5] =
168
{
169
    { COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000) },
170
    { COEF_CONST(0.1661), COEF_CONST(0.1661), COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.3322) },
171
    { COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.6644), COEF_CONST(0.8305), COEF_CONST(0.8305) },
172
    { COEF_CONST(0.4983), COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(1.6610) },
173
    { COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(2.1593), COEF_CONST(2.4914) },
174
    { COEF_CONST(0.8305), COEF_CONST(1.3288), COEF_CONST(2.1593), COEF_CONST(2.9897), COEF_CONST(3.4880) },
175
    { COEF_CONST(0.9966), COEF_CONST(1.8271), COEF_CONST(2.8236), COEF_CONST(3.8202), COEF_CONST(4.6507) },
176
    { COEF_CONST(1.3288), COEF_CONST(2.3253), COEF_CONST(3.4880), COEF_CONST(4.6507), COEF_CONST(5.8134) },
177
};
178
#endif
179
180
/* 2^(pan_quant[x][y] */
181
static const real_t pan_pow_2_pos[8][5] = {
182
    { REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000)  },
183
    { REAL_CONST(1.1220021), REAL_CONST(1.1220021), REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.2589312)  },
184
    { REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.5849090), REAL_CONST(1.7783016), REAL_CONST(1.7783016)  },
185
    { REAL_CONST(1.4125481), REAL_CONST(1.5849090), REAL_CONST(1.9952921), REAL_CONST(2.8184461), REAL_CONST(3.1623565)  },
186
    { REAL_CONST(1.5849090), REAL_CONST(1.9952922), REAL_CONST(2.8184461), REAL_CONST(4.4669806), REAL_CONST(5.6232337)  },
187
    { REAL_CONST(1.7783016), REAL_CONST(2.5119365), REAL_CONST(4.4669806), REAL_CONST(7.9430881), REAL_CONST(11.219994)  },
188
    { REAL_CONST(1.9952921), REAL_CONST(3.5482312), REAL_CONST(7.0792671), REAL_CONST(14.125206), REAL_CONST(25.118876)  },
189
    { REAL_CONST(2.5119365), REAL_CONST(5.0116998), REAL_CONST(11.219994), REAL_CONST(25.118876), REAL_CONST(56.235140)  }
190
};
191
192
/* 2^(-pan_quant[x][y] */
193
static const real_t pan_pow_2_neg[8][5] = {
194
    { REAL_CONST(1),         REAL_CONST(1),         REAL_CONST(1),         REAL_CONST(1),         REAL_CONST(1)          },
195
    { REAL_CONST(0.8912487), REAL_CONST(0.8912487), REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.7943242)  },
196
    { REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.6309511), REAL_CONST(0.5623344), REAL_CONST(0.5623344)  },
197
    { REAL_CONST(0.7079405), REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.3162199)  },
198
    { REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.2238649), REAL_CONST(0.1778336)  },
199
    { REAL_CONST(0.5623343), REAL_CONST(0.3980992), REAL_CONST(0.2238649), REAL_CONST(0.1258956), REAL_CONST(0.0891266)  },
200
    { REAL_CONST(0.5011797), REAL_CONST(0.2818306), REAL_CONST(0.1412576), REAL_CONST(0.0707954), REAL_CONST(0.0398107)  },
201
    { REAL_CONST(0.3980992), REAL_CONST(0.1995331), REAL_CONST(0.0891267), REAL_CONST(0.0398107), REAL_CONST(0.0177825)  }
202
};
203
204
/* 2^(pan_quant[x][y]/30) */
205
static const real_t pan_pow_2_30_pos[8][5] = {
206
    { COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1)           },
207
    { COEF_CONST(1.003845098), COEF_CONST(1.003845098), COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.007704982) },
208
    { COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.01546933),  COEF_CONST(1.019373909), COEF_CONST(1.019373909) },
209
    { COEF_CONST(1.011579706), COEF_CONST(1.01546933),  COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.039123167) },
210
    { COEF_CONST(1.01546933),  COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.051155908), COEF_CONST(1.059252598) },
211
    { COEF_CONST(1.019373909), COEF_CONST(1.03117796),  COEF_CONST(1.051155908), COEF_CONST(1.071518432), COEF_CONST(1.0839263)   },
212
    { COEF_CONST(1.023293502), COEF_CONST(1.043118698), COEF_CONST(1.067414119), COEF_CONST(1.092277933), COEF_CONST(1.113439626) },
213
    { COEF_CONST(1.03117796),  COEF_CONST(1.055195268), COEF_CONST(1.0839263),   COEF_CONST(1.113439626), COEF_CONST(1.143756546) }
214
};
215
216
/* 2^(-pan_quant[x][y]/30) */
217
static const real_t pan_pow_2_30_neg[8][5] = {
218
    { COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1),           COEF_CONST(1)           },
219
    { COEF_CONST(0.99616963),  COEF_CONST(0.99616963),  COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.99235393)  },
220
    { COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.984766325), COEF_CONST(0.980994305), COEF_CONST(0.980994305) },
221
    { COEF_CONST(0.988552848), COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.962349827) },
222
    { COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.951333663), COEF_CONST(0.944061881) },
223
    { COEF_CONST(0.980994305), COEF_CONST(0.969764715), COEF_CONST(0.951333663), COEF_CONST(0.933255062), COEF_CONST(0.922571949) },
224
    { COEF_CONST(0.977236734), COEF_CONST(0.958663671), COEF_CONST(0.936843519), COEF_CONST(0.915517901), COEF_CONST(0.898117847) },
225
    { COEF_CONST(0.969764715), COEF_CONST(0.947691892), COEF_CONST(0.922571949), COEF_CONST(0.898117847), COEF_CONST(0.874311936) }
226
};
227
228
static const real_t g_decayslope[MAX_SA_BAND] = {
229
    FRAC_CONST(1),   FRAC_CONST(1),   FRAC_CONST(1),   FRAC_CONST(0.95),FRAC_CONST(0.9), FRAC_CONST(0.85), FRAC_CONST(0.8),
230
    FRAC_CONST(0.75),FRAC_CONST(0.7), FRAC_CONST(0.65),FRAC_CONST(0.6), FRAC_CONST(0.55),FRAC_CONST(0.5),  FRAC_CONST(0.45),
231
    FRAC_CONST(0.4), FRAC_CONST(0.35),FRAC_CONST(0.3), FRAC_CONST(0.25),FRAC_CONST(0.2), FRAC_CONST(0.15), FRAC_CONST(0.1),
232
    FRAC_CONST(0.05),FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),    FRAC_CONST(0),
233
    FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),    FRAC_CONST(0),
234
    FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0),    FRAC_CONST(0),
235
    FRAC_CONST(0),   FRAC_CONST(0),   FRAC_CONST(0)
236
};
237
238
static const real_t sa_sqrt_1_minus[8][2] = {
239
    { FRAC_CONST(1),            FRAC_CONST(1)           },
240
    { FRAC_CONST(0.998744206),  FRAC_CONST(0.984066644) },
241
    { FRAC_CONST(0.997504707),  FRAC_CONST(0.959473168) },
242
    { FRAC_CONST(0.995037562),  FRAC_CONST(0.894683804) },
243
    { FRAC_CONST(0.990165638),  FRAC_CONST(0.826933317) },
244
    { FRAC_CONST(0.980663811),  FRAC_CONST(0.706312672) },
245
    { FRAC_CONST(0.962494836),  FRAC_CONST(0.45341406)  },
246
    { FRAC_CONST(0.929071574),  FRAC_CONST(0)           }
247
};
248
249
static const uint8_t sa_freq_scale[9] =
250
{
251
    0, 1, 2, 3, 5, 7, 10, 13, 23
252
};
253
254
//static const uint8_t pan_freq_scale[21] =
255
//{
256
//    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
257
//    11, 12, 13, 14, 15, 18, 22, 26, 32, 64
258
//};
259
260
static const uint8_t pan_quant_class[20] =
261
{
262
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
263
    2, 2, 2, 2, 3, 3, 3, 4, 4, 4
264
};
265
266
/* Inverse mapping lookup */
267
static const uint8_t pan_inv_freq[64] = {
268
     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
269
    15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18,
270
    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
271
    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19
272
};
273
274
static const uint8_t sa_inv_freq[MAX_SA_BAND] = {
275
    0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6,
276
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
277
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
278
    7, 7, 7, 7, 7, 7, 7
279
};
280
281
static const real_t filter_coeff[] =
282
{
283
    FRAC_CONST(0.65143905754106),
284
    FRAC_CONST(0.56471812200776),
285
    FRAC_CONST(0.48954165955695)
286
};
287
288
static const uint8_t delay_length[3] =
289
{
290
    3, 4, 5
291
};
292
293
//static const real_t delay_fraction[] =
294
//{
295
//    FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347)
296
//};
297
298
static const real_t peak_decay = FRAC_CONST(0.76592833836465);
299
300
static const real_t smooth_coeff = FRAC_CONST(0.25);
301
302
/* Please note that these are the same tables as in plain PS */
303
static const complex_t Q_Fract_allpass_Qmf[][3] = {
304
    { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } },
305
    { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } },
306
    { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } },
307
    { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } },
308
    { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } },
309
    { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } },
310
    { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } },
311
    { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } },
312
    { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } },
313
    { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } },
314
    { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } },
315
    { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } },
316
    { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } },
317
    { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } },
318
    { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } },
319
    { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } },
320
    { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } },
321
    { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } },
322
    { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } },
323
    { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } },
324
    { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } },
325
    { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } },
326
    { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } },
327
    { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } },
328
    { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } },
329
    { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } },
330
    { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } },
331
    { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } },
332
    { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } },
333
    { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } },
334
    { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } },
335
    { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } },
336
    { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } },
337
    { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } },
338
    { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } },
339
    { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } },
340
    { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } },
341
    { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } },
342
    { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } },
343
    { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } },
344
    { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } },
345
    { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } },
346
    { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } },
347
    { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } },
348
    { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } },
349
    { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } },
350
    { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } },
351
    { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } },
352
    { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } },
353
    { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } },
354
    { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } },
355
    { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } },
356
    { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } },
357
    { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } },
358
    { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } },
359
    { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } },
360
    { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } },
361
    { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } },
362
    { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } },
363
    { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } },
364
    { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } },
365
    { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } },
366
    { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } },
367
    { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } }
368
};
369
370
static const complex_t Phi_Fract_Qmf[] = {
371
    { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) },
372
    { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) },
373
    { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) },
374
    { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) },
375
    { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) },
376
    { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) },
377
    { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) },
378
    { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) },
379
    { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) },
380
    { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) },
381
    { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) },
382
    { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) },
383
    { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) },
384
    { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) },
385
    { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) },
386
    { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) },
387
    { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) },
388
    { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) },
389
    { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) },
390
    { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) },
391
    { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) },
392
    { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) },
393
    { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) },
394
    { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) },
395
    { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) },
396
    { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) },
397
    { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) },
398
    { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) },
399
    { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) },
400
    { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) },
401
    { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) },
402
    { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) },
403
    { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) },
404
    { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) },
405
    { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) },
406
    { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) },
407
    { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) },
408
    { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) },
409
    { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) },
410
    { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) },
411
    { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) },
412
    { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) },
413
    { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) },
414
    { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) },
415
    { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) },
416
    { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) },
417
    { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) },
418
    { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) },
419
    { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) },
420
    { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) },
421
    { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) },
422
    { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) },
423
    { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) },
424
    { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) },
425
    { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) },
426
    { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) },
427
    { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) },
428
    { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) },
429
    { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) },
430
    { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) },
431
    { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) },
432
    { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) },
433
    { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) },
434
    { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) }
435
};
436
437
438
/* static function declarations */
439
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld);
440
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld);
441
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff);
442
443
444
uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld)
445
954k
{
446
954k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
954k
    ps->drm_ps_data_available = 1;
449
450
954k
    ps->bs_enable_sa = faad_get1bit(ld);
451
954k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
954k
    if (ps->bs_enable_sa)
454
21.8k
    {
455
21.8k
        drm_ps_sa_element(ps, ld);
456
21.8k
    }
457
458
954k
    if (ps->bs_enable_pan)
459
13.6k
    {
460
13.6k
        drm_ps_pan_element(ps, ld);
461
13.6k
    }
462
463
954k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
954k
    return bits;
466
954k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
21.8k
{
470
21.8k
    drm_ps_huff_tab huff;
471
21.8k
    uint8_t band;
472
473
21.8k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
21.8k
    if (ps->bs_sa_dt_flag)
475
8.51k
    {
476
8.51k
        huff = t_huffman_sa;
477
13.3k
    } else {
478
13.3k
        huff = f_huffman_sa;
479
13.3k
    }
480
481
196k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
174k
    {
483
174k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
174k
    }
485
21.8k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
13.6k
{
489
13.6k
    drm_ps_huff_tab huff;
490
13.6k
    uint8_t band;
491
492
13.6k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
13.6k
    if (ps->bs_pan_dt_flag)
494
3.68k
    {
495
3.68k
        huff = t_huffman_pan;
496
9.92k
    } else {
497
9.92k
        huff = f_huffman_pan;
498
9.92k
    }
499
500
285k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
272k
    {
502
272k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
272k
    }
504
13.6k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
447k
{
509
447k
    uint8_t bit;
510
447k
    int8_t index = 0;
511
512
1.30M
    while (index >= 0)
513
856k
    {
514
856k
        bit = (uint8_t)faad_get1bit(ld);
515
856k
        index = huff[index][bit];
516
856k
    }
517
518
447k
    return index + 15;
519
447k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
816
{
524
816
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
251
        ps->sa_decode_error = 1;
527
251
        return 0;
528
565
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
92
        ps->sa_decode_error = 1;
531
92
        return 7;
532
92
    } else
533
473
        return i;
534
816
}
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
213
        ps->pan_decode_error = 1;
541
213
        return -7;
542
1.96k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
234
        ps->pan_decode_error = 1;
545
234
        return 7;
546
234
    } else
547
1.73k
        return i;
548
2.18k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
149
{
552
149
    uint8_t band;
553
554
149
    if (ps->bs_enable_sa)
555
127
    {
556
127
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
25
        {
558
            /* wait until we get a DT frame */
559
25
            ps->bs_enable_sa = 0;
560
102
        } 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
86
        } else {
564
            /* DF always decodable */
565
86
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
86
        }
567
568
1.01k
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
889
        {
570
889
            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
777
            } else if (!ps->bs_sa_dt_flag) {
574
602
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
602
            }
576
889
        }
577
127
    }
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
149
    if (ps->sa_decode_error) {
582
81
        ps->pan_decode_error = 1;
583
81
        ps->bs_enable_pan = ps->g_last_had_pan;
584
81
        ps->bs_enable_sa = ps->g_last_had_sa;
585
81
    }
586
587
588
149
    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
149
    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
34
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
75
        } else {
611
75
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
75
        }
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
646
            {
618
646
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.48k
            } else if (!ps->bs_pan_dt_flag) {
620
1.42k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.42k
            }
622
2.12k
        }
623
624
112
        if (ps->pan_decode_error) {
625
1.51k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.44k
            {
627
1.44k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.44k
            }
629
72
        } else {
630
840
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
800
            {
632
800
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
800
            }
634
40
        }
635
112
    }
636
149
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
280
{
640
280
    uint8_t s, b, k;
641
280
    complex_t qfrac, tmp0, tmp, in, R0;
642
280
    real_t peakdiff;
643
280
    real_t nrg;
644
280
    real_t power;
645
280
    real_t transratio;
646
280
    real_t new_delay_slopes[NUM_OF_LINKS];
647
280
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
280
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.72k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.44k
    {
655
        /* set delay indices */
656
25.7k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
19.3k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.44k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.44k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
199k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
193k
        {
664
193k
            const real_t gamma = REAL_CONST(1.5);
665
193k
            const real_t sigma = REAL_CONST(1.5625);
666
667
193k
            RE(in) = QMF_RE(X[s][b]);
668
193k
            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
47.6k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
47.6k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
145k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
193k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
193k
            if (ps->peakdecay_fast[b] < power)
683
15.0k
                ps->peakdecay_fast[b] = power;
684
685
193k
            peakdiff = ps->prev_peakdiff[b];
686
193k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
193k
            ps->prev_peakdiff[b] = peakdiff;
688
689
193k
            nrg = ps->prev_nrg[b];
690
193k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
193k
            ps->prev_nrg[b] = nrg;
692
693
193k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
182k
                transratio = sigma;
695
182k
            } else {
696
10.3k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
10.3k
            }
698
699
772k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
579k
            {
701
579k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
579k
            }
703
704
193k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
193k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
193k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
193k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
193k
            RE(ps->d_buff[1][b]) = RE(in);
711
193k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
193k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
193k
            RE(R0) = RE(tmp);
716
193k
            IM(R0) = IM(tmp);
717
718
772k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
579k
            {
720
579k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
579k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
579k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
579k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
579k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
579k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
579k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
579k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
579k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
579k
                RE(R0) = RE(tmp);
735
579k
                IM(R0) = IM(tmp);
736
579k
            }
737
738
193k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
193k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
772k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
579k
            {
743
579k
                if (++temp_delay_ser[k] >= delay_length[k])
744
149k
                    temp_delay_ser[k] = 0;
745
579k
            }
746
193k
        }
747
6.44k
    }
748
749
1.12k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
840
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
280
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
69
{
640
69
    uint8_t s, b, k;
641
69
    complex_t qfrac, tmp0, tmp, in, R0;
642
69
    real_t peakdiff;
643
69
    real_t nrg;
644
69
    real_t power;
645
69
    real_t transratio;
646
69
    real_t new_delay_slopes[NUM_OF_LINKS];
647
69
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
69
    complex_t Phi_Fract;
649
69
#ifdef FIXED_POINT
650
69
    uint32_t in_re, in_im;
651
69
#endif
652
653
1.65k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.58k
    {
655
        /* set delay indices */
656
6.34k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
4.76k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.58k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.58k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
49.1k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
47.6k
        {
664
47.6k
            const real_t gamma = REAL_CONST(1.5);
665
47.6k
            const real_t sigma = REAL_CONST(1.5625);
666
667
47.6k
            RE(in) = QMF_RE(X[s][b]);
668
47.6k
            IM(in) = QMF_IM(X[s][b]);
669
670
47.6k
#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
47.6k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
47.6k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
47.6k
            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
47.6k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
47.6k
            if (ps->peakdecay_fast[b] < power)
683
6.31k
                ps->peakdecay_fast[b] = power;
684
685
47.6k
            peakdiff = ps->prev_peakdiff[b];
686
47.6k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
47.6k
            ps->prev_peakdiff[b] = peakdiff;
688
689
47.6k
            nrg = ps->prev_nrg[b];
690
47.6k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
47.6k
            ps->prev_nrg[b] = nrg;
692
693
47.6k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
44.7k
                transratio = sigma;
695
44.7k
            } else {
696
2.89k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.89k
            }
698
699
190k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
142k
            {
701
142k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
142k
            }
703
704
47.6k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
47.6k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
47.6k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
47.6k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
47.6k
            RE(ps->d_buff[1][b]) = RE(in);
711
47.6k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
47.6k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
47.6k
            RE(R0) = RE(tmp);
716
47.6k
            IM(R0) = IM(tmp);
717
718
190k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
142k
            {
720
142k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
142k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
142k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
142k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
142k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
142k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
142k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
142k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
142k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
142k
                RE(R0) = RE(tmp);
735
142k
                IM(R0) = IM(tmp);
736
142k
            }
737
738
47.6k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
47.6k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
190k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
142k
            {
743
142k
                if (++temp_delay_ser[k] >= delay_length[k])
744
36.5k
                    temp_delay_ser[k] = 0;
745
142k
            }
746
47.6k
        }
747
1.58k
    }
748
749
276
    for (k = 0; k < NUM_OF_LINKS; k++)
750
207
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
69
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
211
{
640
211
    uint8_t s, b, k;
641
211
    complex_t qfrac, tmp0, tmp, in, R0;
642
211
    real_t peakdiff;
643
211
    real_t nrg;
644
211
    real_t power;
645
211
    real_t transratio;
646
211
    real_t new_delay_slopes[NUM_OF_LINKS];
647
211
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
211
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.06k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.85k
    {
655
        /* set delay indices */
656
19.4k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.5k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.85k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.85k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
150k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
145k
        {
664
145k
            const real_t gamma = REAL_CONST(1.5);
665
145k
            const real_t sigma = REAL_CONST(1.5625);
666
667
145k
            RE(in) = QMF_RE(X[s][b]);
668
145k
            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
145k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
145k
#endif
680
681
145k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
145k
            if (ps->peakdecay_fast[b] < power)
683
8.78k
                ps->peakdecay_fast[b] = power;
684
685
145k
            peakdiff = ps->prev_peakdiff[b];
686
145k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
145k
            ps->prev_peakdiff[b] = peakdiff;
688
689
145k
            nrg = ps->prev_nrg[b];
690
145k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
145k
            ps->prev_nrg[b] = nrg;
692
693
145k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
138k
                transratio = sigma;
695
138k
            } else {
696
7.42k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.42k
            }
698
699
582k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
436k
            {
701
436k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
436k
            }
703
704
145k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
145k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
145k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
145k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
145k
            RE(ps->d_buff[1][b]) = RE(in);
711
145k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
145k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
145k
            RE(R0) = RE(tmp);
716
145k
            IM(R0) = IM(tmp);
717
718
582k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
436k
            {
720
436k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
436k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
436k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
436k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
436k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
436k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
436k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
436k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
436k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
436k
                RE(R0) = RE(tmp);
735
436k
                IM(R0) = IM(tmp);
736
436k
            }
737
738
145k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
145k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
582k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
436k
            {
743
436k
                if (++temp_delay_ser[k] >= delay_length[k])
744
113k
                    temp_delay_ser[k] = 0;
745
436k
            }
746
145k
        }
747
4.85k
    }
748
749
844
    for (k = 0; k < NUM_OF_LINKS; k++)
750
633
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
211
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
280
{
755
280
    uint8_t s, b, ifreq, qclass;
756
280
    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
280
    real_t new_dir_map, new_sa_map;
758
759
280
    if (ps->bs_enable_sa)
760
96
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.30k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.20k
        {
765
2.20k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.20k
            ifreq = sa_inv_freq[b];
768
2.20k
            qclass = (b != 0);
769
770
2.20k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.20k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.20k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.20k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.20k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.20k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.20k
        }
781
782
2.97k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.88k
        {
784
69.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
66.2k
            {
786
66.2k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
66.2k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
66.2k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
66.2k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
66.2k
                sa_map[b]     += k_sa_map[b];
792
66.2k
                sa_dir_map[b] += k_sa_dir_map[b];
793
66.2k
            }
794
120k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
118k
            {
796
118k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
118k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
118k
            }
799
2.88k
        }
800
96
    }
801
184
    else {
802
5.70k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
5.52k
        {
804
358k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
353k
            {
806
353k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
353k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
353k
            }
809
5.52k
        }
810
184
    }
811
280
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
69
{
755
69
    uint8_t s, b, ifreq, qclass;
756
69
    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
69
    real_t new_dir_map, new_sa_map;
758
759
69
    if (ps->bs_enable_sa)
760
18
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
432
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
414
        {
765
414
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
414
            ifreq = sa_inv_freq[b];
768
414
            qclass = (b != 0);
769
770
414
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
414
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
414
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
414
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
414
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
414
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
414
        }
781
782
558
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
540
        {
784
12.9k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
12.4k
            {
786
12.4k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
12.4k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
12.4k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
12.4k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
12.4k
                sa_map[b]     += k_sa_map[b];
792
12.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
12.4k
            }
794
22.6k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
22.1k
            {
796
22.1k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
22.1k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
22.1k
            }
799
540
        }
800
18
    }
801
51
    else {
802
1.58k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.53k
        {
804
99.4k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
97.9k
            {
806
97.9k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
97.9k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
97.9k
            }
809
1.53k
        }
810
51
    }
811
69
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
211
{
755
211
    uint8_t s, b, ifreq, qclass;
756
211
    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
211
    real_t new_dir_map, new_sa_map;
758
759
211
    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
133
    else {
802
4.12k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.99k
        {
804
259k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
255k
            {
806
255k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
255k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
255k
            }
809
3.99k
        }
810
133
    }
811
211
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
192
{
815
192
    uint8_t s, b, qclass, ifreq;
816
192
    real_t tmp, coeff1, coeff2;
817
192
    real_t pan_base[MAX_PAN_BAND];
818
192
    real_t pan_delta[MAX_PAN_BAND];
819
192
    qmf_t temp_l, temp_r;
820
821
192
    if (ps->bs_enable_pan)
822
192
    {
823
12.4k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
12.2k
        {
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
12.2k
            ifreq = pan_inv_freq[b];
828
12.2k
            qclass = pan_quant_class[ifreq];
829
830
12.2k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
11.6k
            {
832
11.6k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
11.6k
            } else {
834
606
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
606
            }
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
12.2k
            if (ps->g_pan_index[ifreq] >= 0)
840
10.8k
            {
841
10.8k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
10.7k
                {
843
10.7k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
10.7k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
10.7k
                } else {
846
101
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
101
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
101
                }
849
10.8k
            } else {
850
1.48k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
976
                {
852
976
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
976
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
976
                } else {
855
505
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
505
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
505
                }
858
1.48k
            }
859
12.2k
        }
860
861
5.95k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.76k
        {
863
            /* PAN always uses all 64 channels */
864
374k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
368k
            {
866
368k
                tmp = pan_base[b];
867
868
368k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
368k
                coeff1 = MUL_R(coeff2, tmp);
870
871
368k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
368k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
368k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
368k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
368k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
368k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
368k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
368k
                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
368k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
368k
            }
885
5.76k
        }
886
192
    }
887
192
}
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
2.04k
            {
841
2.04k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
2.04k
                {
843
2.04k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
2.04k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
2.04k
                } 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
2.04k
            } 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
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
160
{
815
160
    uint8_t s, b, qclass, ifreq;
816
160
    real_t tmp, coeff1, coeff2;
817
160
    real_t pan_base[MAX_PAN_BAND];
818
160
    real_t pan_delta[MAX_PAN_BAND];
819
160
    qmf_t temp_l, temp_r;
820
821
160
    if (ps->bs_enable_pan)
822
160
    {
823
10.4k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
10.2k
        {
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.2k
            ifreq = pan_inv_freq[b];
828
10.2k
            qclass = pan_quant_class[ifreq];
829
830
10.2k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.63k
            {
832
9.63k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.63k
            } else {
834
606
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
606
            }
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.2k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.75k
            {
841
8.75k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.65k
                {
843
8.65k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.65k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.65k
                } else {
846
101
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
101
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
101
                }
849
8.75k
            } else {
850
1.48k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
976
                {
852
976
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
976
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
976
                } else {
855
505
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
505
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
505
                }
858
1.48k
            }
859
10.2k
        }
860
861
4.96k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.80k
        {
863
            /* PAN always uses all 64 channels */
864
312k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
307k
            {
866
307k
                tmp = pan_base[b];
867
868
307k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
307k
                coeff1 = MUL_R(coeff2, tmp);
870
871
307k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
307k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
307k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
307k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
307k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
307k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
307k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
307k
                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
307k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
307k
            }
885
4.80k
        }
886
160
    }
887
160
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.05k
{
891
7.05k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.05k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.05k
    return ps;
896
7.05k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.05k
{
900
7.05k
    faad_free(ps);
901
7.05k
}
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
287
{
906
287
    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
281
    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
280
    if (!guess)
923
149
    {
924
149
        ps->sa_decode_error = 0;
925
149
        ps->pan_decode_error = 0;
926
149
        drm_ps_delta_decode(ps);
927
149
    } else
928
131
    {
929
131
        ps->sa_decode_error = 1;
930
131
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
131
    }
933
934
280
    ps->drm_ps_data_available = 0;
935
936
280
    drm_calc_sa_side_signal(ps, X_left);
937
280
    drm_add_ambiance(ps, X_left, X_right);
938
939
280
    if (ps->bs_enable_sa)
940
96
    {
941
96
        ps->g_last_had_sa = 1;
942
943
96
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
184
    } else {
946
184
        ps->g_last_had_sa = 0;
947
184
    }
948
949
280
    if (ps->bs_enable_pan)
950
192
    {
951
192
        drm_add_pan(ps, X_left, X_right);
952
953
192
        ps->g_last_had_pan = 1;
954
955
192
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
192
    } else {
958
88
        ps->g_last_had_pan = 0;
959
88
    }
960
961
962
280
    return 0;
963
281
}
964
965
#endif