Coverage Report

Created: 2026-07-24 06:21

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
876k
{
446
876k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
876k
    ps->drm_ps_data_available = 1;
449
450
876k
    ps->bs_enable_sa = faad_get1bit(ld);
451
876k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
876k
    if (ps->bs_enable_sa)
454
22.0k
    {
455
22.0k
        drm_ps_sa_element(ps, ld);
456
22.0k
    }
457
458
876k
    if (ps->bs_enable_pan)
459
15.8k
    {
460
15.8k
        drm_ps_pan_element(ps, ld);
461
15.8k
    }
462
463
876k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
876k
    return bits;
466
876k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
22.0k
{
470
22.0k
    drm_ps_huff_tab huff;
471
22.0k
    uint8_t band;
472
473
22.0k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
22.0k
    if (ps->bs_sa_dt_flag)
475
9.48k
    {
476
9.48k
        huff = t_huffman_sa;
477
12.5k
    } else {
478
12.5k
        huff = f_huffman_sa;
479
12.5k
    }
480
481
198k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
176k
    {
483
176k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
176k
    }
485
22.0k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
15.8k
{
489
15.8k
    drm_ps_huff_tab huff;
490
15.8k
    uint8_t band;
491
492
15.8k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
15.8k
    if (ps->bs_pan_dt_flag)
494
4.23k
    {
495
4.23k
        huff = t_huffman_pan;
496
11.6k
    } else {
497
11.6k
        huff = f_huffman_pan;
498
11.6k
    }
499
500
332k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
316k
    {
502
316k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
316k
    }
504
15.8k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
492k
{
509
492k
    uint8_t bit;
510
492k
    int8_t index = 0;
511
512
1.40M
    while (index >= 0)
513
911k
    {
514
911k
        bit = (uint8_t)faad_get1bit(ld);
515
911k
        index = huff[index][bit];
516
911k
    }
517
518
492k
    return index + 15;
519
492k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
736
{
524
736
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
273
        ps->sa_decode_error = 1;
527
273
        return 0;
528
463
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
69
        ps->sa_decode_error = 1;
531
69
        return 7;
532
69
    } else
533
394
        return i;
534
736
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
1.98k
{
538
1.98k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
197
        ps->pan_decode_error = 1;
541
197
        return -7;
542
1.78k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
207
        ps->pan_decode_error = 1;
545
207
        return 7;
546
207
    } else
547
1.57k
        return i;
548
1.98k
}
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
117
    {
556
117
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
25
        {
558
            /* wait until we get a DT frame */
559
25
            ps->bs_enable_sa = 0;
560
92
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
15
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
77
        } else {
564
            /* DF always decodable */
565
77
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
77
        }
567
568
936
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
819
        {
570
819
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
105
            {
572
105
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
714
            } else if (!ps->bs_sa_dt_flag) {
574
539
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
539
            }
576
819
        }
577
117
    }
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
77
        ps->pan_decode_error = 1;
583
77
        ps->bs_enable_pan = ps->g_last_had_pan;
584
77
        ps->bs_enable_sa = ps->g_last_had_sa;
585
77
    }
586
587
588
138
    if (ps->bs_enable_sa)
589
43
    {
590
43
        if (ps->sa_decode_error) {
591
252
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
224
            {
593
224
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
224
            }
595
28
        } else {
596
135
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
120
            {
598
120
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
120
            }
600
15
        }
601
43
    }
602
603
138
    if (ps->bs_enable_pan)
604
102
    {
605
102
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
99
        }  else if (ps->bs_pan_dt_flag) {
609
30
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
69
        } else {
611
69
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
69
        }
613
614
2.04k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
1.93k
        {
616
1.93k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
570
            {
618
570
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.36k
            } else if (!ps->bs_pan_dt_flag) {
620
1.31k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.31k
            }
622
1.93k
        }
623
624
102
        if (ps->pan_decode_error) {
625
1.40k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.34k
            {
627
1.34k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.34k
            }
629
67
        } else {
630
735
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
700
            {
632
700
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
700
            }
634
35
        }
635
102
    }
636
138
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
273
{
640
273
    uint8_t s, b, k;
641
273
    complex_t qfrac, tmp0, tmp, in, R0;
642
273
    real_t peakdiff;
643
273
    real_t nrg;
644
273
    real_t power;
645
273
    real_t transratio;
646
273
    real_t new_delay_slopes[NUM_OF_LINKS];
647
273
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
273
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.55k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.27k
    {
655
        /* set delay indices */
656
25.1k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
18.8k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.27k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.27k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
194k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
188k
        {
664
188k
            const real_t gamma = REAL_CONST(1.5);
665
188k
            const real_t sigma = REAL_CONST(1.5625);
666
667
188k
            RE(in) = QMF_RE(X[s][b]);
668
188k
            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
141k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
188k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
188k
            if (ps->peakdecay_fast[b] < power)
683
16.7k
                ps->peakdecay_fast[b] = power;
684
685
188k
            peakdiff = ps->prev_peakdiff[b];
686
188k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
188k
            ps->prev_peakdiff[b] = peakdiff;
688
689
188k
            nrg = ps->prev_nrg[b];
690
188k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
188k
            ps->prev_nrg[b] = nrg;
692
693
188k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
176k
                transratio = sigma;
695
176k
            } else {
696
12.0k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
12.0k
            }
698
699
753k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
565k
            {
701
565k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
565k
            }
703
704
188k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
188k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
188k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
188k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
188k
            RE(ps->d_buff[1][b]) = RE(in);
711
188k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
188k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
188k
            RE(R0) = RE(tmp);
716
188k
            IM(R0) = IM(tmp);
717
718
753k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
565k
            {
720
565k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
565k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
565k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
565k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
565k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
565k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
565k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
565k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
565k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
565k
                RE(R0) = RE(tmp);
735
565k
                IM(R0) = IM(tmp);
736
565k
            }
737
738
188k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
188k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
753k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
565k
            {
743
565k
                if (++temp_delay_ser[k] >= delay_length[k])
744
146k
                    temp_delay_ser[k] = 0;
745
565k
            }
746
188k
        }
747
6.27k
    }
748
749
1.09k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
819
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
273
}
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.01k
                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.5k
                transratio = sigma;
