Coverage Report

Created: 2026-02-26 06:56

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
23.2k
    {
455
23.2k
        drm_ps_sa_element(ps, ld);
456
23.2k
    }
457
458
1.01M
    if (ps->bs_enable_pan)
459
14.8k
    {
460
14.8k
        drm_ps_pan_element(ps, ld);
461
14.8k
    }
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
23.2k
{
470
23.2k
    drm_ps_huff_tab huff;
471
23.2k
    uint8_t band;
472
473
23.2k
    ps->bs_sa_dt_flag = faad_get1bit(ld);
474
23.2k
    if (ps->bs_sa_dt_flag)
475
8.86k
    {
476
8.86k
        huff = t_huffman_sa;
477
14.3k
    } else {
478
14.3k
        huff = f_huffman_sa;
479
14.3k
    }
480
481
208k
    for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482
185k
    {
483
185k
        ps->bs_sa_data[band] = huff_dec(ld, huff);
484
185k
    }
485
23.2k
}
486
487
static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488
14.8k
{
489
14.8k
    drm_ps_huff_tab huff;
490
14.8k
    uint8_t band;
491
492
14.8k
    ps->bs_pan_dt_flag = faad_get1bit(ld);
493
14.8k
    if (ps->bs_pan_dt_flag)
494
3.55k
    {
495
3.55k
        huff = t_huffman_pan;
496
11.3k
    } else {
497
11.3k
        huff = f_huffman_pan;
498
11.3k
    }
499
500
312k
    for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501
297k
    {
502
297k
        ps->bs_pan_data[band] = huff_dec(ld, huff);
503
297k
    }
504
14.8k
}
505
506
/* binary search huffman decoding */
507
static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508
483k
{
509
483k
    uint8_t bit;
510
483k
    int8_t index = 0;
511
512
1.39M
    while (index >= 0)
513
915k
    {
514
915k
        bit = (uint8_t)faad_get1bit(ld);
515
915k
        index = huff[index][bit];
516
915k
    }
517
518
483k
    return index + 15;
519
483k
}
520
521
522
static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523
792
{
524
792
    if (i < 0) {
525
      /*  printf(" SAminclip %d", i); */
526
236
        ps->sa_decode_error = 1;
527
236
        return 0;
528
556
    } else if (i > 7) {
529
     /*   printf(" SAmaxclip %d", i); */
530
94
        ps->sa_decode_error = 1;
531
94
        return 7;
532
94
    } else
533
462
        return i;
534
792
}
535
536
static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537
2.30k
{
538
2.30k
    if (i < -7) {
539
        /* printf(" PANminclip %d", i); */
540
260
        ps->pan_decode_error = 1;
541
260
        return -7;
542
2.04k
    } else if (i > 7) {
543
       /* printf(" PANmaxclip %d", i);  */
544
235
        ps->pan_decode_error = 1;
545
235
        return 7;
546
235
    } else
547
1.80k
        return i;
548
2.30k
}
549
550
static void drm_ps_delta_decode(drm_ps_info *ps)
551
153
{
552
153
    uint8_t band;
553
554
153
    if (ps->bs_enable_sa)
555
124
    {
556
124
        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
99
        } 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
84
        } else {
564
            /* DF always decodable */
565
84
            ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566
84
        }
567
568
992
        for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569
868
        {
570
868
            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
763
            } else if (!ps->bs_sa_dt_flag) {
574
588
                ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
575
588
            }
576
868
        }
577
124
    }
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
153
    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
153
    if (ps->bs_enable_sa)
589
49
    {
590
49
        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
180
            for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597
160
            {
598
160
                ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599
160
            }
600
20
        }
601
49
    }
602
603
153
    if (ps->bs_enable_pan)
