Coverage Report

Created: 2026-06-10 06:48

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.03M
{
446
1.03M
    uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448
1.03M
    ps->drm_ps_data_available = 1;
449
450
1.03M
    ps->bs_enable_sa = faad_get1bit(ld);
451
1.03M
    ps->bs_enable_pan = faad_get1bit(ld);
452
453
1.03M
    if (ps->bs_enable_sa)
454
23.6k
    {
455
23.6k
        drm_ps_sa_element(ps, ld);
456
23.6k
    }
457
458
1.03M
    if (ps->bs_enable_pan)
459
16.0k
    {
460
16.0k
        drm_ps_pan_element(ps, ld);
461
16.0k
    }
462
463
1.03M
    bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465
1.03M
    return bits;
466
1.03M
}
467
468
static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469
23.6k
{
470
23.6k
    drm_ps_huff_tab huff;
471
23.6k
    uint8_t band;
472
473
23.6k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
23.6k
    if (ps->bs_sa_dt_flag)
475
9.74k
    {
476
9.74k
        huff = t_huffman_sa;
477
13.8k
    } else {
478
13.8k
        huff = f_huffman_sa;
479
13.8k
    }
480
481
212k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
189k
    {
483
189k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
189k
    }
485
23.6k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
16.0k
{
489
16.0k
    drm_ps_huff_tab huff;
490
16.0k
    uint8_t band;
491
492
16.0k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
16.0k
    if (ps->bs_pan_dt_flag)
494
4.26k
    {
495
4.26k
        huff = t_huffman_pan;
496
11.8k
    } else {
497
11.8k
        huff = f_huffman_pan;
498
11.8k
    }
499
500
337k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
321k
    {
502
321k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
321k
    }
504
16.0k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
510k
{
509
510k
    uint8_t bit;
510
510k
    int8_t index = 0;
511
512
1.47M
    while (index >= 0)
513
969k
    {
514
969k
        bit = (uint8_t)faad_get1bit(ld);
515
969k
        index = huff[index][bit];
516
969k
    }
517
518
510k
    return index + 15;
519
510k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
760
{
524
760
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
238
        ps->sa_decode_error = 1;
527
238
        return 0;
528
522
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
87
        ps->sa_decode_error = 1;
531
87
        return 7;
532
87
    } else
533
435
        return i;
534
760
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.22k
{
538
2.22k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
250
        ps->pan_decode_error = 1;
541
250
        return -7;
542
1.97k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
234
        ps->pan_decode_error = 1;
545
234
        return 7;
546
234
    } else
547
1.73k
        return i;
548
2.22k
}
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
120
    {
556
120
        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
95
        } 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
80
        } else {
564
            /* DF always decodable */
565
80
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
80
        }
567
568
960
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
840
        {
570
840
            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
735
            } else if (!ps->bs_sa_dt_flag) {
574
560
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
560
            }
576
840
        }
577
120
    }
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
79
        ps->pan_decode_error = 1;
583
79
        ps->bs_enable_pan = ps->g_last_had_pan;
584
79
        ps->bs_enable_sa = ps->g_last_had_sa;
585
79
    }
586
587
588
150
    if (ps->bs_enable_sa)
589
41
    {
590
41
        if (ps->sa_decode_error) {
591
225
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592
200
            {
593
200
                ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594
200
            }
595
25
        } 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
41
    }
602
603
150
    if (ps->bs_enable_pan)
604
114
    {
605
114
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
111
        }  else if (ps->bs_pan_dt_flag) {
609
32
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
79
        } else {
611
79
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
79
        }
613
614
2.28k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.16k
        {
616
2.16k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
608
            {
618
608
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.55k
            } else if (!ps->bs_pan_dt_flag) {
620
1.50k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.50k
            }
622
2.16k
        }
623
624
114
        if (ps->pan_decode_error) {
625
1.55k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.48k
            {
627
1.48k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.48k
            }
629
74
        } else {
630
840
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
800
            {
632
800
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
800
            }
634
40
        }
635
114
    }
