Coverage Report

Created: 2026-10-17 06:34

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