Coverage Report

Created: 2026-07-10 07:01

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.04M
{
446
1.04M
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
1.04M
    ps->drm_ps_data_available = 1;
449
450
1.04M
    ps->bs_enable_sa = faad_get1bit(ld);
451
1.04M
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
1.04M
    if (ps->bs_enable_sa)
454
23.7k
    {
455
23.7k
        drm_ps_sa_element(ps, ld);
456
23.7k
    }
457
458
1.04M
    if (ps->bs_enable_pan)
459
16.8k
    {
460
16.8k
        drm_ps_pan_element(ps, ld);
461
16.8k
    }
462
463
1.04M
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
1.04M
    return bits;
466
1.04M
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
23.7k
{
470
23.7k
    drm_ps_huff_tab huff;
471
23.7k
    uint8_t band;
472
473
23.7k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
23.7k
    if (ps->bs_sa_dt_flag)
475
10.1k
    {
476
10.1k
        huff = t_huffman_sa;
477
13.5k
    } else {
478
13.5k
        huff = f_huffman_sa;
479
13.5k
    }
480
481
213k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
189k
    {
483
189k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
189k
    }
485
23.7k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
16.8k
{
489
16.8k
    drm_ps_huff_tab huff;
490
16.8k
    uint8_t band;
491
492
16.8k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
16.8k
    if (ps->bs_pan_dt_flag)
494
4.18k
    {
495
4.18k
        huff = t_huffman_pan;
496
12.6k
    } else {
497
12.6k
        huff = f_huffman_pan;
498
12.6k
    }
499
500
353k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
336k
    {
502
336k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
336k
    }
504
16.8k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
526k
{
509
526k
    uint8_t bit;
510
526k
    int8_t index = 0;
511
512
1.49M
    while (index >= 0)
513
973k
    {
514
973k
        bit = (uint8_t)faad_get1bit(ld);
515
973k
        index = huff[index][bit];
516
973k
    }
517
518
526k
    return index + 15;
519
526k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
784
{
524
784
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
250
        ps->sa_decode_error = 1;
527
250
        return 0;
528
534
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
93
        ps->sa_decode_error = 1;
531
93
        return 7;
532
93
    } else
533
441
        return i;
534
784
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.18k
{
538
2.18k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
231
        ps->pan_decode_error = 1;
541
231
        return -7;
542
1.94k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
214
        ps->pan_decode_error = 1;
545
214
        return 7;
546
214
    } else
547
1.73k
        return i;
548
2.18k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
152
{
552
152
    uint8_t band;
553
554
152
    if (ps->bs_enable_sa)
555
123
    {
556
123
        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
98
        } 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
83
        } else {
564
            /* DF always decodable */
565
83
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
83
        }
567
568
984
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
861
        {
570
861
            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
756
            } else if (!ps->bs_sa_dt_flag) {
574
581
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
581
            }
576
861
        }
577
123
    }
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
152
    if (ps->sa_decode_error) {
582
82
        ps->pan_decode_error = 1;
583
82
        ps->bs_enable_pan = ps->g_last_had_pan;
584
82
        ps->bs_enable_sa = ps->g_last_had_sa;
585
82
    }
586
587
588
152
    if (ps->bs_enable_sa)
589
38
    {
590
38
        if (ps->sa_decode_error) {
591
198
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
176
            {
593
176
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
176
            }
595
22
        } else {
596
144
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
128
            {
598
128
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
128
            }
600
16
        }
601
38
    }
602
603
152
    if (ps->bs_enable_pan)
604
112
    {
605
112
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
109
        }  else if (ps->bs_pan_dt_flag) {
609
31
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
78
        } else {
611
78
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
78
        }
613
614
2.24k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.12k
        {
616
2.12k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
589
            {
618
589
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.53k
            } else if (!ps->bs_pan_dt_flag) {
620
1.48k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.48k
            }
622
2.12k
        }
623
624
112
        if (ps->pan_decode_error) {
625
1.51k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.44k
            {
627
1.44k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.44k
            }
629
72
        } else {
630
840
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
800
            {
632
800
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
800
            }
634
40
        }
635
112
    }
636
152
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
278
{
640
278
    uint8_t s, b, k;
641
278
    complex_t qfrac, tmp0, tmp, in, R0;
642
278
    real_t peakdiff;
643
278
    real_t nrg;
644
278
    real_t power;
645
278
    real_t transratio;
646
278
    real_t new_delay_slopes[NUM_OF_LINKS];
647
278
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
278
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.67k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.39k
    {
655
        /* set delay indices */
656
25.5k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
19.1k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.39k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.39k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
198k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
191k
        {
664
191k
            const real_t gamma = REAL_CONST(1.5);
665
191k
            const real_t sigma = REAL_CONST(1.5625);
666
667
191k
            RE(in) = QMF_RE(X[s][b]);
668
191k
            IM(in) = QMF_IM(X[s][b]);
669
670
#ifdef FIXED_POINT
671
            /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672
            * meaning that P will be scaled by 2^(-10) compared to floating point version
673
            */
674
43.4k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
43.4k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
148k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
191k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
191k
            if (ps->peakdecay_fast[b] < power)
683
15.6k
                ps->peakdecay_fast[b] = power;
684
685
191k
            peakdiff = ps->prev_peakdiff[b];
686
191k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
191k
            ps->prev_peakdiff[b] = peakdiff;
688
689
191k
            nrg = ps->prev_nrg[b];
690
191k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
191k
            ps->prev_nrg[b] = nrg;
692
693
191k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
180k
                transratio = sigma;
695
180k
            } else {
696
11.0k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
11.0k
            }
698
699
767k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
575k
            {
701
575k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
575k
            }
703
704
191k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
191k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
191k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
191k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
191k
            RE(ps->d_buff[1][b]) = RE(in);
711
191k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
191k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
191k
            RE(R0) = RE(tmp);
716
191k
            IM(R0) = IM(tmp);
717
718
767k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
575k
            {
720
575k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
575k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
575k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
575k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
575k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
575k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
575k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
575k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
575k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
575k
                RE(R0) = RE(tmp);
735
575k
                IM(R0) = IM(tmp);
736
575k
            }
737
738
191k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
191k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
767k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
575k
            {
743
575k
                if (++temp_delay_ser[k] >= delay_length[k])
744
148k
                    temp_delay_ser[k] = 0;
745
575k
            }
746
191k
        }
747
6.39k
    }
748
749
1.11k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
834
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
278
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
63
{
640
63
    uint8_t s, b, k;
641
63
    complex_t qfrac, tmp0, tmp, in, R0;
642
63
    real_t peakdiff;
643
63
    real_t nrg;
644
63
    real_t power;
645
63
    real_t transratio;
646
63
    real_t new_delay_slopes[NUM_OF_LINKS];
647
63
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
63
    complex_t Phi_Fract;
649
63
#ifdef FIXED_POINT
650
63
    uint32_t in_re, in_im;
651
63
#endif
652
653
1.51k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.44k
    {
655
        /* set delay indices */
656
5.79k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
4.34k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.44k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.44k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
44.9k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
43.4k
        {
664
43.4k
            const real_t gamma = REAL_CONST(1.5);
665
43.4k
            const real_t sigma = REAL_CONST(1.5625);
666
667
43.4k
            RE(in) = QMF_RE(X[s][b]);
668
43.4k
            IM(in) = QMF_IM(X[s][b]);
669
670
43.4k
#ifdef FIXED_POINT
671
            /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672
            * meaning that P will be scaled by 2^(-10) compared to floating point version
673
            */
674
43.4k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
43.4k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
43.4k
            power = in_re*in_re + in_im*in_im;
677
#else
678
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
43.4k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
43.4k
            if (ps->peakdecay_fast[b] < power)
683
5.60k
                ps->peakdecay_fast[b] = power;
684
685
43.4k
            peakdiff = ps->prev_peakdiff[b];
686
43.4k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
43.4k
            ps->prev_peakdiff[b] = peakdiff;
688
689
43.4k
            nrg = ps->prev_nrg[b];
690
43.4k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
43.4k
            ps->prev_nrg[b] = nrg;
692
693
43.4k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
40.9k
                transratio = sigma;
695
40.9k
            } else {
696
2.47k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.47k
            }
698
699
173k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
130k
            {
701
130k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
130k
            }
703
704
43.4k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
43.4k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
43.4k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
43.4k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
43.4k
            RE(ps->d_buff[1][b]) = RE(in);
711
43.4k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
43.4k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
43.4k
            RE(R0) = RE(tmp);
716
43.4k
            IM(R0) = IM(tmp);
717
718
173k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
130k
            {
720
130k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
130k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
130k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
130k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
130k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
130k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
130k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
130k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
130k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
130k
                RE(R0) = RE(tmp);
735
130k
                IM(R0) = IM(tmp);
736
130k
            }
737
738
43.4k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
43.4k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
173k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
130k
            {
743
130k
                if (++temp_delay_ser[k] >= delay_length[k])
744
33.4k
                    temp_delay_ser[k] = 0;
745
130k
            }
746
43.4k
        }
747
1.44k
    }
748
749
252
    for (k = 0; k < NUM_OF_LINKS; k++)
750
189
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
63
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
215
{
640
215
    uint8_t s, b, k;
641
215
    complex_t qfrac, tmp0, tmp, in, R0;
642
215
    real_t peakdiff;
643
215
    real_t nrg;
644
215
    real_t power;
645
215
    real_t transratio;
646
215
    real_t new_delay_slopes[NUM_OF_LINKS];
647
215
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
215
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.16k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.94k
    {
655
        /* set delay indices */
656
19.7k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.8k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.94k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.94k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
153k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
148k
        {
664
148k
            const real_t gamma = REAL_CONST(1.5);
665
148k
            const real_t sigma = REAL_CONST(1.5625);
666
667
148k
            RE(in) = QMF_RE(X[s][b]);
668
148k
            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
148k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
148k
#endif
680
681
148k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
148k
            if (ps->peakdecay_fast[b] < power)
683
10.0k
                ps->peakdecay_fast[b] = power;
684
685
148k
            peakdiff = ps->prev_peakdiff[b];
686
148k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
148k
            ps->prev_peakdiff[b] = peakdiff;
688
689
148k
            nrg = ps->prev_nrg[b];
690
148k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
148k
            ps->prev_nrg[b] = nrg;
692
693
148k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
139k
                transratio = sigma;
695
139k
            } else {
696
8.60k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
8.60k
            }
698
699
593k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
445k
            {
701
445k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
445k
            }
703
704
148k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
148k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
148k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
148k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
148k
            RE(ps->d_buff[1][b]) = RE(in);
711
148k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
148k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
148k
            RE(R0) = RE(tmp);
716
148k
            IM(R0) = IM(tmp);
717
718
593k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
445k
            {
720
445k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
445k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
445k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
445k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
445k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
445k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
445k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
445k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
445k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
445k
                RE(R0) = RE(tmp);
735
445k
                IM(R0) = IM(tmp);
736
445k
            }
737
738
148k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
148k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
593k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
445k
            {
743
445k
                if (++temp_delay_ser[k] >= delay_length[k])
744
115k
                    temp_delay_ser[k] = 0;
745
445k
            }
746
148k
        }
747
4.94k
    }
748
749
860
    for (k = 0; k < NUM_OF_LINKS; k++)
750
645
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
215
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
278
{
755
278
    uint8_t s, b, ifreq, qclass;
756
278
    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
278
    real_t new_dir_map, new_sa_map;
758
759
278
    if (ps->bs_enable_sa)
760
85
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.04k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.95k
        {
765
1.95k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.95k
            ifreq = sa_inv_freq[b];
768
1.95k
            qclass = (b != 0);
769
770
1.95k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.95k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.95k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.95k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.95k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.95k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.95k
        }
781
782
2.63k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.55k
        {
784
61.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
58.6k
            {
786
58.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
58.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
58.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
58.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
58.6k
                sa_map[b]     += k_sa_map[b];
792
58.6k
                sa_dir_map[b] += k_sa_dir_map[b];
793
58.6k
            }
794
107k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
104k
            {
796
104k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
104k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
104k
            }
799
2.55k
        }
800
85
    }
801
193
    else {
802
5.98k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
5.79k
        {
804
376k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
370k
            {
806
370k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
370k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
370k
            }
809
5.79k
        }
810
193
    }
811
278
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
63
{
755
63
    uint8_t s, b, ifreq, qclass;
756
63
    real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND];
757
63
    real_t new_dir_map, new_sa_map;
758
759
63
    if (ps->bs_enable_sa)
760
20
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
480
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
460
        {
765
460
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
460
            ifreq = sa_inv_freq[b];
768
460
            qclass = (b != 0);
769
770
460
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
460
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
460
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
460
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
460
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
460
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
460
        }
781
782
620
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
600
        {
784
14.4k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
13.8k
            {
786
13.8k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
13.8k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
13.8k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
13.8k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
13.8k
                sa_map[b]     += k_sa_map[b];
792
13.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
13.8k
            }
794
25.2k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
24.6k
            {
796
24.6k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
24.6k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
24.6k
            }
799
600
        }
800
20
    }
