Coverage Report

Created: 2026-07-16 06:20

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
993k
{
446
993k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
993k
    ps->drm_ps_data_available = 1;
449
450
993k
    ps->bs_enable_sa = faad_get1bit(ld);
451
993k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
993k
    if (ps->bs_enable_sa)
454
22.2k
    {
455
22.2k
        drm_ps_sa_element(ps, ld);
456
22.2k
    }
457
458
993k
    if (ps->bs_enable_pan)
459
16.1k
    {
460
16.1k
        drm_ps_pan_element(ps, ld);
461
16.1k
    }
462
463
993k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
993k
    return bits;
466
993k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
22.2k
{
470
22.2k
    drm_ps_huff_tab huff;
471
22.2k
    uint8_t band;
472
473
22.2k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
22.2k
    if (ps->bs_sa_dt_flag)
475
9.46k
    {
476
9.46k
        huff = t_huffman_sa;
477
12.8k
    } else {
478
12.8k
        huff = f_huffman_sa;
479
12.8k
    }
480
481
200k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
178k
    {
483
178k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
178k
    }
485
22.2k
}
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
3.89k
    {
495
3.89k
        huff = t_huffman_pan;
496
12.2k
    } else {
497
12.2k
        huff = f_huffman_pan;
498
12.2k
    }
499
500
338k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
322k
    {
502
322k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
322k
    }
504
16.1k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
500k
{
509
500k
    uint8_t bit;
510
500k
    int8_t index = 0;
511
512
1.41M
    while (index >= 0)
513
917k
    {
514
917k
        bit = (uint8_t)faad_get1bit(ld);
515
917k
        index = huff[index][bit];
516
917k
    }
517
518
500k
    return index + 15;
519
500k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
680
{
524
680
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
234
        ps->sa_decode_error = 1;
527
234
        return 0;
528
446
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
67
        ps->sa_decode_error = 1;
531
67
        return 7;
532
67
    } else
533
379
        return i;
534
680
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.02k
{
538
2.02k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
237
        ps->pan_decode_error = 1;
541
237
        return -7;
542
1.78k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
206
        ps->pan_decode_error = 1;
545
206
        return 7;
546
206
    } else
547
1.57k
        return i;
548
2.02k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
138
{
552
138
    uint8_t band;
553
554
138
    if (ps->bs_enable_sa)
555
109
    {
556
109
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
24
        {
558
            /* wait until we get a DT frame */
559
24
            ps->bs_enable_sa = 0;
560
85
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
14
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
71
        } else {
564
            /* DF always decodable */
565
71
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
71
        }
567
568
872
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
763
        {
570
763
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
98
            {
572
98
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
665
            } else if (!ps->bs_sa_dt_flag) {
574
497
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
497
            }
576
763
        }
577
109
    }
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
138
    if (ps->sa_decode_error) {
582
68
        ps->pan_decode_error = 1;
583
68
        ps->bs_enable_pan = ps->g_last_had_pan;
584
68
        ps->bs_enable_sa = ps->g_last_had_sa;
585
68
    }
586
587
588
138
    if (ps->bs_enable_sa)
589
37
    {
590
37
        if (ps->sa_decode_error) {
591
180
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
160
            {
593
160
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
160
            }
595
20
        } else {
596
153
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
136
            {
598
136
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
136
            }
600
17
        }
601
37
    }
602
603
138
    if (ps->bs_enable_pan)
604
105
    {
605
105
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
4
        {
607
4
            ps->bs_enable_pan = 0;
608
101
        }  else if (ps->bs_pan_dt_flag) {
609
26
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
75
        } else {
611
75
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
75
        }
613
614
2.10k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
1.99k
        {
616
1.99k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
494
            {
618
494
                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.42k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.42k
            }
622
1.99k
        }
623
624
105
        if (ps->pan_decode_error) {
625
1.36k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.30k
            {
627
1.30k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.30k
            }
629
65
        } else {
630
840
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
800
            {
632
800
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
800
            }
634
40
        }
635
105
    }
636
138
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
261
{
640
261
    uint8_t s, b, k;
641
261
    complex_t qfrac, tmp0, tmp, in, R0;
642
261
    real_t peakdiff;
643
261
    real_t nrg;
644
261
    real_t power;
645
261
    real_t transratio;
646
261
    real_t new_delay_slopes[NUM_OF_LINKS];
647
261
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
261
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.26k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.00k
    {
655
        /* set delay indices */
656
24.0k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
18.0k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.00k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.00k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
186k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
180k
        {
664
180k
            const real_t gamma = REAL_CONST(1.5);
665
180k
            const real_t sigma = REAL_CONST(1.5625);
666
667
180k
            RE(in) = QMF_RE(X[s][b]);
668
180k
            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
43.4k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
43.4k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
136k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
180k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
180k
            if (ps->peakdecay_fast[b] < power)
683
15.2k
                ps->peakdecay_fast[b] = power;
684
685
180k
            peakdiff = ps->prev_peakdiff[b];
686
180k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
180k
            ps->prev_peakdiff[b] = peakdiff;
688
689
180k
            nrg = ps->prev_nrg[b];
690
180k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
180k
            ps->prev_nrg[b] = nrg;
692
693
180k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
170k
                transratio = sigma;
695
170k
            } else {
696
9.49k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
9.49k
            }
698
699
720k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
540k
            {
701
540k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
540k
            }
703
704
180k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
180k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
180k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
180k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
180k
            RE(ps->d_buff[1][b]) = RE(in);
711
180k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
180k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
180k
            RE(R0) = RE(tmp);
716
180k
            IM(R0) = IM(tmp);
717
718
720k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
540k
            {
720
540k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
540k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
540k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
540k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
540k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
540k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
540k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
540k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
540k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
540k
                RE(R0) = RE(tmp);
735
540k
                IM(R0) = IM(tmp);
736
540k
            }
737
738
180k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
180k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
720k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
540k
            {
743
540k
                if (++temp_delay_ser[k] >= delay_length[k])
744
139k
                    temp_delay_ser[k] = 0;
745
540k
            }
746
180k
        }
747
6.00k
    }
748
749
1.04k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
783
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
261
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
63
{
640
63
    uint8_t s, b, k;
641
63
    complex_t qfrac, tmp0, tmp, in, R0;
642
63
    real_t peakdiff;
643
63
    real_t nrg;
644
63
    real_t power;
645
63
    real_t transratio;
646
63
    real_t new_delay_slopes[NUM_OF_LINKS];
647
63
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
63
    complex_t Phi_Fract;
649
63
#ifdef FIXED_POINT
650
63
    uint32_t in_re, in_im;
651
63
#endif
652
653
1.51k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.44k
    {
655
        /* set delay indices */
656
5.79k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
4.34k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.44k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.44k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
44.9k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
43.4k
        {
664
43.4k
            const real_t gamma = REAL_CONST(1.5);
665
43.4k
            const real_t sigma = REAL_CONST(1.5625);
666
667
43.4k
            RE(in) = QMF_RE(X[s][b]);
668
43.4k
            IM(in) = QMF_IM(X[s][b]);
669
670
43.4k
#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
43.4k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
43.4k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
43.4k
            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
43.4k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
43.4k
            if (ps->peakdecay_fast[b] < power)
683
5.87k
                ps->peakdecay_fast[b] = power;
684
685
43.4k
            peakdiff = ps->prev_peakdiff[b];
686
43.4k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
43.4k
            ps->prev_peakdiff[b] = peakdiff;
688
689
43.4k
            nrg = ps->prev_nrg[b];
690
43.4k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
43.4k
            ps->prev_nrg[b] = nrg;
692
693
43.4k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
41.0k
                transratio = sigma;
695
41.0k
            } else {
696
2.41k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.41k
            }
698
699
173k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
130k
            {
701
130k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
130k
            }
703
704
43.4k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
43.4k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
43.4k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
43.4k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
43.4k
            RE(ps->d_buff[1][b]) = RE(in);
711
43.4k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
43.4k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
43.4k
            RE(R0) = RE(tmp);
716
43.4k
            IM(R0) = IM(tmp);
717
718
173k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
130k
            {
720
130k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
130k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
130k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
130k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
130k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
130k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
130k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
130k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
130k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
130k
                RE(R0) = RE(tmp);
735
130k
                IM(R0) = IM(tmp);
736
130k
            }
737
738
43.4k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
43.4k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
173k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
130k
            {
743
130k
                if (++temp_delay_ser[k] >= delay_length[k])
744
33.4k
                    temp_delay_ser[k] = 0;
745
130k
            }
746
43.4k
        }
747
1.44k
    }
748
749
252
    for (k = 0; k < NUM_OF_LINKS; k++)
750
189
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
63
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
198
{
640
198
    uint8_t s, b, k;
641
198
    complex_t qfrac, tmp0, tmp, in, R0;
642
198
    real_t peakdiff;
643
198
    real_t nrg;
644
198
    real_t power;
645
198
    real_t transratio;
646
198
    real_t new_delay_slopes[NUM_OF_LINKS];
647
198
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
198
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.75k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.55k
    {
655
        /* set delay indices */
656
18.2k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
13.6k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.55k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.55k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
141k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
136k
        {
664
136k
            const real_t gamma = REAL_CONST(1.5);
665
136k
            const real_t sigma = REAL_CONST(1.5625);
666
667
136k
            RE(in) = QMF_RE(X[s][b]);
668
136k
            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
136k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
136k
#endif
680
681
136k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
136k
            if (ps->peakdecay_fast[b] < power)
683
9.41k
                ps->peakdecay_fast[b] = power;
684
685
136k
            peakdiff = ps->prev_peakdiff[b];
686
136k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
136k
            ps->prev_peakdiff[b] = peakdiff;
688
689
136k
            nrg = ps->prev_nrg[b];
690
136k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
136k
            ps->prev_nrg[b] = nrg;
692
693
136k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
129k
                transratio = sigma;
695
129k
            } else {
696
7.08k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.08k
            }
698
699
546k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
409k
            {
701
409k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
409k
            }
703
704
136k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
136k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
136k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
136k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
136k
            RE(ps->d_buff[1][b]) = RE(in);
711
136k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
136k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
136k
            RE(R0) = RE(tmp);
716
136k
            IM(R0) = IM(tmp);
717
718
546k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
409k
            {
720
409k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
409k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
409k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
409k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
409k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
409k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
409k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
409k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
409k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
409k
                RE(R0) = RE(tmp);
735
409k
                IM(R0) = IM(tmp);
736
409k
            }
737
738
136k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
136k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
546k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
409k
            {
743
409k
                if (++temp_delay_ser[k] >= delay_length[k])
744
106k
                    temp_delay_ser[k] = 0;
745
409k
            }
746
136k
        }
747
4.55k
    }
748
749
792
    for (k = 0; k < NUM_OF_LINKS; k++)
750
594
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
198
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
261
{
755
261
    uint8_t s, b, ifreq, qclass;
756
261
    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
261
    real_t new_dir_map, new_sa_map;
758
759
261
    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
183
    else {
802
5.67k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
5.49k
        {
804
356k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
351k
            {
806
351k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
351k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
351k
            }
809
5.49k
        }
810
183
    }
811
261
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
63
{
755
63
    uint8_t s, b, ifreq, qclass;
756
63
    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
63
    real_t new_dir_map, new_sa_map;
758
759
63
    if (ps->bs_enable_sa)
760
19
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
456
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
437
        {
765
437
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
437
            ifreq = sa_inv_freq[b];
768
437
            qclass = (b != 0);
769
770
437
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
437
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
437
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
437
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
437
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
437
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
437
        }
781
782
589
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
570
        {
784
13.6k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
13.1k
            {
786
13.1k
                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
13.1k
                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
13.1k
                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
13.1k
                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
13.1k
                sa_map[b]     += k_sa_map[b];
792
13.1k
                sa_dir_map[b] += k_sa_dir_map[b];
793
13.1k
            }
794
23.9k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
23.3k
            {
796
23.3k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
23.3k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
23.3k
            }
799
570
        }
800
19
    }
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
63
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
198
{
755
198
    uint8_t s, b, ifreq, qclass;
756
198
    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
198
    real_t new_dir_map, new_sa_map;
758
759
198
    if (ps->bs_enable_sa)
760
59
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.41k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.35k
        {
765
1.35k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.35k
            ifreq = sa_inv_freq[b];
768
1.35k
            qclass = (b != 0);
769
770
1.35k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.35k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.35k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.35k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.35k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.35k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.35k
        }
781
782
1.82k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
1.77k
        {
784
42.4k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
40.7k
            {
786
40.7k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
40.7k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
40.7k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
40.7k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
40.7k
                sa_map[b]     += k_sa_map[b];
792
40.7k
                sa_dir_map[b] += k_sa_dir_map[b];
793
40.7k
            }
794
74.3k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
72.5k
            {
796
72.5k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
72.5k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
72.5k
            }
799
1.77k
        }
800
59
    }
801
139
    else {
802
4.30k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.17k
        {
804
271k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
266k
            {
806
266k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
266k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
266k
            }
809
4.17k
        }
810
139
    }
811
198
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
166
{
815
166
    uint8_t s, b, qclass, ifreq;
816
166
    real_t tmp, coeff1, coeff2;
817
166
    real_t pan_base[MAX_PAN_BAND];
818
166
    real_t pan_delta[MAX_PAN_BAND];
819
166
    qmf_t temp_l, temp_r;
820
821
166
    if (ps->bs_enable_pan)
822
166
    {
823
10.7k
        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
548
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
548
            }
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.19k
            {
841
9.19k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.09k
                {
843
9.09k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.09k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.09k
                } else {
846
98
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
98
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
98
                }
849
9.19k
            } else {
850
1.43k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
980
                {
852
980
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
980
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
980
                } else {
855
450
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
450
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
450
                }
858
1.43k
            }
859
10.6k
        }
860
861
5.14k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.98k
        {
863
            /* PAN always uses all 64 channels */
864
323k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
318k
            {
866
318k
                tmp = pan_base[b];
867
868
318k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
318k
                coeff1 = MUL_R(coeff2, tmp);
870
871
318k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
318k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
318k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
318k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
318k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
318k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
318k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
318k
                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
318k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
318k
            }
885
4.98k
        }
886
166
    }
887
166
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
26
{
815
26
    uint8_t s, b, qclass, ifreq;
816
26
    real_t tmp, coeff1, coeff2;
817
26
    real_t pan_base[MAX_PAN_BAND];
818
26
    real_t pan_delta[MAX_PAN_BAND];
819
26
    qmf_t temp_l, temp_r;
820
821
26
    if (ps->bs_enable_pan)
822
26
    {
823
1.69k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.66k
        {
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.66k
            ifreq = pan_inv_freq[b];
828
1.66k
            qclass = pan_quant_class[ifreq];
829
830
1.66k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.66k
            {
832
1.66k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.66k
            } 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.66k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.66k
            {
841
1.66k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.66k
                {
843
1.66k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.66k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.66k
                } 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.66k
            } else {
850
0
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
0
                {
852
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
0
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
0
                } 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
0
            }
859
1.66k
        }
860
861
806
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
780
        {
863
            /* PAN always uses all 64 channels */
864
50.7k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
49.9k
            {
866
49.9k
                tmp = pan_base[b];
867
868
49.9k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
49.9k
                coeff1 = MUL_R(coeff2, tmp);
870
871
49.9k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
49.9k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
49.9k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
49.9k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
49.9k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
49.9k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
49.9k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
49.9k
                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
49.9k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
49.9k
            }
885
780
        }
886
26
    }
887
26
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
140
{
815
140
    uint8_t s, b, qclass, ifreq;
816
140
    real_t tmp, coeff1, coeff2;
817
140
    real_t pan_base[MAX_PAN_BAND];
818
140
    real_t pan_delta[MAX_PAN_BAND];
819
140
    qmf_t temp_l, temp_r;
820
821
140
    if (ps->bs_enable_pan)
822
140
    {
823
9.10k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
8.96k
        {
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
8.96k
            ifreq = pan_inv_freq[b];
828
8.96k
            qclass = pan_quant_class[ifreq];
829
830
8.96k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
8.41k
            {
832
8.41k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
8.41k
            } else {
834
548
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
548
            }
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
8.96k
            if (ps->g_pan_index[ifreq] >= 0)
840
7.53k
            {
841
7.53k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
7.43k
                {
843
7.43k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
7.43k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
7.43k
                } else {
846
98
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
98
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
98
                }
849
7.53k
            } else {
850
1.43k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
980
                {
852
980
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
980
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
980
                } else {
855
450
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
450
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
450
                }
858
1.43k
            }
859
8.96k
        }
860
861
4.34k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.20k
        {
863
            /* PAN always uses all 64 channels */
864
273k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
268k
            {
866
268k
                tmp = pan_base[b];
867
868
268k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
268k
                coeff1 = MUL_R(coeff2, tmp);
870
871
268k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
268k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
268k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
268k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
268k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
268k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
268k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
268k
                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
268k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
268k
            }
885
4.20k
        }
886
140
    }
887
140
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.55k
{
891
7.55k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.55k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.55k
    return ps;
896
7.55k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.55k
{
900
7.55k
    faad_free(ps);
901
7.55k
}
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
270
{
906
270
    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
262
    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
261
    if (!guess)
923
138
    {
924
138
        ps->sa_decode_error = 0;
925
138
        ps->pan_decode_error = 0;
926
138
        drm_ps_delta_decode(ps);
927
138
    } else
928
123
    {
929
123
        ps->sa_decode_error = 1;
930
123
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
123
    }
933
934
261
    ps->drm_ps_data_available = 0;
935
936
261
    drm_calc_sa_side_signal(ps, X_left);
937
261
    drm_add_ambiance(ps, X_left, X_right);
938
939
261
    if (ps->bs_enable_sa)
940
78
    {
941
78
        ps->g_last_had_sa = 1;
942
943
78
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
183
    } else {
946
183
        ps->g_last_had_sa = 0;
947
183
    }
948
949
261
    if (ps->bs_enable_pan)
950
166
    {
951
166
        drm_add_pan(ps, X_left, X_right);
952
953
166
        ps->g_last_had_pan = 1;
954
955
166
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
166
    } else {
958
95
        ps->g_last_had_pan = 0;
959
95
    }
960
961
962
261
    return 0;
963
262
}
964
965
#endif