Coverage Report

Created: 2026-02-14 07:13

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
886k
{
446
886k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
886k
    ps->drm_ps_data_available = 1;
449
450
886k
    ps->bs_enable_sa = faad_get1bit(ld);
451
886k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
886k
    if (ps->bs_enable_sa)
454
18.7k
    {
455
18.7k
        drm_ps_sa_element(ps, ld);
456
18.7k
    }
457
458
886k
    if (ps->bs_enable_pan)
459
14.0k
    {
460
14.0k
        drm_ps_pan_element(ps, ld);
461
14.0k
    }
462
463
886k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
886k
    return bits;
466
886k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
18.7k
{
470
18.7k
    drm_ps_huff_tab huff;
471
18.7k
    uint8_t band;
472
473
18.7k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
18.7k
    if (ps->bs_sa_dt_flag)
475
7.88k
    {
476
7.88k
        huff = t_huffman_sa;
477
10.8k
    } else {
478
10.8k
        huff = f_huffman_sa;
479
10.8k
    }
480
481
168k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
149k
    {
483
149k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
149k
    }
485
18.7k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
14.0k
{
489
14.0k
    drm_ps_huff_tab huff;
490
14.0k
    uint8_t band;
491
492
14.0k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
14.0k
    if (ps->bs_pan_dt_flag)
494
3.52k
    {
495
3.52k
        huff = t_huffman_pan;
496
10.4k
    } else {
497
10.4k
        huff = f_huffman_pan;
498
10.4k
    }
499
500
294k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
280k
    {
502
280k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
280k
    }
504
14.0k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
430k
{
509
430k
    uint8_t bit;
510
430k
    int8_t index = 0;
511
512
1.24M
    while (index >= 0)
513
815k
    {
514
815k
        bit = (uint8_t)faad_get1bit(ld);
515
815k
        index = huff[index][bit];
516
815k
    }
517
518
430k
    return index + 15;
519
430k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
712
{
524
712
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
218
        ps->sa_decode_error = 1;
527
218
        return 0;
528
494
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
82
        ps->sa_decode_error = 1;
531
82
        return 7;
532
82
    } else
533
412
        return i;
534
712
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
1.86k
{
538
1.86k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
215
        ps->pan_decode_error = 1;
541
215
        return -7;
542
1.64k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
227
        ps->pan_decode_error = 1;
545
227
        return 7;
546
227
    } else
547
1.41k
        return i;
548
1.86k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
127
{
552
127
    uint8_t band;
553
554
127
    if (ps->bs_enable_sa)
555
104
    {
556
104
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
15
        {
558
            /* wait until we get a DT frame */
559
15
            ps->bs_enable_sa = 0;
560
89
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
14
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
75
        } else {
564
            /* DF always decodable */
565
75
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
75
        }
567
568
832
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
728
        {
570
728
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
98
            {
572
98
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
630
            } else if (!ps->bs_sa_dt_flag) {
574
525
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
525
            }
576
728
        }
577
104
    }
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
127
    if (ps->sa_decode_error) {
582
72
        ps->pan_decode_error = 1;
583
72
        ps->bs_enable_pan = ps->g_last_had_pan;
584
72
        ps->bs_enable_sa = ps->g_last_had_sa;
585
72
    }
586
587
588
127
    if (ps->bs_enable_sa)
589
45
    {
590
45
        if (ps->sa_decode_error) {
591
252
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
224
            {
593
224
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
224
            }
595
28
        } else {
596
153
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
136
            {
598
136
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
136
            }
600
17
        }
601
45
    }
602
603
127
    if (ps->bs_enable_pan)
604
96
    {
605
96
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
93
        }  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
64
        } else {
611
64
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
64
        }
613
614
1.92k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
1.82k
        {
616
1.82k
            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.27k
            } else if (!ps->bs_pan_dt_flag) {
620
1.21k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.21k
            }
622
1.82k
        }
623
624
96
        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
630
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
600
            {
632
600
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
600
            }
634
30
        }
635
96
    }
636
127
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
231
{
640
231
    uint8_t s, b, k;
641
231
    complex_t qfrac, tmp0, tmp, in, R0;
642
231
    real_t peakdiff;
643
231
    real_t nrg;
644
231
    real_t power;
645
231
    real_t transratio;
646
231
    real_t new_delay_slopes[NUM_OF_LINKS];
647
231
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
231
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.54k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.31k
    {
655
        /* set delay indices */
656
21.2k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
15.9k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.31k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.31k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
164k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
159k
        {
664
159k
            const real_t gamma = REAL_CONST(1.5);
665
159k
            const real_t sigma = REAL_CONST(1.5625);
666
667
159k
            RE(in) = QMF_RE(X[s][b]);
668
159k
            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
35.1k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
35.1k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
124k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
159k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
159k
            if (ps->peakdecay_fast[b] < power)
683
11.4k
                ps->peakdecay_fast[b] = power;
684
685
159k
            peakdiff = ps->prev_peakdiff[b];
686
159k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
159k
            ps->prev_peakdiff[b] = peakdiff;
688
689
159k
            nrg = ps->prev_nrg[b];
690
159k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
159k
            ps->prev_nrg[b] = nrg;
692
693
159k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
152k
                transratio = sigma;
695
152k
            } else {
696
7.23k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.23k
            }
698
699
637k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
478k
            {
701
478k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
478k
            }
703
704
159k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
159k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
159k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
159k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
159k
            RE(ps->d_buff[1][b]) = RE(in);
711
159k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
159k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
159k
            RE(R0) = RE(tmp);
716
159k
            IM(R0) = IM(tmp);
717
718
637k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
478k
            {
720
478k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
478k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
478k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
478k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
478k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
478k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
478k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
478k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
478k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
478k
                RE(R0) = RE(tmp);
735
478k
                IM(R0) = IM(tmp);
736
478k
            }
737
738
159k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
159k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
637k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
478k
            {
743
478k
                if (++temp_delay_ser[k] >= delay_length[k])
744
123k
                    temp_delay_ser[k] = 0;
745
478k
            }
746
159k
        }
747
5.31k
    }
748
749
924
    for (k = 0; k < NUM_OF_LINKS; k++)
750
693
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
231
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
51
{
640
51
    uint8_t s, b, k;
641
51
    complex_t qfrac, tmp0, tmp, in, R0;
642
51
    real_t peakdiff;
643
51
    real_t nrg;
644
51
    real_t power;
645
51
    real_t transratio;
646
51
    real_t new_delay_slopes[NUM_OF_LINKS];
647
51
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
51
    complex_t Phi_Fract;
649
51
#ifdef FIXED_POINT
650
51
    uint32_t in_re, in_im;
651
51
#endif
652
653
1.22k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.17k
    {
655
        /* set delay indices */
656
4.69k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
3.51k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.17k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.17k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
36.3k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
35.1k
        {
664
35.1k
            const real_t gamma = REAL_CONST(1.5);
665
35.1k
            const real_t sigma = REAL_CONST(1.5625);
666
667
35.1k
            RE(in) = QMF_RE(X[s][b]);
668
35.1k
            IM(in) = QMF_IM(X[s][b]);
669
670
35.1k
#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
35.1k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
35.1k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
35.1k
            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
35.1k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
35.1k
            if (ps->peakdecay_fast[b] < power)
683
4.60k
                ps->peakdecay_fast[b] = power;
684
685
35.1k
            peakdiff = ps->prev_peakdiff[b];
686
35.1k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
35.1k
            ps->prev_peakdiff[b] = peakdiff;
688
689
35.1k
            nrg = ps->prev_nrg[b];
690
35.1k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
35.1k
            ps->prev_nrg[b] = nrg;
692
693
35.1k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
33.3k
                transratio = sigma;
695
33.3k
            } else {
696
1.82k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
1.82k
            }
698
699
140k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
105k
            {
701
105k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
105k
            }
703
704
35.1k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
35.1k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
35.1k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
35.1k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
35.1k
            RE(ps->d_buff[1][b]) = RE(in);
711
35.1k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
35.1k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
35.1k
            RE(R0) = RE(tmp);
716
35.1k
            IM(R0) = IM(tmp);
717
718
140k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
105k
            {
720
105k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
105k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
105k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
105k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
105k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
105k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
105k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
105k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
105k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
105k
                RE(R0) = RE(tmp);
735
105k
                IM(R0) = IM(tmp);
736
105k
            }
737
738
35.1k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
35.1k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
140k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
105k
            {
743
105k
                if (++temp_delay_ser[k] >= delay_length[k])
744
27.0k
                    temp_delay_ser[k] = 0;
745
105k
            }
746
35.1k
        }
747
1.17k
    }
748
749
204
    for (k = 0; k < NUM_OF_LINKS; k++)
750
153
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
51
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
180
{
640
180
    uint8_t s, b, k;
641
180
    complex_t qfrac, tmp0, tmp, in, R0;
642
180
    real_t peakdiff;
643
180
    real_t nrg;
644
180
    real_t power;
645
180
    real_t transratio;
646
180
    real_t new_delay_slopes[NUM_OF_LINKS];
647
180
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
180
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.32k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.14k
    {
655
        /* set delay indices */
656
16.5k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
12.4k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.14k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.14k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
128k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
124k
        {
664
124k
            const real_t gamma = REAL_CONST(1.5);
665
124k
            const real_t sigma = REAL_CONST(1.5625);
666
667
124k
            RE(in) = QMF_RE(X[s][b]);
668
124k
            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
124k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
124k
#endif
680
681
124k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
124k
            if (ps->peakdecay_fast[b] < power)
683
6.82k
                ps->peakdecay_fast[b] = power;
684
685
124k
            peakdiff = ps->prev_peakdiff[b];
686
124k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
124k
            ps->prev_peakdiff[b] = peakdiff;
688
689
124k
            nrg = ps->prev_nrg[b];
690
124k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
124k
            ps->prev_nrg[b] = nrg;
692
693
124k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
118k
                transratio = sigma;
695
118k
            } else {
696
5.40k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
5.40k
            }
698
699
496k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
372k
            {
701
372k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
372k
            }
703
704
124k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
124k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
124k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
124k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
124k
            RE(ps->d_buff[1][b]) = RE(in);
711
124k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
124k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
124k
            RE(R0) = RE(tmp);
716
124k
            IM(R0) = IM(tmp);
717
718
496k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
372k
            {
720
372k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
372k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
372k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
372k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
372k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
372k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
372k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
372k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
372k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
372k
                RE(R0) = RE(tmp);
735
372k
                IM(R0) = IM(tmp);
736
372k
            }
737
738
124k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
124k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
496k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
372k
            {
743
372k
                if (++temp_delay_ser[k] >= delay_length[k])
744
96.7k
                    temp_delay_ser[k] = 0;
745
372k
            }
746
124k
        }
747
4.14k
    }
748
749
720
    for (k = 0; k < NUM_OF_LINKS; k++)
750
540
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
180
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
231
{
755
231
    uint8_t s, b, ifreq, qclass;
756
231
    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
231
    real_t new_dir_map, new_sa_map;
758
759
231
    if (ps->bs_enable_sa)
760
89
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.13k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.04k
        {
765
2.04k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.04k
            ifreq = sa_inv_freq[b];
768
2.04k
            qclass = (b != 0);
769
770
2.04k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.04k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.04k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.04k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.04k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.04k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.04k
        }
781
782
2.75k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.67k
        {
784
64.0k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
61.4k
            {
786
61.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
61.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
61.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
61.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
61.4k
                sa_map[b]     += k_sa_map[b];
792
61.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
61.4k
            }
794
112k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
109k
            {
796
109k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
109k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
109k
            }
799
2.67k
        }
800
89
    }
801
142
    else {
802
4.40k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.26k
        {
804
276k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
272k
            {
806
272k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
272k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
272k
            }
809
4.26k
        }
810
142
    }
811
231
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
51
{
755
51
    uint8_t s, b, ifreq, qclass;
756
51
    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
51
    real_t new_dir_map, new_sa_map;
758
759
51
    if (ps->bs_enable_sa)
760
15
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
360
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
345
        {
765
345
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
345
            ifreq = sa_inv_freq[b];
768
345
            qclass = (b != 0);
769
770
345
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
345
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
345
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
345
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
345
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
345
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
345
        }
781
782
465
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
450
        {
784
10.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
10.3k
            {
786
10.3k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
10.3k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
10.3k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
10.3k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
10.3k
                sa_map[b]     += k_sa_map[b];
792
10.3k
                sa_dir_map[b] += k_sa_dir_map[b];
793
10.3k
            }
794
18.9k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
18.4k
            {
796
18.4k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
18.4k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
18.4k
            }
799
450
        }
800
15
    }
801
36
    else {
802
1.11k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.08k
        {
804
70.2k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
69.1k
            {
806
69.1k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
69.1k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
69.1k
            }
809
1.08k
        }
810
36
    }
811
51
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
180
{
755
180
    uint8_t s, b, ifreq, qclass;
756
180
    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
180
    real_t new_dir_map, new_sa_map;
758
759
180
    if (ps->bs_enable_sa)
760
74
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.77k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.70k
        {
765
1.70k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.70k
            ifreq = sa_inv_freq[b];
768
1.70k
            qclass = (b != 0);
769
770
1.70k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.70k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.70k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.70k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.70k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.70k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.70k
        }
781
782
2.29k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.22k
        {
784
53.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
51.0k
            {
786
51.0k
                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
51.0k
                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
51.0k
                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
51.0k
                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
51.0k
                sa_map[b]     += k_sa_map[b];
792
51.0k
                sa_dir_map[b] += k_sa_dir_map[b];
793
51.0k
            }
794
93.2k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
91.0k
            {
796
91.0k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
91.0k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
91.0k
            }
799
2.22k
        }
800
74
    }
801
106
    else {
802
3.28k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.18k
        {
804
206k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
203k
            {
806
203k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
203k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
203k
            }
809
3.18k
        }
810
106
    }
811
180
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
154
{
815
154
    uint8_t s, b, qclass, ifreq;
816
154
    real_t tmp, coeff1, coeff2;
817
154
    real_t pan_base[MAX_PAN_BAND];
818
154
    real_t pan_delta[MAX_PAN_BAND];
819
154
    qmf_t temp_l, temp_r;
820
821
154
    if (ps->bs_enable_pan)
822
154
    {
823
10.0k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.85k
        {
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.85k
            ifreq = pan_inv_freq[b];
828
9.85k
            qclass = pan_quant_class[ifreq];
829
830
9.85k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.37k
            {
832
9.37k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.37k
            } else {
834
483
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
483
            }
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.85k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.72k
            {
841
8.72k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.64k
                {
843
8.64k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.64k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.64k
                } else {
846
76
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
76
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
76
                }
849
8.72k
            } else {
850
1.13k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
726
                {
852
726
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
726
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
726
                } else {
855
407
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
407
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
407
                }
858
1.13k
            }
859
9.85k
        }
860
861
4.77k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.62k
        {
863
            /* PAN always uses all 64 channels */
864
300k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
295k
            {
866
295k
                tmp = pan_base[b];
867
868
295k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
295k
                coeff1 = MUL_R(coeff2, tmp);
870
871
295k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
295k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
295k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
295k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
295k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
295k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
295k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
295k
                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
295k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
295k
            }
885
4.62k
        }
886
154
    }
887
154
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
22
{
815
22
    uint8_t s, b, qclass, ifreq;
816
22
    real_t tmp, coeff1, coeff2;
817
22
    real_t pan_base[MAX_PAN_BAND];
818
22
    real_t pan_delta[MAX_PAN_BAND];
819
22
    qmf_t temp_l, temp_r;
820
821
22
    if (ps->bs_enable_pan)
822
22
    {
823
1.43k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.40k
        {
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.40k
            ifreq = pan_inv_freq[b];
828
1.40k
            qclass = pan_quant_class[ifreq];
829
830
1.40k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.40k
            {
832
1.40k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.40k
            } 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.40k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.40k
            {
841
1.40k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.40k
                {
843
1.40k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.40k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.40k
                } 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.40k
            } 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
1.40k
        }
860
861
682
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
660
        {
863
            /* PAN always uses all 64 channels */
864
42.9k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
42.2k
            {
866
42.2k
                tmp = pan_base[b];
867
868
42.2k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
42.2k
                coeff1 = MUL_R(coeff2, tmp);
870
871
42.2k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
42.2k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
42.2k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
42.2k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
42.2k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
42.2k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
42.2k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
42.2k
                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
42.2k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
42.2k
            }
885
660
        }
886
22
    }
887
22
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
132
{
815
132
    uint8_t s, b, qclass, ifreq;
816
132
    real_t tmp, coeff1, coeff2;
817
132
    real_t pan_base[MAX_PAN_BAND];
818
132
    real_t pan_delta[MAX_PAN_BAND];
819
132
    qmf_t temp_l, temp_r;
820
821
132
    if (ps->bs_enable_pan)
822
132
    {
823
8.58k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
8.44k
        {
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
8.44k
            ifreq = pan_inv_freq[b];
828
8.44k
            qclass = pan_quant_class[ifreq];
829
830
8.44k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
7.96k
            {
832
7.96k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
7.96k
            } else {
834
483
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
483
            }
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
8.44k
            if (ps->g_pan_index[ifreq] >= 0)
840
7.31k
            {
841
7.31k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
7.23k
                {
843
7.23k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
7.23k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
7.23k
                } else {
846
76
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
76
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
76
                }
849
7.31k
            } else {
850
1.13k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
726
                {
852
726
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
726
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
726
                } else {
855
407
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
407
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
407
                }
858
1.13k
            }
859
8.44k
        }
860
861
4.09k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
3.96k
        {
863
            /* PAN always uses all 64 channels */
864
257k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
253k
            {
866
253k
                tmp = pan_base[b];
867
868
253k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
253k
                coeff1 = MUL_R(coeff2, tmp);
870
871
253k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
253k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
253k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
253k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
253k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
253k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
253k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
253k
                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
253k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
253k
            }
885
3.96k
        }
886
132
    }
887
132
}
888
889
drm_ps_info *drm_ps_init(void)
890
6.34k
{
891
6.34k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
6.34k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
6.34k
    return ps;
896
6.34k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
6.34k
{
900
6.34k
    faad_free(ps);
901
6.34k
}
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
237
{
906
237
    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
232
    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
231
    if (!guess)
923
127
    {
924
127
        ps->sa_decode_error = 0;
925
127
        ps->pan_decode_error = 0;
926
127
        drm_ps_delta_decode(ps);
927
127
    } else
928
104
    {
929
104
        ps->sa_decode_error = 1;
930
104
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
104
    }
933
934
231
    ps->drm_ps_data_available = 0;
935
936
231
    drm_calc_sa_side_signal(ps, X_left);
937
231
    drm_add_ambiance(ps, X_left, X_right);
938
939
231
    if (ps->bs_enable_sa)
940
89
    {
941
89
        ps->g_last_had_sa = 1;
942
943
89
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
142
    } else {
946
142
        ps->g_last_had_sa = 0;
947
142
    }
948
949
231
    if (ps->bs_enable_pan)
950
154
    {
951
154
        drm_add_pan(ps, X_left, X_right);
952
953
154
        ps->g_last_had_pan = 1;
954
955
154
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
154
    } else {
958
77
        ps->g_last_had_pan = 0;
959
77
    }
960
961
962
231
    return 0;
963
232
}
964
965
#endif