604
118
    {
605
118
        if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606
3
        {
607
3
            ps->bs_enable_pan = 0;
608
115
        }  else if (ps->bs_pan_dt_flag) {
609
34
            ps->g_pan_index[0] = pan_delta_clip(ps,  ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
610
81
        } else {
611
81
            ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612
81
        }
613
614
2.36k
        for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615
2.24k
        {
616
2.24k
            if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617
646
            {
618
646
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619
1.59k
            } else if (!ps->bs_pan_dt_flag) {
620
1.53k
                ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
621
1.53k
            }
622
2.24k
        }
623
624
118
        if (ps->pan_decode_error) {
625
1.59k
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626
1.52k
            {
627
1.52k
                ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628
1.52k
            }
629
76
        } else {
630
882
            for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631
840
            {
632
840
                ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633
840
            }
634
42
        }
635
118
    }
636
153
}
637
638
static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639
282
{
640
282
    uint8_t s, b, k;
641
282
    complex_t qfrac, tmp0, tmp, in, R0;
642
282
    real_t peakdiff;
643
282
    real_t nrg;
644
282
    real_t power;
645
282
    real_t transratio;
646
282
    real_t new_delay_slopes[NUM_OF_LINKS];
647
282
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
282
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
6.76k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
6.48k
    {
655
        /* set delay indices */
656
25.9k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
19.4k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
6.48k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
6.48k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
201k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
194k
        {
664
194k
            const real_t gamma = REAL_CONST(1.5);
665
194k
            const real_t sigma = REAL_CONST(1.5625);
666
667
194k
            RE(in) = QMF_RE(X[s][b]);
668
194k
            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
52.4k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
52.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
142k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
#endif
680
681
194k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
194k
            if (ps->peakdecay_fast[b] < power)
683
16.3k
                ps->peakdecay_fast[b] = power;
684
685
194k
            peakdiff = ps->prev_peakdiff[b];
686
194k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
194k
            ps->prev_peakdiff[b] = peakdiff;
688
689
194k
            nrg = ps->prev_nrg[b];
690
194k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
194k
            ps->prev_nrg[b] = nrg;
692
693
194k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
184k
                transratio = sigma;
695
184k
            } else {
696
9.86k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
9.86k
            }
698
699
778k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
583k
            {
701
583k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
583k
            }
703
704
194k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
194k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
194k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
194k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
194k
            RE(ps->d_buff[1][b]) = RE(in);
711
194k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
194k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
194k
            RE(R0) = RE(tmp);
716
194k
            IM(R0) = IM(tmp);
717
718
778k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
583k
            {
720
583k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
583k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
583k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
583k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
583k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
583k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
583k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
583k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
583k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
583k
                RE(R0) = RE(tmp);
735
583k
                IM(R0) = IM(tmp);
736
583k
            }
737
738
194k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
194k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
778k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
583k
            {
743
583k
                if (++temp_delay_ser[k] >= delay_length[k])
744
150k
                    temp_delay_ser[k] = 0;
745
583k
            }
746
194k
        }
747
6.48k
    }
748
749
1.12k
    for (k = 0; k < NUM_OF_LINKS; k++)
750
846
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
282
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
76
{
640
76
    uint8_t s, b, k;
641
76
    complex_t qfrac, tmp0, tmp, in, R0;
642
76
    real_t peakdiff;
643
76
    real_t nrg;
644
76
    real_t power;
645
76
    real_t transratio;
646
76
    real_t new_delay_slopes[NUM_OF_LINKS];
647
76
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
76
    complex_t Phi_Fract;
649
76
#ifdef FIXED_POINT
650
76
    uint32_t in_re, in_im;
651
76
#endif
652
653
1.82k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
1.74k
    {
655
        /* set delay indices */
656
6.99k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
5.24k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
1.74k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
1.74k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
54.1k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
52.4k
        {
664
52.4k
            const real_t gamma = REAL_CONST(1.5);
665
52.4k
            const real_t sigma = REAL_CONST(1.5625);
666
667
52.4k
            RE(in) = QMF_RE(X[s][b]);
668
52.4k
            IM(in) = QMF_IM(X[s][b]);
669
670
52.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
52.4k
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
52.4k
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
52.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
52.4k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
52.4k
            if (ps->peakdecay_fast[b] < power)
683
8.18k
                ps->peakdecay_fast[b] = power;
684
685
52.4k
            peakdiff = ps->prev_peakdiff[b];
686
52.4k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
52.4k
            ps->prev_peakdiff[b] = peakdiff;
688
689
52.4k
            nrg = ps->prev_nrg[b];
690
52.4k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
52.4k
            ps->prev_nrg[b] = nrg;
692
693
52.4k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
49.0k
                transratio = sigma;
695
49.0k
            } else {
696
3.39k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
3.39k
            }
698
699
209k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
157k
            {
701
157k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
157k
            }
703
704
52.4k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
52.4k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
52.4k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
52.4k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
52.4k
            RE(ps->d_buff[1][b]) = RE(in);
711
52.4k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
52.4k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
52.4k
            RE(R0) = RE(tmp);
716
52.4k
            IM(R0) = IM(tmp);
717
718
209k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
157k
            {
720
157k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
157k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
157k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
157k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
157k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
157k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
157k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
157k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
157k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
157k
                RE(R0) = RE(tmp);
735
157k
                IM(R0) = IM(tmp);
736
157k
            }
737
738
52.4k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
52.4k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
209k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
157k
            {
743
157k
                if (++temp_delay_ser[k] >= delay_length[k])
744
40.2k
                    temp_delay_ser[k] = 0;
745
157k
            }
746
52.4k
        }
747
1.74k
    }