695
44.5k
            } else {
696
2.36k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.36k
            }
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
205
{
640
205
    uint8_t s, b, k;
641
205
    complex_t qfrac, tmp0, tmp, in, R0;
642
205
    real_t peakdiff;
643
205
    real_t nrg;
644
205
    real_t power;
645
205
    real_t transratio;
646
205
    real_t new_delay_slopes[NUM_OF_LINKS];
647
205
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
205
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.92k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.71k
    {
655
        /* set delay indices */
656
18.8k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.1k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.71k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.71k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
146k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
141k
        {
664
141k
            const real_t gamma = REAL_CONST(1.5);
665
141k
            const real_t sigma = REAL_CONST(1.5625);
666
667
141k
            RE(in) = QMF_RE(X[s][b]);
668
141k
            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
141k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
141k
#endif
680
681
141k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
141k
            if (ps->peakdecay_fast[b] < power)
683
10.7k
                ps->peakdecay_fast[b] = power;
684
685
141k
            peakdiff = ps->prev_peakdiff[b];
686
141k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
141k
            ps->prev_peakdiff[b] = peakdiff;
688
689
141k
            nrg = ps->prev_nrg[b];
690
141k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
141k
            ps->prev_nrg[b] = nrg;
692
693
141k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
131k
                transratio = sigma;
695
131k
            } else {
696
9.73k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
9.73k
            }
698
699
565k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
424k
            {
701
424k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
424k
            }
703
704
141k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
141k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
141k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
141k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
141k
            RE(ps->d_buff[1][b]) = RE(in);
711
141k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
141k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
141k
            RE(R0) = RE(tmp);
716
141k
            IM(R0) = IM(tmp);
717
718
565k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
424k
            {
720
424k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
424k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
424k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
424k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
424k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
424k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
424k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
424k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
424k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
424k
                RE(R0) = RE(tmp);
735
424k
                IM(R0) = IM(tmp);
736
424k
            }
737
738
141k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
141k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
565k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
424k
            {
743
424k
                if (++temp_delay_ser[k] >= delay_length[k])
744
110k
                    temp_delay_ser[k] = 0;
745
424k
            }
746
141k
        }
747
4.71k
    }
748
749
820
    for (k = 0; k < NUM_OF_LINKS; k++)