636
150
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
272
{
640
272
    uint8_t s, b, k;
641
272
    complex_t qfrac, tmp0, tmp, in, R0;
642
272
    real_t peakdiff;
643
272
    real_t nrg;
644
272
    real_t power;
645
272
    real_t transratio;
646
272
    real_t new_delay_slopes[NUM_OF_LINKS];
647
272
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
272
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.52k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.25k
    {
655
        /* set delay indices */
656
25.0k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
18.7k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.25k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.25k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
193k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
187k
        {
664
187k
            const real_t gamma = REAL_CONST(1.5);
665
187k
            const real_t sigma = REAL_CONST(1.5625);
666
667
187k
            RE(in) = QMF_RE(X[s][b]);
668
187k
            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
41.4k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
41.4k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
146k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
187k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
187k
            if (ps->peakdecay_fast[b] < power)
683
14.3k
                ps->peakdecay_fast[b] = power;
684
685
187k
            peakdiff = ps->prev_peakdiff[b];
686
187k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
187k
            ps->prev_peakdiff[b] = peakdiff;
688
689
187k
            nrg = ps->prev_nrg[b];
690
187k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
187k
            ps->prev_nrg[b] = nrg;
692
693
187k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
177k
                transratio = sigma;
695
177k
            } else {
696
10.1k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
10.1k
            }
698
699
750k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
563k
            {
701
563k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
563k
            }
703
704
187k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
187k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
187k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
187k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
187k
            RE(ps->d_buff[1][b]) = RE(in);
711
187k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
187k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
187k
            RE(R0) = RE(tmp);
716
187k
            IM(R0) = IM(tmp);
717
718
750k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
563k
            {
720
563k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
563k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
563k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
563k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
563k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
563k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
563k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
563k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
563k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
563k
                RE(R0) = RE(tmp);
735
563k
                IM(R0) = IM(tmp);
736
563k
            }
737
738
187k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
187k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
750k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
563k
            {
743
563k
                if (++temp_delay_ser[k] >= delay_length[k])
744
145k
                    temp_delay_ser[k] = 0;
745
563k
            }
746
187k
        }
747
6.25k
    }
748
749
1.08k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
816
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
272
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
60
{
640
60
    uint8_t s, b, k;
641
60
    complex_t qfrac, tmp0, tmp, in, R0;
642
60
    real_t peakdiff;
643
60
    real_t nrg;
644
60
    real_t power;
645
60
    real_t transratio;
646
60
    real_t new_delay_slopes[NUM_OF_LINKS];
647
60
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
60
    complex_t Phi_Fract;
649
60
#ifdef FIXED_POINT
650
60
    uint32_t in_re, in_im;
651
60
#endif
652
653
1.44k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.38k
    {
655
        /* set delay indices */
656
5.52k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
4.14k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.38k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.38k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
42.7k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
41.4k
        {
664
41.4k
            const real_t gamma = REAL_CONST(1.5);
665
41.4k
            const real_t sigma = REAL_CONST(1.5625);
666
667
41.4k
            RE(in) = QMF_RE(X[s][b]);
668
41.4k
            IM(in) = QMF_IM(X[s][b]);
669
670
41.4k
#ifdef FIXED_POINT
671
            /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672
            * meaning that P will be scaled by 2^(-10) compared to floating point version
673
            */
674
41.4k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
41.4k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
41.4k
            power = in_re*in_re + in_im*in_im;
677
#else
678
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
41.4k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
41.4k
            if (ps->peakdecay_fast[b] < power)
683
5.49k
                ps->peakdecay_fast[b] = power;
684
685
41.4k
            peakdiff = ps->prev_peakdiff[b];
686
41.4k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
41.4k
            ps->prev_peakdiff[b] = peakdiff;
688
689
41.4k
            nrg = ps->prev_nrg[b];
690
41.4k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
41.4k
            ps->prev_nrg[b] = nrg;
692
693
41.4k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
38.7k
                transratio = sigma;
695
38.7k
            } else {
696
2.67k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
2.67k
            }
698
699
165k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
124k
            {
701
124k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
124k
            }
703
704
41.4k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
41.4k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
41.4k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
41.4k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
41.4k
            RE(ps->d_buff[1][b]) = RE(in);
711
41.4k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
41.4k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
41.4k
            RE(R0) = RE(tmp);
716
41.4k
            IM(R0) = IM(tmp);
717
718
165k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
124k
            {
720
124k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
124k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
124k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
124k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
124k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
124k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
124k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
124k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
124k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
124k
                RE(R0) = RE(tmp);
735
124k
                IM(R0) = IM(tmp);
736
124k
            }
737
738
41.4k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
41.4k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
165k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
124k
            {
743
124k
                if (++temp_delay_ser[k] >= delay_length[k])
744
31.8k
                    temp_delay_ser[k] = 0;
745
124k
            }
746
41.4k
        }
747
1.38k
    }