801
43
    else {
802
1.33k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.29k
        {
804
83.8k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
82.5k
            {
806
82.5k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
82.5k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
82.5k
            }
809
1.29k
        }
810
43
    }
811
63
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
215
{
755
215
    uint8_t s, b, ifreq, qclass;
756
215
    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
215
    real_t new_dir_map, new_sa_map;
758
759
215
    if (ps->bs_enable_sa)
760
65
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.56k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.49k
        {
765
1.49k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.49k
            ifreq = sa_inv_freq[b];
768
1.49k
            qclass = (b != 0);
769
770
1.49k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.49k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.49k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.49k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.49k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.49k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.49k
        }
781
782
2.01k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
1.95k
        {
784
46.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
44.8k
            {
786
44.8k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
44.8k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
44.8k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
44.8k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
44.8k
                sa_map[b]     += k_sa_map[b];
792
44.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
44.8k
            }
794
81.9k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
79.9k
            {
796
79.9k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
79.9k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
79.9k
            }
799
1.95k
        }
800
65
    }
801
150
    else {
802
4.65k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.50k
        {
804
292k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
288k
            {
806
288k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
288k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
288k
            }
809
4.50k
        }
810
150
    }
811
215
}
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
548
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
548
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
11.2k
            if (ps->g_pan_index[ifreq] >= 0)