750
615
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
205
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
273
{
755
273
    uint8_t s, b, ifreq, qclass;
756
273
    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
273
    real_t new_dir_map, new_sa_map;
758
759
273
    if (ps->bs_enable_sa)
760
97
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.32k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.23k
        {
765
2.23k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.23k
            ifreq = sa_inv_freq[b];
768
2.23k
            qclass = (b != 0);
769
770
2.23k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.23k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.23k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.23k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.23k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.23k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.23k
        }
781
782
3.00k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.91k
        {
784
69.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
66.9k
            {
786
66.9k
                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.9k
                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.9k
                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.9k
                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.9k
                sa_map[b]     += k_sa_map[b];
792
66.9k
                sa_dir_map[b] += k_sa_dir_map[b];
793
66.9k
            }
794
122k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
119k
            {
796
119k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
119k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
119k
            }
799
2.91k
        }
800
97
    }
801
176
    else {
802
5.45k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
5.28k
        {
804
343k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
337k
            {
806
337k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
337k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
337k
            }
809
5.28k
        }
810
176
    }
811
273
}
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
18
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
432
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
414
        {
765
414
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
414
            ifreq = sa_inv_freq[b];
768
414
            qclass = (b != 0);
769
770
414
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
414
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
414
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
414
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
414
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
414
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
414
        }
781
782
558
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
540
        {
784
12.9k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
12.4k
            {
786
12.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
12.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
12.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
12.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
12.4k
                sa_map[b]     += k_sa_map[b];
792
12.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
12.4k
            }
794
22.6k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
22.1k
            {
796
22.1k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
22.1k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
22.1k
            }
799
540
        }
800
18
    }
801
50
    else {
802
1.55k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.50k
        {
804
97.5k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
96.0k
            {
806
96.0k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
96.0k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
96.0k
            }
809
1.50k
        }
810
50
    }
811
68
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
205
{
755
205
    uint8_t s, b, ifreq, qclass;
756
205
    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
205
    real_t new_dir_map, new_sa_map;
758
759
205
    if (ps->bs_enable_sa)
760
79
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.89k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.81k
        {
765
1.81k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.81k
            ifreq = sa_inv_freq[b];
768
1.81k
            qclass = (b != 0);
769
770
1.81k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.81k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.81k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.81k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.81k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.81k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.81k
        }
781
782
2.44k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.37k
        {
784
56.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
54.5k
            {
786
54.5k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
54.5k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
54.5k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
54.5k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
54.5k
                sa_map[b]     += k_sa_map[b];
792
54.5k
                sa_dir_map[b] += k_sa_dir_map[b];
793
54.5k
            }
794
99.5k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
97.1k
            {
796
97.1k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
97.1k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
97.1k
            }
799
2.37k
        }
800
79
    }
801
126
    else {
802
3.90k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.78k
        {
804
245k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
241k
            {
806
241k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
241k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
241k
            }
809
3.78k
        }
810
126
    }
811
205
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
176
{
815
176
    uint8_t s, b, qclass, ifreq;
816
176
    real_t tmp, coeff1, coeff2;
817
176
    real_t pan_base[MAX_PAN_BAND];
818
176
    real_t pan_delta[MAX_PAN_BAND];
819
176
    qmf_t temp_l, temp_r;
820
821
176
    if (ps->bs_enable_pan)
822
176
    {
823
11.4k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
11.2k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
11.2k
            ifreq = pan_inv_freq[b];
828
11.2k
            qclass = pan_quant_class[ifreq];
829
830
11.2k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
10.7k
            {
832
10.7k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
10.7k
            } else {
834
544
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
544
            }
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
11.2k
            if (ps->g_pan_index[ifreq] >= 0)
840
9.81k
            {
841
9.81k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.71k
                {
843
9.71k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.71k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.71k
                } 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.81k
            } else {
850
1.44k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.00k
                {
852
1.00k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.00k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.00k
                } else {
855
446
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
446
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
446
                }
858
1.44k
            }
859
11.2k
        }
860
861
5.45k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.28k
        {
863
            /* PAN always uses all 64 channels */
864
343k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
337k
            {
866
337k
                tmp = pan_base[b];
867
868
337k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
337k
                coeff1 = MUL_R(coeff2, tmp);
870
871
337k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
337k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
337k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
337k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
337k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
337k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
337k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
337k
                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
337k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
337k
            }
885
5.28k
        }
886
176
    }
