Coverage Report

Created: 2026-03-20 06:59

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