840
9.77k
            {
841
9.77k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
9.67k
                {
843
9.67k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
9.67k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
9.67k
                } 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.77k
            } else {
850
1.49k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.04k
                {
852
1.04k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.04k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.04k
                } else {
855
450
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
450
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
450
                }
858
1.49k
            }
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
23
{
815
23
    uint8_t s, b, qclass, ifreq;
816
23
    real_t tmp, coeff1, coeff2;
817
23
    real_t pan_base[MAX_PAN_BAND];
818
23
    real_t pan_delta[MAX_PAN_BAND];
819
23
    qmf_t temp_l, temp_r;
820
821
23
    if (ps->bs_enable_pan)
822
23
    {
823
1.49k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.47k
        {
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.47k
            ifreq = pan_inv_freq[b];
828
1.47k
            qclass = pan_quant_class[ifreq];
829
830
1.47k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.47k
            {
832
1.47k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.47k
            } 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.47k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.40k
            {
841
1.40k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.40k
                {
843
1.40k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.40k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.40k
                } 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.40k
            } 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.47k
        }
860
861
713
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
690
        {
863
            /* PAN always uses all 64 channels */
864
44.8k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
44.1k
            {
866
44.1k
                tmp = pan_base[b];
867
868
44.1k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
44.1k
                coeff1 = MUL_R(coeff2, tmp);
870
871
44.1k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
44.1k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
44.1k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
44.1k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
44.1k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
44.1k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
44.1k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
44.1k
                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
44.1k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
44.1k
            }
885
690
        }
886
23
    }
887
23
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
153
{
815
153
    uint8_t s, b, qclass, ifreq;
816
153
    real_t tmp, coeff1, coeff2;
817
153
    real_t pan_base[MAX_PAN_BAND];
818
153
    real_t pan_delta[MAX_PAN_BAND];
819
153
    qmf_t temp_l, temp_r;
820
821
153
    if (ps->bs_enable_pan)
822
153
    {
823
9.94k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.79k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
9.79k
            ifreq = pan_inv_freq[b];
828
9.79k
            qclass = pan_quant_class[ifreq];
829
830
9.79k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.24k
            {
832
9.24k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.24k
            } else {
834
548
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
548
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
9.79k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.36k
            {
841
8.36k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.26k
                {
843
8.26k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.26k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.26k
                } 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.36k
            } else {
850
1.43k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
980
                {
852
980
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
980
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
980
                } else {
855
450
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
450
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
450
                }
858
1.43k
            }
859
9.79k
        }
860
861
4.74k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.59k
        {
863
            /* PAN always uses all 64 channels */
864
298k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
293k
            {
866
293k
                tmp = pan_base[b];
867
868
293k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
293k
                coeff1 = MUL_R(coeff2, tmp);
870
871
293k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
293k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
293k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
293k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
293k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
293k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
293k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
293k
                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
293k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
293k
            }
885
4.59k
        }
886
153
    }
887
153
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.71k
{
891
7.71k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.71k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.71k
    return ps;
896
7.71k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.71k
{
900
7.71k
    faad_free(ps);
901
7.71k
}
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
289
{
906
289
    if (ps == NULL)
907
10
    {
908
10
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
10
        return 0;
910
10
    }
911
912
279
    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
278
    if (!guess)
923
152
    {
924
152
        ps->sa_decode_error = 0;
925
152
        ps->pan_decode_error = 0;
926
152
        drm_ps_delta_decode(ps);
927
152
    } else
928
126
    {
929
126
        ps->sa_decode_error = 1;
930
126
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
126
    }
933
934
278
    ps->drm_ps_data_available = 0;
935
936
278
    drm_calc_sa_side_signal(ps, X_left);
937
278
    drm_add_ambiance(ps, X_left, X_right);
938
939
278
    if (ps->bs_enable_sa)
940
85
    {
941
85
        ps->g_last_had_sa = 1;
942
943
85
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
193
    } else {
946
193
        ps->g_last_had_sa = 0;
947
193
    }
948
949
278
    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
102
        ps->g_last_had_pan = 0;
959
102
    }
960
961
962
278
    return 0;
963
279
}
964
965
#endif