Coverage Report

Created: 2026-04-01 06:58

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
914k
{
446
914k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
914k
    ps->drm_ps_data_available = 1;
449
450
914k
    ps->bs_enable_sa = faad_get1bit(ld);
451
914k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
914k
    if (ps->bs_enable_sa)
454
20.7k
    {
455
20.7k
        drm_ps_sa_element(ps, ld);
456
20.7k
    }
457
458
914k
    if (ps->bs_enable_pan)
459
13.3k
    {
460
13.3k
        drm_ps_pan_element(ps, ld);
461
13.3k
    }
462
463
914k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
914k
    return bits;
466
914k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
20.7k
{
470
20.7k
    drm_ps_huff_tab huff;
471
20.7k
    uint8_t band;
472
473
20.7k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
20.7k
    if (ps->bs_sa_dt_flag)
475
7.82k
    {
476
7.82k
        huff = t_huffman_sa;
477
12.9k
    } else {
478
12.9k
        huff = f_huffman_sa;
479
12.9k
    }
480
481
186k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
166k
    {
483
166k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
166k
    }
485
20.7k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
13.3k
{
489
13.3k
    drm_ps_huff_tab huff;
490
13.3k
    uint8_t band;
491
492
13.3k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
13.3k
    if (ps->bs_pan_dt_flag)
494
3.73k
    {
495
3.73k
        huff = t_huffman_pan;
496
9.62k
    } else {
497
9.62k
        huff = f_huffman_pan;
498
9.62k
    }
499
500
280k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
267k
    {
502
267k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
267k
    }
504
13.3k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
433k
{
509
433k
    uint8_t bit;
510
433k
    int8_t index = 0;
511
512
1.26M
    while (index >= 0)
513
828k
    {
514
828k
        bit = (uint8_t)faad_get1bit(ld);
515
828k
        index = huff[index][bit];
516
828k
    }
517
518
433k
    return index + 15;
519
433k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
800
{
524
800
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
244
        ps->sa_decode_error = 1;
527
244
        return 0;
528
556
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
89
        ps->sa_decode_error = 1;
531
89
        return 7;
532
89
    } else
533
467
        return i;
534
800
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.20k
{
538
2.20k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
213
        ps->pan_decode_error = 1;
541
213
        return -7;
542
1.98k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
234
        ps->pan_decode_error = 1;
545
234
        return 7;
546
234
    } else
547
1.75k
        return i;
548
2.20k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
148
{
552
148
    uint8_t band;
553
554
148
    if (ps->bs_enable_sa)
555
125
    {
556
125
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
25
        {
558
            /* wait until we get a DT frame */
559
25
            ps->bs_enable_sa = 0;
560
100
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
16
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
84
        } else {
564
            /* DF always decodable */
565
84
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
84
        }
567
568
1.00k
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
875
        {
570
875
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
112
            {
572
112
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
763
            } else if (!ps->bs_sa_dt_flag) {
574
588
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
588
            }
576
875
        }
577
125
    }
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
148
    if (ps->sa_decode_error) {
582
79
        ps->pan_decode_error = 1;
583
79
        ps->bs_enable_pan = ps->g_last_had_pan;
584
79
        ps->bs_enable_sa = ps->g_last_had_sa;
585
79
    }
586
587
588
148
    if (ps->bs_enable_sa)
589
45
    {
590
45
        if (ps->sa_decode_error) {
591
216
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
192
            {
593
192
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
192
            }
595
24
        } else {
596
189
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
168
            {
598
168
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
168
            }
600
21
        }
601
45
    }
602
603
148
    if (ps->bs_enable_pan)
604
113
    {
605
113
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
110
        }  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
76
        } else {
611
76
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
76
        }
613
614
2.26k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.14k
        {
616
2.14k
            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
1.50k
            } else if (!ps->bs_pan_dt_flag) {
620
1.44k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.44k
            }
622
2.14k
        }
623
624
113
        if (ps->pan_decode_error) {
625
1.51k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.44k
            {
627
1.44k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.44k
            }
629
72
        } else {
630
861
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
820
            {
632
820
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
820
            }
634
41
        }
635
113
    }
636
148
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
272
{
640
272
    uint8_t s, b, k;
641
272
    complex_t qfrac, tmp0, tmp, in, R0;
642
272
    real_t peakdiff;
643
272
    real_t nrg;
644
272
    real_t power;
645
272
    real_t transratio;
646
272
    real_t new_delay_slopes[NUM_OF_LINKS];
647
272
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
272
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.52k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.25k
    {
655
        /* set delay indices */
656
25.0k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
18.7k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.25k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.25k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
193k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
187k
        {
664
187k
            const real_t gamma = REAL_CONST(1.5);
665
187k
            const real_t sigma = REAL_CONST(1.5625);
666
667
187k
            RE(in) = QMF_RE(X[s][b]);
668
187k
            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
42.0k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
42.0k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
145k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
187k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
187k
            if (ps->peakdecay_fast[b] < power)
683
14.2k
                ps->peakdecay_fast[b] = power;
684
685
187k
            peakdiff = ps->prev_peakdiff[b];
686
187k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
187k
            ps->prev_peakdiff[b] = peakdiff;
688
689
187k
            nrg = ps->prev_nrg[b];
690
187k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
187k
            ps->prev_nrg[b] = nrg;
692
693
187k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
177k
                transratio = sigma;
695
177k
            } else {
696
9.80k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
9.80k
            }
698
699
750k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
563k
            {
701
563k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
563k
            }
703
704
187k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
187k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
187k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
187k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
187k
            RE(ps->d_buff[1][b]) = RE(in);
711
187k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
187k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
187k
            RE(R0) = RE(tmp);
716
187k
            IM(R0) = IM(tmp);
717
718
750k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
563k
            {
720
563k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
563k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
563k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
563k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
563k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
563k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
563k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
563k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
563k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
563k
                RE(R0) = RE(tmp);
735
563k
                IM(R0) = IM(tmp);
736
563k
            }
737
738
187k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
187k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
750k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
563k
            {
743
563k
                if (++temp_delay_ser[k] >= delay_length[k])
744
145k
                    temp_delay_ser[k] = 0;
745
563k
            }
746
187k
        }
747
6.25k
    }
748
749
1.08k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
816
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
272
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
61
{
640
61
    uint8_t s, b, k;
641
61
    complex_t qfrac, tmp0, tmp, in, R0;
642
61
    real_t peakdiff;
643
61
    real_t nrg;
644
61
    real_t power;
645
61
    real_t transratio;
646
61
    real_t new_delay_slopes[NUM_OF_LINKS];
647
61
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
61
    complex_t Phi_Fract;
649
61
#ifdef FIXED_POINT
650
61
    uint32_t in_re, in_im;
651
61
#endif
652
653
1.46k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.40k
    {
655
        /* set delay indices */
656
5.61k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
4.20k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.40k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.40k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
43.4k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
42.0k
        {
664
42.0k
            const real_t gamma = REAL_CONST(1.5);
665
42.0k
            const real_t sigma = REAL_CONST(1.5625);
666
667
42.0k
            RE(in) = QMF_RE(X[s][b]);
668
42.0k
            IM(in) = QMF_IM(X[s][b]);
669
670
42.0k
#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
42.0k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
42.0k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
42.0k
            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
42.0k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
42.0k
            if (ps->peakdecay_fast[b] < power)
683
5.46k
                ps->peakdecay_fast[b] = power;
684
685
42.0k
            peakdiff = ps->prev_peakdiff[b];
686
42.0k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
42.0k
            ps->prev_peakdiff[b] = peakdiff;
688
689
42.0k
            nrg = ps->prev_nrg[b];
690
42.0k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
42.0k
            ps->prev_nrg[b] = nrg;
692
693
42.0k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
39.7k
                transratio = sigma;
695
39.7k
            } else {
696
2.38k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.38k
            }
698
699
168k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
126k
            {
701
126k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
126k
            }
703
704
42.0k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
42.0k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
42.0k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
42.0k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
42.0k
            RE(ps->d_buff[1][b]) = RE(in);
711
42.0k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
42.0k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
42.0k
            RE(R0) = RE(tmp);
716
42.0k
            IM(R0) = IM(tmp);
717
718
168k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
126k
            {
720
126k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
126k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
126k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
126k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
126k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
126k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
126k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
126k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
126k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
126k
                RE(R0) = RE(tmp);
735
126k
                IM(R0) = IM(tmp);
736
126k
            }
737
738
42.0k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
42.0k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
168k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
126k
            {
743
126k
                if (++temp_delay_ser[k] >= delay_length[k])
744
32.3k
                    temp_delay_ser[k] = 0;
745
126k
            }
746
42.0k
        }
747
1.40k
    }
748
749
244
    for (k = 0; k < NUM_OF_LINKS; k++)
750
183
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
61
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
211
{
640
211
    uint8_t s, b, k;
641
211
    complex_t qfrac, tmp0, tmp, in, R0;
642
211
    real_t peakdiff;
643
211
    real_t nrg;
644
211
    real_t power;
645
211
    real_t transratio;
646
211
    real_t new_delay_slopes[NUM_OF_LINKS];
647
211
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
211
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.06k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.85k
    {
655
        /* set delay indices */
656
19.4k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.5k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.85k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.85k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
150k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
145k
        {
664
145k
            const real_t gamma = REAL_CONST(1.5);
665
145k
            const real_t sigma = REAL_CONST(1.5625);
666
667
145k
            RE(in) = QMF_RE(X[s][b]);
668
145k
            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
145k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
145k
#endif
680
681
145k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
145k
            if (ps->peakdecay_fast[b] < power)
683
8.78k
                ps->peakdecay_fast[b] = power;
684
685
145k
            peakdiff = ps->prev_peakdiff[b];
686
145k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
145k
            ps->prev_peakdiff[b] = peakdiff;
688
689
145k
            nrg = ps->prev_nrg[b];
690
145k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
145k
            ps->prev_nrg[b] = nrg;
692
693
145k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
138k
                transratio = sigma;
695
138k
            } else {
696
7.42k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.42k
            }
698
699
582k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
436k
            {
701
436k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
436k
            }
703
704
145k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
145k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
145k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
145k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
145k
            RE(ps->d_buff[1][b]) = RE(in);
711
145k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
145k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
145k
            RE(R0) = RE(tmp);
716
145k
            IM(R0) = IM(tmp);
717
718
582k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
436k
            {
720
436k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
436k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
436k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
436k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
436k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
436k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
436k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
436k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
436k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
436k
                RE(R0) = RE(tmp);
735
436k
                IM(R0) = IM(tmp);
736
436k
            }
737
738
145k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
145k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
582k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
436k
            {
743
436k
                if (++temp_delay_ser[k] >= delay_length[k])
744
113k
                    temp_delay_ser[k] = 0;
745
436k
            }
746
145k
        }
747
4.85k
    }
748
749
844
    for (k = 0; k < NUM_OF_LINKS; k++)
750
633
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
211
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
272
{
755
272
    uint8_t s, b, ifreq, qclass;
756
272
    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
272
    real_t new_dir_map, new_sa_map;
758
759
272
    if (ps->bs_enable_sa)
760
95
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.28k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.18k
        {
765
2.18k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.18k
            ifreq = sa_inv_freq[b];
768
2.18k
            qclass = (b != 0);
769
770
2.18k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.18k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.18k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.18k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.18k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.18k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.18k
        }
781
782
2.94k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.85k
        {
784
68.4k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
65.5k
            {
786
65.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
65.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
65.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
65.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
65.5k
                sa_map[b]     += k_sa_map[b];
792
65.5k
                sa_dir_map[b] += k_sa_dir_map[b];
793
65.5k
            }
794
119k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
116k
            {
796
116k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
116k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
116k
            }
799
2.85k
        }
800
95
    }
801
177
    else {
802
5.48k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
5.31k
        {
804
345k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
339k
            {
806
339k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
339k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
339k
            }
809
5.31k
        }
810
177
    }
811
272
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
61
{
755
61
    uint8_t s, b, ifreq, qclass;
756
61
    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
61
    real_t new_dir_map, new_sa_map;
758
759
61
    if (ps->bs_enable_sa)
760
17
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
408
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
391
        {
765
391
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
391
            ifreq = sa_inv_freq[b];
768
391
            qclass = (b != 0);
769
770
391
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
391
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
391
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
391
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
391
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
391
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
391
        }
781
782
527
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
510
        {
784
12.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
11.7k
            {
786
11.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
11.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
11.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
11.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
11.7k
                sa_map[b]     += k_sa_map[b];
792
11.7k
                sa_dir_map[b] += k_sa_dir_map[b];
793
11.7k
            }
794
21.4k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
20.9k
            {
796
20.9k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
20.9k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
20.9k
            }
799
510
        }
800
17
    }
801
44
    else {
802
1.36k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.32k
        {
804
85.8k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
84.4k
            {
806
84.4k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
84.4k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
84.4k
            }
809
1.32k
        }
810
44
    }
811
61
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
211
{
755
211
    uint8_t s, b, ifreq, qclass;
756
211
    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
211
    real_t new_dir_map, new_sa_map;
758
759
211
    if (ps->bs_enable_sa)
760
78
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.87k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.79k
        {
765
1.79k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.79k
            ifreq = sa_inv_freq[b];
768
1.79k
            qclass = (b != 0);
769
770
1.79k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.79k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.79k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.79k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.79k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.79k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.79k
        }
781
782
2.41k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.34k
        {
784
56.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
53.8k
            {
786
53.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
53.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
53.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
53.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
53.8k
                sa_map[b]     += k_sa_map[b];
792
53.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
53.8k
            }
794
98.2k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
95.9k
            {
796
95.9k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
95.9k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
95.9k
            }
799
2.34k
        }
800
78
    }
801
133
    else {
802
4.12k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.99k
        {
804
259k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
255k
            {
806
255k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
255k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
255k
            }
809
3.99k
        }
810
133
    }
811
211
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
188
{
815
188
    uint8_t s, b, qclass, ifreq;
816
188
    real_t tmp, coeff1, coeff2;
817
188
    real_t pan_base[MAX_PAN_BAND];
818
188
    real_t pan_delta[MAX_PAN_BAND];
819
188
    qmf_t temp_l, temp_r;
820
821
188
    if (ps->bs_enable_pan)
822
188
    {
823
12.2k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
12.0k
        {
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
12.0k
            ifreq = pan_inv_freq[b];
828
12.0k
            qclass = pan_quant_class[ifreq];
829
830
12.0k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
11.4k
            {
832
11.4k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
11.4k
            } else {
834
606
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
606
            }
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
12.0k
            if (ps->g_pan_index[ifreq] >= 0)
840
10.4k
            {
841
10.4k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
10.3k
                {
843
10.3k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
10.3k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
10.3k
                } else {
846
101
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
101
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
101
                }
849
10.4k
            } else {
850
1.54k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.03k
                {
852
1.03k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.03k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.03k
                } else {
855
505
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
505
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
505
                }
858
1.54k
            }
859
12.0k
        }
860
861
5.82k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.64k
        {
863
            /* PAN always uses all 64 channels */
864
366k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
360k
            {
866
360k
                tmp = pan_base[b];
867
868
360k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
360k
                coeff1 = MUL_R(coeff2, tmp);
870
871
360k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
360k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
360k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
360k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
360k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
360k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
360k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
360k
                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
360k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
360k
            }
885
5.64k
        }
886
188
    }
887
188
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
28
{
815
28
    uint8_t s, b, qclass, ifreq;
816
28
    real_t tmp, coeff1, coeff2;
817
28
    real_t pan_base[MAX_PAN_BAND];
818
28
    real_t pan_delta[MAX_PAN_BAND];
819
28
    qmf_t temp_l, temp_r;
820
821
28
    if (ps->bs_enable_pan)
822
28
    {
823
1.82k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.79k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
1.79k
            ifreq = pan_inv_freq[b];
828
1.79k
            qclass = pan_quant_class[ifreq];
829
830
1.79k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.79k
            {
832
1.79k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.79k
            } else {
834
0
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
0
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
1.79k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.72k
            {
841
1.72k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.72k
                {
843
1.72k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.72k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.72k
                } else {
846
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
0
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
0
                }
849
1.72k
            } else {
850
63
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
63
                {
852
63
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
63
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
63
                } else {
855
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
0
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
0
                }
858
63
            }
859
1.79k
        }
860
861
868
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
840
        {
863
            /* PAN always uses all 64 channels */
864
54.6k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
53.7k
            {
866
53.7k
                tmp = pan_base[b];
867
868
53.7k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
53.7k
                coeff1 = MUL_R(coeff2, tmp);
870
871
53.7k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
53.7k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
53.7k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
53.7k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
53.7k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
53.7k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
53.7k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
53.7k
                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
53.7k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
53.7k
            }
885
840
        }
886
28
    }
887
28
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
160
{
815
160
    uint8_t s, b, qclass, ifreq;
816
160
    real_t tmp, coeff1, coeff2;
817
160
    real_t pan_base[MAX_PAN_BAND];
818
160
    real_t pan_delta[MAX_PAN_BAND];
819
160
    qmf_t temp_l, temp_r;
820
821
160
    if (ps->bs_enable_pan)
822
160
    {
823
10.4k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
10.2k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
10.2k
            ifreq = pan_inv_freq[b];
828
10.2k
            qclass = pan_quant_class[ifreq];
829
830
10.2k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.63k
            {
832
9.63k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.63k
            } else {
834
606
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
606
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
10.2k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.75k
            {
841
8.75k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.65k
                {
843
8.65k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.65k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.65k
                } else {
846
101
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
101
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
101
                }
849
8.75k
            } else {
850
1.48k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
976
                {
852
976
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
976
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
976
                } else {
855
505
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
505
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
505
                }
858
1.48k
            }
859
10.2k
        }
860
861
4.96k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.80k
        {
863
            /* PAN always uses all 64 channels */
864
312k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
307k
            {
866
307k
                tmp = pan_base[b];
867
868
307k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
307k
                coeff1 = MUL_R(coeff2, tmp);
870
871
307k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
307k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
307k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
307k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
307k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
307k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
307k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
307k
                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
307k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
307k
            }
885
4.80k
        }
886
160
    }
887
160
}
888
889
drm_ps_info *drm_ps_init(void)
890
6.97k
{
891
6.97k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
6.97k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
6.97k
    return ps;
896
6.97k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
6.97k
{
900
6.97k
    faad_free(ps);
901
6.97k
}
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
280
{
906
280
    if (ps == NULL)
907
7
    {
908
7
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
7
        return 0;
910
7
    }
911
912
273
    if (!ps->drm_ps_data_available && !guess)
913
1
    {
914
1
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
915
1
        memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index));
916
1
        memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index));
917
1
        return 0;
918
1
    }
919
920
    /* if SBR CRC doesn't match out, we can assume decode errors to start with,
921
       and we'll guess what the parameters should be */
922
272
    if (!guess)
923
148
    {
924
148
        ps->sa_decode_error = 0;
925
148
        ps->pan_decode_error = 0;
926
148
        drm_ps_delta_decode(ps);
927
148
    } else
928
124
    {
929
124
        ps->sa_decode_error = 1;
930
124
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
124
    }
933
934
272
    ps->drm_ps_data_available = 0;
935
936
272
    drm_calc_sa_side_signal(ps, X_left);
937
272
    drm_add_ambiance(ps, X_left, X_right);
938
939
272
    if (ps->bs_enable_sa)
940
95
    {
941
95
        ps->g_last_had_sa = 1;
942
943
95
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
177
    } else {
946
177
        ps->g_last_had_sa = 0;
947
177
    }
948
949
272
    if (ps->bs_enable_pan)
950
188
    {
951
188
        drm_add_pan(ps, X_left, X_right);
952
953
188
        ps->g_last_had_pan = 1;
954
955
188
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
188
    } else {
958
84
        ps->g_last_had_pan = 0;
959
84
    }
960
961
962
272
    return 0;
963
273
}
964
965
#endif