748
749
240
    for (k = 0; k < NUM_OF_LINKS; k++)
750
180
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
60
}
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
8.90k
                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
138k
                transratio = sigma;
695
138k
            } else {
696
7.49k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
7.49k
            }
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
272
{
755
272
    uint8_t s, b, ifreq, qclass;
756
272
    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
272
    real_t new_dir_map, new_sa_map;
758
759
272
    if (ps->bs_enable_sa)
760
88
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.11k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.02k
        {
765
2.02k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.02k
            ifreq = sa_inv_freq[b];
768
2.02k
            qclass = (b != 0);
769
770
2.02k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.02k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.02k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.02k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.02k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.02k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.02k
        }
781
782
2.72k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.64k
        {
784
63.3k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
60.7k
            {
786
60.7k
                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
60.7k
                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
60.7k
                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
60.7k
                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
60.7k
                sa_map[b]     += k_sa_map[b];
792
60.7k
                sa_dir_map[b] += k_sa_dir_map[b];
793
60.7k
            }
794
110k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
108k
            {
796
108k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
108k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
108k
            }
799
2.64k
        }
800
88
    }
801
184
    else {
802
5.70k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
5.52k
        {
804
358k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
353k
            {
806
353k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
353k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
353k
            }
809
5.52k
        }
810
184
    }
811
272
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
60
{
755
60
    uint8_t s, b, ifreq, qclass;
756
60
    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
60
    real_t new_dir_map, new_sa_map;
758
759
60
    if (ps->bs_enable_sa)
760
17
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
408
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
391
        {
765
391
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
391
            ifreq = sa_inv_freq[b];
768
391
            qclass = (b != 0);
769
770
391
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
391
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
391
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
391
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
391
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
391
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
391
        }
781
782
527
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
510
        {
784
12.2k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
11.7k
            {
786
11.7k
                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
11.7k
                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
11.7k
                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
11.7k
                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
11.7k
                sa_map[b]     += k_sa_map[b];
792
11.7k
                sa_dir_map[b] += k_sa_dir_map[b];
793
11.7k
            }
794
21.4k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
20.9k
            {
796
20.9k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
20.9k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
20.9k
            }
799
510
        }
800
17
    }
801
43
    else {
802
1.33k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.29k
        {
804
83.8k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
82.5k
            {
806
82.5k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
82.5k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
82.5k
            }
809
1.29k
        }
810
43
    }
811
60
}
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
71
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
1.70k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
1.63k
        {
765
1.63k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
1.63k
            ifreq = sa_inv_freq[b];
768
1.63k
            qclass = (b != 0);
769
770
1.63k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
1.63k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
1.63k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
1.63k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
1.63k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
1.63k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
1.63k
        }
781
782
2.20k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
2.13k
        {
784
51.1k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
48.9k
            {
786
48.9k
                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
48.9k
                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
48.9k
                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
48.9k
                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
48.9k
                sa_map[b]     += k_sa_map[b];
792
48.9k
                sa_dir_map[b] += k_sa_dir_map[b];
793
48.9k
            }
794
89.4k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
87.3k
            {
796
87.3k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
87.3k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
87.3k
            }
799
2.13k
        }
800
71
    }