748
749
304
    for (k = 0; k < NUM_OF_LINKS; k++)
750
228
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
76
}
drm_dec.c:drm_calc_sa_side_signal
Line
Count
Source
639
206
{
640
206
    uint8_t s, b, k;
641
206
    complex_t qfrac, tmp0, tmp, in, R0;
642
206
    real_t peakdiff;
643
206
    real_t nrg;
644
206
    real_t power;
645
206
    real_t transratio;
646
206
    real_t new_delay_slopes[NUM_OF_LINKS];
647
206
    uint8_t temp_delay_ser[NUM_OF_LINKS];
648
206
    complex_t Phi_Fract;
649
#ifdef FIXED_POINT
650
    uint32_t in_re, in_im;
651
#endif
652
653
4.94k
    for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654
4.73k
    {
655
        /* set delay indices */
656
18.9k
        for (k = 0; k < NUM_OF_LINKS; k++)
657
14.2k
            temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659
4.73k
        RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660
4.73k
        IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662
146k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663
142k
        {
664
142k
            const real_t gamma = REAL_CONST(1.5);
665
142k
            const real_t sigma = REAL_CONST(1.5625);
666
667
142k
            RE(in) = QMF_RE(X[s][b]);
668
142k
            IM(in) = QMF_IM(X[s][b]);
669
670
#ifdef FIXED_POINT
671
            /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672
            * meaning that P will be scaled by 2^(-10) compared to floating point version
673
            */
674
            in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675
            in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676
            power = in_re*in_re + in_im*in_im;
677
#else
678
142k
            power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679
142k
#endif
680
681
142k
            ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682
142k
            if (ps->peakdecay_fast[b] < power)
683
8.13k
                ps->peakdecay_fast[b] = power;
684
685
142k
            peakdiff = ps->prev_peakdiff[b];
686
142k
            peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687
142k
            ps->prev_peakdiff[b] = peakdiff;
688
689
142k
            nrg = ps->prev_nrg[b];
690
142k
            nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691
142k
            ps->prev_nrg[b] = nrg;
692
693
142k
            if (MUL_R(peakdiff, gamma) <= nrg) {
694
135k
                transratio = sigma;
695
135k
            } else {
696
6.46k
                transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697
6.46k
            }
698
699
568k
            for (k = 0; k < NUM_OF_LINKS; k++)
700
426k
            {
701
426k
                new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702
426k
            }
703
704
142k
            RE(tmp0) = RE(ps->d_buff[0][b]);
705
142k
            IM(tmp0) = IM(ps->d_buff[0][b]);
706
707
142k
            RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708
142k
            IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
709
710
142k
            RE(ps->d_buff[1][b]) = RE(in);
711
142k
            IM(ps->d_buff[1][b]) = IM(in);
712
713
142k
            ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715
142k
            RE(R0) = RE(tmp);
716
142k
            IM(R0) = IM(tmp);
717
718
568k
            for (k = 0; k < NUM_OF_LINKS; k++)
719
426k
            {
720
426k
                RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721
426k
                IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
723
426k
                RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724
426k
                IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
725
726
426k
                ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728
426k
                RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729
426k
                IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
731
426k
                RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732
426k
                IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
733
734
426k
                RE(R0) = RE(tmp);
735
426k
                IM(R0) = IM(tmp);
736
426k
            }
737
738
142k
            QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739
142k
            QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741
568k
            for (k = 0; k < NUM_OF_LINKS; k++)
742
426k
            {
743
426k
                if (++temp_delay_ser[k] >= delay_length[k])
744
110k
                    temp_delay_ser[k] = 0;
745
426k
            }
746
142k
        }
747
4.73k
    }
748
749
824
    for (k = 0; k < NUM_OF_LINKS; k++)
750
618
        ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751
206
}
752
753
static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754
282
{
755
282
    uint8_t s, b, ifreq, qclass;
756
282
    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
282
    real_t new_dir_map, new_sa_map;
758
759
282
    if (ps->bs_enable_sa)
760
100
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
2.40k
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
2.30k
        {
765
2.30k
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
2.30k
            ifreq = sa_inv_freq[b];
768
2.30k
            qclass = (b != 0);
769
770
2.30k
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
2.30k
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
2.30k
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
2.30k
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
2.30k
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
2.30k
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
2.30k
        }
781
782
3.10k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
3.00k
        {
784
72.0k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
69.0k
            {
786
69.0k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
69.0k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
69.0k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
69.0k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
69.0k
                sa_map[b]     += k_sa_map[b];
792
69.0k
                sa_dir_map[b] += k_sa_dir_map[b];
793
69.0k
            }
794
126k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
123k
            {
796
123k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
123k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
123k
            }
799
3.00k
        }
800
100
    }
