/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 | 25.2k | { |
40 | 25.2k | drc_info *drc = (drc_info*)faad_malloc(sizeof(drc_info)); |
41 | 25.2k | memset(drc, 0, sizeof(drc_info)); |
42 | | |
43 | 25.2k | drc->ctrl1 = cut; |
44 | 25.2k | drc->ctrl2 = boost; |
45 | | |
46 | 25.2k | drc->num_bands = 1; |
47 | 25.2k | drc->band_top[0] = 1024/4 - 1; |
48 | 25.2k | drc->dyn_rng_sgn[0] = 1; |
49 | 25.2k | drc->dyn_rng_ctl[0] = 0; |
50 | | |
51 | 25.2k | return drc; |
52 | 25.2k | } |
53 | | |
54 | | void drc_end(drc_info *drc) |
55 | 25.2k | { |
56 | 25.2k | if (drc) faad_free(drc); |
57 | 25.2k | } |
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 | 24.4k | { |
114 | 24.4k | uint16_t i, bd, top; |
115 | | #ifdef FIXED_POINT |
116 | | int32_t exp, frac; |
117 | | #else |
118 | | real_t factor, exp; |
119 | | #endif |
120 | 24.4k | uint16_t bottom = 0; |
121 | | |
122 | 24.4k | if (drc->num_bands == 1) |
123 | 16.7k | drc->band_top[0] = 1024/4 - 1; |
124 | | |
125 | 112k | for (bd = 0; bd < drc->num_bands; bd++) |
126 | 87.8k | { |
127 | 87.8k | top = 4 * (drc->band_top[bd] + 1); |
128 | | |
129 | | #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 | | 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 | 42.0k | if (drc->dyn_rng_sgn[bd]) /* compress */ |
143 | 6.74k | { |
144 | 6.74k | exp = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; |
145 | 6.74k | frac = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; |
146 | 35.3k | } else { /* boost */ |
147 | 35.3k | exp = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; |
148 | 35.3k | frac = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; |
149 | 35.3k | } |
150 | | |
151 | | /* Apply gain factor */ |
152 | 42.0k | if (exp < 0) |
153 | 27.7k | { |
154 | 6.13M | for (i = bottom; i < top; i++) |
155 | 6.10M | { |
156 | 6.10M | spec[i] >>= -exp; |
157 | 6.10M | if (frac) |
158 | 5.86M | spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); |
159 | 6.10M | } |
160 | 27.7k | } else { |
161 | 4.72M | for (i = bottom; i < top; i++) |
162 | 4.70M | { |
163 | 4.70M | spec[i] = (int32_t)(((uint32_t)spec[i]) << exp); |
164 | 4.70M | if (frac) |
165 | 4.33M | spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); |
166 | 4.70M | } |
167 | 14.2k | } |
168 | | #endif |
169 | | |
170 | 87.8k | bottom = top; |
171 | 87.8k | } |
172 | 24.4k | } Line | Count | Source | 113 | 11.0k | { | 114 | 11.0k | uint16_t i, bd, top; | 115 | 11.0k | #ifdef FIXED_POINT | 116 | 11.0k | int32_t exp, frac; | 117 | | #else | 118 | | real_t factor, exp; | 119 | | #endif | 120 | 11.0k | uint16_t bottom = 0; | 121 | | | 122 | 11.0k | if (drc->num_bands == 1) | 123 | 6.93k | drc->band_top[0] = 1024/4 - 1; | 124 | | | 125 | 53.1k | for (bd = 0; bd < drc->num_bands; bd++) | 126 | 42.0k | { | 127 | 42.0k | top = 4 * (drc->band_top[bd] + 1); | 128 | | | 129 | | #ifndef FIXED_POINT | 130 | | /* Decode DRC gain factor */ | 131 | | if (drc->dyn_rng_sgn[bd]) /* compress */ | 132 | | exp = ((-drc->ctrl1 * drc->dyn_rng_ctl[bd]) - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); | 133 | | else /* boost */ | 134 | | exp = ((drc->ctrl2 * drc->dyn_rng_ctl[bd]) - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); | 135 | | factor = (real_t)pow(2.0, exp); | 136 | | | 137 | | /* Apply gain factor */ | 138 | | for (i = bottom; i < top; i++) | 139 | | spec[i] *= factor; | 140 | | #else | 141 | | /* Decode DRC gain factor */ | 142 | 42.0k | if (drc->dyn_rng_sgn[bd]) /* compress */ | 143 | 6.74k | { | 144 | 6.74k | exp = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; | 145 | 6.74k | frac = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; | 146 | 35.3k | } else { /* boost */ | 147 | 35.3k | exp = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; | 148 | 35.3k | frac = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; | 149 | 35.3k | } | 150 | | | 151 | | /* Apply gain factor */ | 152 | 42.0k | if (exp < 0) | 153 | 27.7k | { | 154 | 6.13M | for (i = bottom; i < top; i++) | 155 | 6.10M | { | 156 | 6.10M | spec[i] >>= -exp; | 157 | 6.10M | if (frac) | 158 | 5.86M | spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); | 159 | 6.10M | } | 160 | 27.7k | } else { | 161 | 4.72M | for (i = bottom; i < top; i++) | 162 | 4.70M | { | 163 | 4.70M | spec[i] = (int32_t)(((uint32_t)spec[i]) << exp); | 164 | 4.70M | if (frac) | 165 | 4.33M | spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); | 166 | 4.70M | } | 167 | 14.2k | } | 168 | 42.0k | #endif | 169 | | | 170 | 42.0k | bottom = top; | 171 | 42.0k | } | 172 | 11.0k | } |
Line | Count | Source | 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 | } |
|