Coverage Report

Created: 2026-01-10 06:29

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
918k
{
446
918k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
918k
    ps->drm_ps_data_available = 1;
449
450
918k
    ps->bs_enable_sa = faad_get1bit(ld);
451
918k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
918k
    if (ps->bs_enable_sa)
454
18.0k
    {
455
18.0k
        drm_ps_sa_element(ps, ld);
456
18.0k
    }
457
458
918k
    if (ps->bs_enable_pan)
459
14.4k
    {
460
14.4k
        drm_ps_pan_element(ps, ld);
461
14.4k
    }
462
463
918k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
918k
    return bits;
466
918k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
18.0k
{
470
18.0k
    drm_ps_huff_tab huff;
471
18.0k
    uint8_t band;
472
473
18.0k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
18.0k
    if (ps->bs_sa_dt_flag)
475
9.46k
    {
476
9.46k
        huff = t_huffman_sa;
477
9.46k
    } else {
478
8.56k
        huff = f_huffman_sa;
479
8.56k
    }
480
481
162k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
144k
    {
483
144k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
144k
    }
485
18.0k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
14.4k
{
489
14.4k
    drm_ps_huff_tab huff;
490
14.4k
    uint8_t band;
491
492
14.4k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
14.4k
    if (ps->bs_pan_dt_flag)
494
3.92k
    {
495
3.92k
        huff = t_huffman_pan;
496
10.5k
    } else {
497
10.5k
        huff = f_huffman_pan;
498
10.5k
    }
499
500
303k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
288k
    {
502
288k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
288k
    }
504
14.4k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
433k
{
509
433k
    uint8_t bit;
510
433k
    int8_t index = 0;
511
512
1.23M
    while (index >= 0)
513
802k
    {
514
802k
        bit = (uint8_t)faad_get1bit(ld);
515
802k
        index = huff[index][bit];
516
802k
    }
517
518
433k
    return index + 15;
519
433k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
656
{
524
656
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
179
        ps->sa_decode_error = 1;
527
179
        return 0;
528
477
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
72
        ps->sa_decode_error = 1;
531
72
        return 7;
532
72
    } else
533
405
        return i;
534
656
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.14k
{
538
2.14k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
219
        ps->pan_decode_error = 1;
541
219
        return -7;
542
1.92k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
225
        ps->pan_decode_error = 1;
545
225
        return 7;
546
225
    } else
547
1.69k
        return i;
548
2.14k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
137
{
552
137
    uint8_t band;
553
554
137
    if (ps->bs_enable_sa)
555
107
    {
556
107
        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
82
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
13
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
69
        } else {
564
            /* DF always decodable */
565
69
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
69
        }
567
568
856
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
749
        {
570
749
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
91
            {
572
91
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
658
            } else if (!ps->bs_sa_dt_flag) {
574
483
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
483
            }
576
749
        }
577
107
    }
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
137
    if (ps->sa_decode_error) {
582
62
        ps->pan_decode_error = 1;
583
62
        ps->bs_enable_pan = ps->g_last_had_pan;
584
62
        ps->bs_enable_sa = ps->g_last_had_sa;
585
62
    }
586
587
588
137
    if (ps->bs_enable_sa)
589
43
    {
590
43
        if (ps->sa_decode_error) {
591
207
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
184
            {
593
184
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
184
            }
595
23
        } 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
43
    }
602
603
137
    if (ps->bs_enable_pan)
604
110
    {
605
110
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
107
        }  else if (ps->bs_pan_dt_flag) {
609
29
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
78
        } else {
611
78
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
78
        }
613
614
2.20k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.09k
        {
616
2.09k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
551
            {
618
551
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.53k
            } else if (!ps->bs_pan_dt_flag) {
620
1.48k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.48k
            }
622
2.09k
        }
623
624
110
        if (ps->pan_decode_error) {
625
1.38k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.32k
            {
627
1.32k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.32k
            }
629
66
        } else {
630
924
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
880
            {
632
880
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
880
            }
634
44
        }
635
110
    }
636
137
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
255
{
640
255
    uint8_t s, b, k;
641
255
    complex_t qfrac, tmp0, tmp, in, R0;
642
255
    real_t peakdiff;
643
255
    real_t nrg;
644
255
    real_t power;
645
255
    real_t transratio;
646
255
    real_t new_delay_slopes[NUM_OF_LINKS];
647
255
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
255
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.12k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.86k
    {
655
        /* set delay indices */
656
23.4k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
17.5k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.86k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.86k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
181k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
175k
        {
664
175k
            const real_t gamma = REAL_CONST(1.5);
665
175k
            const real_t sigma = REAL_CONST(1.5625);
666
667
175k
            RE(in) = QMF_RE(X[s][b]);
668
175k
            IM(in) = QMF_IM(X[s][b]);
669
670
#ifdef FIXED_POINT
671
            /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672
            * meaning that P will be scaled by 2^(-10) compared to floating point version
673
            */
674
37.2k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
37.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
138k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
175k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
175k
            if (ps->peakdecay_fast[b] < power)
683
11.1k
                ps->peakdecay_fast[b] = power;
684
685
175k
            peakdiff = ps->prev_peakdiff[b];
686
175k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
175k
            ps->prev_peakdiff[b] = peakdiff;
688
689
175k
            nrg = ps->prev_nrg[b];
690
175k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
175k
            ps->prev_nrg[b] = nrg;
692
693
175k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
167k
                transratio = sigma;
695
167k
            } else {
696
8.94k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
8.94k
            }
698
699
703k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
527k
            {
701
527k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
527k
            }
703
704
175k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
175k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
175k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
175k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
175k
            RE(ps->d_buff[1][b]) = RE(in);
711
175k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
175k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
175k
            RE(R0) = RE(tmp);
716
175k
            IM(R0) = IM(tmp);
717
718
703k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
527k
            {
720
527k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
527k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
527k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
527k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
527k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
527k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
527k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
527k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
527k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
527k
                RE(R0) = RE(tmp);
735
527k
                IM(R0) = IM(tmp);
736
527k
            }
737
738
175k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
175k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
703k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
527k
            {
743
527k
                if (++temp_delay_ser[k] >= delay_length[k])
744
136k
                    temp_delay_ser[k] = 0;
745
527k
            }
746
175k
        }
747
5.86k
    }
748
749
1.02k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
765
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
255
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
54
{
640
54
    uint8_t s, b, k;
641
54
    complex_t qfrac, tmp0, tmp, in, R0;
642
54
    real_t peakdiff;
643
54
    real_t nrg;
644
54
    real_t power;
645
54
    real_t transratio;
646
54
    real_t new_delay_slopes[NUM_OF_LINKS];
647
54
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
54
    complex_t Phi_Fract;
649
54
#ifdef FIXED_POINT
650
54
    uint32_t in_re, in_im;
651
54
#endif
652
653
1.29k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.24k
    {
655
        /* set delay indices */
656
4.96k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
3.72k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.24k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.24k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
38.5k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
37.2k
        {
664
37.2k
            const real_t gamma = REAL_CONST(1.5);
665
37.2k
            const real_t sigma = REAL_CONST(1.5625);
666
667
37.2k
            RE(in) = QMF_RE(X[s][b]);
668
37.2k
            IM(in) = QMF_IM(X[s][b]);
669
670
37.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
37.2k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
37.2k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
37.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
37.2k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
37.2k
            if (ps->peakdecay_fast[b] < power)
683
4.55k
                ps->peakdecay_fast[b] = power;
684
685
37.2k
            peakdiff = ps->prev_peakdiff[b];
686
37.2k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
37.2k
            ps->prev_peakdiff[b] = peakdiff;
688
689
37.2k
            nrg = ps->prev_nrg[b];
690
37.2k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
37.2k
            ps->prev_nrg[b] = nrg;
692
693
37.2k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
34.5k
                transratio = sigma;
695
34.5k
            } else {
696
2.71k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.71k
            }
698
699
149k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
111k
            {
701
111k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
111k
            }
703
704
37.2k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
37.2k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
37.2k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
37.2k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
37.2k
            RE(ps->d_buff[1][b]) = RE(in);
711
37.2k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
37.2k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
37.2k
            RE(R0) = RE(tmp);
716
37.2k
            IM(R0) = IM(tmp);
717
718
149k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
111k
            {
720
111k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
111k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
111k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
111k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
111k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
111k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
111k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
111k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
111k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
111k
                RE(R0) = RE(tmp);
735
111k
                IM(R0) = IM(tmp);
736
111k
            }
737
738
37.2k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
37.2k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
149k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
111k
            {
743
111k
                if (++temp_delay_ser[k] >= delay_length[k])
744
28.6k
                    temp_delay_ser[k] = 0;
745
111k
            }
746
37.2k
        }
747
1.24k
    }
748
749
216
    for (k = 0; k < NUM_OF_LINKS; k++)
750
162
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
54
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
201
{
640
201
    uint8_t s, b, k;
641
201
    complex_t qfrac, tmp0, tmp, in, R0;
642
201
    real_t peakdiff;
643
201
    real_t nrg;
644
201
    real_t power;
645
201
    real_t transratio;
646
201
    real_t new_delay_slopes[NUM_OF_LINKS];
647
201
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
201
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.82k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.62k
    {
655
        /* set delay indices */
656
18.4k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
13.8k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.62k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.62k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
143k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
138k
        {
664
138k
            const real_t gamma = REAL_CONST(1.5);
665
138k
            const real_t sigma = REAL_CONST(1.5625);
666
667
138k
            RE(in) = QMF_RE(X[s][b]);
668
138k
            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
138k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
138k
#endif
680
681
138k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
138k
            if (ps->peakdecay_fast[b] < power)
683
6.61k
                ps->peakdecay_fast[b] = power;
684
685
138k
            peakdiff = ps->prev_peakdiff[b];
686
138k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
138k
            ps->prev_peakdiff[b] = peakdiff;
688
689
138k
            nrg = ps->prev_nrg[b];
690
138k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
138k
            ps->prev_nrg[b] = nrg;
692
693
138k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
132k
                transratio = sigma;
695
132k
            } else {
696
6.23k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.23k
            }
698
699
554k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
416k
            {
701
416k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
416k
            }
703
704
138k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
138k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
138k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
138k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
138k
            RE(ps->d_buff[1][b]) = RE(in);
711
138k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
138k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
138k
            RE(R0) = RE(tmp);
716
138k
            IM(R0) = IM(tmp);
717
718
554k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
416k
            {
720
416k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
416k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
416k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
416k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
416k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
416k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
416k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
416k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
416k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
416k
                RE(R0) = RE(tmp);
735
416k
                IM(R0) = IM(tmp);
736
416k
            }
737
738
138k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
138k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
554k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
416k
            {
743
416k
                if (++temp_delay_ser[k] >= delay_length[k])
744
107k
                    temp_delay_ser[k] = 0;
745
416k
            }
746
138k
        }
747
4.62k
    }
748
749
804
    for (k = 0; k < NUM_OF_LINKS; k++)
750
603
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
201
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
255
{
755
255
    uint8_t s, b, ifreq, qclass;
756
255
    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
255
    real_t new_dir_map, new_sa_map;
758
759
255
    if (ps->bs_enable_sa)
760
91
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.18k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.09k
        {
765
2.09k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.09k
            ifreq = sa_inv_freq[b];
768
2.09k
            qclass = (b != 0);
769
770
2.09k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.09k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.09k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.09k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.09k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.09k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.09k
        }
781
782
2.82k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.73k
        {
784
65.5k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
62.7k
            {
786
62.7k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
62.7k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
62.7k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
62.7k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
62.7k
                sa_map[b]     += k_sa_map[b];
792
62.7k
                sa_dir_map[b] += k_sa_dir_map[b];
793
62.7k
            }
794
114k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
111k
            {
796
111k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
111k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
111k
            }
799
2.73k
        }
800
91
    }
801
164
    else {
802
5.08k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.92k
        {
804
319k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
314k
            {
806
314k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
314k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
314k
            }
809
4.92k
        }
810
164
    }
811
255
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
54
{
755
54
    uint8_t s, b, ifreq, qclass;
756
54
    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
54
    real_t new_dir_map, new_sa_map;
758
759
54
    if (ps->bs_enable_sa)
760
20
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
480
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
460
        {
765
460
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
460
            ifreq = sa_inv_freq[b];
768
460
            qclass = (b != 0);
769
770
460
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
460
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
460
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
460
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
460
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
460
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
460
        }
781
782
620
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
600
        {
784
14.4k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
13.8k
            {
786
13.8k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
13.8k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
13.8k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
13.8k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
13.8k
                sa_map[b]     += k_sa_map[b];
792
13.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
13.8k
            }
794
25.2k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
24.6k
            {
796
24.6k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
24.6k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
24.6k
            }
799
600
        }
800
20
    }
801
34
    else {
802
1.05k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.02k
        {
804
66.3k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
65.2k
            {
806
65.2k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
65.2k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
65.2k
            }
809
1.02k
        }
810
34
    }
811
54
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
201
{
755
201
    uint8_t s, b, ifreq, qclass;
756
201
    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
201
    real_t new_dir_map, new_sa_map;
758
759
201
    if (ps->bs_enable_sa)
760
71
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.70k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.63k
        {
765
1.63k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.63k
            ifreq = sa_inv_freq[b];
768
1.63k
            qclass = (b != 0);
769
770
1.63k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.63k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.63k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.63k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.63k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.63k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.63k
        }
781
782
2.20k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.13k
        {
784
51.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
48.9k
            {
786
48.9k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
48.9k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
48.9k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
48.9k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
48.9k
                sa_map[b]     += k_sa_map[b];
792
48.9k
                sa_dir_map[b] += k_sa_dir_map[b];
793
48.9k
            }
794
89.4k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
87.3k
            {
796
87.3k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
87.3k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
87.3k
            }
799
2.13k
        }
800
71
    }
801
130
    else {
802
4.03k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.90k
        {
804
253k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
249k
            {
806
249k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
249k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
249k
            }
809
3.90k
        }
810
130
    }
811
201
}
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.0k
            {
832
10.0k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
10.0k
            } else {
834
593
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
593
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
10.6k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.97k
            {
841
8.97k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.87k
                {
843
8.87k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.87k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.87k
                } 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.97k
            } else {
850
1.71k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.22k
                {
852
1.22k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.22k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.22k
                } else {
855
498
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
498
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
498
                }
858
1.71k
            }
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
25
{
815
25
    uint8_t s, b, qclass, ifreq;
816
25
    real_t tmp, coeff1, coeff2;
817
25
    real_t pan_base[MAX_PAN_BAND];
818
25
    real_t pan_delta[MAX_PAN_BAND];
819
25
    qmf_t temp_l, temp_r;
820
821
25
    if (ps->bs_enable_pan)
822
25
    {
823
1.62k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.60k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
1.60k
            ifreq = pan_inv_freq[b];
828
1.60k
            qclass = pan_quant_class[ifreq];
829
830
1.60k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.60k
            {
832
1.60k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.60k
            } else {
834
0
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
0
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
1.60k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.41k
            {
841
1.41k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.41k
                {
843
1.41k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.41k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.41k
                } else {
846
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
0
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
0
                }
849
1.41k
            } else {
850
189
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
189
                {
852
189
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
189
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
189
                } 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
189
            }
859
1.60k
        }
860
861
775
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
750
        {
863
            /* PAN always uses all 64 channels */
864
48.7k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
48.0k
            {
866
48.0k
                tmp = pan_base[b];
867
868
48.0k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
48.0k
                coeff1 = MUL_R(coeff2, tmp);
870
871
48.0k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
48.0k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
48.0k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
48.0k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
48.0k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
48.0k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
48.0k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
48.0k
                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
48.0k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
48.0k
            }
885
750
        }
886
25
    }
887
25
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
142
{
815
142
    uint8_t s, b, qclass, ifreq;
816
142
    real_t tmp, coeff1, coeff2;
817
142
    real_t pan_base[MAX_PAN_BAND];
818
142
    real_t pan_delta[MAX_PAN_BAND];
819
142
    qmf_t temp_l, temp_r;
820
821
142
    if (ps->bs_enable_pan)
822
142
    {
823
9.23k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.08k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
9.08k
            ifreq = pan_inv_freq[b];
828
9.08k
            qclass = pan_quant_class[ifreq];
829
830
9.08k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
8.49k
            {
832
8.49k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
8.49k
            } else {
834
593
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
593
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
9.08k
            if (ps->g_pan_index[ifreq] >= 0)
840
7.55k
            {
841
7.55k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
7.46k
                {
843
7.46k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
7.46k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
7.46k
                } 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
7.55k
            } else {
850
1.52k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.03k
                {
852
1.03k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.03k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.03k
                } else {
855
498
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
498
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
498
                }
858
1.52k
            }
859
9.08k
        }
860
861
4.40k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.26k
        {
863
            /* PAN always uses all 64 channels */
864
276k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
272k
            {
866
272k
                tmp = pan_base[b];
867
868
272k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
272k
                coeff1 = MUL_R(coeff2, tmp);
870
871
272k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
272k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
272k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
272k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
272k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
272k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
272k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
272k
                QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
880
881
                /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
882
                /*                   ^^^^^^^^^^^^^^^ k times */
883
272k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
272k
            }
885
4.26k
        }
886
142
    }
887
142
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.91k
{
891
7.91k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.91k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.91k
    return ps;
896
7.91k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.91k
{
900
7.91k
    faad_free(ps);
901
7.91k
}
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
261
{
906
261
    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
256
    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
255
    if (!guess)
923
137
    {
924
137
        ps->sa_decode_error = 0;
925
137
        ps->pan_decode_error = 0;
926
137
        drm_ps_delta_decode(ps);
927
137
    } else
928
118
    {
929
118
        ps->sa_decode_error = 1;
930
118
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
118
    }
933
934
255
    ps->drm_ps_data_available = 0;
935
936
255
    drm_calc_sa_side_signal(ps, X_left);
937
255
    drm_add_ambiance(ps, X_left, X_right);
938
939
255
    if (ps->bs_enable_sa)
940
91
    {
941
91
        ps->g_last_had_sa = 1;
942
943
91
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
164
    } else {
946
164
        ps->g_last_had_sa = 0;
947
164
    }
948
949
255
    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
88
        ps->g_last_had_pan = 0;
959
88
    }
960
961
962
255
    return 0;
963
256
}
964
965
#endif