/proc/self/cwd/libfaad/drc.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: drc.c,v 1.29 2015/02/22 10:09:29 knik Exp $ |
29 | | **/ |
30 | | |
31 | | #include "common.h" |
32 | | #include "structs.h" |
33 | | |
34 | | #include <stdlib.h> |
35 | | #include "syntax.h" |
36 | | #include "drc.h" |
37 | | |
38 | | drc_info *drc_init(real_t cut, real_t boost) |
39 | 8.64k | { |
40 | 8.64k | drc_info *drc = (drc_info*)faad_malloc(sizeof(drc_info)); |
41 | 8.64k | memset(drc, 0, sizeof(drc_info)); |
42 | | |
43 | 8.64k | drc->ctrl1 = cut; |
44 | 8.64k | drc->ctrl2 = boost; |
45 | | |
46 | 8.64k | drc->num_bands = 1; |
47 | 8.64k | drc->band_top[0] = 1024/4 - 1; |
48 | 8.64k | drc->dyn_rng_sgn[0] = 1; |
49 | 8.64k | drc->dyn_rng_ctl[0] = 0; |
50 | | |
51 | 8.64k | return drc; |
52 | 8.64k | } |
53 | | |
54 | | void drc_end(drc_info *drc) |
55 | 8.64k | { |
56 | 8.64k | if (drc) faad_free(drc); |
57 | 8.64k | } |
58 | | |
59 | | #ifdef FIXED_POINT |
60 | | static real_t drc_pow2_table[] = |
61 | | { |
62 | | COEF_CONST(0.5146511183), |
63 | | COEF_CONST(0.5297315472), |
64 | | COEF_CONST(0.5452538663), |
65 | | COEF_CONST(0.5612310242), |
66 | | COEF_CONST(0.5776763484), |
67 | | COEF_CONST(0.5946035575), |
68 | | COEF_CONST(0.6120267717), |
69 | | COEF_CONST(0.6299605249), |
70 | | COEF_CONST(0.6484197773), |
71 | | COEF_CONST(0.6674199271), |
72 | | COEF_CONST(0.6869768237), |
73 | | COEF_CONST(0.7071067812), |
74 | | COEF_CONST(0.7278265914), |
75 | | COEF_CONST(0.7491535384), |
76 | | COEF_CONST(0.7711054127), |
77 | | COEF_CONST(0.7937005260), |
78 | | COEF_CONST(0.8169577266), |
79 | | COEF_CONST(0.8408964153), |
80 | | COEF_CONST(0.8655365610), |
81 | | COEF_CONST(0.8908987181), |
82 | | COEF_CONST(0.9170040432), |
83 | | COEF_CONST(0.9438743127), |
84 | | COEF_CONST(0.9715319412), |
85 | | COEF_CONST(1.0000000000), |
86 | | COEF_CONST(1.0293022366), |
87 | | COEF_CONST(1.0594630944), |
88 | | COEF_CONST(1.0905077327), |
89 | | COEF_CONST(1.1224620483), |
90 | | COEF_CONST(1.1553526969), |
91 | | COEF_CONST(1.1892071150), |
92 | | COEF_CONST(1.2240535433), |
93 | | COEF_CONST(1.2599210499), |
94 | | COEF_CONST(1.2968395547), |
95 | | COEF_CONST(1.3348398542), |
96 | | COEF_CONST(1.3739536475), |
97 | | COEF_CONST(1.4142135624), |
98 | | COEF_CONST(1.4556531828), |
99 | | COEF_CONST(1.4983070769), |
100 | | COEF_CONST(1.5422108254), |
101 | | COEF_CONST(1.5874010520), |
102 | | COEF_CONST(1.6339154532), |
103 | | COEF_CONST(1.6817928305), |
104 | | COEF_CONST(1.7310731220), |
105 | | COEF_CONST(1.7817974363), |
106 | | COEF_CONST(1.8340080864), |
107 | | COEF_CONST(1.8877486254), |
108 | | COEF_CONST(1.9430638823) |
109 | | }; |
110 | | #endif |
111 | | |
112 | | void drc_decode(drc_info *drc, real_t *spec) |
113 | 13.4k | { |
114 | 13.4k | uint16_t i, bd, top; |
115 | | #ifdef FIXED_POINT |
116 | | int32_t exp, frac; |
117 | | #else |
118 | 13.4k | real_t factor, exp; |
119 | 13.4k | #endif |
120 | 13.4k | uint16_t bottom = 0; |
121 | | |
122 | 13.4k | if (drc->num_bands == 1) |
123 | 9.78k | drc->band_top[0] = 1024/4 - 1; |
124 | | |
125 | 59.2k | for (bd = 0; bd < drc->num_bands; bd++) |
126 | 45.7k | { |
127 | 45.7k | top = 4 * (drc->band_top[bd] + 1); |
128 | | |
129 | 45.7k | #ifndef FIXED_POINT |
130 | | /* Decode DRC gain factor */ |
131 | 45.7k | if (drc->dyn_rng_sgn[bd]) /* compress */ |
132 | 5.40k | exp = ((-drc->ctrl1 * drc->dyn_rng_ctl[bd]) - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); |
133 | 40.3k | else /* boost */ |
134 | 40.3k | exp = ((drc->ctrl2 * drc->dyn_rng_ctl[bd]) - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); |
135 | 45.7k | factor = (real_t)pow(2.0, exp); |
136 | | |
137 | | /* Apply gain factor */ |
138 | 11.3M | for (i = bottom; i < top; i++) |
139 | 11.3M | spec[i] *= factor; |
140 | | #else |
141 | | /* Decode DRC gain factor */ |
142 | | if (drc->dyn_rng_sgn[bd]) /* compress */ |
143 | | { |
144 | | exp = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; |
145 | | frac = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; |
146 | | } else { /* boost */ |
147 | | exp = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; |
148 | | frac = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; |
149 | | } |
150 | | |
151 | | /* Apply gain factor */ |
152 | | if (exp < 0) |
153 | | { |
154 | | for (i = bottom; i < top; i++) |
155 | | { |
156 | | spec[i] >>= -exp; |
157 | | if (frac) |
158 | | spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); |
159 | | } |
160 | | } else { |
161 | | for (i = bottom; i < top; i++) |
162 | | { |
163 | | spec[i] = (int32_t)(((uint32_t)spec[i]) << exp); |
164 | | if (frac) |
165 | | spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); |
166 | | } |
167 | | } |
168 | | #endif |
169 | | |
170 | 45.7k | bottom = top; |
171 | 45.7k | } |
172 | 13.4k | } |