887
176
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
31
{
815
31
    uint8_t s, b, qclass, ifreq;
816
31
    real_t tmp, coeff1, coeff2;
817
31
    real_t pan_base[MAX_PAN_BAND];
818
31
    real_t pan_delta[MAX_PAN_BAND];
819
31
    qmf_t temp_l, temp_r;
820
821
31
    if (ps->bs_enable_pan)
822
31
    {
823
2.01k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.98k
        {
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.98k
            ifreq = pan_inv_freq[b];
828
1.98k
            qclass = pan_quant_class[ifreq];
829
830
1.98k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.98k
            {
832
1.98k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.98k
            } 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.98k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.92k
            {
841
1.92k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.92k
                {
843
1.92k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.92k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.92k
                } 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.92k
            } else {
850
63
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
63
                {
852
63
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
63
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
63
                } else {
855
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
0
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
0
                }
858
63
            }
859
1.98k
        }
860
861
961
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
930
        {
863
            /* PAN always uses all 64 channels */
864
60.4k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
59.5k
            {
866
59.5k
                tmp = pan_base[b];
867
868
59.5k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
59.5k
                coeff1 = MUL_R(coeff2, tmp);
870
871
59.5k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
59.5k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
59.5k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
59.5k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
59.5k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
59.5k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
59.5k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
59.5k
                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
59.5k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
59.5k
            }
885
930
        }
886
31
    }
887
31
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
145
{
815
145
    uint8_t s, b, qclass, ifreq;
816
145
    real_t tmp, coeff1, coeff2;
817
145
    real_t pan_base[MAX_PAN_BAND];
818
145
    real_t pan_delta[MAX_PAN_BAND];
819
145
    qmf_t temp_l, temp_r;
820
821
145
    if (ps->bs_enable_pan)
822
145
    {
823
9.42k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.28k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
9.28k
            ifreq = pan_inv_freq[b];
828
9.28k
            qclass = pan_quant_class[ifreq];
829
830
9.28k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
8.73k
            {
832
8.73k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
8.73k
            } else {
834
544
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
544
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
9.28k
            if (ps->g_pan_index[ifreq] >= 0)
840
7.89k
            {
841
7.89k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
7.79k
                {
843
7.79k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
7.79k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
7.79k
                } 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.89k
            } else {
850
1.38k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
939
                {
852
939
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
939
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
939
                } else {
855
446
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
446
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
446
                }
858
1.38k
            }
859
9.28k
        }
860
861
4.49k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.35k
        {
863
            /* PAN always uses all 64 channels */
864
282k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
278k
            {
866
278k
                tmp = pan_base[b];
867
868
278k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
278k
                coeff1 = MUL_R(coeff2, tmp);
870
871
278k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
278k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
278k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
278k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
278k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
278k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
278k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
278k
                QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
880
881
                /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
882
                /*                   ^^^^^^^^^^^^^^^ k times */
883
278k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
278k
            }
885
4.35k
        }
886
145
    }
887
145
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.11k
{
891
7.11k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.11k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.11k
    return ps;
896
7.11k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.11k
{
900
7.11k
    faad_free(ps);
901
7.11k
}
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
278
{
906
278
    if (ps == NULL)
907
4
    {
908
4
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
4
        return 0;
910
4
    }
911
912
274
    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
273
    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
135
    {
929
135
        ps->sa_decode_error = 1;
930
135
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
135
    }
933
934
273
    ps->drm_ps_data_available = 0;
935
936
273
    drm_calc_sa_side_signal(ps, X_left);
937
273
    drm_add_ambiance(ps, X_left, X_right);
938
939
273
    if (ps->bs_enable_sa)
940
97
    {
941
97
        ps->g_last_had_sa = 1;
942
943
97
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
176
    } else {
946
176
        ps->g_last_had_sa = 0;
947
176
    }
948
949
273
    if (ps->bs_enable_pan)
950
176
    {
951
176
        drm_add_pan(ps, X_left, X_right);
952
953
176
        ps->g_last_had_pan = 1;
954
955
176
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
176
    } else {
958
97
        ps->g_last_had_pan = 0;
959
97
    }
960
961
962
273
    return 0;
963
274
}
964
965
#endif