Coverage Report

Created: 2025-07-11 06:40

/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
6.96k
{
40
6.96k
    drc_info *drc = (drc_info*)faad_malloc(sizeof(drc_info));
41
6.96k
    memset(drc, 0, sizeof(drc_info));
42
43
6.96k
    drc->ctrl1 = cut;
44
6.96k
    drc->ctrl2 = boost;
45
46
6.96k
    drc->num_bands = 1;
47
6.96k
    drc->band_top[0] = 1024/4 - 1;
48
6.96k
    drc->dyn_rng_sgn[0] = 1;
49
6.96k
    drc->dyn_rng_ctl[0] = 0;
50
51
6.96k
    return drc;
52
6.96k
}
53
54
void drc_end(drc_info *drc)
55
6.96k
{
56
6.96k
    if (drc) faad_free(drc);
57
6.96k
}
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
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
}