Coverage Report

Created: 2026-08-31 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 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.31M
{
446
1.31M
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
1.31M
    ps->drm_ps_data_available = 1;
449
450
1.31M
    ps->bs_enable_sa = faad_get1bit(ld);
451
1.31M
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
1.31M
    if (ps->bs_enable_sa)
454
27.6k
    {
455
27.6k
        drm_ps_sa_element(ps, ld);
456
27.6k
    }
457
458
1.31M
    if (ps->bs_enable_pan)
459
19.6k
    {
460
19.6k
        drm_ps_pan_element(ps, ld);
461
19.6k
    }
462
463
1.31M
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
1.31M
    return bits;
466
1.31M
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
27.6k
{
470
27.6k
    drm_ps_huff_tab huff;
471
27.6k
    uint8_t band;
472
473
27.6k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
27.6k
    if (ps->bs_sa_dt_flag)
475
10.9k
    {
476
10.9k
        huff = t_huffman_sa;
477
16.7k
    } else {
478
16.7k
        huff = f_huffman_sa;
479
16.7k
    }
480
481
248k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
221k
    {
483
221k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
221k
    }
485
27.6k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
19.6k
{
489
19.6k
    drm_ps_huff_tab huff;
490
19.6k
    uint8_t band;
491
492
19.6k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
19.6k
    if (ps->bs_pan_dt_flag)
494
4.60k
    {
495
4.60k
        huff = t_huffman_pan;
496
15.0k
    } else {
497
15.0k
        huff = f_huffman_pan;
498
15.0k
    }
499
500
412k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
393k
    {
502
393k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
393k
    }
504
19.6k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
614k
{
509
614k
    uint8_t bit;
510
614k
    int8_t index = 0;
511
512
1.74M
    while (index >= 0)
513
1.12M
    {
514
1.12M
        bit = (uint8_t)faad_get1bit(ld);
515
1.12M
        index = huff[index][bit];
516
1.12M
    }
517
518
614k
    return index + 15;
519
614k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
1.25k
{
524
1.25k
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
426
        ps->sa_decode_error = 1;
527
426
        return 0;
528
830
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
88
        ps->sa_decode_error = 1;
531
88
        return 7;
532
88
    } else
533
742
        return i;
534
1.25k
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
3.26k
{
538
3.26k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
319
        ps->pan_decode_error = 1;
541
319
        return -7;
542
2.94k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
280
        ps->pan_decode_error = 1;
545
280
        return 7;
546
280
    } else
547
2.66k
        return i;
548
3.26k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
247
{
552
247
    uint8_t band;
553
554
247
    if (ps->bs_enable_sa)
555
201
    {
556
201
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
44
        {
558
            /* wait until we get a DT frame */
559
44
            ps->bs_enable_sa = 0;
560
157
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
29
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
128
        } else {
564
            /* DF always decodable */
565
128
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
128
        }
567
568
1.60k
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
1.40k
        {
570
1.40k
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
203
            {
572
203
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
1.20k
            } else if (!ps->bs_sa_dt_flag) {
574
896
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
896
            }
576
1.40k
        }
577
201
    }
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
247
    if (ps->sa_decode_error) {
582
129
        ps->pan_decode_error = 1;
583
129
        ps->bs_enable_pan = ps->g_last_had_pan;
584
129
        ps->bs_enable_sa = ps->g_last_had_sa;
585
129
    }
586
587
588
247
    if (ps->bs_enable_sa)
589
74
    {
590
74
        if (ps->sa_decode_error) {
591
414
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
368
            {
593
368
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
368
            }
595
46
        } else {
596
252
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
224
            {
598
224
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
224
            }
600
28
        }
601
74
    }
602
603
247
    if (ps->bs_enable_pan)
604
174
    {
605
174
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
11
        {
607
11
            ps->bs_enable_pan = 0;
608
163
        }  else if (ps->bs_pan_dt_flag) {
609
39
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
124
        } else {
611
124
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
124
        }
613
614
3.48k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
3.30k
        {
616
3.30k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
741
            {
618
741
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
2.56k
            } else if (!ps->bs_pan_dt_flag) {
620
2.35k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
2.35k
            }
622
3.30k
        }
623
624
174
        if (ps->pan_decode_error) {
625
1.99k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.90k
            {
627
1.90k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.90k
            }
629
95
        } else {
630
1.65k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
1.58k
            {
632
1.58k
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
1.58k
            }
634
79
        }
635
174
    }
636
247
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
397
{
640
397
    uint8_t s, b, k;
641
397
    complex_t qfrac, tmp0, tmp, in, R0;
642
397
    real_t peakdiff;
643
397
    real_t nrg;
644
397
    real_t power;
645
397
    real_t transratio;
646
397
    real_t new_delay_slopes[NUM_OF_LINKS];
647
397
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
397
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
9.52k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
9.13k
    {
655
        /* set delay indices */
656
36.5k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
27.3k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
9.13k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
9.13k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
283k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
273k
        {
664
273k
            const real_t gamma = REAL_CONST(1.5);
665
273k
            const real_t sigma = REAL_CONST(1.5625);
666
667
273k
            RE(in) = QMF_RE(X[s][b]);
668
273k
            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
134k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
134k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
139k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
273k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
273k
            if (ps->peakdecay_fast[b] < power)
683
17.6k
                ps->peakdecay_fast[b] = power;
684
685
273k
            peakdiff = ps->prev_peakdiff[b];
686
273k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
273k
            ps->prev_peakdiff[b] = peakdiff;
688
689
273k
            nrg = ps->prev_nrg[b];
690
273k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
273k
            ps->prev_nrg[b] = nrg;
692
693
273k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
260k
                transratio = sigma;
695
260k
            } else {
696
13.7k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
13.7k
            }
698
699
1.09M
            for (k = 0; k < NUM_OF_LINKS; k++)
700
821k
            {
701
821k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
821k
            }
703
704
273k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
273k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
273k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
273k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
273k
            RE(ps->d_buff[1][b]) = RE(in);
711
273k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
273k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
273k
            RE(R0) = RE(tmp);
716
273k
            IM(R0) = IM(tmp);
717
718
1.09M
            for (k = 0; k < NUM_OF_LINKS; k++)
719
821k
            {
720
821k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
821k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
821k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
821k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
821k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
821k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
821k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
821k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
821k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
821k
                RE(R0) = RE(tmp);
735
821k
                IM(R0) = IM(tmp);
736
821k
            }
737
738
273k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
273k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
1.09M
            for (k = 0; k < NUM_OF_LINKS; k++)
742
821k
            {
743
821k
                if (++temp_delay_ser[k] >= delay_length[k])
744
212k
                    temp_delay_ser[k] = 0;
745
821k
            }
746
273k
        }
747
9.13k
    }
748
749
1.58k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
1.19k
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
397
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
195
{
640
195
    uint8_t s, b, k;
641
195
    complex_t qfrac, tmp0, tmp, in, R0;
642
195
    real_t peakdiff;
643
195
    real_t nrg;
644
195
    real_t power;
645
195
    real_t transratio;
646
195
    real_t new_delay_slopes[NUM_OF_LINKS];
647
195
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
195
    complex_t Phi_Fract;
649
195
#ifdef FIXED_POINT
650
195
    uint32_t in_re, in_im;
651
195
#endif
652
653
4.68k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.48k
    {
655
        /* set delay indices */
656
17.9k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
13.4k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.48k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.48k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
139k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
134k
        {
664
134k
            const real_t gamma = REAL_CONST(1.5);
665
134k
            const real_t sigma = REAL_CONST(1.5625);
666
667
134k
            RE(in) = QMF_RE(X[s][b]);
668
134k
            IM(in) = QMF_IM(X[s][b]);
669
670
134k
#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
134k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
134k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
134k
            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
134k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
134k
            if (ps->peakdecay_fast[b] < power)
683
8.95k
                ps->peakdecay_fast[b] = power;
684
685
134k
            peakdiff = ps->prev_peakdiff[b];
686
134k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
134k
            ps->prev_peakdiff[b] = peakdiff;
688
689
134k
            nrg = ps->prev_nrg[b];
690
134k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
134k
            ps->prev_nrg[b] = nrg;
692
693
134k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
128k
                transratio = sigma;
695
128k
            } else {
696
5.92k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
5.92k
            }
698
699
538k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
403k
            {
701
403k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
403k
            }
703
704
134k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
134k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
134k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
134k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
134k
            RE(ps->d_buff[1][b]) = RE(in);
711
134k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
134k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
134k
            RE(R0) = RE(tmp);
716
134k
            IM(R0) = IM(tmp);
717
718
538k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
403k
            {
720
403k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
403k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
403k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
403k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
403k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
403k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
403k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
403k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
403k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
403k
                RE(R0) = RE(tmp);
735
403k
                IM(R0) = IM(tmp);
736
403k
            }
737
738
134k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
134k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
538k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
403k
            {
743
403k
                if (++temp_delay_ser[k] >= delay_length[k])
744
104k
                    temp_delay_ser[k] = 0;
745
403k
            }
746
134k
        }
747
4.48k
    }
748
749
780
    for (k = 0; k < NUM_OF_LINKS; k++)
750
585
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
195
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
202
{
640
202
    uint8_t s, b, k;
641
202
    complex_t qfrac, tmp0, tmp, in, R0;
642
202
    real_t peakdiff;
643
202
    real_t nrg;
644
202
    real_t power;
645
202
    real_t transratio;
646
202
    real_t new_delay_slopes[NUM_OF_LINKS];
647
202
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
202
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.84k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.64k
    {
655
        /* set delay indices */
656
18.5k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
13.9k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.64k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.64k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
144k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
139k
        {
664
139k
            const real_t gamma = REAL_CONST(1.5);
665
139k
            const real_t sigma = REAL_CONST(1.5625);
666
667
139k
            RE(in) = QMF_RE(X[s][b]);
668
139k
            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
139k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
139k
#endif
680
681
139k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
139k
            if (ps->peakdecay_fast[b] < power)
683
8.65k
                ps->peakdecay_fast[b] = power;
684
685
139k
            peakdiff = ps->prev_peakdiff[b];
686
139k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
139k
            ps->prev_peakdiff[b] = peakdiff;
688
689
139k
            nrg = ps->prev_nrg[b];
690
139k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
139k
            ps->prev_nrg[b] = nrg;
692
693
139k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
131k
                transratio = sigma;
695
131k
            } else {
696
7.82k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.82k
            }
698
699
557k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
418k
            {
701
418k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
418k
            }
703
704
139k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
139k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
139k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
139k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
139k
            RE(ps->d_buff[1][b]) = RE(in);
711
139k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
139k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
139k
            RE(R0) = RE(tmp);
716
139k
            IM(R0) = IM(tmp);
717
718
557k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
418k
            {
720
418k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
418k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
418k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
418k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
418k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
418k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
418k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
418k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
418k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
418k
                RE(R0) = RE(tmp);
735
418k
                IM(R0) = IM(tmp);
736
418k
            }
737
738
139k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
139k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
557k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
418k
            {
743
418k
                if (++temp_delay_ser[k] >= delay_length[k])
744
108k
                    temp_delay_ser[k] = 0;
745
418k
            }
746
139k
        }
747
4.64k
    }
748
749
808
    for (k = 0; k < NUM_OF_LINKS; k++)
750
606
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
202
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
397
{
755
397
    uint8_t s, b, ifreq, qclass;
756
397
    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
397
    real_t new_dir_map, new_sa_map;
758
759
397
    if (ps->bs_enable_sa)
760
128
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
3.07k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.94k
        {
765
2.94k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.94k
            ifreq = sa_inv_freq[b];
768
2.94k
            qclass = (b != 0);
769
770
2.94k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.94k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.94k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.94k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.94k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.94k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.94k
        }
781
782
3.96k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.84k
        {
784
92.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
88.3k
            {
786
88.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
88.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
88.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
88.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
88.3k
                sa_map[b]     += k_sa_map[b];
792
88.3k
                sa_dir_map[b] += k_sa_dir_map[b];
793
88.3k
            }
794
161k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
157k
            {
796
157k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
157k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
157k
            }
799
3.84k
        }
800
128
    }
801
269
    else {
802
8.33k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
8.07k
        {
804
524k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
516k
            {
806
516k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
516k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
516k
            }
809
8.07k
        }
810
269
    }
811
397
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
195
{
755
195
    uint8_t s, b, ifreq, qclass;
756
195
    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
195
    real_t new_dir_map, new_sa_map;
758
759
195
    if (ps->bs_enable_sa)
760
69
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.65k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.58k
        {
765
1.58k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.58k
            ifreq = sa_inv_freq[b];
768
1.58k
            qclass = (b != 0);
769
770
1.58k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.58k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.58k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.58k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.58k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.58k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.58k
        }
781
782
2.13k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.07k
        {
784
49.6k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
47.6k
            {
786
47.6k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
47.6k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
47.6k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
47.6k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
47.6k
                sa_map[b]     += k_sa_map[b];
792
47.6k
                sa_dir_map[b] += k_sa_dir_map[b];
793
47.6k
            }
794
86.9k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
84.8k
            {
796
84.8k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
84.8k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
84.8k
            }
799
2.07k
        }
800
69
    }
801
126
    else {
802
3.90k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.78k
        {
804
245k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
241k
            {
806
241k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
241k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
241k
            }
809
3.78k
        }
810
126
    }
811
195
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
202
{
755
202
    uint8_t s, b, ifreq, qclass;
756
202
    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
202
    real_t new_dir_map, new_sa_map;
758
759
202
    if (ps->bs_enable_sa)
760
59
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.41k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.35k
        {
765
1.35k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.35k
            ifreq = sa_inv_freq[b];
768
1.35k
            qclass = (b != 0);
769
770
1.35k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.35k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.35k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.35k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.35k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.35k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.35k
        }
781
782
1.82k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
1.77k
        {
784
42.4k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
40.7k
            {
786
40.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
40.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
40.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
40.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
40.7k
                sa_map[b]     += k_sa_map[b];
792
40.7k
                sa_dir_map[b] += k_sa_dir_map[b];
793
40.7k
            }
794
74.3k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
72.5k
            {
796
72.5k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
72.5k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
72.5k
            }
799
1.77k
        }
800
59
    }
801
143
    else {
802
4.43k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.29k
        {
804
278k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
274k
            {
806
274k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
274k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
274k
            }
809
4.29k
        }
810
143
    }
811
202
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
245
{
815
245
    uint8_t s, b, qclass, ifreq;
816
245
    real_t tmp, coeff1, coeff2;
817
245
    real_t pan_base[MAX_PAN_BAND];
818
245
    real_t pan_delta[MAX_PAN_BAND];
819
245
    qmf_t temp_l, temp_r;
820
821
245
    if (ps->bs_enable_pan)
822
245
    {
823
15.9k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
15.6k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
15.6k
            ifreq = pan_inv_freq[b];
828
15.6k
            qclass = pan_quant_class[ifreq];
829
830
15.6k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
14.8k
            {
832
14.8k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
14.8k
            } else {
834
854
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
854
            }
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
15.6k
            if (ps->g_pan_index[ifreq] >= 0)
840
13.0k
            {
841
13.0k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
12.8k
                {
843
12.8k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
12.8k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
12.8k
                } else {
846
177
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
177
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
177
                }
849
13.0k
            } else {
850
2.65k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.97k
                {
852
1.97k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.97k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.97k
                } else {
855
677
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
677
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
677
                }
858
2.65k
            }
859
15.6k
        }
860
861
7.59k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
7.35k
        {
863
            /* PAN always uses all 64 channels */
864
477k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
470k
            {
866
470k
                tmp = pan_base[b];
867
868
470k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
470k
                coeff1 = MUL_R(coeff2, tmp);
870
871
470k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
470k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
470k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
470k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
470k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
470k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
470k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
470k
                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
470k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
470k
            }
885
7.35k
        }
886
245
    }
887
245
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
100
{
815
100
    uint8_t s, b, qclass, ifreq;
816
100
    real_t tmp, coeff1, coeff2;
817
100
    real_t pan_base[MAX_PAN_BAND];
818
100
    real_t pan_delta[MAX_PAN_BAND];
819
100
    qmf_t temp_l, temp_r;
820
821
100
    if (ps->bs_enable_pan)
822
100
    {
823
6.50k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
6.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
6.40k
            ifreq = pan_inv_freq[b];
828
6.40k
            qclass = pan_quant_class[ifreq];
829
830
6.40k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
6.15k
            {
832
6.15k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
6.15k
            } else {
834
246
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
246
            }
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.40k
            if (ps->g_pan_index[ifreq] >= 0)
840
5.30k
            {
841
5.30k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
5.22k
                {
843
5.22k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
5.22k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
5.22k
                } else {
846
79
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
79
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
79
                }
849
5.30k
            } else {
850
1.09k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
932
                {
852
932
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
932
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
932
                } else {
855
167
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
167
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
167
                }
858
1.09k
            }
859
6.40k
        }
860
861
3.10k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
3.00k
        {
863
            /* PAN always uses all 64 channels */
864
195k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
192k
            {
866
192k
                tmp = pan_base[b];
867
868
192k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
192k
                coeff1 = MUL_R(coeff2, tmp);
870
871
192k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
192k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
192k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
192k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
192k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
192k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
192k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
192k
                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
192k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
192k
            }
885
3.00k
        }
886
100
    }
887
100
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
145
{
815
145
    uint8_t s, b, qclass, ifreq;
816
145
    real_t tmp, coeff1, coeff2;
817
145
    real_t pan_base[MAX_PAN_BAND];
818
145
    real_t pan_delta[MAX_PAN_BAND];
819
145
    qmf_t temp_l, temp_r;
820
821
145
    if (ps->bs_enable_pan)
822
145
    {
823
9.42k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.28k
        {
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.28k
            ifreq = pan_inv_freq[b];
828
9.28k
            qclass = pan_quant_class[ifreq];
829
830
9.28k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
8.67k
            {
832
8.67k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
8.67k
            } else {
834
608
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
608
            }
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.28k
            if (ps->g_pan_index[ifreq] >= 0)
840
7.72k
            {
841
7.72k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
7.63k
                {
843
7.63k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
7.63k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
7.63k
                } 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.72k
            } else {
850
1.55k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.04k
                {
852
1.04k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.04k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.04k
                } else {
855
510
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
510
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
510
                }
858
1.55k
            }
859
9.28k
        }
860
861
4.49k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.35k
        {
863
            /* PAN always uses all 64 channels */
864
282k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
278k
            {
866
278k
                tmp = pan_base[b];
867
868
278k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
278k
                coeff1 = MUL_R(coeff2, tmp);
870
871
278k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
278k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
278k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
278k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
278k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
278k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
278k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
278k
                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
278k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
278k
            }
885
4.35k
        }
886
145
    }
887
145
}
888
889
drm_ps_info *drm_ps_init(void)
890
8.93k
{
891
8.93k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
8.93k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
8.93k
    return ps;
896
8.93k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
8.93k
{
900
8.93k
    faad_free(ps);
901
8.93k
}
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
407
{
906
407
    if (ps == NULL)
907
8
    {
908
8
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
8
        return 0;
910
8
    }
911
912
399
    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
397
    if (!guess)
923
247
    {
924
247
        ps->sa_decode_error = 0;
925
247
        ps->pan_decode_error = 0;
926
247
        drm_ps_delta_decode(ps);
927
247
    } else
928
150
    {
929
150
        ps->sa_decode_error = 1;
930
150
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
150
    }
933
934
397
    ps->drm_ps_data_available = 0;
935
936
397
    drm_calc_sa_side_signal(ps, X_left);
937
397
    drm_add_ambiance(ps, X_left, X_right);
938
939
397
    if (ps->bs_enable_sa)
940
128
    {
941
128
        ps->g_last_had_sa = 1;
942
943
128
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
269
    } else {
946
269
        ps->g_last_had_sa = 0;
947
269
    }
948
949
397
    if (ps->bs_enable_pan)
950
245
    {
951
245
        drm_add_pan(ps, X_left, X_right);
952
953
245
        ps->g_last_had_pan = 1;
954
955
245
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
245
    } else {
958
152
        ps->g_last_had_pan = 0;
959
152
    }
960
961
962
397
    return 0;
963
399
}
964
965
#endif