Coverage Report

Created: 2025-11-24 06:22

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 definitaions */
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
891k
{
446
891k
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
891k
    ps->drm_ps_data_available = 1;
449
450
891k
    ps->bs_enable_sa = faad_get1bit(ld);
451
891k
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
891k
    if (ps->bs_enable_sa)
454
18.8k
    {
455
18.8k
        drm_ps_sa_element(ps, ld);
456
18.8k
    }
457
458
891k
    if (ps->bs_enable_pan)
459
16.8k
    {
460
16.8k
        drm_ps_pan_element(ps, ld);
461
16.8k
    }
462
463
891k
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
891k
    return bits;
466
891k
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
18.8k
{
470
18.8k
    drm_ps_huff_tab huff;
471
18.8k
    uint8_t band;
472
473
18.8k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
18.8k
    if (ps->bs_sa_dt_flag)
475
9.35k
    {
476
9.35k
        huff = t_huffman_sa;
477
9.47k
    } else {
478
9.47k
        huff = f_huffman_sa;
479
9.47k
    }
480
481
169k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
150k
    {
483
150k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
150k
    }
485
18.8k
}
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.75k
    {
495
4.75k
        huff = t_huffman_pan;
496
12.0k
    } else {
497
12.0k
        huff = f_huffman_pan;
498
12.0k
    }
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
487k
{
509
487k
    uint8_t bit;
510
487k
    int8_t index = 0;
511
512
1.37M
    while (index >= 0)
513
891k
    {
514
891k
        bit = (uint8_t)faad_get1bit(ld);
515
891k
        index = huff[index][bit];
516
891k
    }
517
518
487k
    return index + 15;
519
487k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
632
{
524
632
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
168
        ps->sa_decode_error = 1;
527
168
        return 0;
528
464
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
62
        ps->sa_decode_error = 1;
531
62
        return 7;
532
62
    } else
533
402
        return i;
534
632
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.14k
{
538
2.14k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
235
        ps->pan_decode_error = 1;
541
235
        return -7;
542
1.90k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
211
        ps->pan_decode_error = 1;
545
211
        return 7;
546
211
    } else
547
1.69k
        return i;
548
2.14k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
133
{
552
133
    uint8_t band;
553
554
133
    if (ps->bs_enable_sa)
555
98
    {
556
98
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
19
        {
558
            /* wait until we get a DT frame */
559
19
            ps->bs_enable_sa = 0;
560
79
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
14
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
65
        } else {
564
            /* DF always decodable */
565
65
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
65
        }
567
568
784
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
686
        {
570
686
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
98
            {
572
98
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
588
            } else if (!ps->bs_sa_dt_flag) {
574
455
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
455
            }
576
686
        }
577
98
    }
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
133
    if (ps->sa_decode_error) {
582
58
        ps->pan_decode_error = 1;
583
58
        ps->bs_enable_pan = ps->g_last_had_pan;
584
58
        ps->bs_enable_sa = ps->g_last_had_sa;
585
58
    }
586
587
588
133
    if (ps->bs_enable_sa)
589
50
    {
590
50
        if (ps->sa_decode_error) {
591
261
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
232
            {
593
232
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
232
            }
595
29
        } else {
596
189
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
168
            {
598
168
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
168
            }
600
21
        }
601
50
    }
602
603
133
    if (ps->bs_enable_pan)
604
112
    {
605
112
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
5
        {
607
5
            ps->bs_enable_pan = 0;
608
107
        }  else if (ps->bs_pan_dt_flag) {
609
33
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
74
        } else {
611
74
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
74
        }
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
627
            {
618
627
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.50k
            } else if (!ps->bs_pan_dt_flag) {
620
1.40k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.40k
            }
622
2.12k
        }
623
624
112
        if (ps->pan_decode_error) {
625
1.36k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.30k
            {
627
1.30k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.30k
            }
629
65
        } else {
630
987
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
940
            {
632
940
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
940
            }
634
47
        }
635
112
    }
636
133
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
259
{
640
259
    uint8_t s, b, k;
641
259
    complex_t qfrac, tmp0, tmp, in, R0;
642
259
    real_t peakdiff;
643
259
    real_t nrg;
644
259
    real_t power;
645
259
    real_t transratio;
646
259
    real_t new_delay_slopes[NUM_OF_LINKS];
647
259
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
259
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.21k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
5.95k
    {
655
        /* set delay indices */
656
23.8k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
17.8k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
5.95k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
5.95k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
184k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
178k
        {
664
178k
            const real_t gamma = REAL_CONST(1.5);
665
178k
            const real_t sigma = REAL_CONST(1.5625);
666
667
178k
            RE(in) = QMF_RE(X[s][b]);
668
178k
            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
37.2k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
37.2k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
141k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
178k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
178k
            if (ps->peakdecay_fast[b] < power)
683
13.5k
                ps->peakdecay_fast[b] = power;
684
685
178k
            peakdiff = ps->prev_peakdiff[b];
686
178k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
178k
            ps->prev_peakdiff[b] = peakdiff;
688
689
178k
            nrg = ps->prev_nrg[b];
690
178k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
178k
            ps->prev_nrg[b] = nrg;
692
693
178k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
168k
                transratio = sigma;
695
168k
            } else {
696
10.3k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
10.3k
            }
698
699
714k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
536k
            {
701
536k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
536k
            }
703
704
178k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
178k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
178k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
178k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
178k
            RE(ps->d_buff[1][b]) = RE(in);
711
178k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
178k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
178k
            RE(R0) = RE(tmp);
716
178k
            IM(R0) = IM(tmp);
717
718
714k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
536k
            {
720
536k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
536k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
536k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
536k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
536k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
536k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
536k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
536k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
536k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
536k
                RE(R0) = RE(tmp);
735
536k
                IM(R0) = IM(tmp);
736
536k
            }
737
738
178k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
178k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
714k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
536k
            {
743
536k
                if (++temp_delay_ser[k] >= delay_length[k])
744
138k
                    temp_delay_ser[k] = 0;
745
536k
            }
746
178k
        }
747
5.95k
    }
748
749
1.03k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
777
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
259
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
54
{
640
54
    uint8_t s, b, k;
641
54
    complex_t qfrac, tmp0, tmp, in, R0;
642
54
    real_t peakdiff;
643
54
    real_t nrg;
644
54
    real_t power;
645
54
    real_t transratio;
646
54
    real_t new_delay_slopes[NUM_OF_LINKS];
647
54
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
54
    complex_t Phi_Fract;
649
54
#ifdef FIXED_POINT
650
54
    uint32_t in_re, in_im;
651
54
#endif
652
653
1.29k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.24k
    {
655
        /* set delay indices */
656
4.96k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
3.72k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.24k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.24k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
38.5k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
37.2k
        {
664
37.2k
            const real_t gamma = REAL_CONST(1.5);
665
37.2k
            const real_t sigma = REAL_CONST(1.5625);
666
667
37.2k
            RE(in) = QMF_RE(X[s][b]);
668
37.2k
            IM(in) = QMF_IM(X[s][b]);
669
670
37.2k
#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
37.2k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
37.2k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
37.2k
            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
37.2k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
37.2k
            if (ps->peakdecay_fast[b] < power)
683
5.14k
                ps->peakdecay_fast[b] = power;
684
685
37.2k
            peakdiff = ps->prev_peakdiff[b];
686
37.2k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
37.2k
            ps->prev_peakdiff[b] = peakdiff;
688
689
37.2k
            nrg = ps->prev_nrg[b];
690
37.2k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
37.2k
            ps->prev_nrg[b] = nrg;
692
693
37.2k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
34.8k
                transratio = sigma;
695
34.8k
            } else {
696
2.39k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.39k
            }
698
699
149k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
111k
            {
701
111k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
111k
            }
703
704
37.2k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
37.2k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
37.2k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
37.2k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
37.2k
            RE(ps->d_buff[1][b]) = RE(in);
711
37.2k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
37.2k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
37.2k
            RE(R0) = RE(tmp);
716
37.2k
            IM(R0) = IM(tmp);
717
718
149k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
111k
            {
720
111k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
111k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
111k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
111k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
111k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
111k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
111k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
111k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
111k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
111k
                RE(R0) = RE(tmp);
735
111k
                IM(R0) = IM(tmp);
736
111k
            }
737
738
37.2k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
37.2k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
149k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
111k
            {
743
111k
                if (++temp_delay_ser[k] >= delay_length[k])
744
28.6k
                    temp_delay_ser[k] = 0;
745
111k
            }
746
37.2k
        }
747
1.24k
    }
748
749
216
    for (k = 0; k < NUM_OF_LINKS; k++)
750
162
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
54
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
205
{
640
205
    uint8_t s, b, k;
641
205
    complex_t qfrac, tmp0, tmp, in, R0;
642
205
    real_t peakdiff;
643
205
    real_t nrg;
644
205
    real_t power;
645
205
    real_t transratio;
646
205
    real_t new_delay_slopes[NUM_OF_LINKS];
647
205
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
205
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.92k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.71k
    {
655
        /* set delay indices */
656
18.8k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.1k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.71k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.71k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
146k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
141k
        {
664
141k
            const real_t gamma = REAL_CONST(1.5);
665
141k
            const real_t sigma = REAL_CONST(1.5625);
666
667
141k
            RE(in) = QMF_RE(X[s][b]);
668
141k
            IM(in) = QMF_IM(X[s][b]);
669
670
#ifdef FIXED_POINT
671
            /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672
            * meaning that P will be scaled by 2^(-10) compared to floating point version
673
            */
674
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
141k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
141k
#endif
680
681
141k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
141k
            if (ps->peakdecay_fast[b] < power)
683
8.37k
                ps->peakdecay_fast[b] = power;
684
685
141k
            peakdiff = ps->prev_peakdiff[b];
686
141k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
141k
            ps->prev_peakdiff[b] = peakdiff;
688
689
141k
            nrg = ps->prev_nrg[b];
690
141k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
141k
            ps->prev_nrg[b] = nrg;
692
693
141k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
133k
                transratio = sigma;
695
133k
            } else {
696
7.93k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.93k
            }
698
699
565k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
424k
            {
701
424k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
424k
            }
703
704
141k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
141k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
141k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
141k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
141k
            RE(ps->d_buff[1][b]) = RE(in);
711
141k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
141k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
141k
            RE(R0) = RE(tmp);
716
141k
            IM(R0) = IM(tmp);
717
718
565k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
424k
            {
720
424k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
424k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
424k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
424k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
424k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
424k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
424k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
424k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
424k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
424k
                RE(R0) = RE(tmp);
735
424k
                IM(R0) = IM(tmp);
736
424k
            }
737
738
141k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
141k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
565k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
424k
            {
743
424k
                if (++temp_delay_ser[k] >= delay_length[k])
744
110k
                    temp_delay_ser[k] = 0;
745
424k
            }
746
141k
        }
747
4.71k
    }
748
749
820
    for (k = 0; k < NUM_OF_LINKS; k++)
750
615
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
205
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
259
{
755
259
    uint8_t s, b, ifreq, qclass;
756
259
    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
259
    real_t new_dir_map, new_sa_map;
758
759
259
    if (ps->bs_enable_sa)
760
108
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.59k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.48k
        {
765
2.48k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.48k
            ifreq = sa_inv_freq[b];
768
2.48k
            qclass = (b != 0);
769
770
2.48k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.48k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.48k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.48k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.48k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.48k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.48k
        }
781
782
3.34k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.24k
        {
784
77.7k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
74.5k
            {
786
74.5k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
74.5k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
74.5k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
74.5k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
74.5k
                sa_map[b]     += k_sa_map[b];
792
74.5k
                sa_dir_map[b] += k_sa_dir_map[b];
793
74.5k
            }
794
136k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
132k
            {
796
132k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
132k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
132k
            }
799
3.24k
        }
800
108
    }
801
151
    else {
802
4.68k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.53k
        {
804
294k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
289k
            {
806
289k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
289k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
289k
            }
809
4.53k
        }
810
151
    }
811
259
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
54
{
755
54
    uint8_t s, b, ifreq, qclass;
756
54
    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
54
    real_t new_dir_map, new_sa_map;
758
759
54
    if (ps->bs_enable_sa)
760
18
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
432
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
414
        {
765
414
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
414
            ifreq = sa_inv_freq[b];
768
414
            qclass = (b != 0);
769
770
414
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
414
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
414
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
414
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
414
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
414
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
414
        }
781
782
558
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
540
        {
784
12.9k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
12.4k
            {
786
12.4k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
12.4k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
12.4k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
12.4k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
12.4k
                sa_map[b]     += k_sa_map[b];
792
12.4k
                sa_dir_map[b] += k_sa_dir_map[b];
793
12.4k
            }
794
22.6k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
22.1k
            {
796
22.1k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
22.1k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
22.1k
            }
799
540
        }
800
18
    }
801
36
    else {
802
1.11k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.08k
        {
804
70.2k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
69.1k
            {
806
69.1k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
69.1k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
69.1k
            }
809
1.08k
        }
810
36
    }
811
54
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
205
{
755
205
    uint8_t s, b, ifreq, qclass;
756
205
    real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND];
757
205
    real_t new_dir_map, new_sa_map;
758
759
205
    if (ps->bs_enable_sa)
760
90
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.16k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.07k
        {
765
2.07k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.07k
            ifreq = sa_inv_freq[b];
768
2.07k
            qclass = (b != 0);
769
770
2.07k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.07k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.07k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.07k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.07k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.07k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.07k
        }
781
782
2.79k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.70k
        {
784
64.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
62.1k
            {
786
62.1k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
62.1k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
62.1k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
62.1k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
62.1k
                sa_map[b]     += k_sa_map[b];
792
62.1k
                sa_dir_map[b] += k_sa_dir_map[b];
793
62.1k
            }
794
113k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
110k
            {
796
110k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
110k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
110k
            }
799
2.70k
        }
800
90
    }
801
115
    else {
802
3.56k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.45k
        {
804
224k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
220k
            {
806
220k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
220k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
220k
            }
809
3.45k
        }
810
115
    }
811
205
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
186
{
815
186
    uint8_t s, b, qclass, ifreq;
816
186
    real_t tmp, coeff1, coeff2;
817
186
    real_t pan_base[MAX_PAN_BAND];
818
186
    real_t pan_delta[MAX_PAN_BAND];
819
186
    qmf_t temp_l, temp_r;
820
821
186
    if (ps->bs_enable_pan)
822
186
    {
823
12.0k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
11.9k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
11.9k
            ifreq = pan_inv_freq[b];
828
11.9k
            qclass = pan_quant_class[ifreq];
829
830
11.9k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
11.4k
            {
832
11.4k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
11.4k
            } else {
834
467
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
467
            }
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.9k
            if (ps->g_pan_index[ifreq] >= 0)
840
10.4k
            {
841
10.4k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
10.3k
                {
843
10.3k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
10.3k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
10.3k
                } else {
846
94
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
94
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
94
                }
849
10.4k
            } else {
850
1.47k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.10k
                {
852
1.10k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.10k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.10k
                } else {
855
373
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
373
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
373
                }
858
1.47k
            }
859
11.9k
        }
860
861
5.76k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.58k
        {
863
            /* PAN always uses all 64 channels */
864
362k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
357k
            {
866
357k
                tmp = pan_base[b];
867
868
357k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
357k
                coeff1 = MUL_R(coeff2, tmp);
870
871
357k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
357k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
357k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
357k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
357k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
357k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
357k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
357k
                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
357k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
357k
            }
885
5.58k
        }
886
186
    }
887
186
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
38
{
815
38
    uint8_t s, b, qclass, ifreq;
816
38
    real_t tmp, coeff1, coeff2;
817
38
    real_t pan_base[MAX_PAN_BAND];
818
38
    real_t pan_delta[MAX_PAN_BAND];
819
38
    qmf_t temp_l, temp_r;
820
821
38
    if (ps->bs_enable_pan)
822
38
    {
823
2.47k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
2.43k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
2.43k
            ifreq = pan_inv_freq[b];
828
2.43k
            qclass = pan_quant_class[ifreq];
829
830
2.43k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
2.43k
            {
832
2.43k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
2.43k
            } else {
834
0
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
0
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
2.43k
            if (ps->g_pan_index[ifreq] >= 0)
840
2.25k
            {
841
2.25k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
2.25k
                {
843
2.25k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
2.25k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
2.25k
                } else {
846
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
0
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
0
                }
849
2.25k
            } else {
850
177
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
177
                {
852
177
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
177
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
177
                } 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
177
            }
859
2.43k
        }
860
861
1.17k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
1.14k
        {
863
            /* PAN always uses all 64 channels */
864
74.1k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
72.9k
            {
866
72.9k
                tmp = pan_base[b];
867
868
72.9k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
72.9k
                coeff1 = MUL_R(coeff2, tmp);
870
871
72.9k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
72.9k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
72.9k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
72.9k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
72.9k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
72.9k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
72.9k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
72.9k
                QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
880
881
                /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
882
                /*                   ^^^^^^^^^^^^^^^ k times */
883
72.9k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
72.9k
            }
885
1.14k
        }
886
38
    }
887
38
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
148
{
815
148
    uint8_t s, b, qclass, ifreq;
816
148
    real_t tmp, coeff1, coeff2;
817
148
    real_t pan_base[MAX_PAN_BAND];
818
148
    real_t pan_delta[MAX_PAN_BAND];
819
148
    qmf_t temp_l, temp_r;
820
821
148
    if (ps->bs_enable_pan)
822
148
    {
823
9.62k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.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
9.47k
            ifreq = pan_inv_freq[b];
828
9.47k
            qclass = pan_quant_class[ifreq];
829
830
9.47k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.00k
            {
832
9.00k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.00k
            } else {
834
467
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
467
            }
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.47k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.17k
            {
841
8.17k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.08k
                {
843
8.08k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.08k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.08k
                } else {
846
94
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
94
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
94
                }
849
8.17k
            } else {
850
1.29k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
925
                {
852
925
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
925
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
925
                } else {
855
373
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
373
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
373
                }
858
1.29k
            }
859
9.47k
        }
860
861
4.58k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.44k
        {
863
            /* PAN always uses all 64 channels */
864
288k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
284k
            {
866
284k
                tmp = pan_base[b];
867
868
284k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
284k
                coeff1 = MUL_R(coeff2, tmp);
870
871
284k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
284k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
284k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
284k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
284k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
284k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
284k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
284k
                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
284k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
284k
            }
885
4.44k
        }
886
148
    }
887
148
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.10k
{
891
7.10k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.10k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.10k
    return ps;
896
7.10k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.10k
{
900
7.10k
    faad_free(ps);
901
7.10k
}
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
265
{
906
265
    if (ps == NULL)
907
5
    {
908
5
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
5
        return 0;
910
5
    }
911
912
260
    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
259
    if (!guess)
923
133
    {
924
133
        ps->sa_decode_error = 0;
925
133
        ps->pan_decode_error = 0;
926
133
        drm_ps_delta_decode(ps);
927
133
    } 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
259
    ps->drm_ps_data_available = 0;
935
936
259
    drm_calc_sa_side_signal(ps, X_left);
937
259
    drm_add_ambiance(ps, X_left, X_right);
938
939
259
    if (ps->bs_enable_sa)
940
108
    {
941
108
        ps->g_last_had_sa = 1;
942
943
108
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
151
    } else {
946
151
        ps->g_last_had_sa = 0;
947
151
    }
948
949
259
    if (ps->bs_enable_pan)
950
186
    {
951
186
        drm_add_pan(ps, X_left, X_right);
952
953
186
        ps->g_last_had_pan = 1;
954
955
186
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
186
    } else {
958
73
        ps->g_last_had_pan = 0;
959
73
    }
960
961
962
259
    return 0;
963
260
}
964
965
#endif