Coverage Report

Created: 2026-09-14 06:52

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