Coverage Report

Created: 2026-09-04 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.32M
{
446
1.32M
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
1.32M
    ps->drm_ps_data_available = 1;
449
450
1.32M
    ps->bs_enable_sa = faad_get1bit(ld);
451
1.32M
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
1.32M
    if (ps->bs_enable_sa)
454
27.9k
    {
455
27.9k
        drm_ps_sa_element(ps, ld);
456
27.9k
    }
457
458
1.32M
    if (ps->bs_enable_pan)
459
22.3k
    {
460
22.3k
        drm_ps_pan_element(ps, ld);
461
22.3k
    }
462
463
1.32M
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
1.32M
    return bits;
466
1.32M
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
27.9k
{
470
27.9k
    drm_ps_huff_tab huff;
471
27.9k
    uint8_t band;
472
473
27.9k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
27.9k
    if (ps->bs_sa_dt_flag)
475
11.1k
    {
476
11.1k
        huff = t_huffman_sa;
477
16.8k
    } else {
478
16.8k
        huff = f_huffman_sa;
479
16.8k
    }
480
481
251k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
223k
    {
483
223k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
223k
    }
485
27.9k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
22.3k
{
489
22.3k
    drm_ps_huff_tab huff;
490
22.3k
    uint8_t band;
491
492
22.3k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
22.3k
    if (ps->bs_pan_dt_flag)
494
4.75k
    {
495
4.75k
        huff = t_huffman_pan;
496
17.6k
    } else {
497
17.6k
        huff = f_huffman_pan;
498
17.6k
    }
499
500
469k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
447k
    {
502
447k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
447k
    }
504
22.3k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
670k
{
509
670k
    uint8_t bit;
510
670k
    int8_t index = 0;
511
512
1.87M
    while (index >= 0)
513
1.20M
    {
514
1.20M
        bit = (uint8_t)faad_get1bit(ld);
515
1.20M
        index = huff[index][bit];
516
1.20M
    }
517
518
670k
    return index + 15;
519
670k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
1.35k
{
524
1.35k
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
461
        ps->sa_decode_error = 1;
527
461
        return 0;
528
891
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
94
        ps->sa_decode_error = 1;
531
94
        return 7;
532
94
    } else
533
797
        return i;
534
1.35k
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
3.10k
{
538
3.10k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
281
        ps->pan_decode_error = 1;
541
281
        return -7;
542
2.81k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
286
        ps->pan_decode_error = 1;
545
286
        return 7;
546
286
    } else
547
2.53k
        return i;
548
3.10k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
246
{
552
246
    uint8_t band;
553
554
246
    if (ps->bs_enable_sa)
555
207
    {
556
207
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
38
        {
558
            /* wait until we get a DT frame */
559
38
            ps->bs_enable_sa = 0;
560
169
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
28
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
141
        } else {
564
            /* DF always decodable */
565
141
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
141
        }
567
568
1.65k
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
1.44k
        {
570
1.44k
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
196
            {
572
196
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
1.25k
            } else if (!ps->bs_sa_dt_flag) {
574
987
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
987
            }
576
1.44k
        }
577
207
    }
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
246
    if (ps->sa_decode_error) {
582
138
        ps->pan_decode_error = 1;
583
138
        ps->bs_enable_pan = ps->g_last_had_pan;
584
138
        ps->bs_enable_sa = ps->g_last_had_sa;
585
138
    }
586
587
588
246
    if (ps->bs_enable_sa)
589
82
    {
590
82
        if (ps->sa_decode_error) {
591
459
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
408
            {
593
408
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
408
            }
595
51
        } else {
596
279
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
248
            {
598
248
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
248
            }
600
31
        }
601
82
    }
602
603
246
    if (ps->bs_enable_pan)
604
166
    {
605
166
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
11
        {
607
11
            ps->bs_enable_pan = 0;
608
155
        }  else if (ps->bs_pan_dt_flag) {
609
37
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
118
        } else {
611
118
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
118
        }
613
614
3.32k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
3.15k
        {
616
3.15k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
703
            {
618
703
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
2.45k
            } else if (!ps->bs_pan_dt_flag) {
620
2.24k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
2.24k
            }
622
3.15k
        }
623
624
166
        if (ps->pan_decode_error) {
625
1.93k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.84k
            {
627
1.84k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.84k
            }
629
92
        } else {
630
1.55k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
1.48k
            {
632
1.48k
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
1.48k
            }
634
74
        }
635
166
    }
636
246
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
402
{
640
402
    uint8_t s, b, k;
641
402
    complex_t qfrac, tmp0, tmp, in, R0;
642
402
    real_t peakdiff;
643
402
    real_t nrg;
644
402
    real_t power;
645
402
    real_t transratio;
646
402
    real_t new_delay_slopes[NUM_OF_LINKS];
647
402
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
402
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
9.64k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
9.24k
    {
655
        /* set delay indices */
656
36.9k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
27.7k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
9.24k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
9.24k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
286k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
277k
        {
664
277k
            const real_t gamma = REAL_CONST(1.5);
665
277k
            const real_t sigma = REAL_CONST(1.5625);
666
667
277k
            RE(in) = QMF_RE(X[s][b]);
668
277k
            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
135k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
135k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
142k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
277k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
277k
            if (ps->peakdecay_fast[b] < power)
683
17.2k
                ps->peakdecay_fast[b] = power;
684
685
277k
            peakdiff = ps->prev_peakdiff[b];
686
277k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
277k
            ps->prev_peakdiff[b] = peakdiff;
688
689
277k
            nrg = ps->prev_nrg[b];
690
277k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
277k
            ps->prev_nrg[b] = nrg;
692
693
277k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
262k
                transratio = sigma;
695
262k
            } else {
696
14.4k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
14.4k
            }
698
699
1.10M
            for (k = 0; k < NUM_OF_LINKS; k++)
700
832k
            {
701
832k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
832k
            }
703
704
277k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
277k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
277k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
277k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
277k
            RE(ps->d_buff[1][b]) = RE(in);
711
277k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
277k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
277k
            RE(R0) = RE(tmp);
716
277k
            IM(R0) = IM(tmp);
717
718
1.10M
            for (k = 0; k < NUM_OF_LINKS; k++)
719
832k
            {
720
832k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
832k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
832k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
832k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
832k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
832k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
832k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
832k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
832k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
832k
                RE(R0) = RE(tmp);
735
832k
                IM(R0) = IM(tmp);
736
832k
            }
737
738
277k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
277k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
1.10M
            for (k = 0; k < NUM_OF_LINKS; k++)
742
832k
            {
743
832k
                if (++temp_delay_ser[k] >= delay_length[k])
744
215k
                    temp_delay_ser[k] = 0;
745
832k
            }
746
277k
        }
747
9.24k
    }
748
749
1.60k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
1.20k
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
402
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
196
{
640
196
    uint8_t s, b, k;
641
196
    complex_t qfrac, tmp0, tmp, in, R0;
642
196
    real_t peakdiff;
643
196
    real_t nrg;
644
196
    real_t power;
645
196
    real_t transratio;
646
196
    real_t new_delay_slopes[NUM_OF_LINKS];
647
196
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
196
    complex_t Phi_Fract;
649
196
#ifdef FIXED_POINT
650
196
    uint32_t in_re, in_im;
651
196
#endif
652
653
4.70k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.50k
    {
655
        /* set delay indices */
656
18.0k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
13.5k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.50k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.50k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
139k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
135k
        {
664
135k
            const real_t gamma = REAL_CONST(1.5);
665
135k
            const real_t sigma = REAL_CONST(1.5625);
666
667
135k
            RE(in) = QMF_RE(X[s][b]);
668
135k
            IM(in) = QMF_IM(X[s][b]);
669
670
135k
#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
135k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
135k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
135k
            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
135k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
135k
            if (ps->peakdecay_fast[b] < power)
683
9.07k
                ps->peakdecay_fast[b] = power;
684
685
135k
            peakdiff = ps->prev_peakdiff[b];
686
135k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
135k
            ps->prev_peakdiff[b] = peakdiff;
688
689
135k
            nrg = ps->prev_nrg[b];
690
135k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
135k
            ps->prev_nrg[b] = nrg;
692
693
135k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
128k
                transratio = sigma;
695
128k
            } else {
696
6.78k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.78k
            }
698
699
540k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
405k
            {
701
405k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
405k
            }
703
704
135k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
135k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
135k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
135k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
135k
            RE(ps->d_buff[1][b]) = RE(in);
711
135k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
135k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
135k
            RE(R0) = RE(tmp);
716
135k
            IM(R0) = IM(tmp);
717
718
540k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
405k
            {
720
405k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
405k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
405k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
405k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
405k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
405k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
405k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
405k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
405k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
405k
                RE(R0) = RE(tmp);
735
405k
                IM(R0) = IM(tmp);
736
405k
            }
737
738
135k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
135k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
540k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
405k
            {
743
405k
                if (++temp_delay_ser[k] >= delay_length[k])
744
104k
                    temp_delay_ser[k] = 0;
745
405k
            }
746
135k
        }
747
4.50k
    }
748
749
784
    for (k = 0; k < NUM_OF_LINKS; k++)
750
588
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
196
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
206
{
640
206
    uint8_t s, b, k;
641
206
    complex_t qfrac, tmp0, tmp, in, R0;
642
206
    real_t peakdiff;
643
206
    real_t nrg;
644
206
    real_t power;
645
206
    real_t transratio;
646
206
    real_t new_delay_slopes[NUM_OF_LINKS];
647
206
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
206
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.94k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.73k
    {
655
        /* set delay indices */
656
18.9k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.2k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.73k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.73k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
146k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
142k
        {
664
142k
            const real_t gamma = REAL_CONST(1.5);
665
142k
            const real_t sigma = REAL_CONST(1.5625);
666
667
142k
            RE(in) = QMF_RE(X[s][b]);
668
142k
            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
142k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
142k
#endif
680
681
142k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
142k
            if (ps->peakdecay_fast[b] < power)
683
8.18k
                ps->peakdecay_fast[b] = power;
684
685
142k
            peakdiff = ps->prev_peakdiff[b];
686
142k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
142k
            ps->prev_peakdiff[b] = peakdiff;
688
689
142k
            nrg = ps->prev_nrg[b];
690
142k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
142k
            ps->prev_nrg[b] = nrg;
692
693
142k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
134k
                transratio = sigma;
695
134k
            } else {
696
7.62k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.62k
            }
698
699
568k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
426k
            {
701
426k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
426k
            }
703
704
142k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
142k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
142k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
142k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
142k
            RE(ps->d_buff[1][b]) = RE(in);
711
142k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
142k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
142k
            RE(R0) = RE(tmp);
716
142k
            IM(R0) = IM(tmp);
717
718
568k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
426k
            {
720
426k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
426k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
426k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
426k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
426k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
426k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
426k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
426k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
426k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
426k
                RE(R0) = RE(tmp);
735
426k
                IM(R0) = IM(tmp);
736
426k
            }
737
738
142k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
142k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
568k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
426k
            {
743
426k
                if (++temp_delay_ser[k] >= delay_length[k])
744
110k
                    temp_delay_ser[k] = 0;
745
426k
            }
746
142k
        }
747
4.73k
    }
748
749
824
    for (k = 0; k < NUM_OF_LINKS; k++)
750
618
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
206
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
402
{
755
402
    uint8_t s, b, ifreq, qclass;
756
402
    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
402
    real_t new_dir_map, new_sa_map;
758
759
402
    if (ps->bs_enable_sa)
760
143
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
3.43k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
3.28k
        {
765
3.28k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
3.28k
            ifreq = sa_inv_freq[b];
768
3.28k
            qclass = (b != 0);
769
770
3.28k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
3.28k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
3.28k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
3.28k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
3.28k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
3.28k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
3.28k
        }
781
782
4.43k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
4.29k
        {
784
102k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
98.6k
            {
786
98.6k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
98.6k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
98.6k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
98.6k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
98.6k
                sa_map[b]     += k_sa_map[b];
792
98.6k
                sa_dir_map[b] += k_sa_dir_map[b];
793
98.6k
            }
794
180k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
175k
            {
796
175k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
175k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
175k
            }
799
4.29k
        }
800
143
    }
801
259
    else {
802
8.02k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
7.77k
        {
804
505k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
497k
            {
806
497k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
497k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
497k
            }
809
7.77k
        }
810
259
    }
811
402
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
196
{
755
196
    uint8_t s, b, ifreq, qclass;
756
196
    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
196
    real_t new_dir_map, new_sa_map;
758
759
196
    if (ps->bs_enable_sa)
760
69
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.65k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.58k
        {
765
1.58k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.58k
            ifreq = sa_inv_freq[b];
768
1.58k
            qclass = (b != 0);
769
770
1.58k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.58k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.58k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.58k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.58k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.58k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.58k
        }
781
782
2.13k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.07k
        {
784
49.6k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
47.6k
            {
786
47.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
47.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
47.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
47.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
47.6k
                sa_map[b]     += k_sa_map[b];
792
47.6k
                sa_dir_map[b] += k_sa_dir_map[b];
793
47.6k
            }
794
86.9k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
84.8k
            {
796
84.8k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
84.8k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
84.8k
            }
799
2.07k
        }
800
69
    }
801
127
    else {
802
3.93k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.81k
        {
804
247k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
243k
            {
806
243k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
243k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
243k
            }
809
3.81k
        }
810
127
    }
811
196
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
206
{
755
206
    uint8_t s, b, ifreq, qclass;
756
206
    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
206
    real_t new_dir_map, new_sa_map;
758
759
206
    if (ps->bs_enable_sa)
760
74
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.77k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.70k
        {
765
1.70k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.70k
            ifreq = sa_inv_freq[b];
768
1.70k
            qclass = (b != 0);
769
770
1.70k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.70k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.70k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.70k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.70k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.70k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.70k
        }
781
782
2.29k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.22k
        {
784
53.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
51.0k
            {
786
51.0k
                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
51.0k
                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
51.0k
                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
51.0k
                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
51.0k
                sa_map[b]     += k_sa_map[b];
792
51.0k
                sa_dir_map[b] += k_sa_dir_map[b];
793
51.0k
            }
794
93.2k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
91.0k
            {
796
91.0k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
91.0k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
91.0k
            }
799
2.22k
        }
800
74
    }
801
132
    else {
802
4.09k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.96k
        {
804
257k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
253k
            {
806
253k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
253k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
253k
            }
809
3.96k
        }
810
132
    }
811
206
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
243
{
815
243
    uint8_t s, b, qclass, ifreq;
816
243
    real_t tmp, coeff1, coeff2;
817
243
    real_t pan_base[MAX_PAN_BAND];
818
243
    real_t pan_delta[MAX_PAN_BAND];
819
243
    qmf_t temp_l, temp_r;
820
821
243
    if (ps->bs_enable_pan)
822
243
    {
823
15.7k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
15.5k
        {
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
15.5k
            ifreq = pan_inv_freq[b];
828
15.5k
            qclass = pan_quant_class[ifreq];
829
830
15.5k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
14.6k
            {
832
14.6k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
14.6k
            } else {
834
921
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
921
            }
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
15.5k
            if (ps->g_pan_index[ifreq] >= 0)
840
12.9k
            {
841
12.9k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
12.7k
                {
843
12.7k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
12.7k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
12.7k
                } else {
846
235
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
235
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
235
                }
849
12.9k
            } else {
850
2.59k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.90k
                {
852
1.90k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.90k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.90k
                } else {
855
686
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
686
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
686
                }
858
2.59k
            }
859
15.5k
        }
860
861
7.53k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
7.29k
        {
863
            /* PAN always uses all 64 channels */
864
473k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
466k
            {
866
466k
                tmp = pan_base[b];
867
868
466k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
466k
                coeff1 = MUL_R(coeff2, tmp);
870
871
466k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
466k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
466k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
466k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
466k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
466k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
466k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
466k
                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
466k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
466k
            }
885
7.29k
        }
886
243
    }
887
243
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
97
{
815
97
    uint8_t s, b, qclass, ifreq;
816
97
    real_t tmp, coeff1, coeff2;
817
97
    real_t pan_base[MAX_PAN_BAND];
818
97
    real_t pan_delta[MAX_PAN_BAND];
819
97
    qmf_t temp_l, temp_r;
820
821
97
    if (ps->bs_enable_pan)
822
97
    {
823
6.30k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
6.20k
        {
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
6.20k
            ifreq = pan_inv_freq[b];
828
6.20k
            qclass = pan_quant_class[ifreq];
829
830
6.20k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
5.96k
            {
832
5.96k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
5.96k
            } else {
834
246
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
246
            }
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
6.20k
            if (ps->g_pan_index[ifreq] >= 0)
840
5.17k
            {
841
5.17k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
5.09k
                {
843
5.09k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
5.09k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
5.09k
                } else {
846
79
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
79
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
79
                }
849
5.17k
            } else {
850
1.03k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
867
                {
852
867
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
867
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
867
                } else {
855
167
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
167
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
167
                }
858
1.03k
            }
859
6.20k
        }
860
861
3.00k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
2.91k
        {
863
            /* PAN always uses all 64 channels */
864
189k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
186k
            {
866
186k
                tmp = pan_base[b];
867
868
186k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
186k
                coeff1 = MUL_R(coeff2, tmp);
870
871
186k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
186k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
186k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
186k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
186k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
186k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
186k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
186k
                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
186k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
186k
            }
885
2.91k
        }
886
97
    }
887
97
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
146
{
815
146
    uint8_t s, b, qclass, ifreq;
816
146
    real_t tmp, coeff1, coeff2;
817
146
    real_t pan_base[MAX_PAN_BAND];
818
146
    real_t pan_delta[MAX_PAN_BAND];
819
146
    qmf_t temp_l, temp_r;
820
821
146
    if (ps->bs_enable_pan)
822
146
    {
823
9.49k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.34k
        {
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.34k
            ifreq = pan_inv_freq[b];
828
9.34k
            qclass = pan_quant_class[ifreq];
829
830
9.34k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
8.66k
            {
832
8.66k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
8.66k
            } else {
834
675
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
675
            }
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.34k
            if (ps->g_pan_index[ifreq] >= 0)
840
7.78k
            {
841
7.78k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
7.62k
                {
843
7.62k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
7.62k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
7.62k
                } else {
846
156
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
156
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
156
                }
849
7.78k
            } else {
850
1.56k
                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
519
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
519
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
519
                }
858
1.56k
            }
859
9.34k
        }
860
861
4.52k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.38k
        {
863
            /* PAN always uses all 64 channels */
864
284k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
280k
            {
866
280k
                tmp = pan_base[b];
867
868
280k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
280k
                coeff1 = MUL_R(coeff2, tmp);
870
871
280k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
280k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
280k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
280k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
280k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
280k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
280k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
280k
                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
280k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
280k
            }
885
4.38k
        }
886
146
    }
887
146
}
888
889
drm_ps_info *drm_ps_init(void)
890
8.81k
{
891
8.81k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
8.81k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
8.81k
    return ps;
896
8.81k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
8.81k
{
900
8.81k
    faad_free(ps);
901
8.81k
}
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
416
{
906
416
    if (ps == NULL)
907
12
    {
908
12
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
12
        return 0;
910
12
    }
911
912
404
    if (!ps->drm_ps_data_available && !guess)
913
2
    {
914
2
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
915
2
        memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index));
916
2
        memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index));
917
2
        return 0;
918
2
    }
919
920
    /* if SBR CRC doesn't match out, we can assume decode errors to start with,
921
       and we'll guess what the parameters should be */
922
402
    if (!guess)
923
246
    {
924
246
        ps->sa_decode_error = 0;
925
246
        ps->pan_decode_error = 0;
926
246
        drm_ps_delta_decode(ps);
927
246
    } else
928
156
    {
929
156
        ps->sa_decode_error = 1;
930
156
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
156
    }
933
934
402
    ps->drm_ps_data_available = 0;
935
936
402
    drm_calc_sa_side_signal(ps, X_left);
937
402
    drm_add_ambiance(ps, X_left, X_right);
938
939
402
    if (ps->bs_enable_sa)
940
143
    {
941
143
        ps->g_last_had_sa = 1;
942
943
143
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
259
    } else {
946
259
        ps->g_last_had_sa = 0;
947
259
    }
948
949
402
    if (ps->bs_enable_pan)
950
243
    {
951
243
        drm_add_pan(ps, X_left, X_right);
952
953
243
        ps->g_last_had_pan = 1;
954
955
243
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
243
    } else {
958
159
        ps->g_last_had_pan = 0;
959
159
    }
960
961
962
402
    return 0;
963
404
}
964
965
#endif