801
182
    else {
802
5.64k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
5.46k
        {
804
354k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
349k
            {
806
349k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
349k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
349k
            }
809
5.46k
        }
810
182
    }
811
282
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
76
{
755
76
    uint8_t s, b, ifreq, qclass;
756
76
    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
76
    real_t new_dir_map, new_sa_map;
758
759
76
    if (ps->bs_enable_sa)
760
22
    {
761
        /* Instead of dequantization and mapping, we use an inverse mapping
762
           to look up all the values we need */
763
528
        for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
764
506
        {
765
506
            const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767
506
            ifreq = sa_inv_freq[b];
768
506
            qclass = (b != 0);
769
770
506
            sa_map[b]  = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771
506
            new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
772
773
506
            k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
775
506
            sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776
506
            new_dir_map   = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
777
778
506
            k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780
506
        }
781
782
682
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783
660
        {
784
15.8k
            for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785
15.1k
            {
786
15.1k
                QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787
15.1k
                QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788
15.1k
                QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789
15.1k
                QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
790
791
15.1k
                sa_map[b]     += k_sa_map[b];
792
15.1k
                sa_dir_map[b] += k_sa_dir_map[b];
793
15.1k
            }
794
27.7k
            for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795
27.0k
            {
796
27.0k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797
27.0k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
798
27.0k
            }
799
660
        }
800
22
    }
801
54
    else {
802
1.67k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
1.62k
        {
804
105k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
103k
            {
806
103k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
103k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
103k
            }
809
1.62k
        }
810
54
    }
811
76
}
drm_dec.c:drm_add_ambiance
Line
Count
Source
754
206
{
755
206
    uint8_t s, b, ifreq, qclass;
756
206
    real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND];
757
206
    real_t new_dir_map, new_sa_map;
758
759
206
    if (ps->bs_enable_sa)
760
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
128
    else {
802
3.96k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803
3.84k
        {
804
249k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805
245k
            {
806
245k
                QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807
245k
                QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
808
245k
            }
809
3.84k
        }
810
128
    }
