Coverage Report

Created: 2026-05-30 06:09

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.01M
{
446
1.01M
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
1.01M
    ps->drm_ps_data_available = 1;
449
450
1.01M
    ps->bs_enable_sa = faad_get1bit(ld);
451
1.01M
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
1.01M
    if (ps->bs_enable_sa)
454
22.3k
    {
455
22.3k
        drm_ps_sa_element(ps, ld);
456
22.3k
    }
457
458
1.01M
    if (ps->bs_enable_pan)
459
15.9k
    {
460
15.9k
        drm_ps_pan_element(ps, ld);
461
15.9k
    }
462
463
1.01M
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
1.01M
    return bits;
466
1.01M
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
22.3k
{
470
22.3k
    drm_ps_huff_tab huff;
471
22.3k
    uint8_t band;
472
473
22.3k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
22.3k
    if (ps->bs_sa_dt_flag)
475
9.39k
    {
476
9.39k
        huff = t_huffman_sa;
477
12.9k
    } else {
478
12.9k
        huff = f_huffman_sa;
479
12.9k
    }
480
481
200k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
178k
    {
483
178k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
178k
    }
485
22.3k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
15.9k
{
489
15.9k
    drm_ps_huff_tab huff;
490
15.9k
    uint8_t band;
491
492
15.9k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
15.9k
    if (ps->bs_pan_dt_flag)
494
4.01k
    {
495
4.01k
        huff = t_huffman_pan;
496
11.9k
    } else {
497
11.9k
        huff = f_huffman_pan;
498
11.9k
    }
499
500
335k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
319k
    {
502
319k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
319k
    }
504
15.9k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
497k
{
509
497k
    uint8_t bit;
510
497k
    int8_t index = 0;
511
512
1.44M
    while (index >= 0)
513
946k
    {
514
946k
        bit = (uint8_t)faad_get1bit(ld);
515
946k
        index = huff[index][bit];
516
946k
    }
517
518
497k
    return index + 15;
519
497k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
752
{
524
752
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
259
        ps->sa_decode_error = 1;
527
259
        return 0;
528
493
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
80
        ps->sa_decode_error = 1;
531
80
        return 7;
532
80
    } else
533
413
        return i;
534
752
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.24k
{
538
2.24k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
232
        ps->pan_decode_error = 1;
541
232
        return -7;
542
2.00k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
215
        ps->pan_decode_error = 1;
545
215
        return 7;
546
215
    } else
547
1.79k
        return i;
548
2.24k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
150
{
552
150
    uint8_t band;
553
554
150
    if (ps->bs_enable_sa)
555
119
    {
556
119
        if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557
25
        {
558
            /* wait until we get a DT frame */
559
25
            ps->bs_enable_sa = 0;
560
94
        } else if (ps->bs_sa_dt_flag) {
561
            /* DT frame, we have a last frame, so we can decode */
562
15
            ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
563
79
        } else {
564
            /* DF always decodable */
565
79
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
79
        }
567
568
952
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
833
        {
570
833
            if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571
105
            {
572
105
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573
728
            } else if (!ps->bs_sa_dt_flag) {
574
553
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
553
            }
576
833
        }
577
119
    }
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
150
    if (ps->sa_decode_error) {
582
78
        ps->pan_decode_error = 1;
583
78
        ps->bs_enable_pan = ps->g_last_had_pan;
584
78
        ps->bs_enable_sa = ps->g_last_had_sa;
585
78
    }
586
587
588
150
    if (ps->bs_enable_sa)
589
45
    {
590
45
        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
144
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
128
            {
598
128
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
128
            }
600
16
        }
601
45
    }
602
603
150
    if (ps->bs_enable_pan)
604
115
    {
605
115
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
112
        }  else if (ps->bs_pan_dt_flag) {
609
36
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
76
        } else {
611
76
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
76
        }
613
614
2.30k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.18k
        {
616
2.18k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
684
            {
618
684
                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.44k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.44k
            }
622
2.18k
        }
623
624
115
        if (ps->pan_decode_error) {
625
1.47k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.40k
            {
627
1.40k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.40k
            }
629
70
        } else {
630
945
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
900
            {
632
900
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
900
            }
634
45
        }
635
115
    }
636
150
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
277
{
640
277
    uint8_t s, b, k;
641
277
    complex_t qfrac, tmp0, tmp, in, R0;
642
277
    real_t peakdiff;
643
277
    real_t nrg;
644
277
    real_t power;
645
277
    real_t transratio;
646
277
    real_t new_delay_slopes[NUM_OF_LINKS];
647
277
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
277
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.64k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.37k
    {
655
        /* set delay indices */
656
25.4k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
19.1k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.37k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.37k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
197k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
191k
        {
664
191k
            const real_t gamma = REAL_CONST(1.5);
665
191k
            const real_t sigma = REAL_CONST(1.5625);
666
667
191k
            RE(in) = QMF_RE(X[s][b]);
668
191k
            IM(in) = QMF_IM(X[s][b]);
669
670
#ifdef FIXED_POINT
671
            /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672
            * meaning that P will be scaled by 2^(-10) compared to floating point version
673
            */
674
44.8k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
44.8k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
146k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
191k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
191k
            if (ps->peakdecay_fast[b] < power)
683
13.5k
                ps->peakdecay_fast[b] = power;
684
685
191k
            peakdiff = ps->prev_peakdiff[b];
686
191k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
191k
            ps->prev_peakdiff[b] = peakdiff;
688
689
191k
            nrg = ps->prev_nrg[b];
690
191k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
191k
            ps->prev_nrg[b] = nrg;
692
693
191k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
182k
                transratio = sigma;
695
182k
            } else {
696
8.90k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
8.90k
            }
698
699
764k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
573k
            {
701
573k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
573k
            }
703
704
191k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
191k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
191k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
191k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
191k
            RE(ps->d_buff[1][b]) = RE(in);
711
191k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
191k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
191k
            RE(R0) = RE(tmp);
716
191k
            IM(R0) = IM(tmp);
717
718
764k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
573k
            {
720
573k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
573k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
573k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
573k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
573k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
573k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
573k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
573k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
573k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
573k
                RE(R0) = RE(tmp);
735
573k
                IM(R0) = IM(tmp);
736
573k
            }
737
738
191k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
191k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
764k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
573k
            {
743
573k
                if (++temp_delay_ser[k] >= delay_length[k])
744
148k
                    temp_delay_ser[k] = 0;
745
573k
            }
746
191k
        }
747
6.37k
    }
748
749
1.10k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
831
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
277
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
65
{
640
65
    uint8_t s, b, k;
641
65
    complex_t qfrac, tmp0, tmp, in, R0;
642
65
    real_t peakdiff;
643
65
    real_t nrg;
644
65
    real_t power;
645
65
    real_t transratio;
646
65
    real_t new_delay_slopes[NUM_OF_LINKS];
647
65
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
65
    complex_t Phi_Fract;
649
65
#ifdef FIXED_POINT
650
65
    uint32_t in_re, in_im;
651
65
#endif
652
653
1.56k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.49k
    {
655
        /* set delay indices */
656
5.98k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
4.48k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.49k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.49k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
46.3k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
44.8k
        {
664
44.8k
            const real_t gamma = REAL_CONST(1.5);
665
44.8k
            const real_t sigma = REAL_CONST(1.5625);
666
667
44.8k
            RE(in) = QMF_RE(X[s][b]);
668
44.8k
            IM(in) = QMF_IM(X[s][b]);
669
670
44.8k
#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
44.8k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
44.8k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
44.8k
            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
44.8k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
44.8k
            if (ps->peakdecay_fast[b] < power)
683
5.99k
                ps->peakdecay_fast[b] = power;
684
685
44.8k
            peakdiff = ps->prev_peakdiff[b];
686
44.8k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
44.8k
            ps->prev_peakdiff[b] = peakdiff;
688
689
44.8k
            nrg = ps->prev_nrg[b];
690
44.8k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
44.8k
            ps->prev_nrg[b] = nrg;
692
693
44.8k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
42.2k
                transratio = sigma;
695
42.2k
            } else {
696
2.60k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.60k
            }
698
699
179k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
134k
            {
701
134k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
134k
            }
703
704
44.8k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
44.8k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
44.8k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
44.8k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
44.8k
            RE(ps->d_buff[1][b]) = RE(in);
711
44.8k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
44.8k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
44.8k
            RE(R0) = RE(tmp);
716
44.8k
            IM(R0) = IM(tmp);
717
718
179k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
134k
            {
720
134k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
134k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
134k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
134k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
134k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
134k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
134k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
134k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
134k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
134k
                RE(R0) = RE(tmp);
735
134k
                IM(R0) = IM(tmp);
736
134k
            }
737
738
44.8k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
44.8k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
179k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
134k
            {
743
134k
                if (++temp_delay_ser[k] >= delay_length[k])
744
34.4k
                    temp_delay_ser[k] = 0;
745
134k
            }
746
44.8k
        }
747
1.49k
    }
748
749
260
    for (k = 0; k < NUM_OF_LINKS; k++)
750
195
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
65
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
212
{
640
212
    uint8_t s, b, k;
641
212
    complex_t qfrac, tmp0, tmp, in, R0;
642
212
    real_t peakdiff;
643
212
    real_t nrg;
644
212
    real_t power;
645
212
    real_t transratio;
646
212
    real_t new_delay_slopes[NUM_OF_LINKS];
647
212
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
212
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
5.08k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.87k
    {
655
        /* set delay indices */
656
19.5k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.6k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.87k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.87k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
151k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
146k
        {
664
146k
            const real_t gamma = REAL_CONST(1.5);
665
146k
            const real_t sigma = REAL_CONST(1.5625);
666
667
146k
            RE(in) = QMF_RE(X[s][b]);
668
146k
            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
146k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
146k
#endif
680
681
146k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
146k
            if (ps->peakdecay_fast[b] < power)
683
7.56k
                ps->peakdecay_fast[b] = power;
684
685
146k
            peakdiff = ps->prev_peakdiff[b];
686
146k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
146k
            ps->prev_peakdiff[b] = peakdiff;
688
689
146k
            nrg = ps->prev_nrg[b];
690
146k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
146k
            ps->prev_nrg[b] = nrg;
692
693
146k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
139k
                transratio = sigma;
695
139k
            } else {
696
6.29k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.29k
            }
698
699
585k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
438k
            {
701
438k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
438k
            }
703
704
146k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
146k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
146k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
146k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
146k
            RE(ps->d_buff[1][b]) = RE(in);
711
146k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
146k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
146k
            RE(R0) = RE(tmp);
716
146k
            IM(R0) = IM(tmp);
717
718
585k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
438k
            {
720
438k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
438k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
438k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
438k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
438k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
438k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
438k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
438k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
438k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
438k
                RE(R0) = RE(tmp);
735
438k
                IM(R0) = IM(tmp);
736
438k
            }
737
738
146k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
146k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
585k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
438k
            {
743
438k
                if (++temp_delay_ser[k] >= delay_length[k])
744
113k
                    temp_delay_ser[k] = 0;
745
438k
            }
746
146k
        }
747
4.87k
    }
748
749
848
    for (k = 0; k < NUM_OF_LINKS; k++)
750
636
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
212
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
277
{
755
277
    uint8_t s, b, ifreq, qclass;
756
277
    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
277
    real_t new_dir_map, new_sa_map;
758
759
277
    if (ps->bs_enable_sa)
760
102
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.44k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.34k
        {
765
2.34k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.34k
            ifreq = sa_inv_freq[b];
768
2.34k
            qclass = (b != 0);
769
770
2.34k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.34k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.34k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.34k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.34k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.34k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.34k
        }
781
782
3.16k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.06k
        {
784
73.4k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
70.3k
            {
786
70.3k
                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
70.3k
                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
70.3k
                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
70.3k
                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
70.3k
                sa_map[b]     += k_sa_map[b];
792
70.3k
                sa_dir_map[b] += k_sa_dir_map[b];
793
70.3k
            }
794
128k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
125k
            {
796
125k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
125k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
125k
            }
799
3.06k
        }
800
102
    }
801
175
    else {
802
5.42k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
5.25k
        {
804
341k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
336k
            {
806
336k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
336k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
336k
            }
809
5.25k
        }
810
175
    }
811
277
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
65
{
755
65
    uint8_t s, b, ifreq, qclass;
756
65
    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
65
    real_t new_dir_map, new_sa_map;
758
759
65
    if (ps->bs_enable_sa)
760
24
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
576
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
552
        {
765
552
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
552
            ifreq = sa_inv_freq[b];
768
552
            qclass = (b != 0);
769
770
552
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
552
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
552
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
552
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
552
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
552
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
552
        }
781
782
744
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
720
        {
784
17.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
16.5k
            {
786
16.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
16.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
16.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
16.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
16.5k
                sa_map[b]     += k_sa_map[b];
792
16.5k
                sa_dir_map[b] += k_sa_dir_map[b];
793
16.5k
            }
794
30.2k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
29.5k
            {
796
29.5k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
29.5k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
29.5k
            }
799
720
        }
800
24
    }
801
41
    else {
802
1.27k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.23k
        {
804
79.9k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
78.7k
            {
806
78.7k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
78.7k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
78.7k
            }
809
1.23k
        }
810
41
    }
811
65
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
212
{
755
212
    uint8_t s, b, ifreq, qclass;
756
212
    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
212
    real_t new_dir_map, new_sa_map;
758
759
212
    if (ps->bs_enable_sa)
760
78
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.87k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.79k
        {
765
1.79k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.79k
            ifreq = sa_inv_freq[b];
768
1.79k
            qclass = (b != 0);
769
770
1.79k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.79k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.79k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.79k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.79k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.79k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.79k
        }
781
782
2.41k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.34k
        {
784
56.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
53.8k
            {
786
53.8k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
53.8k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
53.8k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
53.8k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
53.8k
                sa_map[b]     += k_sa_map[b];
792
53.8k
                sa_dir_map[b] += k_sa_dir_map[b];
793
53.8k
            }
794
98.2k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
95.9k
            {
796
95.9k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
95.9k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
95.9k
            }
799
2.34k
        }
800
78
    }
801
134
    else {
802
4.15k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.02k
        {
804
261k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
257k
            {
806
257k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
257k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
257k
            }
809
4.02k
        }
810
134
    }
811
212
}
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.3k
            {
832
11.3k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
11.3k
            } else {
834
579
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
579
            }
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.2k
            {
841
10.2k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
10.1k
                {
843
10.1k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
10.1k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
10.1k
                } else {
846
98
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
98
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
98
                }
849
10.2k
            } else {
850
1.67k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.19k
                {
852
1.19k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.19k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.19k
                } else {
855
481
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
481
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
481
                }
858
1.67k
            }
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
29
{
815
29
    uint8_t s, b, qclass, ifreq;
816
29
    real_t tmp, coeff1, coeff2;
817
29
    real_t pan_base[MAX_PAN_BAND];
818
29
    real_t pan_delta[MAX_PAN_BAND];
819
29
    qmf_t temp_l, temp_r;
820
821
29
    if (ps->bs_enable_pan)
822
29
    {
823
1.88k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
1.85k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
1.85k
            ifreq = pan_inv_freq[b];
828
1.85k
            qclass = pan_quant_class[ifreq];
829
830
1.85k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
1.85k
            {
832
1.85k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
1.85k
            } else {
834
0
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
0
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
1.85k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.73k
            {
841
1.73k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.73k
                {
843
1.73k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.73k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.73k
                } else {
846
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
0
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
0
                }
849
1.73k
            } else {
850
126
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
126
                {
852
126
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
126
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
126
                } 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
126
            }
859
1.85k
        }
860
861
899
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
870
        {
863
            /* PAN always uses all 64 channels */
864
56.5k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
55.6k
            {
866
55.6k
                tmp = pan_base[b];
867
868
55.6k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
55.6k
                coeff1 = MUL_R(coeff2, tmp);
870
871
55.6k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
55.6k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
55.6k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
55.6k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
55.6k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
55.6k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
55.6k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
55.6k
                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
55.6k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
55.6k
            }
885
870
        }
886
29
    }
887
29
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
157
{
815
157
    uint8_t s, b, qclass, ifreq;
816
157
    real_t tmp, coeff1, coeff2;
817
157
    real_t pan_base[MAX_PAN_BAND];
818
157
    real_t pan_delta[MAX_PAN_BAND];
819
157
    qmf_t temp_l, temp_r;
820
821
157
    if (ps->bs_enable_pan)
822
157
    {
823
10.2k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
10.0k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
10.0k
            ifreq = pan_inv_freq[b];
828
10.0k
            qclass = pan_quant_class[ifreq];
829
830
10.0k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.46k
            {
832
9.46k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.46k
            } else {
834
579
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
579
            }
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
10.0k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.50k
            {
841
8.50k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.40k
                {
843
8.40k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.40k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.40k
                } else {
846
98
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
98
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
98
                }
849
8.50k
            } else {
850
1.54k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.06k
                {
852
1.06k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.06k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.06k
                } else {
855
481
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
481
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
481
                }
858
1.54k
            }
859
10.0k
        }
860
861
4.86k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.71k
        {
863
            /* PAN always uses all 64 channels */
864
306k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
301k
            {
866
301k
                tmp = pan_base[b];
867
868
301k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
301k
                coeff1 = MUL_R(coeff2, tmp);
870
871
301k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
301k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
301k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
301k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
301k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
301k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
301k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
301k
                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
301k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
301k
            }
885
4.71k
        }
886
157
    }
887
157
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.66k
{
891
7.66k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.66k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.66k
    return ps;
896
7.66k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.66k
{
900
7.66k
    faad_free(ps);
901
7.66k
}
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
282
{
906
282
    if (ps == NULL)
907
4
    {
908
4
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
4
        return 0;
910
4
    }
911
912
278
    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
277
    if (!guess)
923
150
    {
924
150
        ps->sa_decode_error = 0;
925
150
        ps->pan_decode_error = 0;
926
150
        drm_ps_delta_decode(ps);
927
150
    } else
928
127
    {
929
127
        ps->sa_decode_error = 1;
930
127
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
127
    }
933
934
277
    ps->drm_ps_data_available = 0;
935
936
277
    drm_calc_sa_side_signal(ps, X_left);
937
277
    drm_add_ambiance(ps, X_left, X_right);
938
939
277
    if (ps->bs_enable_sa)
940
102
    {
941
102
        ps->g_last_had_sa = 1;
942
943
102
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
175
    } else {
946
175
        ps->g_last_had_sa = 0;
947
175
    }
948
949
277
    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
91
        ps->g_last_had_pan = 0;
959
91
    }
960
961
962
277
    return 0;
963
278
}
964
965
#endif