801
141
    else {
802
4.37k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
4.23k
        {
804
274k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
270k
            {
806
270k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
270k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
270k
            }
809
4.23k
        }
810
141
    }
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
184
{
815
184
    uint8_t s, b, qclass, ifreq;
816
184
    real_t tmp, coeff1, coeff2;
817
184
    real_t pan_base[MAX_PAN_BAND];
818
184
    real_t pan_delta[MAX_PAN_BAND];
819
184
    qmf_t temp_l, temp_r;
820
821
184
    if (ps->bs_enable_pan)
822
184
    {
823
11.9k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
11.7k
        {
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.7k
            ifreq = pan_inv_freq[b];
828
11.7k
            qclass = pan_quant_class[ifreq];
829
830
11.7k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
11.2k
            {
832
11.2k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
11.2k
            } else {
834
559
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
559
            }
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.7k
            if (ps->g_pan_index[ifreq] >= 0)
840
10.1k
            {
841
10.1k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
10.0k
                {
843
10.0k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
10.0k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
10.0k
                } 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.1k
            } else {
850
1.62k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.16k
                {
852
1.16k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.16k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.16k
                } else {
855
461
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
461
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
461
                }
858
1.62k
            }
859
11.7k
        }
860
861
5.70k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.52k
        {
863
            /* PAN always uses all 64 channels */
864
358k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
353k
            {
866
353k
                tmp = pan_base[b];
867
868
353k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
353k
                coeff1 = MUL_R(coeff2, tmp);
870
871
353k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
353k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
353k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
353k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
353k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
353k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
353k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
353k
                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
353k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
353k
            }
885
5.52k
        }
886
184
    }
887
184
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
33
{
815
33
    uint8_t s, b, qclass, ifreq;
816
33
    real_t tmp, coeff1, coeff2;
817
33
    real_t pan_base[MAX_PAN_BAND];
818
33
    real_t pan_delta[MAX_PAN_BAND];
819
33
    qmf_t temp_l, temp_r;
820
821
33
    if (ps->bs_enable_pan)
822
33
    {
823
2.14k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
2.11k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
2.11k
            ifreq = pan_inv_freq[b];
828
2.11k
            qclass = pan_quant_class[ifreq];
829
830
2.11k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
2.11k
            {
832
2.11k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
2.11k
            } else {
834
0
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
0
            }
836
837
            /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838
            /* a en b can be negative so we may need to inverse parts */
839
2.11k
            if (ps->g_pan_index[ifreq] >= 0)
840
1.98k
            {
841
1.98k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
1.98k
                {
843
1.98k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
1.98k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
1.98k
                } 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.98k
            } 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
2.11k
        }
860
861
1.02k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
990
        {
863
            /* PAN always uses all 64 channels */
864
64.3k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
63.3k
            {
866
63.3k
                tmp = pan_base[b];
867
868
63.3k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
63.3k
                coeff1 = MUL_R(coeff2, tmp);
870
871
63.3k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
63.3k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
63.3k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
63.3k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
63.3k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
63.3k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
63.3k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
63.3k
                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
63.3k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
63.3k
            }
885
990
        }
886
33
    }
887
33
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
151
{
815
151
    uint8_t s, b, qclass, ifreq;
816
151
    real_t tmp, coeff1, coeff2;
817
151
    real_t pan_base[MAX_PAN_BAND];
818
151
    real_t pan_delta[MAX_PAN_BAND];
819
151
    qmf_t temp_l, temp_r;
820
821
151
    if (ps->bs_enable_pan)
822
151
    {
823
9.81k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.66k
        {
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.66k
            ifreq = pan_inv_freq[b];
828
9.66k
            qclass = pan_quant_class[ifreq];
829
830
9.66k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.10k
            {
832
9.10k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.10k
            } else {
834
559
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
559
            }
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.66k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.16k
            {
841
8.16k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.06k
                {
843
8.06k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.06k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.06k
                } 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.16k
            } else {
850
1.49k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.03k
                {
852
1.03k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.03k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.03k
                } else {
855
461
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
461
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
461
                }
858
1.49k
            }
859
9.66k
        }
860
861
4.68k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.53k
        {
863
            /* PAN always uses all 64 channels */
864
294k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
289k
            {
866
289k
                tmp = pan_base[b];
867
868
289k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
289k
                coeff1 = MUL_R(coeff2, tmp);
870
871
289k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
289k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
289k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
289k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
289k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
289k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
289k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
289k
                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
289k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
289k
            }
885
4.53k
        }
886
151
    }
887
151
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.44k
{
891
7.44k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.44k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.44k
    return ps;
896
7.44k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.44k
{
900
7.44k
    faad_free(ps);
901
7.44k
}
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
277
{
906
277
    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
273
    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
272
    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
122
    {
929
122
        ps->sa_decode_error = 1;
930
122
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
122
    }
933
934
272
    ps->drm_ps_data_available = 0;
935
936
272
    drm_calc_sa_side_signal(ps, X_left);
937
272
    drm_add_ambiance(ps, X_left, X_right);
938
939
272
    if (ps->bs_enable_sa)
940
88
    {
941
88
        ps->g_last_had_sa = 1;
942
943
88
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
184
    } else {
946
184
        ps->g_last_had_sa = 0;
947
184
    }
948
949
272
    if (ps->bs_enable_pan)
950
184
    {
951
184
        drm_add_pan(ps, X_left, X_right);
952
953
184
        ps->g_last_had_pan = 1;
954
955
184
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
184
    } else {
958
88
        ps->g_last_had_pan = 0;
959
88
    }
960
961
962
272
    return 0;
963
273
}
964
965
#endif