811
206
}
812
813
static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814
191
{
815
191
    uint8_t s, b, qclass, ifreq;
816
191
    real_t tmp, coeff1, coeff2;
817
191
    real_t pan_base[MAX_PAN_BAND];
818
191
    real_t pan_delta[MAX_PAN_BAND];
819
191
    qmf_t temp_l, temp_r;
820
821
191
    if (ps->bs_enable_pan)
822
191
    {
823
12.4k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
12.2k
        {
825
            /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826
               inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827
12.2k
            ifreq = pan_inv_freq[b];
828
12.2k
            qclass = pan_quant_class[ifreq];
829
830
12.2k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
11.6k
            {
832
11.6k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
11.6k
            } else {
834
614
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
614
            }
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
12.2k
            if (ps->g_pan_index[ifreq] >= 0)
840
10.6k
            {
841
10.6k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
10.5k
                {
843
10.5k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
10.5k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
10.5k
                } else {
846
101
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
101
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
101
                }
849
10.6k
            } else {
850
1.56k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.05k
                {
852
1.05k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.05k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.05k
                } else {
855
513
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
513
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
513
                }
858
1.56k
            }
859
12.2k
        }
860
861
5.92k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
5.73k
        {
863
            /* PAN always uses all 64 channels */
864
372k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
366k
            {
866
366k
                tmp = pan_base[b];
867
868
366k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
366k
                coeff1 = MUL_R(coeff2, tmp);
870
871
366k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
366k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
366k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
366k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
366k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
366k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
366k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
366k
                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
366k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
366k
            }
885
5.73k
        }
886
191
    }
887
191
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
37
{
815
37
    uint8_t s, b, qclass, ifreq;
816
37
    real_t tmp, coeff1, coeff2;
817
37
    real_t pan_base[MAX_PAN_BAND];
818
37
    real_t pan_delta[MAX_PAN_BAND];
819
37
    qmf_t temp_l, temp_r;
820
821
37
    if (ps->bs_enable_pan)
822
37
    {
823
2.40k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
2.36k
        {
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.36k
            ifreq = pan_inv_freq[b];
828
2.36k
            qclass = pan_quant_class[ifreq];
829
830
2.36k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
2.36k
            {
832
2.36k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
2.36k
            } 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.36k
            if (ps->g_pan_index[ifreq] >= 0)
840
2.36k
            {
841
2.36k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
2.36k
                {
843
2.36k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
2.36k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
2.36k
                } else {
846
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
0
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
0
                }
849
2.36k
            } else {
850
0
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
0
                {
852
0
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
0
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
0
                } 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
0
            }
859
2.36k
        }
860
861
1.14k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
1.11k
        {
863
            /* PAN always uses all 64 channels */
864
72.1k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
71.0k
            {
866
71.0k
                tmp = pan_base[b];
867
868
71.0k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
71.0k
                coeff1 = MUL_R(coeff2, tmp);
870
871
71.0k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
71.0k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
71.0k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
71.0k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
71.0k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
71.0k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
71.0k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
71.0k
                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
71.0k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
71.0k
            }
885
1.11k
        }
886
37
    }
887
37
}
drm_dec.c:drm_add_pan
Line
Count
Source
814
154
{
815
154
    uint8_t s, b, qclass, ifreq;
816
154
    real_t tmp, coeff1, coeff2;
817
154
    real_t pan_base[MAX_PAN_BAND];
818
154
    real_t pan_delta[MAX_PAN_BAND];
819
154
    qmf_t temp_l, temp_r;
820
821
154
    if (ps->bs_enable_pan)
822
154
    {
823
10.0k
        for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824
9.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
9.85k
            ifreq = pan_inv_freq[b];
828
9.85k
            qclass = pan_quant_class[ifreq];
829
830
9.85k
            if (ps->g_prev_pan_index[ifreq] >= 0)
831
9.24k
            {
832
9.24k
                pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833
9.24k
            } else {
834
614
                pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835
614
            }
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.85k
            if (ps->g_pan_index[ifreq] >= 0)
840
8.29k
            {
841
8.29k
                if (ps->g_prev_pan_index[ifreq] >= 0)
842
8.19k
                {
843
8.19k
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844
8.19k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
845
8.19k
                } else {
846
101
                    pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847
101
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
848
101
                }
849
8.29k
            } else {
850
1.56k
                if (ps->g_prev_pan_index[ifreq] >= 0)
851
1.05k
                {
852
1.05k
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853
1.05k
                                         pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
854
1.05k
                } else {
855
513
                    pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856
513
                                         pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
857
513
                }
858
1.56k
            }
859
9.85k
        }
860
861
4.77k
        for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862
4.62k
        {
863
            /* PAN always uses all 64 channels */
864
300k
            for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865
295k
            {
866
295k
                tmp = pan_base[b];
867
868
295k
                coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869
295k
                coeff1 = MUL_R(coeff2, tmp);
870
871
295k
                QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872
295k
                QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873
295k
                QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874
295k
                QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
875
876
295k
                QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877
295k
                QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878
295k
                QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879
295k
                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
295k
                pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
884
295k
            }
885
4.62k
        }
886
154
    }
887
154
}
888
889
drm_ps_info *drm_ps_init(void)
890
7.70k
{
891
7.70k
    drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893
7.70k
    memset(ps, 0, sizeof(drm_ps_info));
894
895
7.70k
    return ps;
896
7.70k
}
897
898
void drm_ps_free(drm_ps_info *ps)
899
7.70k
{
900
7.70k
    faad_free(ps);
901
7.70k
}
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
290
{
906
290
    if (ps == NULL)
907
7
    {
908
7
        memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909
7
        return 0;
910
7
    }
911
912
283
    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
282
    if (!guess)
923
153
    {
924
153
        ps->sa_decode_error = 0;
925
153
        ps->pan_decode_error = 0;
926
153
        drm_ps_delta_decode(ps);
927
153
    } else
928
129
    {
929
129
        ps->sa_decode_error = 1;
930
129
        ps->pan_decode_error = 1;
931
        /* don't even bother decoding */
932
129
    }
933
934
282
    ps->drm_ps_data_available = 0;
935
936
282
    drm_calc_sa_side_signal(ps, X_left);
937
282
    drm_add_ambiance(ps, X_left, X_right);
938
939
282
    if (ps->bs_enable_sa)
940
100
    {
941
100
        ps->g_last_had_sa = 1;
942
943
100
        memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945
182
    } else {
946
182
        ps->g_last_had_sa = 0;
947
182
    }
948
949
282
    if (ps->bs_enable_pan)
950
191
    {
951
191
        drm_add_pan(ps, X_left, X_right);
952
953
191
        ps->g_last_had_pan = 1;
954
955
191
        memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957
191
    } else {
958
91
        ps->g_last_had_pan = 0;
959
91
    }
960
961
962
282
    return 0;
963
283
}
964
965
#endif