Coverage Report

Created: 2026-09-01 06:57

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
955k
{
446
955k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
955k
    ps->drm_ps_data_available = 1;
449
450
955k
    ps->bs_enable_sa = faad_get1bit(ld);
451
955k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
955k
    if (ps->bs_enable_sa)
454
25.6k
    {
455
25.6k
        drm_ps_sa_element(ps, ld);
456
25.6k
    }
457
458
955k
    if (ps->bs_enable_pan)
459
18.5k
    {
460
18.5k
        drm_ps_pan_element(ps, ld);
461
18.5k
    }
462
463
955k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
955k
    return bits;
466
955k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
25.6k
{
470
25.6k
    drm_ps_huff_tab huff;
471
25.6k
    uint8_t band;
472
473
25.6k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
25.6k
    if (ps->bs_sa_dt_flag)
475
9.30k
    {
476
9.30k
        huff = t_huffman_sa;
477
16.3k
    } else {
478
16.3k
        huff = f_huffman_sa;
479
16.3k
    }
480
481
231k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
205k
    {
483
205k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
205k
    }
485
25.6k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
18.5k
{
489
18.5k
    drm_ps_huff_tab huff;
490
18.5k
    uint8_t band;
491
492
18.5k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
18.5k
    if (ps->bs_pan_dt_flag)
494
4.69k
    {
495
4.69k
        huff = t_huffman_pan;
496
13.8k
    } else {
497
13.8k
        huff = f_huffman_pan;
498
13.8k
    }
499
500
389k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
370k
    {
502
370k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
370k
    }
504
18.5k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
576k
{
509
576k
    uint8_t bit;
510
576k
    int8_t index = 0;
511
512
1.65M
    while (index >= 0)
513
1.08M
    {
514
1.08M
        bit = (uint8_t)faad_get1bit(ld);
515
1.08M
        index = huff[index][bit];
516
1.08M
    }
517
518
576k
    return index + 15;
519
576k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
1.17k
{
524
1.17k
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
401
        ps->sa_decode_error = 1;
527
401
        return 0;
528
775
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
77
        ps->sa_decode_error = 1;
531
77
        return 7;
532
77
    } else
533
698
        return i;
534
1.17k
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.70k
{
538
2.70k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
200
        ps->pan_decode_error = 1;
541
200
        return -7;
542
2.50k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
291
        ps->pan_decode_error = 1;
545
291
        return 7;
546
291
    } else
547
2.20k
        return i;
548
2.70k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
218
{
552
218
    uint8_t band;
553
554
218
    if (ps->bs_enable_sa)
555
186
    {
556
186
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
39
        {
558
            /* wait until we get a DT frame */
559
39
            ps->bs_enable_sa = 0;
560
147
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
26
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
121
        } else {
564
            /* DF always decodable */
565
121
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
121
        }
567
568
1.48k
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
1.30k
        {
570
1.30k
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
182
            {
572
182
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
1.12k
            } else if (!ps->bs_sa_dt_flag) {
574
847
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
847
            }
576
1.30k
        }
577
186
    }
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
218
    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
218
    if (ps->bs_enable_sa)
589
71
    {
590
71
        if (ps->sa_decode_error) {
591
405
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
360
            {
593
360
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
360
            }
595
45
        } else {
596
234
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
208
            {
598
208
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
208
            }
600
26
        }
601
71
    }
602
603
218
    if (ps->bs_enable_pan)
604
147
    {
605
147
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
12
        {
607
12
            ps->bs_enable_pan = 0;
608
135
        }  else if (ps->bs_pan_dt_flag) {
609
34
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
101
        } else {
611
101
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
101
        }
613
614
2.94k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.79k
        {
616
2.79k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
646
            {
618
646
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
2.14k
            } else if (!ps->bs_pan_dt_flag) {
620
1.91k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.91k
            }
622
2.79k
        }
623
624
147
        if (ps->pan_decode_error) {
625
1.70k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.62k
            {
627
1.62k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.62k
            }
629
81
        } else {
630
1.38k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
1.32k
            {
632
1.32k
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
1.32k
            }
634
66
        }
635
147
    }
636
218
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
348
{
640
348
    uint8_t s, b, k;
641
348
    complex_t qfrac, tmp0, tmp, in, R0;
642
348
    real_t peakdiff;
643
348
    real_t nrg;
644
348
    real_t power;
645
348
    real_t transratio;
646
348
    real_t new_delay_slopes[NUM_OF_LINKS];
647
348
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
348
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
8.35k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
8.00k
    {
655
        /* set delay indices */
656
32.0k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
24.0k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
8.00k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
8.00k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
248k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
240k
        {
664
240k
            const real_t gamma = REAL_CONST(1.5);
665
240k
            const real_t sigma = REAL_CONST(1.5625);
666
667
240k
            RE(in) = QMF_RE(X[s][b]);
668
240k
            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
131k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
131k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
108k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
240k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
240k
            if (ps->peakdecay_fast[b] < power)
683
13.9k
                ps->peakdecay_fast[b] = power;
684
685
240k
            peakdiff = ps->prev_peakdiff[b];
686
240k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
240k
            ps->prev_peakdiff[b] = peakdiff;
688
689
240k
            nrg = ps->prev_nrg[b];
690
240k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
240k
            ps->prev_nrg[b] = nrg;
692
693
240k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
229k
                transratio = sigma;
695
229k
            } else {
696
10.8k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
10.8k
            }
698
699
960k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
720k
            {
701
720k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
720k
            }
703
704
240k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
240k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
240k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
240k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
240k
            RE(ps->d_buff[1][b]) = RE(in);
711
240k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
240k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
240k
            RE(R0) = RE(tmp);
716
240k
            IM(R0) = IM(tmp);
717
718
960k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
720k
            {
720
720k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
720k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
720k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
720k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
720k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
720k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
720k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
720k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
720k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
720k
                RE(R0) = RE(tmp);
735
720k
                IM(R0) = IM(tmp);
736
720k
            }
737
738
240k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
240k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
960k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
720k
            {
743
720k
                if (++temp_delay_ser[k] >= delay_length[k])
744
186k
                    temp_delay_ser[k] = 0;
745
720k
            }
746
240k
        }
747
8.00k
    }
748
749
1.39k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
1.04k
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
348
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
191
{
640
191
    uint8_t s, b, k;
641
191
    complex_t qfrac, tmp0, tmp, in, R0;
642
191
    real_t peakdiff;
643
191
    real_t nrg;
644
191
    real_t power;
645
191
    real_t transratio;
646
191
    real_t new_delay_slopes[NUM_OF_LINKS];
647
191
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
191
    complex_t Phi_Fract;
649
191
#ifdef FIXED_POINT
650
191
    uint32_t in_re, in_im;
651
191
#endif
652
653
4.58k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.39k
    {
655
        /* set delay indices */
656
17.5k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
13.1k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.39k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.39k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
136k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
131k
        {
664
131k
            const real_t gamma = REAL_CONST(1.5);
665
131k
            const real_t sigma = REAL_CONST(1.5625);
666
667
131k
            RE(in) = QMF_RE(X[s][b]);
668
131k
            IM(in) = QMF_IM(X[s][b]);
669
670
131k
#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
131k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
131k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
131k
            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
131k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
131k
            if (ps->peakdecay_fast[b] < power)
683
8.80k
                ps->peakdecay_fast[b] = power;
684
685
131k
            peakdiff = ps->prev_peakdiff[b];
686
131k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
131k
            ps->prev_peakdiff[b] = peakdiff;
688
689
131k
            nrg = ps->prev_nrg[b];
690
131k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
131k
            ps->prev_nrg[b] = nrg;
692
693
131k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
125k
                transratio = sigma;
695
125k
            } else {
696
6.38k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.38k
            }
698
699
527k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
395k
            {
701
395k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
395k
            }
703
704
131k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
131k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
131k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
131k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
131k
            RE(ps->d_buff[1][b]) = RE(in);
711
131k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
131k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
131k
            RE(R0) = RE(tmp);
716
131k
            IM(R0) = IM(tmp);
717
718
527k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
395k
            {
720
395k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
395k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
395k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
395k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
395k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
395k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
395k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
395k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
395k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
395k
                RE(R0) = RE(tmp);
735
395k
                IM(R0) = IM(tmp);
736
395k
            }
737
738
131k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
131k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
527k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
395k
            {
743
395k
                if (++temp_delay_ser[k] >= delay_length[k])
744
102k
                    temp_delay_ser[k] = 0;
745
395k
            }
746
131k
        }
747
4.39k
    }
748
749
764
    for (k = 0; k < NUM_OF_LINKS; k++)
750
573
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
191
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
157
{
640
157
    uint8_t s, b, k;
641
157
    complex_t qfrac, tmp0, tmp, in, R0;
642
157
    real_t peakdiff;
643
157
    real_t nrg;
644
157
    real_t power;
645
157
    real_t transratio;
646
157
    real_t new_delay_slopes[NUM_OF_LINKS];
647
157
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
157
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
3.76k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
3.61k
    {
655
        /* set delay indices */
656
14.4k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
10.8k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
3.61k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
3.61k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
111k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
108k
        {
664
108k
            const real_t gamma = REAL_CONST(1.5);
665
108k
            const real_t sigma = REAL_CONST(1.5625);
666
667
108k
            RE(in) = QMF_RE(X[s][b]);
668
108k
            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
108k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
108k
#endif
680
681
108k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
108k
            if (ps->peakdecay_fast[b] < power)
683
5.14k
                ps->peakdecay_fast[b] = power;
684
685
108k
            peakdiff = ps->prev_peakdiff[b];
686
108k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
108k
            ps->prev_peakdiff[b] = peakdiff;
688
689
108k
            nrg = ps->prev_nrg[b];
690
108k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
108k
            ps->prev_nrg[b] = nrg;
692
693
108k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
103k
                transratio = sigma;
695
103k
            } else {
696
4.47k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
4.47k
            }
698
699
433k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
324k
            {
701
324k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
324k
            }
703
704
108k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
108k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
108k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
108k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
108k
            RE(ps->d_buff[1][b]) = RE(in);
711
108k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
108k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
108k
            RE(R0) = RE(tmp);
716
108k
            IM(R0) = IM(tmp);
717
718
433k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
324k
            {
720
324k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
324k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
324k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
324k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
324k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
324k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
324k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
324k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
324k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
324k
                RE(R0) = RE(tmp);
735
324k
                IM(R0) = IM(tmp);
736
324k
            }
737
738
108k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
108k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
433k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
324k
            {
743
324k
                if (++temp_delay_ser[k] >= delay_length[k])
744
84.3k
                    temp_delay_ser[k] = 0;
745
324k
            }
746
108k
        }
747
3.61k
    }
748
749
628
    for (k = 0; k < NUM_OF_LINKS; k++)
750
471
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
157
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
348
{
755
348
    uint8_t s, b, ifreq, qclass;
756
348
    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
348
    real_t new_dir_map, new_sa_map;
758
759
348
    if (ps->bs_enable_sa)
760
123
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.95k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.82k
        {
765
2.82k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.82k
            ifreq = sa_inv_freq[b];
768
2.82k
            qclass = (b != 0);
769
770
2.82k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.82k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.82k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.82k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.82k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.82k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.82k
        }
781
782
3.81k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.69k
        {
784
88.5k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
84.8k
            {
786
84.8k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
84.8k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
84.8k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
84.8k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
84.8k
                sa_map[b]     += k_sa_map[b];
792
84.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
84.8k
            }
794
154k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
151k
            {
796
151k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
151k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
151k
            }
799
3.69k
        }
800
123
    }
801
225
    else {
802
6.97k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
6.75k
        {
804
438k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
432k
            {
806
432k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
432k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
432k
            }
809
6.75k
        }
810
225
    }
811
348
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
191
{
755
191
    uint8_t s, b, ifreq, qclass;
756
191
    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
191
    real_t new_dir_map, new_sa_map;
758
759
191
    if (ps->bs_enable_sa)
760
70
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.68k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.61k
        {
765
1.61k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.61k
            ifreq = sa_inv_freq[b];
768
1.61k
            qclass = (b != 0);
769
770
1.61k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.61k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.61k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.61k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.61k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.61k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.61k
        }
781
782
2.17k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.10k
        {
784
50.4k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
48.3k
            {
786
48.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
48.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
48.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
48.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
48.3k
                sa_map[b]     += k_sa_map[b];
792
48.3k
                sa_dir_map[b] += k_sa_dir_map[b];
793
48.3k
            }
794
88.2k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
86.1k
            {
796
86.1k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
86.1k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
86.1k
            }
799
2.10k
        }
800
70
    }
801
121
    else {
802
3.75k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.63k
        {
804
235k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
232k
            {
806
232k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
232k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
232k
            }
809
3.63k
        }
810
121
    }
811
191
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
157
{
755
157
    uint8_t s, b, ifreq, qclass;
756
157
    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
157
    real_t new_dir_map, new_sa_map;
758
759
157
    if (ps->bs_enable_sa)
760
53
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.27k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.21k
        {
765
1.21k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.21k
            ifreq = sa_inv_freq[b];
768
1.21k
            qclass = (b != 0);
769
770
1.21k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.21k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.21k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.21k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.21k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.21k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.21k
        }
781
782
1.64k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
1.59k
        {
784
38.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
36.5k
            {
786
36.5k
                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
36.5k
                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
36.5k
                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
36.5k
                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
36.5k
                sa_map[b]     += k_sa_map[b];
792
36.5k
                sa_dir_map[b] += k_sa_dir_map[b];
793
36.5k
            }
794
66.7k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
65.1k
            {
796
65.1k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
65.1k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
65.1k
            }
799
1.59k
        }
800
53
    }
801
104
    else {
802
3.22k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.12k
        {
804
202k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
199k
            {
806
199k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
199k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
199k
            }
809
3.12k
        }
810
104
    }
811
157
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
208
{
815
208
    uint8_t s, b, qclass, ifreq;
816
208
    real_t tmp, coeff1, coeff2;
817
208
    real_t pan_base[MAX_PAN_BAND];
818
208
    real_t pan_delta[MAX_PAN_BAND];
819
208
    qmf_t temp_l, temp_r;
820
821
208
    if (ps->bs_enable_pan)
822
208
    {
823
13.5k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
13.3k
        {
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
13.3k
            ifreq = pan_inv_freq[b];
828
13.3k
            qclass = pan_quant_class[ifreq];
829
830
13.3k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
12.6k
            {
832
12.6k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
12.6k
            } else {
834
707
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
707
            }
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
13.3k
            if (ps->g_pan_index[ifreq] >= 0)
840
11.1k
            {
841
11.1k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
10.9k
                {
843
10.9k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
10.9k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
10.9k
                } 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
11.1k
            } else {
850
2.16k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.63k
                {
852
1.63k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.63k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.63k
                } else {
855
530
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
530
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
530
                }
858
2.16k
            }
859
13.3k
        }
860
861
6.44k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
6.24k
        {
863
            /* PAN always uses all 64 channels */
864
405k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
399k
            {
866
399k
                tmp = pan_base[b];
867
868
399k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
399k
                coeff1 = MUL_R(coeff2, tmp);
870
871
399k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
399k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
399k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
399k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
399k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
399k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
399k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
399k
                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
399k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
399k
            }
885
6.24k
        }
886
208
    }
887
208
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
97
{
815
97
    uint8_t s, b, qclass, ifreq;
816
97
    real_t tmp, coeff1, coeff2;
817
97
    real_t pan_base[MAX_PAN_BAND];
818
97
    real_t pan_delta[MAX_PAN_BAND];
819
97
    qmf_t temp_l, temp_r;
820
821
97
    if (ps->bs_enable_pan)
822
97
    {
823
6.30k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
6.20k
        {
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.20k
            ifreq = pan_inv_freq[b];
828
6.20k
            qclass = pan_quant_class[ifreq];
829
830
6.20k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
5.96k
            {
832
5.96k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
5.96k
            } 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.20k
            if (ps->g_pan_index[ifreq] >= 0)
840
5.17k
            {
841
5.17k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
5.09k
                {
843
5.09k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
5.09k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
5.09k
                } 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.17k
            } else {
850
1.03k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
869
                {
852
869
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
869
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
869
                } 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.03k
            }
859
6.20k
        }
860
861
3.00k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
2.91k
        {
863
            /* PAN always uses all 64 channels */
864
189k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
186k
            {
866
186k
                tmp = pan_base[b];
867
868
186k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
186k
                coeff1 = MUL_R(coeff2, tmp);
870
871
186k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
186k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
186k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
186k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
186k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
186k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
186k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
186k
                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
186k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
186k
            }
885
2.91k
        }
886
97
    }
887
97
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
111
{
815
111
    uint8_t s, b, qclass, ifreq;
816
111
    real_t tmp, coeff1, coeff2;
817
111
    real_t pan_base[MAX_PAN_BAND];
818
111
    real_t pan_delta[MAX_PAN_BAND];
819
111
    qmf_t temp_l, temp_r;
820
821
111
    if (ps->bs_enable_pan)
822
111
    {
823
7.21k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
7.10k
        {
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
7.10k
            ifreq = pan_inv_freq[b];
828
7.10k
            qclass = pan_quant_class[ifreq];
829
830
7.10k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
6.64k
            {
832
6.64k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
6.64k
            } else {
834
461
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
461
            }
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
7.10k
            if (ps->g_pan_index[ifreq] >= 0)
840
5.97k
            {
841
5.97k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
5.87k
                {
843
5.87k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
5.87k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
5.87k
                } 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
5.97k
            } else {
850
1.12k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
765
                {
852
765
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
765
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
765
                } else {
855
363
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
363
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
363
                }
858
1.12k
            }
859
7.10k
        }
860
861
3.44k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
3.33k
        {
863
            /* PAN always uses all 64 channels */
864
216k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
213k
            {
866
213k
                tmp = pan_base[b];
867
868
213k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
213k
                coeff1 = MUL_R(coeff2, tmp);
870
871
213k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
213k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
213k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
213k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
213k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
213k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
213k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
213k
                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
213k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
213k
            }
885
3.33k
        }
886
111
    }
887
111
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.06k
{
891
7.06k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.06k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.06k
    return ps;
896
7.06k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.06k
{
900
7.06k
    faad_free(ps);
901
7.06k
}
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
360
{
906
360
    if (ps == NULL)
907
10
    {
908
10
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
10
        return 0;
910
10
    }
911
912
350
    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
348
    if (!guess)
923
218
    {
924
218
        ps->sa_decode_error = 0;
925
218
        ps->pan_decode_error = 0;
926
218
        drm_ps_delta_decode(ps);
927
218
    } else
928
130
    {
929
130
        ps->sa_decode_error = 1;
930
130
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
130
    }
933
934
348
    ps->drm_ps_data_available = 0;
935
936
348
    drm_calc_sa_side_signal(ps, X_left);
937
348
    drm_add_ambiance(ps, X_left, X_right);
938
939
348
    if (ps->bs_enable_sa)
940
123
    {
941
123
        ps->g_last_had_sa = 1;
942
943
123
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
225
    } else {
946
225
        ps->g_last_had_sa = 0;
947
225
    }
948
949
348
    if (ps->bs_enable_pan)
950
208
    {
951
208
        drm_add_pan(ps, X_left, X_right);
952
953
208
        ps->g_last_had_pan = 1;
954
955
208
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
208
    } else {
958
140
        ps->g_last_had_pan = 0;
959
140
    }
960
961
962
348
    return 0;
963
350
}
964
965
#endif