Coverage Report

Created: 2026-02-14 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/aacps.c
Line
Count
Source
1
/*
2
 * MPEG-4 Parametric Stereo decoding functions
3
 * Copyright (c) 2010 Alex Converse <alex.converse@gmail.com>
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 *
21
 * Note: Rounding-to-nearest used unless otherwise stated
22
 *
23
 */
24
25
#include <stdint.h>
26
#include "libavutil/common.h"
27
#include "libavutil/mathematics.h"
28
#include "libavutil/mem_internal.h"
29
#include "aacps.h"
30
#if USE_FIXED
31
#include "aacps_fixed_tablegen.h"
32
#else
33
#include "libavutil/internal.h"
34
#include "aacps_tablegen.h"
35
#endif /* USE_FIXED */
36
37
static const INTFLOAT g1_Q2[] = {
38
    Q31(0.0f),  Q31(0.01899487526049f), Q31(0.0f), Q31(-0.07293139167538f),
39
    Q31(0.0f),  Q31(0.30596630545168f), Q31(0.5f)
40
};
41
42
static void ipdopd_reset(int8_t *ipd_hist, int8_t *opd_hist)
43
8.07k
{
44
8.07k
    int i;
45
145k
    for (i = 0; i < PS_MAX_NR_IPDOPD; i++) {
46
137k
        opd_hist[i] = 0;
47
137k
        ipd_hist[i] = 0;
48
137k
    }
49
8.07k
}
aacps_fixed.c:ipdopd_reset
Line
Count
Source
43
6.29k
{
44
6.29k
    int i;
45
113k
    for (i = 0; i < PS_MAX_NR_IPDOPD; i++) {
46
107k
        opd_hist[i] = 0;
47
107k
        ipd_hist[i] = 0;
48
107k
    }
49
6.29k
}
aacps_float.c:ipdopd_reset
Line
Count
Source
43
1.77k
{
44
1.77k
    int i;
45
31.9k
    for (i = 0; i < PS_MAX_NR_IPDOPD; i++) {
46
30.1k
        opd_hist[i] = 0;
47
30.1k
        ipd_hist[i] = 0;
48
30.1k
    }
49
1.77k
}
50
51
/** Split one subband into 2 subsubbands with a symmetric real filter.
52
 * The filter must have its non-center even coefficients equal to zero. */
53
static void hybrid2_re(INTFLOAT (*in)[2], INTFLOAT (*out)[32][2],
54
                       const INTFLOAT filter[7], int len, int reverse)
55
53.4k
{
56
53.4k
    int i, j;
57
1.76M
    for (i = 0; i < len; i++, in++) {
58
1.71M
        INT64FLOAT re_in = AAC_MUL31(filter[6], in[6][0]); //real inphase
59
1.71M
        INT64FLOAT re_op = 0.0f;                          //real out of phase
60
1.71M
        INT64FLOAT im_in = AAC_MUL31(filter[6], in[6][1]); //imag inphase
61
1.71M
        INT64FLOAT im_op = 0.0f;                          //imag out of phase
62
6.84M
        for (j = 0; j < 6; j += 2) {
63
5.13M
            re_op += (INT64FLOAT)filter[j+1] * (in[j+1][0] + in[12-j-1][0]);
64
5.13M
            im_op += (INT64FLOAT)filter[j+1] * (in[j+1][1] + in[12-j-1][1]);
65
5.13M
        }
66
67
#if USE_FIXED
68
        re_op = (re_op + 0x40000000) >> 31;
69
        im_op = (im_op + 0x40000000) >> 31;
70
#endif /* USE_FIXED */
71
72
1.71M
        out[ reverse][i][0] = (INTFLOAT)(re_in + re_op);
73
1.71M
        out[ reverse][i][1] = (INTFLOAT)(im_in + im_op);
74
1.71M
        out[!reverse][i][0] = (INTFLOAT)(re_in - re_op);
75
1.71M
        out[!reverse][i][1] = (INTFLOAT)(im_in - im_op);
76
1.71M
    }
77
53.4k
}
aacps_fixed.c:hybrid2_re
Line
Count
Source
55
21.9k
{
56
21.9k
    int i, j;
57
723k
    for (i = 0; i < len; i++, in++) {
58
701k
        INT64FLOAT re_in = AAC_MUL31(filter[6], in[6][0]); //real inphase
59
701k
        INT64FLOAT re_op = 0.0f;                          //real out of phase
60
701k
        INT64FLOAT im_in = AAC_MUL31(filter[6], in[6][1]); //imag inphase
61
701k
        INT64FLOAT im_op = 0.0f;                          //imag out of phase
62
2.80M
        for (j = 0; j < 6; j += 2) {
63
2.10M
            re_op += (INT64FLOAT)filter[j+1] * (in[j+1][0] + in[12-j-1][0]);
64
2.10M
            im_op += (INT64FLOAT)filter[j+1] * (in[j+1][1] + in[12-j-1][1]);
65
2.10M
        }
66
67
701k
#if USE_FIXED
68
701k
        re_op = (re_op + 0x40000000) >> 31;
69
701k
        im_op = (im_op + 0x40000000) >> 31;
70
701k
#endif /* USE_FIXED */
71
72
701k
        out[ reverse][i][0] = (INTFLOAT)(re_in + re_op);
73
701k
        out[ reverse][i][1] = (INTFLOAT)(im_in + im_op);
74
701k
        out[!reverse][i][0] = (INTFLOAT)(re_in - re_op);
75
701k
        out[!reverse][i][1] = (INTFLOAT)(im_in - im_op);
76
701k
    }
77
21.9k
}
aacps_float.c:hybrid2_re
Line
Count
Source
55
31.5k
{
56
31.5k
    int i, j;
57
1.04M
    for (i = 0; i < len; i++, in++) {
58
1.00M
        INT64FLOAT re_in = AAC_MUL31(filter[6], in[6][0]); //real inphase
59
1.00M
        INT64FLOAT re_op = 0.0f;                          //real out of phase
60
1.00M
        INT64FLOAT im_in = AAC_MUL31(filter[6], in[6][1]); //imag inphase
61
1.00M
        INT64FLOAT im_op = 0.0f;                          //imag out of phase
62
4.03M
        for (j = 0; j < 6; j += 2) {
63
3.02M
            re_op += (INT64FLOAT)filter[j+1] * (in[j+1][0] + in[12-j-1][0]);
64
3.02M
            im_op += (INT64FLOAT)filter[j+1] * (in[j+1][1] + in[12-j-1][1]);
65
3.02M
        }
66
67
#if USE_FIXED
68
        re_op = (re_op + 0x40000000) >> 31;
69
        im_op = (im_op + 0x40000000) >> 31;
70
#endif /* USE_FIXED */
71
72
1.00M
        out[ reverse][i][0] = (INTFLOAT)(re_in + re_op);
73
1.00M
        out[ reverse][i][1] = (INTFLOAT)(im_in + im_op);
74
1.00M
        out[!reverse][i][0] = (INTFLOAT)(re_in - re_op);
75
1.00M
        out[!reverse][i][1] = (INTFLOAT)(im_in - im_op);
76
1.00M
    }
77
31.5k
}
78
79
/** Split one subband into 6 subsubbands with a complex filter */
80
static void hybrid6_cx(PSDSPContext *dsp, INTFLOAT (*in)[2], INTFLOAT (*out)[32][2],
81
                       TABLE_CONST INTFLOAT (*filter)[8][2], int len)
82
26.7k
{
83
26.7k
    int i;
84
26.7k
    int N = 8;
85
26.7k
    LOCAL_ALIGNED_16(INTFLOAT, temp, [8], [2]);
86
87
882k
    for (i = 0; i < len; i++, in++) {
88
855k
        dsp->hybrid_analysis(temp, in, (const INTFLOAT (*)[8][2]) filter, 1, N);
89
855k
        out[0][i][0] = temp[6][0];
90
855k
        out[0][i][1] = temp[6][1];
91
855k
        out[1][i][0] = temp[7][0];
92
855k
        out[1][i][1] = temp[7][1];
93
855k
        out[2][i][0] = temp[0][0];
94
855k
        out[2][i][1] = temp[0][1];
95
855k
        out[3][i][0] = temp[1][0];
96
855k
        out[3][i][1] = temp[1][1];
97
855k
        out[4][i][0] = temp[2][0] + temp[5][0];
98
855k
        out[4][i][1] = temp[2][1] + temp[5][1];
99
855k
        out[5][i][0] = temp[3][0] + temp[4][0];
100
855k
        out[5][i][1] = temp[3][1] + temp[4][1];
101
855k
    }
102
26.7k
}
aacps_fixed.c:hybrid6_cx
Line
Count
Source
82
10.9k
{
83
10.9k
    int i;
84
10.9k
    int N = 8;
85
10.9k
    LOCAL_ALIGNED_16(INTFLOAT, temp, [8], [2]);
86
87
361k
    for (i = 0; i < len; i++, in++) {
88
350k
        dsp->hybrid_analysis(temp, in, (const INTFLOAT (*)[8][2]) filter, 1, N);
89
350k
        out[0][i][0] = temp[6][0];
90
350k
        out[0][i][1] = temp[6][1];
91
350k
        out[1][i][0] = temp[7][0];
92
350k
        out[1][i][1] = temp[7][1];
93
350k
        out[2][i][0] = temp[0][0];
94
350k
        out[2][i][1] = temp[0][1];
95
350k
        out[3][i][0] = temp[1][0];
96
350k
        out[3][i][1] = temp[1][1];
97
350k
        out[4][i][0] = temp[2][0] + temp[5][0];
98
350k
        out[4][i][1] = temp[2][1] + temp[5][1];
99
350k
        out[5][i][0] = temp[3][0] + temp[4][0];
100
350k
        out[5][i][1] = temp[3][1] + temp[4][1];
101
350k
    }
102
10.9k
}
aacps_float.c:hybrid6_cx
Line
Count
Source
82
15.7k
{
83
15.7k
    int i;
84
15.7k
    int N = 8;
85
15.7k
    LOCAL_ALIGNED_16(INTFLOAT, temp, [8], [2]);
86
87
520k
    for (i = 0; i < len; i++, in++) {
88
504k
        dsp->hybrid_analysis(temp, in, (const INTFLOAT (*)[8][2]) filter, 1, N);
89
504k
        out[0][i][0] = temp[6][0];
90
504k
        out[0][i][1] = temp[6][1];
91
504k
        out[1][i][0] = temp[7][0];
92
504k
        out[1][i][1] = temp[7][1];
93
504k
        out[2][i][0] = temp[0][0];
94
504k
        out[2][i][1] = temp[0][1];
95
504k
        out[3][i][0] = temp[1][0];
96
504k
        out[3][i][1] = temp[1][1];
97
504k
        out[4][i][0] = temp[2][0] + temp[5][0];
98
504k
        out[4][i][1] = temp[2][1] + temp[5][1];
99
504k
        out[5][i][0] = temp[3][0] + temp[4][0];
100
504k
        out[5][i][1] = temp[3][1] + temp[4][1];
101
504k
    }
102
15.7k
}
103
104
static void hybrid4_8_12_cx(PSDSPContext *dsp,
105
                            INTFLOAT (*in)[2], INTFLOAT (*out)[32][2],
106
                            TABLE_CONST INTFLOAT (*filter)[8][2], int N, int len)
107
78.1k
{
108
78.1k
    int i;
109
110
2.58M
    for (i = 0; i < len; i++, in++) {
111
2.50M
        dsp->hybrid_analysis(out[0] + i, in, (const INTFLOAT (*)[8][2]) filter, 32, N);
112
2.50M
    }
113
78.1k
}
aacps_fixed.c:hybrid4_8_12_cx
Line
Count
Source
107
59.1k
{
108
59.1k
    int i;
109
110
1.95M
    for (i = 0; i < len; i++, in++) {
111
1.89M
        dsp->hybrid_analysis(out[0] + i, in, (const INTFLOAT (*)[8][2]) filter, 32, N);
112
1.89M
    }
113
59.1k
}
aacps_float.c:hybrid4_8_12_cx
Line
Count
Source
107
19.0k
{
108
19.0k
    int i;
109
110
629k
    for (i = 0; i < len; i++, in++) {
111
610k
        dsp->hybrid_analysis(out[0] + i, in, (const INTFLOAT (*)[8][2]) filter, 32, N);
112
610k
    }
113
19.0k
}
114
115
static void hybrid_analysis(PSDSPContext *dsp, INTFLOAT out[91][32][2],
116
                            INTFLOAT in[5][44][2], INTFLOAT L[2][38][64],
117
                            int is34, int len)
118
42.3k
{
119
42.3k
    int i, j;
120
254k
    for (i = 0; i < 5; i++) {
121
8.26M
        for (j = 0; j < 38; j++) {
122
8.05M
            in[i][j+6][0] = L[0][j][i];
123
8.05M
            in[i][j+6][1] = L[1][j][i];
124
8.05M
        }
125
211k
    }
126
42.3k
    if (is34) {
127
15.6k
        hybrid4_8_12_cx(dsp, in[0], out,    f34_0_12, 12, len);
128
15.6k
        hybrid4_8_12_cx(dsp, in[1], out+12, f34_1_8,   8, len);
129
15.6k
        hybrid4_8_12_cx(dsp, in[2], out+20, f34_2_4,   4, len);
130
15.6k
        hybrid4_8_12_cx(dsp, in[3], out+24, f34_2_4,   4, len);
131
15.6k
        hybrid4_8_12_cx(dsp, in[4], out+28, f34_2_4,   4, len);
132
15.6k
        dsp->hybrid_analysis_ileave(out + 27, L, 5, len);
133
26.7k
    } else {
134
26.7k
        hybrid6_cx(dsp, in[0], out, f20_0_8, len);
135
26.7k
        hybrid2_re(in[1], out+6, g1_Q2, len, 1);
136
26.7k
        hybrid2_re(in[2], out+8, g1_Q2, len, 0);
137
26.7k
        dsp->hybrid_analysis_ileave(out + 7, L, 3, len);
138
26.7k
    }
139
    //update in_buf
140
254k
    for (i = 0; i < 5; i++) {
141
211k
        memcpy(in[i], in[i]+32, 6 * sizeof(in[i][0]));
142
211k
    }
143
42.3k
}
aacps_fixed.c:hybrid_analysis
Line
Count
Source
118
22.7k
{
119
22.7k
    int i, j;
120
136k
    for (i = 0; i < 5; i++) {
121
4.44M
        for (j = 0; j < 38; j++) {
122
4.32M
            in[i][j+6][0] = L[0][j][i];
123
4.32M
            in[i][j+6][1] = L[1][j][i];
124
4.32M
        }
125
113k
    }
126
22.7k
    if (is34) {
127
11.8k
        hybrid4_8_12_cx(dsp, in[0], out,    f34_0_12, 12, len);
128
11.8k
        hybrid4_8_12_cx(dsp, in[1], out+12, f34_1_8,   8, len);
129
11.8k
        hybrid4_8_12_cx(dsp, in[2], out+20, f34_2_4,   4, len);
130
11.8k
        hybrid4_8_12_cx(dsp, in[3], out+24, f34_2_4,   4, len);
131
11.8k
        hybrid4_8_12_cx(dsp, in[4], out+28, f34_2_4,   4, len);
132
11.8k
        dsp->hybrid_analysis_ileave(out + 27, L, 5, len);
133
11.8k
    } else {
134
10.9k
        hybrid6_cx(dsp, in[0], out, f20_0_8, len);
135
10.9k
        hybrid2_re(in[1], out+6, g1_Q2, len, 1);
136
10.9k
        hybrid2_re(in[2], out+8, g1_Q2, len, 0);
137
10.9k
        dsp->hybrid_analysis_ileave(out + 7, L, 3, len);
138
10.9k
    }
139
    //update in_buf
140
136k
    for (i = 0; i < 5; i++) {
141
113k
        memcpy(in[i], in[i]+32, 6 * sizeof(in[i][0]));
142
113k
    }
143
22.7k
}
aacps_float.c:hybrid_analysis
Line
Count
Source
118
19.5k
{
119
19.5k
    int i, j;
120
117k
    for (i = 0; i < 5; i++) {
121
3.81M
        for (j = 0; j < 38; j++) {
122
3.72M
            in[i][j+6][0] = L[0][j][i];
123
3.72M
            in[i][j+6][1] = L[1][j][i];
124
3.72M
        }
125
97.9k
    }
126
19.5k
    if (is34) {
127
3.81k
        hybrid4_8_12_cx(dsp, in[0], out,    f34_0_12, 12, len);
128
3.81k
        hybrid4_8_12_cx(dsp, in[1], out+12, f34_1_8,   8, len);
129
3.81k
        hybrid4_8_12_cx(dsp, in[2], out+20, f34_2_4,   4, len);
130
3.81k
        hybrid4_8_12_cx(dsp, in[3], out+24, f34_2_4,   4, len);
131
3.81k
        hybrid4_8_12_cx(dsp, in[4], out+28, f34_2_4,   4, len);
132
3.81k
        dsp->hybrid_analysis_ileave(out + 27, L, 5, len);
133
15.7k
    } else {
134
15.7k
        hybrid6_cx(dsp, in[0], out, f20_0_8, len);
135
15.7k
        hybrid2_re(in[1], out+6, g1_Q2, len, 1);
136
15.7k
        hybrid2_re(in[2], out+8, g1_Q2, len, 0);
137
15.7k
        dsp->hybrid_analysis_ileave(out + 7, L, 3, len);
138
15.7k
    }
139
    //update in_buf
140
117k
    for (i = 0; i < 5; i++) {
141
97.9k
        memcpy(in[i], in[i]+32, 6 * sizeof(in[i][0]));
142
97.9k
    }
143
19.5k
}
144
145
static void hybrid_synthesis(PSDSPContext *dsp, INTFLOAT out[2][38][64],
146
                             INTFLOAT in[91][32][2], int is34, int len)
147
84.7k
{
148
84.7k
    int i, n;
149
84.7k
    if (is34) {
150
1.03M
        for (n = 0; n < len; n++) {
151
1.00M
            memset(out[0][n], 0, 5*sizeof(out[0][n][0]));
152
1.00M
            memset(out[1][n], 0, 5*sizeof(out[1][n][0]));
153
13.0M
            for (i = 0; i < 12; i++) {
154
12.0M
                out[0][n][0] += (UINTFLOAT)in[   i][n][0];
155
12.0M
                out[1][n][0] += (UINTFLOAT)in[   i][n][1];
156
12.0M
            }
157
9.00M
            for (i = 0; i < 8; i++) {
158
8.00M
                out[0][n][1] += (UINTFLOAT)in[12+i][n][0];
159
8.00M
                out[1][n][1] += (UINTFLOAT)in[12+i][n][1];
160
8.00M
            }
161
5.00M
            for (i = 0; i < 4; i++) {
162
4.00M
                out[0][n][2] += (UINTFLOAT)in[20+i][n][0];
163
4.00M
                out[1][n][2] += (UINTFLOAT)in[20+i][n][1];
164
4.00M
                out[0][n][3] += (UINTFLOAT)in[24+i][n][0];
165
4.00M
                out[1][n][3] += (UINTFLOAT)in[24+i][n][1];
166
4.00M
                out[0][n][4] += (UINTFLOAT)in[28+i][n][0];
167
4.00M
                out[1][n][4] += (UINTFLOAT)in[28+i][n][1];
168
4.00M
            }
169
1.00M
        }
170
31.2k
        dsp->hybrid_synthesis_deint(out, in + 27, 5, len);
171
53.4k
    } else {
172
1.76M
        for (n = 0; n < len; n++) {
173
1.71M
            out[0][n][0] = (UINTFLOAT)in[0][n][0] + in[1][n][0] + in[2][n][0] +
174
1.71M
                           (UINTFLOAT)in[3][n][0] + in[4][n][0] + in[5][n][0];
175
1.71M
            out[1][n][0] = (UINTFLOAT)in[0][n][1] + in[1][n][1] + in[2][n][1] +
176
1.71M
                           (UINTFLOAT)in[3][n][1] + in[4][n][1] + in[5][n][1];
177
1.71M
            out[0][n][1] = (UINTFLOAT)in[6][n][0] + in[7][n][0];
178
1.71M
            out[1][n][1] = (UINTFLOAT)in[6][n][1] + in[7][n][1];
179
1.71M
            out[0][n][2] = (UINTFLOAT)in[8][n][0] + in[9][n][0];
180
1.71M
            out[1][n][2] = (UINTFLOAT)in[8][n][1] + in[9][n][1];
181
1.71M
        }
182
53.4k
        dsp->hybrid_synthesis_deint(out, in + 7, 3, len);
183
53.4k
    }
184
84.7k
}
aacps_fixed.c:hybrid_synthesis
Line
Count
Source
147
45.5k
{
148
45.5k
    int i, n;
149
45.5k
    if (is34) {
150
780k
        for (n = 0; n < len; n++) {
151
756k
            memset(out[0][n], 0, 5*sizeof(out[0][n][0]));
152
756k
            memset(out[1][n], 0, 5*sizeof(out[1][n][0]));
153
9.83M
            for (i = 0; i < 12; i++) {
154
9.07M
                out[0][n][0] += (UINTFLOAT)in[   i][n][0];
155
9.07M
                out[1][n][0] += (UINTFLOAT)in[   i][n][1];
156
9.07M
            }
157
6.80M
            for (i = 0; i < 8; i++) {
158
6.05M
                out[0][n][1] += (UINTFLOAT)in[12+i][n][0];
159
6.05M
                out[1][n][1] += (UINTFLOAT)in[12+i][n][1];
160
6.05M
            }
161
3.78M
            for (i = 0; i < 4; i++) {
162
3.02M
                out[0][n][2] += (UINTFLOAT)in[20+i][n][0];
163
3.02M
                out[1][n][2] += (UINTFLOAT)in[20+i][n][1];
164
3.02M
                out[0][n][3] += (UINTFLOAT)in[24+i][n][0];
165
3.02M
                out[1][n][3] += (UINTFLOAT)in[24+i][n][1];
166
3.02M
                out[0][n][4] += (UINTFLOAT)in[28+i][n][0];
167
3.02M
                out[1][n][4] += (UINTFLOAT)in[28+i][n][1];
168
3.02M
            }
169
756k
        }
170
23.6k
        dsp->hybrid_synthesis_deint(out, in + 27, 5, len);
171
23.6k
    } else {
172
723k
        for (n = 0; n < len; n++) {
173
701k
            out[0][n][0] = (UINTFLOAT)in[0][n][0] + in[1][n][0] + in[2][n][0] +
174
701k
                           (UINTFLOAT)in[3][n][0] + in[4][n][0] + in[5][n][0];
175
701k
            out[1][n][0] = (UINTFLOAT)in[0][n][1] + in[1][n][1] + in[2][n][1] +
176
701k
                           (UINTFLOAT)in[3][n][1] + in[4][n][1] + in[5][n][1];
177
701k
            out[0][n][1] = (UINTFLOAT)in[6][n][0] + in[7][n][0];
178
701k
            out[1][n][1] = (UINTFLOAT)in[6][n][1] + in[7][n][1];
179
701k
            out[0][n][2] = (UINTFLOAT)in[8][n][0] + in[9][n][0];
180
701k
            out[1][n][2] = (UINTFLOAT)in[8][n][1] + in[9][n][1];
181
701k
        }
182
21.9k
        dsp->hybrid_synthesis_deint(out, in + 7, 3, len);
183
21.9k
    }
184
45.5k
}
aacps_float.c:hybrid_synthesis
Line
Count
Source
147
39.1k
{
148
39.1k
    int i, n;
149
39.1k
    if (is34) {
150
251k
        for (n = 0; n < len; n++) {
151
244k
            memset(out[0][n], 0, 5*sizeof(out[0][n][0]));
152
244k
            memset(out[1][n], 0, 5*sizeof(out[1][n][0]));
153
3.17M
            for (i = 0; i < 12; i++) {
154
2.93M
                out[0][n][0] += (UINTFLOAT)in[   i][n][0];
155
2.93M
                out[1][n][0] += (UINTFLOAT)in[   i][n][1];
156
2.93M
            }
157
2.19M
            for (i = 0; i < 8; i++) {
158
1.95M
                out[0][n][1] += (UINTFLOAT)in[12+i][n][0];
159
1.95M
                out[1][n][1] += (UINTFLOAT)in[12+i][n][1];
160
1.95M
            }
161
1.22M
            for (i = 0; i < 4; i++) {
162
976k
                out[0][n][2] += (UINTFLOAT)in[20+i][n][0];
163
976k
                out[1][n][2] += (UINTFLOAT)in[20+i][n][1];
164
976k
                out[0][n][3] += (UINTFLOAT)in[24+i][n][0];
165
976k
                out[1][n][3] += (UINTFLOAT)in[24+i][n][1];
166
976k
                out[0][n][4] += (UINTFLOAT)in[28+i][n][0];
167
976k
                out[1][n][4] += (UINTFLOAT)in[28+i][n][1];
168
976k
            }
169
244k
        }
170
7.63k
        dsp->hybrid_synthesis_deint(out, in + 27, 5, len);
171
31.5k
    } else {
172
1.04M
        for (n = 0; n < len; n++) {
173
1.00M
            out[0][n][0] = (UINTFLOAT)in[0][n][0] + in[1][n][0] + in[2][n][0] +
174
1.00M
                           (UINTFLOAT)in[3][n][0] + in[4][n][0] + in[5][n][0];
175
1.00M
            out[1][n][0] = (UINTFLOAT)in[0][n][1] + in[1][n][1] + in[2][n][1] +
176
1.00M
                           (UINTFLOAT)in[3][n][1] + in[4][n][1] + in[5][n][1];
177
1.00M
            out[0][n][1] = (UINTFLOAT)in[6][n][0] + in[7][n][0];
178
1.00M
            out[1][n][1] = (UINTFLOAT)in[6][n][1] + in[7][n][1];
179
1.00M
            out[0][n][2] = (UINTFLOAT)in[8][n][0] + in[9][n][0];
180
1.00M
            out[1][n][2] = (UINTFLOAT)in[8][n][1] + in[9][n][1];
181
1.00M
        }
182
31.5k
        dsp->hybrid_synthesis_deint(out, in + 7, 3, len);
183
31.5k
    }
184
39.1k
}
185
186
/// All-pass filter decay slope
187
1.07M
#define DECAY_SLOPE      Q30(0.05f)
188
/// Number of frequency bands that can be addressed by the parameter index, b(k)
189
static const int   NR_PAR_BANDS[]      = { 20, 34 };
190
static const int   NR_IPDOPD_BANDS[]   = { 11, 17 };
191
/// Number of frequency bands that can be addressed by the sub subband index, k
192
static const int   NR_BANDS[]          = { 71, 91 };
193
/// Start frequency band for the all-pass filter decay slope
194
static const int   DECAY_CUTOFF[]      = { 10, 32 };
195
/// Number of all-pass filer bands
196
static const int   NR_ALLPASS_BANDS[]  = { 30, 50 };
197
/// First stereo band using the short one sample delay
198
static const int   SHORT_DELAY_BAND[]  = { 42, 62 };
199
200
/** Table 8.46 */
201
static void map_idx_10_to_20(int8_t *par_mapped, const int8_t *par, int full)
202
54.5k
{
203
54.5k
    int b;
204
54.5k
    if (full)
205
41.2k
        b = 9;
206
13.3k
    else {
207
13.3k
        b = 4;
208
13.3k
        par_mapped[10] = 0;
209
13.3k
    }
210
533k
    for (; b >= 0; b--) {
211
479k
        par_mapped[2*b+1] = par_mapped[2*b] = par[b];
212
479k
    }
213
54.5k
}
aacps_fixed.c:map_idx_10_to_20
Line
Count
Source
202
32.0k
{
203
32.0k
    int b;
204
32.0k
    if (full)
205
23.7k
        b = 9;
206
8.35k
    else {
207
8.35k
        b = 4;
208
8.35k
        par_mapped[10] = 0;
209
8.35k
    }
210
311k
    for (; b >= 0; b--) {
211
279k
        par_mapped[2*b+1] = par_mapped[2*b] = par[b];
212
279k
    }
213
32.0k
}
aacps_float.c:map_idx_10_to_20
Line
Count
Source
202
22.4k
{
203
22.4k
    int b;
204
22.4k
    if (full)
205
17.4k
        b = 9;
206
5.01k
    else {
207
5.01k
        b = 4;
208
5.01k
        par_mapped[10] = 0;
209
5.01k
    }
210
222k
    for (; b >= 0; b--) {
211
199k
        par_mapped[2*b+1] = par_mapped[2*b] = par[b];
212
199k
    }
213
22.4k
}
214
215
static void map_idx_34_to_20(int8_t *par_mapped, const int8_t *par, int full)
216
14.2k
{
217
14.2k
    par_mapped[ 0] = (2*par[ 0] +   par[ 1]) / 3;
218
14.2k
    par_mapped[ 1] = (  par[ 1] + 2*par[ 2]) / 3;
219
14.2k
    par_mapped[ 2] = (2*par[ 3] +   par[ 4]) / 3;
220
14.2k
    par_mapped[ 3] = (  par[ 4] + 2*par[ 5]) / 3;
221
14.2k
    par_mapped[ 4] = (  par[ 6] +   par[ 7]) / 2;
222
14.2k
    par_mapped[ 5] = (  par[ 8] +   par[ 9]) / 2;
223
14.2k
    par_mapped[ 6] =    par[10];
224
14.2k
    par_mapped[ 7] =    par[11];
225
14.2k
    par_mapped[ 8] = (  par[12] +   par[13]) / 2;
226
14.2k
    par_mapped[ 9] = (  par[14] +   par[15]) / 2;
227
14.2k
    par_mapped[10] =    par[16];
228
14.2k
    if (full) {
229
5.84k
        par_mapped[11] =    par[17];
230
5.84k
        par_mapped[12] =    par[18];
231
5.84k
        par_mapped[13] =    par[19];
232
5.84k
        par_mapped[14] = (  par[20] +   par[21]) / 2;
233
5.84k
        par_mapped[15] = (  par[22] +   par[23]) / 2;
234
5.84k
        par_mapped[16] = (  par[24] +   par[25]) / 2;
235
5.84k
        par_mapped[17] = (  par[26] +   par[27]) / 2;
236
5.84k
        par_mapped[18] = (  par[28] +   par[29] +   par[30] +   par[31]) / 4;
237
5.84k
        par_mapped[19] = (  par[32] +   par[33]) / 2;
238
5.84k
    }
239
14.2k
}
aacps_fixed.c:map_idx_34_to_20
Line
Count
Source
216
12.1k
{
217
12.1k
    par_mapped[ 0] = (2*par[ 0] +   par[ 1]) / 3;
218
12.1k
    par_mapped[ 1] = (  par[ 1] + 2*par[ 2]) / 3;
219
12.1k
    par_mapped[ 2] = (2*par[ 3] +   par[ 4]) / 3;
220
12.1k
    par_mapped[ 3] = (  par[ 4] + 2*par[ 5]) / 3;
221
12.1k
    par_mapped[ 4] = (  par[ 6] +   par[ 7]) / 2;
222
12.1k
    par_mapped[ 5] = (  par[ 8] +   par[ 9]) / 2;
223
12.1k
    par_mapped[ 6] =    par[10];
224
12.1k
    par_mapped[ 7] =    par[11];
225
12.1k
    par_mapped[ 8] = (  par[12] +   par[13]) / 2;
226
12.1k
    par_mapped[ 9] = (  par[14] +   par[15]) / 2;
227
12.1k
    par_mapped[10] =    par[16];
228
12.1k
    if (full) {
229
4.18k
        par_mapped[11] =    par[17];
230
4.18k
        par_mapped[12] =    par[18];
231
4.18k
        par_mapped[13] =    par[19];
232
4.18k
        par_mapped[14] = (  par[20] +   par[21]) / 2;
233
4.18k
        par_mapped[15] = (  par[22] +   par[23]) / 2;
234
4.18k
        par_mapped[16] = (  par[24] +   par[25]) / 2;
235
4.18k
        par_mapped[17] = (  par[26] +   par[27]) / 2;
236
4.18k
        par_mapped[18] = (  par[28] +   par[29] +   par[30] +   par[31]) / 4;
237
4.18k
        par_mapped[19] = (  par[32] +   par[33]) / 2;
238
4.18k
    }
239
12.1k
}
aacps_float.c:map_idx_34_to_20
Line
Count
Source
216
2.09k
{
217
2.09k
    par_mapped[ 0] = (2*par[ 0] +   par[ 1]) / 3;
218
2.09k
    par_mapped[ 1] = (  par[ 1] + 2*par[ 2]) / 3;
219
2.09k
    par_mapped[ 2] = (2*par[ 3] +   par[ 4]) / 3;
220
2.09k
    par_mapped[ 3] = (  par[ 4] + 2*par[ 5]) / 3;
221
2.09k
    par_mapped[ 4] = (  par[ 6] +   par[ 7]) / 2;
222
2.09k
    par_mapped[ 5] = (  par[ 8] +   par[ 9]) / 2;
223
2.09k
    par_mapped[ 6] =    par[10];
224
2.09k
    par_mapped[ 7] =    par[11];
225
2.09k
    par_mapped[ 8] = (  par[12] +   par[13]) / 2;
226
2.09k
    par_mapped[ 9] = (  par[14] +   par[15]) / 2;
227
2.09k
    par_mapped[10] =    par[16];
228
2.09k
    if (full) {
229
1.66k
        par_mapped[11] =    par[17];
230
1.66k
        par_mapped[12] =    par[18];
231
1.66k
        par_mapped[13] =    par[19];
232
1.66k
        par_mapped[14] = (  par[20] +   par[21]) / 2;
233
1.66k
        par_mapped[15] = (  par[22] +   par[23]) / 2;
234
1.66k
        par_mapped[16] = (  par[24] +   par[25]) / 2;
235
1.66k
        par_mapped[17] = (  par[26] +   par[27]) / 2;
236
1.66k
        par_mapped[18] = (  par[28] +   par[29] +   par[30] +   par[31]) / 4;
237
1.66k
        par_mapped[19] = (  par[32] +   par[33]) / 2;
238
1.66k
    }
239
2.09k
}
240
241
static void map_val_34_to_20(INTFLOAT par[PS_MAX_NR_IIDICC])
242
22.3k
{
243
#if USE_FIXED
244
    par[ 0] = (int)(((int64_t)(par[ 0] + (unsigned)(par[ 1]>>1)) * 1431655765 + \
245
                      0x40000000) >> 31);
246
    par[ 1] = (int)(((int64_t)((par[ 1]>>1) + (unsigned)par[ 2]) * 1431655765 + \
247
                      0x40000000) >> 31);
248
    par[ 2] = (int)(((int64_t)(par[ 3] + (unsigned)(par[ 4]>>1)) * 1431655765 + \
249
                      0x40000000) >> 31);
250
    par[ 3] = (int)(((int64_t)((par[ 4]>>1) + (unsigned)par[ 5]) * 1431655765 + \
251
                      0x40000000) >> 31);
252
#else
253
    par[ 0] = (2*par[ 0] +   par[ 1]) * 0.33333333f;
254
    par[ 1] = (  par[ 1] + 2*par[ 2]) * 0.33333333f;
255
    par[ 2] = (2*par[ 3] +   par[ 4]) * 0.33333333f;
256
    par[ 3] = (  par[ 4] + 2*par[ 5]) * 0.33333333f;
257
#endif /* USE_FIXED */
258
22.3k
    par[ 4] = AAC_HALF_SUM(par[ 6], par[ 7]);
259
22.3k
    par[ 5] = AAC_HALF_SUM(par[ 8], par[ 9]);
260
22.3k
    par[ 6] =    par[10];
261
22.3k
    par[ 7] =    par[11];
262
22.3k
    par[ 8] = AAC_HALF_SUM(par[12], par[13]);
263
22.3k
    par[ 9] = AAC_HALF_SUM(par[14], par[15]);
264
22.3k
    par[10] =    par[16];
265
22.3k
    par[11] =    par[17];
266
22.3k
    par[12] =    par[18];
267
22.3k
    par[13] =    par[19];
268
22.3k
    par[14] = AAC_HALF_SUM(par[20], par[21]);
269
22.3k
    par[15] = AAC_HALF_SUM(par[22], par[23]);
270
22.3k
    par[16] = AAC_HALF_SUM(par[24], par[25]);
271
22.3k
    par[17] = AAC_HALF_SUM(par[26], par[27]);
272
#if USE_FIXED
273
    par[18] = (((par[28]+2)>>2) + ((par[29]+2)>>2) + ((par[30]+2)>>2) + ((par[31]+2)>>2));
274
#else
275
    par[18] = (  par[28] +   par[29] +   par[30] +   par[31]) * 0.25f;
276
#endif /* USE_FIXED */
277
22.3k
    par[19] = AAC_HALF_SUM(par[32], par[33]);
278
22.3k
}
aacps_fixed.c:map_val_34_to_20
Line
Count
Source
242
18.2k
{
243
18.2k
#if USE_FIXED
244
18.2k
    par[ 0] = (int)(((int64_t)(par[ 0] + (unsigned)(par[ 1]>>1)) * 1431655765 + \
245
18.2k
                      0x40000000) >> 31);
246
18.2k
    par[ 1] = (int)(((int64_t)((par[ 1]>>1) + (unsigned)par[ 2]) * 1431655765 + \
247
18.2k
                      0x40000000) >> 31);
248
18.2k
    par[ 2] = (int)(((int64_t)(par[ 3] + (unsigned)(par[ 4]>>1)) * 1431655765 + \
249
18.2k
                      0x40000000) >> 31);
250
18.2k
    par[ 3] = (int)(((int64_t)((par[ 4]>>1) + (unsigned)par[ 5]) * 1431655765 + \
251
18.2k
                      0x40000000) >> 31);
252
#else
253
    par[ 0] = (2*par[ 0] +   par[ 1]) * 0.33333333f;
254
    par[ 1] = (  par[ 1] + 2*par[ 2]) * 0.33333333f;
255
    par[ 2] = (2*par[ 3] +   par[ 4]) * 0.33333333f;
256
    par[ 3] = (  par[ 4] + 2*par[ 5]) * 0.33333333f;
257
#endif /* USE_FIXED */
258
18.2k
    par[ 4] = AAC_HALF_SUM(par[ 6], par[ 7]);
259
18.2k
    par[ 5] = AAC_HALF_SUM(par[ 8], par[ 9]);
260
18.2k
    par[ 6] =    par[10];
261
18.2k
    par[ 7] =    par[11];
262
18.2k
    par[ 8] = AAC_HALF_SUM(par[12], par[13]);
263
18.2k
    par[ 9] = AAC_HALF_SUM(par[14], par[15]);
264
18.2k
    par[10] =    par[16];
265
18.2k
    par[11] =    par[17];
266
18.2k
    par[12] =    par[18];
267
18.2k
    par[13] =    par[19];
268
18.2k
    par[14] = AAC_HALF_SUM(par[20], par[21]);
269
18.2k
    par[15] = AAC_HALF_SUM(par[22], par[23]);
270
18.2k
    par[16] = AAC_HALF_SUM(par[24], par[25]);
271
18.2k
    par[17] = AAC_HALF_SUM(par[26], par[27]);
272
18.2k
#if USE_FIXED
273
18.2k
    par[18] = (((par[28]+2)>>2) + ((par[29]+2)>>2) + ((par[30]+2)>>2) + ((par[31]+2)>>2));
274
#else
275
    par[18] = (  par[28] +   par[29] +   par[30] +   par[31]) * 0.25f;
276
#endif /* USE_FIXED */
277
18.2k
    par[19] = AAC_HALF_SUM(par[32], par[33]);
278
18.2k
}
aacps_float.c:map_val_34_to_20
Line
Count
Source
242
4.04k
{
243
#if USE_FIXED
244
    par[ 0] = (int)(((int64_t)(par[ 0] + (unsigned)(par[ 1]>>1)) * 1431655765 + \
245
                      0x40000000) >> 31);
246
    par[ 1] = (int)(((int64_t)((par[ 1]>>1) + (unsigned)par[ 2]) * 1431655765 + \
247
                      0x40000000) >> 31);
248
    par[ 2] = (int)(((int64_t)(par[ 3] + (unsigned)(par[ 4]>>1)) * 1431655765 + \
249
                      0x40000000) >> 31);
250
    par[ 3] = (int)(((int64_t)((par[ 4]>>1) + (unsigned)par[ 5]) * 1431655765 + \
251
                      0x40000000) >> 31);
252
#else
253
4.04k
    par[ 0] = (2*par[ 0] +   par[ 1]) * 0.33333333f;
254
4.04k
    par[ 1] = (  par[ 1] + 2*par[ 2]) * 0.33333333f;
255
4.04k
    par[ 2] = (2*par[ 3] +   par[ 4]) * 0.33333333f;
256
4.04k
    par[ 3] = (  par[ 4] + 2*par[ 5]) * 0.33333333f;
257
4.04k
#endif /* USE_FIXED */
258
4.04k
    par[ 4] = AAC_HALF_SUM(par[ 6], par[ 7]);
259
4.04k
    par[ 5] = AAC_HALF_SUM(par[ 8], par[ 9]);
260
4.04k
    par[ 6] =    par[10];
261
4.04k
    par[ 7] =    par[11];
262
4.04k
    par[ 8] = AAC_HALF_SUM(par[12], par[13]);
263
4.04k
    par[ 9] = AAC_HALF_SUM(par[14], par[15]);
264
4.04k
    par[10] =    par[16];
265
4.04k
    par[11] =    par[17];
266
4.04k
    par[12] =    par[18];
267
4.04k
    par[13] =    par[19];
268
4.04k
    par[14] = AAC_HALF_SUM(par[20], par[21]);
269
4.04k
    par[15] = AAC_HALF_SUM(par[22], par[23]);
270
4.04k
    par[16] = AAC_HALF_SUM(par[24], par[25]);
271
4.04k
    par[17] = AAC_HALF_SUM(par[26], par[27]);
272
#if USE_FIXED
273
    par[18] = (((par[28]+2)>>2) + ((par[29]+2)>>2) + ((par[30]+2)>>2) + ((par[31]+2)>>2));
274
#else
275
4.04k
    par[18] = (  par[28] +   par[29] +   par[30] +   par[31]) * 0.25f;
276
4.04k
#endif /* USE_FIXED */
277
4.04k
    par[19] = AAC_HALF_SUM(par[32], par[33]);
278
4.04k
}
279
280
static void map_idx_10_to_34(int8_t *par_mapped, const int8_t *par, int full)
281
23.3k
{
282
23.3k
    if (full) {
283
17.2k
        par_mapped[33] = par[9];
284
17.2k
        par_mapped[32] = par[9];
285
17.2k
        par_mapped[31] = par[9];
286
17.2k
        par_mapped[30] = par[9];
287
17.2k
        par_mapped[29] = par[9];
288
17.2k
        par_mapped[28] = par[9];
289
17.2k
        par_mapped[27] = par[8];
290
17.2k
        par_mapped[26] = par[8];
291
17.2k
        par_mapped[25] = par[8];
292
17.2k
        par_mapped[24] = par[8];
293
17.2k
        par_mapped[23] = par[7];
294
17.2k
        par_mapped[22] = par[7];
295
17.2k
        par_mapped[21] = par[7];
296
17.2k
        par_mapped[20] = par[7];
297
17.2k
        par_mapped[19] = par[6];
298
17.2k
        par_mapped[18] = par[6];
299
17.2k
        par_mapped[17] = par[5];
300
17.2k
        par_mapped[16] = par[5];
301
17.2k
    } else {
302
6.08k
        par_mapped[16] =      0;
303
6.08k
    }
304
23.3k
    par_mapped[15] = par[4];
305
23.3k
    par_mapped[14] = par[4];
306
23.3k
    par_mapped[13] = par[4];
307
23.3k
    par_mapped[12] = par[4];
308
23.3k
    par_mapped[11] = par[3];
309
23.3k
    par_mapped[10] = par[3];
310
23.3k
    par_mapped[ 9] = par[2];
311
23.3k
    par_mapped[ 8] = par[2];
312
23.3k
    par_mapped[ 7] = par[2];
313
23.3k
    par_mapped[ 6] = par[2];
314
23.3k
    par_mapped[ 5] = par[1];
315
23.3k
    par_mapped[ 4] = par[1];
316
23.3k
    par_mapped[ 3] = par[1];
317
23.3k
    par_mapped[ 2] = par[0];
318
23.3k
    par_mapped[ 1] = par[0];
319
23.3k
    par_mapped[ 0] = par[0];
320
23.3k
}
aacps_fixed.c:map_idx_10_to_34
Line
Count
Source
281
14.4k
{
282
14.4k
    if (full) {
283
11.6k
        par_mapped[33] = par[9];
284
11.6k
        par_mapped[32] = par[9];
285
11.6k
        par_mapped[31] = par[9];
286
11.6k
        par_mapped[30] = par[9];
287
11.6k
        par_mapped[29] = par[9];
288
11.6k
        par_mapped[28] = par[9];
289
11.6k
        par_mapped[27] = par[8];
290
11.6k
        par_mapped[26] = par[8];
291
11.6k
        par_mapped[25] = par[8];
292
11.6k
        par_mapped[24] = par[8];
293
11.6k
        par_mapped[23] = par[7];
294
11.6k
        par_mapped[22] = par[7];
295
11.6k
        par_mapped[21] = par[7];
296
11.6k
        par_mapped[20] = par[7];
297
11.6k
        par_mapped[19] = par[6];
298
11.6k
        par_mapped[18] = par[6];
299
11.6k
        par_mapped[17] = par[5];
300
11.6k
        par_mapped[16] = par[5];
301
11.6k
    } else {
302
2.74k
        par_mapped[16] =      0;
303
2.74k
    }
304
14.4k
    par_mapped[15] = par[4];
305
14.4k
    par_mapped[14] = par[4];
306
14.4k
    par_mapped[13] = par[4];
307
14.4k
    par_mapped[12] = par[4];
308
14.4k
    par_mapped[11] = par[3];
309
14.4k
    par_mapped[10] = par[3];
310
14.4k
    par_mapped[ 9] = par[2];
311
14.4k
    par_mapped[ 8] = par[2];
312
14.4k
    par_mapped[ 7] = par[2];
313
14.4k
    par_mapped[ 6] = par[2];
314
14.4k
    par_mapped[ 5] = par[1];
315
14.4k
    par_mapped[ 4] = par[1];
316
14.4k
    par_mapped[ 3] = par[1];
317
14.4k
    par_mapped[ 2] = par[0];
318
14.4k
    par_mapped[ 1] = par[0];
319
14.4k
    par_mapped[ 0] = par[0];
320
14.4k
}
aacps_float.c:map_idx_10_to_34
Line
Count
Source
281
8.91k
{
282
8.91k
    if (full) {
283
5.57k
        par_mapped[33] = par[9];
284
5.57k
        par_mapped[32] = par[9];
285
5.57k
        par_mapped[31] = par[9];
286
5.57k
        par_mapped[30] = par[9];
287
5.57k
        par_mapped[29] = par[9];
288
5.57k
        par_mapped[28] = par[9];
289
5.57k
        par_mapped[27] = par[8];
290
5.57k
        par_mapped[26] = par[8];
291
5.57k
        par_mapped[25] = par[8];
292
5.57k
        par_mapped[24] = par[8];
293
5.57k
        par_mapped[23] = par[7];
294
5.57k
        par_mapped[22] = par[7];
295
5.57k
        par_mapped[21] = par[7];
296
5.57k
        par_mapped[20] = par[7];
297
5.57k
        par_mapped[19] = par[6];
298
5.57k
        par_mapped[18] = par[6];
299
5.57k
        par_mapped[17] = par[5];
300
5.57k
        par_mapped[16] = par[5];
301
5.57k
    } else {
302
3.33k
        par_mapped[16] =      0;
303
3.33k
    }
304
8.91k
    par_mapped[15] = par[4];
305
8.91k
    par_mapped[14] = par[4];
306
8.91k
    par_mapped[13] = par[4];
307
8.91k
    par_mapped[12] = par[4];
308
8.91k
    par_mapped[11] = par[3];
309
8.91k
    par_mapped[10] = par[3];
310
8.91k
    par_mapped[ 9] = par[2];
311
8.91k
    par_mapped[ 8] = par[2];
312
8.91k
    par_mapped[ 7] = par[2];
313
8.91k
    par_mapped[ 6] = par[2];
314
8.91k
    par_mapped[ 5] = par[1];
315
8.91k
    par_mapped[ 4] = par[1];
316
8.91k
    par_mapped[ 3] = par[1];
317
8.91k
    par_mapped[ 2] = par[0];
318
8.91k
    par_mapped[ 1] = par[0];
319
8.91k
    par_mapped[ 0] = par[0];
320
8.91k
}
321
322
static void map_idx_20_to_34(int8_t *par_mapped, const int8_t *par, int full)
323
15.0k
{
324
15.0k
    if (full) {
325
8.50k
        par_mapped[33] =  par[19];
326
8.50k
        par_mapped[32] =  par[19];
327
8.50k
        par_mapped[31] =  par[18];
328
8.50k
        par_mapped[30] =  par[18];
329
8.50k
        par_mapped[29] =  par[18];
330
8.50k
        par_mapped[28] =  par[18];
331
8.50k
        par_mapped[27] =  par[17];
332
8.50k
        par_mapped[26] =  par[17];
333
8.50k
        par_mapped[25] =  par[16];
334
8.50k
        par_mapped[24] =  par[16];
335
8.50k
        par_mapped[23] =  par[15];
336
8.50k
        par_mapped[22] =  par[15];
337
8.50k
        par_mapped[21] =  par[14];
338
8.50k
        par_mapped[20] =  par[14];
339
8.50k
        par_mapped[19] =  par[13];
340
8.50k
        par_mapped[18] =  par[12];
341
8.50k
        par_mapped[17] =  par[11];
342
8.50k
    }
343
15.0k
    par_mapped[16] =  par[10];
344
15.0k
    par_mapped[15] =  par[ 9];
345
15.0k
    par_mapped[14] =  par[ 9];
346
15.0k
    par_mapped[13] =  par[ 8];
347
15.0k
    par_mapped[12] =  par[ 8];
348
15.0k
    par_mapped[11] =  par[ 7];
349
15.0k
    par_mapped[10] =  par[ 6];
350
15.0k
    par_mapped[ 9] =  par[ 5];
351
15.0k
    par_mapped[ 8] =  par[ 5];
352
15.0k
    par_mapped[ 7] =  par[ 4];
353
15.0k
    par_mapped[ 6] =  par[ 4];
354
15.0k
    par_mapped[ 5] =  par[ 3];
355
15.0k
    par_mapped[ 4] = (par[ 2] + par[ 3]) / 2;
356
15.0k
    par_mapped[ 3] =  par[ 2];
357
15.0k
    par_mapped[ 2] =  par[ 1];
358
15.0k
    par_mapped[ 1] = (par[ 0] + par[ 1]) / 2;
359
15.0k
    par_mapped[ 0] =  par[ 0];
360
15.0k
}
aacps_fixed.c:map_idx_20_to_34
Line
Count
Source
323
8.14k
{
324
8.14k
    if (full) {
325
6.17k
        par_mapped[33] =  par[19];
326
6.17k
        par_mapped[32] =  par[19];
327
6.17k
        par_mapped[31] =  par[18];
328
6.17k
        par_mapped[30] =  par[18];
329
6.17k
        par_mapped[29] =  par[18];
330
6.17k
        par_mapped[28] =  par[18];
331
6.17k
        par_mapped[27] =  par[17];
332
6.17k
        par_mapped[26] =  par[17];
333
6.17k
        par_mapped[25] =  par[16];
334
6.17k
        par_mapped[24] =  par[16];
335
6.17k
        par_mapped[23] =  par[15];
336
6.17k
        par_mapped[22] =  par[15];
337
6.17k
        par_mapped[21] =  par[14];
338
6.17k
        par_mapped[20] =  par[14];
339
6.17k
        par_mapped[19] =  par[13];
340
6.17k
        par_mapped[18] =  par[12];
341
6.17k
        par_mapped[17] =  par[11];
342
6.17k
    }
343
8.14k
    par_mapped[16] =  par[10];
344
8.14k
    par_mapped[15] =  par[ 9];
345
8.14k
    par_mapped[14] =  par[ 9];
346
8.14k
    par_mapped[13] =  par[ 8];
347
8.14k
    par_mapped[12] =  par[ 8];
348
8.14k
    par_mapped[11] =  par[ 7];
349
8.14k
    par_mapped[10] =  par[ 6];
350
8.14k
    par_mapped[ 9] =  par[ 5];
351
8.14k
    par_mapped[ 8] =  par[ 5];
352
8.14k
    par_mapped[ 7] =  par[ 4];
353
8.14k
    par_mapped[ 6] =  par[ 4];
354
8.14k
    par_mapped[ 5] =  par[ 3];
355
8.14k
    par_mapped[ 4] = (par[ 2] + par[ 3]) / 2;
356
8.14k
    par_mapped[ 3] =  par[ 2];
357
8.14k
    par_mapped[ 2] =  par[ 1];
358
8.14k
    par_mapped[ 1] = (par[ 0] + par[ 1]) / 2;
359
8.14k
    par_mapped[ 0] =  par[ 0];
360
8.14k
}
aacps_float.c:map_idx_20_to_34
Line
Count
Source
323
6.90k
{
324
6.90k
    if (full) {
325
2.32k
        par_mapped[33] =  par[19];
326
2.32k
        par_mapped[32] =  par[19];
327
2.32k
        par_mapped[31] =  par[18];
328
2.32k
        par_mapped[30] =  par[18];
329
2.32k
        par_mapped[29] =  par[18];
330
2.32k
        par_mapped[28] =  par[18];
331
2.32k
        par_mapped[27] =  par[17];
332
2.32k
        par_mapped[26] =  par[17];
333
2.32k
        par_mapped[25] =  par[16];
334
2.32k
        par_mapped[24] =  par[16];
335
2.32k
        par_mapped[23] =  par[15];
336
2.32k
        par_mapped[22] =  par[15];
337
2.32k
        par_mapped[21] =  par[14];
338
2.32k
        par_mapped[20] =  par[14];
339
2.32k
        par_mapped[19] =  par[13];
340
2.32k
        par_mapped[18] =  par[12];
341
2.32k
        par_mapped[17] =  par[11];
342
2.32k
    }
343
6.90k
    par_mapped[16] =  par[10];
344
6.90k
    par_mapped[15] =  par[ 9];
345
6.90k
    par_mapped[14] =  par[ 9];
346
6.90k
    par_mapped[13] =  par[ 8];
347
6.90k
    par_mapped[12] =  par[ 8];
348
6.90k
    par_mapped[11] =  par[ 7];
349
6.90k
    par_mapped[10] =  par[ 6];
350
6.90k
    par_mapped[ 9] =  par[ 5];
351
6.90k
    par_mapped[ 8] =  par[ 5];
352
6.90k
    par_mapped[ 7] =  par[ 4];
353
6.90k
    par_mapped[ 6] =  par[ 4];
354
6.90k
    par_mapped[ 5] =  par[ 3];
355
6.90k
    par_mapped[ 4] = (par[ 2] + par[ 3]) / 2;
356
6.90k
    par_mapped[ 3] =  par[ 2];
357
6.90k
    par_mapped[ 2] =  par[ 1];
358
6.90k
    par_mapped[ 1] = (par[ 0] + par[ 1]) / 2;
359
6.90k
    par_mapped[ 0] =  par[ 0];
360
6.90k
}
361
362
static void map_val_20_to_34(INTFLOAT par[PS_MAX_NR_IIDICC])
363
42.2k
{
364
42.2k
    par[33] =  par[19];
365
42.2k
    par[32] =  par[19];
366
42.2k
    par[31] =  par[18];
367
42.2k
    par[30] =  par[18];
368
42.2k
    par[29] =  par[18];
369
42.2k
    par[28] =  par[18];
370
42.2k
    par[27] =  par[17];
371
42.2k
    par[26] =  par[17];
372
42.2k
    par[25] =  par[16];
373
42.2k
    par[24] =  par[16];
374
42.2k
    par[23] =  par[15];
375
42.2k
    par[22] =  par[15];
376
42.2k
    par[21] =  par[14];
377
42.2k
    par[20] =  par[14];
378
42.2k
    par[19] =  par[13];
379
42.2k
    par[18] =  par[12];
380
42.2k
    par[17] =  par[11];
381
42.2k
    par[16] =  par[10];
382
42.2k
    par[15] =  par[ 9];
383
42.2k
    par[14] =  par[ 9];
384
42.2k
    par[13] =  par[ 8];
385
42.2k
    par[12] =  par[ 8];
386
42.2k
    par[11] =  par[ 7];
387
42.2k
    par[10] =  par[ 6];
388
42.2k
    par[ 9] =  par[ 5];
389
42.2k
    par[ 8] =  par[ 5];
390
42.2k
    par[ 7] =  par[ 4];
391
42.2k
    par[ 6] =  par[ 4];
392
42.2k
    par[ 5] =  par[ 3];
393
42.2k
    par[ 4] = AAC_HALF_SUM(par[ 2], par[ 3]);
394
42.2k
    par[ 3] =  par[ 2];
395
42.2k
    par[ 2] =  par[ 1];
396
42.2k
    par[ 1] = AAC_HALF_SUM(par[ 0], par[ 1]);
397
42.2k
}
aacps_fixed.c:map_val_20_to_34
Line
Count
Source
363
32.1k
{
364
32.1k
    par[33] =  par[19];
365
32.1k
    par[32] =  par[19];
366
32.1k
    par[31] =  par[18];
367
32.1k
    par[30] =  par[18];
368
32.1k
    par[29] =  par[18];
369
32.1k
    par[28] =  par[18];
370
32.1k
    par[27] =  par[17];
371
32.1k
    par[26] =  par[17];
372
32.1k
    par[25] =  par[16];
373
32.1k
    par[24] =  par[16];
374
32.1k
    par[23] =  par[15];
375
32.1k
    par[22] =  par[15];
376
32.1k
    par[21] =  par[14];
377
32.1k
    par[20] =  par[14];
378
32.1k
    par[19] =  par[13];
379
32.1k
    par[18] =  par[12];
380
32.1k
    par[17] =  par[11];
381
32.1k
    par[16] =  par[10];
382
32.1k
    par[15] =  par[ 9];
383
32.1k
    par[14] =  par[ 9];
384
32.1k
    par[13] =  par[ 8];
385
32.1k
    par[12] =  par[ 8];
386
32.1k
    par[11] =  par[ 7];
387
32.1k
    par[10] =  par[ 6];
388
32.1k
    par[ 9] =  par[ 5];
389
32.1k
    par[ 8] =  par[ 5];
390
32.1k
    par[ 7] =  par[ 4];
391
32.1k
    par[ 6] =  par[ 4];
392
32.1k
    par[ 5] =  par[ 3];
393
32.1k
    par[ 4] = AAC_HALF_SUM(par[ 2], par[ 3]);
394
32.1k
    par[ 3] =  par[ 2];
395
32.1k
    par[ 2] =  par[ 1];
396
32.1k
    par[ 1] = AAC_HALF_SUM(par[ 0], par[ 1]);
397
32.1k
}
aacps_float.c:map_val_20_to_34
Line
Count
Source
363
10.1k
{
364
10.1k
    par[33] =  par[19];
365
10.1k
    par[32] =  par[19];
366
10.1k
    par[31] =  par[18];
367
10.1k
    par[30] =  par[18];
368
10.1k
    par[29] =  par[18];
369
10.1k
    par[28] =  par[18];
370
10.1k
    par[27] =  par[17];
371
10.1k
    par[26] =  par[17];
372
10.1k
    par[25] =  par[16];
373
10.1k
    par[24] =  par[16];
374
10.1k
    par[23] =  par[15];
375
10.1k
    par[22] =  par[15];
376
10.1k
    par[21] =  par[14];
377
10.1k
    par[20] =  par[14];
378
10.1k
    par[19] =  par[13];
379
10.1k
    par[18] =  par[12];
380
10.1k
    par[17] =  par[11];
381
10.1k
    par[16] =  par[10];
382
10.1k
    par[15] =  par[ 9];
383
10.1k
    par[14] =  par[ 9];
384
10.1k
    par[13] =  par[ 8];
385
10.1k
    par[12] =  par[ 8];
386
10.1k
    par[11] =  par[ 7];
387
10.1k
    par[10] =  par[ 6];
388
10.1k
    par[ 9] =  par[ 5];
389
10.1k
    par[ 8] =  par[ 5];
390
10.1k
    par[ 7] =  par[ 4];
391
10.1k
    par[ 6] =  par[ 4];
392
10.1k
    par[ 5] =  par[ 3];
393
10.1k
    par[ 4] = AAC_HALF_SUM(par[ 2], par[ 3]);
394
10.1k
    par[ 3] =  par[ 2];
395
10.1k
    par[ 2] =  par[ 1];
396
10.1k
    par[ 1] = AAC_HALF_SUM(par[ 0], par[ 1]);
397
10.1k
}
398
399
static void decorrelation(PSContext *ps, INTFLOAT (*out)[32][2], const INTFLOAT (*s)[32][2], int is34)
400
42.3k
{
401
42.3k
    LOCAL_ALIGNED_16(INTFLOAT, power, [34], [PS_QMF_TIME_SLOTS]);
402
42.3k
    LOCAL_ALIGNED_16(INTFLOAT, transient_gain, [34], [PS_QMF_TIME_SLOTS]);
403
42.3k
    INTFLOAT *peak_decay_nrg = ps->peak_decay_nrg;
404
42.3k
    INTFLOAT *power_smooth = ps->power_smooth;
405
42.3k
    INTFLOAT *peak_decay_diff_smooth = ps->peak_decay_diff_smooth;
406
42.3k
    INTFLOAT (*delay)[PS_QMF_TIME_SLOTS + PS_MAX_DELAY][2] = ps->delay;
407
42.3k
    INTFLOAT (*ap_delay)[PS_AP_LINKS][PS_QMF_TIME_SLOTS + PS_MAX_AP_DELAY][2] = ps->ap_delay;
408
#if !USE_FIXED
409
    const float transient_impact  = 1.5f;
410
    const float a_smooth          = 0.25f; ///< Smoothing coefficient
411
#endif /* USE_FIXED */
412
42.3k
    const int8_t *const k_to_i = is34 ? ff_k_to_i_34 : ff_k_to_i_20;
413
42.3k
    int i, k, m, n;
414
42.3k
    int n0 = 0, nL = 32;
415
42.3k
    const INTFLOAT peak_decay_factor = Q31(0.76592833836465f);
416
417
42.3k
    memset(power, 0, 34 * sizeof(*power));
418
419
42.3k
    if (is34 != ps->common.is34bands_old) {
420
8.07k
        memset(ps->peak_decay_nrg,         0, sizeof(ps->peak_decay_nrg));
421
8.07k
        memset(ps->power_smooth,           0, sizeof(ps->power_smooth));
422
8.07k
        memset(ps->peak_decay_diff_smooth, 0, sizeof(ps->peak_decay_diff_smooth));
423
8.07k
        memset(ps->delay,                  0, sizeof(ps->delay));
424
8.07k
        memset(ps->ap_delay,               0, sizeof(ps->ap_delay));
425
8.07k
    }
426
427
3.36M
    for (k = 0; k < NR_BANDS[is34]; k++) {
428
3.32M
        int i = k_to_i[k];
429
3.32M
        ps->dsp.add_squares(power[i], s[k], nL - n0);
430
3.32M
    }
431
432
    //Transient detection
433
#if USE_FIXED
434
644k
    for (i = 0; i < NR_PAR_BANDS[is34]; i++) {
435
20.5M
        for (n = n0; n < nL; n++) {
436
19.8M
            int decayed_peak;
437
19.8M
            decayed_peak = (int)(((int64_t)peak_decay_factor * \
438
19.8M
                                           peak_decay_nrg[i] + 0x40000000) >> 31);
439
19.8M
            peak_decay_nrg[i] = FFMAX(decayed_peak, power[i][n]);
440
19.8M
            power_smooth[i] += (power[i][n] + 2LL - power_smooth[i]) >> 2;
441
19.8M
            peak_decay_diff_smooth[i] += (peak_decay_nrg[i] + 2LL - power[i][n] - \
442
19.8M
                                          peak_decay_diff_smooth[i]) >> 2;
443
444
19.8M
            if (peak_decay_diff_smooth[i]) {
445
5.32M
                transient_gain[i][n] = FFMIN(power_smooth[i]*43691LL / peak_decay_diff_smooth[i], 1<<16);
446
5.32M
            } else
447
14.5M
                transient_gain[i][n] = 1 << 16;
448
19.8M
        }
449
621k
    }
450
#else
451
464k
    for (i = 0; i < NR_PAR_BANDS[is34]; i++) {
452
14.6M
        for (n = n0; n < nL; n++) {
453
14.2M
            float decayed_peak = peak_decay_factor * peak_decay_nrg[i];
454
14.2M
            float denom;
455
14.2M
            peak_decay_nrg[i] = FFMAX(decayed_peak, power[i][n]);
456
14.2M
            power_smooth[i] += a_smooth * (power[i][n] - power_smooth[i]);
457
14.2M
            peak_decay_diff_smooth[i] += a_smooth * (peak_decay_nrg[i] - power[i][n] - peak_decay_diff_smooth[i]);
458
14.2M
            denom = transient_impact * peak_decay_diff_smooth[i];
459
14.2M
            transient_gain[i][n]   = (denom > power_smooth[i]) ?
460
11.2M
                                         power_smooth[i] / denom : 1.0f;
461
14.2M
        }
462
445k
    }
463
464
#endif /* USE_FIXED */
465
    //Decorrelation and transient reduction
466
    //                         PS_AP_LINKS - 1
467
    //                               -----
468
    //                                | |  Q_fract_allpass[k][m]*z^-link_delay[m] - a[m]*g_decay_slope[k]
469
    //H[k][z] = z^-2 * phi_fract[k] * | | ----------------------------------------------------------------
470
    //                                | | 1 - a[m]*g_decay_slope[k]*Q_fract_allpass[k][m]*z^-link_delay[m]
471
    //                               m = 0
472
    //d[k][z] (out) = transient_gain_mapped[k][z] * H[k][z] * s[k][z]
473
1.62M
    for (k = 0; k < NR_ALLPASS_BANDS[is34]; k++) {
474
1.58M
        int b = k_to_i[k];
475
#if USE_FIXED
476
        int g_decay_slope;
477
478
920k
        if (k - DECAY_CUTOFF[is34] <= 0) {
479
510k
          g_decay_slope = 1 << 30;
480
510k
        }
481
409k
        else if (k - DECAY_CUTOFF[is34] >= 20) {
482
0
          g_decay_slope = 0;
483
0
        }
484
409k
        else {
485
409k
          g_decay_slope = (1 << 30) - DECAY_SLOPE * (k - DECAY_CUTOFF[is34]);
486
409k
        }
487
#else
488
663k
        float g_decay_slope = 1.f - DECAY_SLOPE * (k - DECAY_CUTOFF[is34]);
489
663k
        g_decay_slope = av_clipf(g_decay_slope, 0.f, 1.f);
490
#endif /* USE_FIXED */
491
1.58M
        memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
492
1.58M
        memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
493
6.33M
        for (m = 0; m < PS_AP_LINKS; m++) {
494
4.75M
            memcpy(ap_delay[k][m],   ap_delay[k][m]+numQMFSlots,           5*sizeof(ap_delay[k][m][0]));
495
4.75M
        }
496
1.58M
        ps->dsp.decorrelate(out[k], delay[k] + PS_MAX_DELAY - 2, ap_delay[k],
497
1.58M
                            phi_fract[is34][k],
498
1.58M
                            (const INTFLOAT (*)[2]) Q_fract_allpass[is34][k],
499
1.58M
                            transient_gain[b], g_decay_slope, nL - n0);
500
1.58M
    }
501
550k
    for (; k < SHORT_DELAY_BAND[is34]; k++) {
502
508k
        int i = k_to_i[k];
503
508k
        memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
504
508k
        memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
505
        //H = delay 14
506
508k
        ps->dsp.mul_pair_single(out[k], delay[k] + PS_MAX_DELAY - 14,
507
508k
                                transient_gain[i], nL - n0);
508
508k
    }
509
1.27M
    for (; k < NR_BANDS[is34]; k++) {
510
1.22M
        int i = k_to_i[k];
511
1.22M
        memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
512
1.22M
        memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
513
        //H = delay 1
514
1.22M
        ps->dsp.mul_pair_single(out[k], delay[k] + PS_MAX_DELAY - 1,
515
1.22M
                                transient_gain[i], nL - n0);
516
1.22M
    }
517
42.3k
}
aacps_fixed.c:decorrelation
Line
Count
Source
400
22.7k
{
401
22.7k
    LOCAL_ALIGNED_16(INTFLOAT, power, [34], [PS_QMF_TIME_SLOTS]);
402
22.7k
    LOCAL_ALIGNED_16(INTFLOAT, transient_gain, [34], [PS_QMF_TIME_SLOTS]);
403
22.7k
    INTFLOAT *peak_decay_nrg = ps->peak_decay_nrg;
404
22.7k
    INTFLOAT *power_smooth = ps->power_smooth;
405
22.7k
    INTFLOAT *peak_decay_diff_smooth = ps->peak_decay_diff_smooth;
406
22.7k
    INTFLOAT (*delay)[PS_QMF_TIME_SLOTS + PS_MAX_DELAY][2] = ps->delay;
407
22.7k
    INTFLOAT (*ap_delay)[PS_AP_LINKS][PS_QMF_TIME_SLOTS + PS_MAX_AP_DELAY][2] = ps->ap_delay;
408
#if !USE_FIXED
409
    const float transient_impact  = 1.5f;
410
    const float a_smooth          = 0.25f; ///< Smoothing coefficient
411
#endif /* USE_FIXED */
412
22.7k
    const int8_t *const k_to_i = is34 ? ff_k_to_i_34 : ff_k_to_i_20;
413
22.7k
    int i, k, m, n;
414
22.7k
    int n0 = 0, nL = 32;
415
22.7k
    const INTFLOAT peak_decay_factor = Q31(0.76592833836465f);
416
417
22.7k
    memset(power, 0, 34 * sizeof(*power));
418
419
22.7k
    if (is34 != ps->common.is34bands_old) {
420
6.29k
        memset(ps->peak_decay_nrg,         0, sizeof(ps->peak_decay_nrg));
421
6.29k
        memset(ps->power_smooth,           0, sizeof(ps->power_smooth));
422
6.29k
        memset(ps->peak_decay_diff_smooth, 0, sizeof(ps->peak_decay_diff_smooth));
423
6.29k
        memset(ps->delay,                  0, sizeof(ps->delay));
424
6.29k
        memset(ps->ap_delay,               0, sizeof(ps->ap_delay));
425
6.29k
    }
426
427
1.87M
    for (k = 0; k < NR_BANDS[is34]; k++) {
428
1.85M
        int i = k_to_i[k];
429
1.85M
        ps->dsp.add_squares(power[i], s[k], nL - n0);
430
1.85M
    }
431
432
    //Transient detection
433
22.7k
#if USE_FIXED
434
644k
    for (i = 0; i < NR_PAR_BANDS[is34]; i++) {
435
20.5M
        for (n = n0; n < nL; n++) {
436
19.8M
            int decayed_peak;
437
19.8M
            decayed_peak = (int)(((int64_t)peak_decay_factor * \
438
19.8M
                                           peak_decay_nrg[i] + 0x40000000) >> 31);
439
19.8M
            peak_decay_nrg[i] = FFMAX(decayed_peak, power[i][n]);
440
19.8M
            power_smooth[i] += (power[i][n] + 2LL - power_smooth[i]) >> 2;
441
19.8M
            peak_decay_diff_smooth[i] += (peak_decay_nrg[i] + 2LL - power[i][n] - \
442
19.8M
                                          peak_decay_diff_smooth[i]) >> 2;
443
444
19.8M
            if (peak_decay_diff_smooth[i]) {
445
5.32M
                transient_gain[i][n] = FFMIN(power_smooth[i]*43691LL / peak_decay_diff_smooth[i], 1<<16);
446
5.32M
            } else
447
14.5M
                transient_gain[i][n] = 1 << 16;
448
19.8M
        }
449
621k
    }
450
#else
451
    for (i = 0; i < NR_PAR_BANDS[is34]; i++) {
452
        for (n = n0; n < nL; n++) {
453
            float decayed_peak = peak_decay_factor * peak_decay_nrg[i];
454
            float denom;
455
            peak_decay_nrg[i] = FFMAX(decayed_peak, power[i][n]);
456
            power_smooth[i] += a_smooth * (power[i][n] - power_smooth[i]);
457
            peak_decay_diff_smooth[i] += a_smooth * (peak_decay_nrg[i] - power[i][n] - peak_decay_diff_smooth[i]);
458
            denom = transient_impact * peak_decay_diff_smooth[i];
459
            transient_gain[i][n]   = (denom > power_smooth[i]) ?
460
                                         power_smooth[i] / denom : 1.0f;
461
        }
462
    }
463
464
#endif /* USE_FIXED */
465
    //Decorrelation and transient reduction
466
    //                         PS_AP_LINKS - 1
467
    //                               -----
468
    //                                | |  Q_fract_allpass[k][m]*z^-link_delay[m] - a[m]*g_decay_slope[k]
469
    //H[k][z] = z^-2 * phi_fract[k] * | | ----------------------------------------------------------------
470
    //                                | | 1 - a[m]*g_decay_slope[k]*Q_fract_allpass[k][m]*z^-link_delay[m]
471
    //                               m = 0
472
    //d[k][z] (out) = transient_gain_mapped[k][z] * H[k][z] * s[k][z]
473
942k
    for (k = 0; k < NR_ALLPASS_BANDS[is34]; k++) {
474
920k
        int b = k_to_i[k];
475
920k
#if USE_FIXED
476
920k
        int g_decay_slope;
477
478
920k
        if (k - DECAY_CUTOFF[is34] <= 0) {
479
510k
          g_decay_slope = 1 << 30;
480
510k
        }
481
409k
        else if (k - DECAY_CUTOFF[is34] >= 20) {
482
0
          g_decay_slope = 0;
483
0
        }
484
409k
        else {
485
409k
          g_decay_slope = (1 << 30) - DECAY_SLOPE * (k - DECAY_CUTOFF[is34]);
486
409k
        }
487
#else
488
        float g_decay_slope = 1.f - DECAY_SLOPE * (k - DECAY_CUTOFF[is34]);
489
        g_decay_slope = av_clipf(g_decay_slope, 0.f, 1.f);
490
#endif /* USE_FIXED */
491
920k
        memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
492
920k
        memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
493
3.68M
        for (m = 0; m < PS_AP_LINKS; m++) {
494
2.76M
            memcpy(ap_delay[k][m],   ap_delay[k][m]+numQMFSlots,           5*sizeof(ap_delay[k][m][0]));
495
2.76M
        }
496
920k
        ps->dsp.decorrelate(out[k], delay[k] + PS_MAX_DELAY - 2, ap_delay[k],
497
920k
                            phi_fract[is34][k],
498
920k
                            (const INTFLOAT (*)[2]) Q_fract_allpass[is34][k],
499
920k
                            transient_gain[b], g_decay_slope, nL - n0);
500
920k
    }
501
296k
    for (; k < SHORT_DELAY_BAND[is34]; k++) {
502
273k
        int i = k_to_i[k];
503
273k
        memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
504
273k
        memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
505
        //H = delay 14
506
273k
        ps->dsp.mul_pair_single(out[k], delay[k] + PS_MAX_DELAY - 14,
507
273k
                                transient_gain[i], nL - n0);
508
273k
    }
509
683k
    for (; k < NR_BANDS[is34]; k++) {
510
660k
        int i = k_to_i[k];
511
660k
        memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
512
660k
        memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
513
        //H = delay 1
514
660k
        ps->dsp.mul_pair_single(out[k], delay[k] + PS_MAX_DELAY - 1,
515
660k
                                transient_gain[i], nL - n0);
516
660k
    }
517
22.7k
}
aacps_float.c:decorrelation
Line
Count
Source
400
19.5k
{
401
19.5k
    LOCAL_ALIGNED_16(INTFLOAT, power, [34], [PS_QMF_TIME_SLOTS]);
402
19.5k
    LOCAL_ALIGNED_16(INTFLOAT, transient_gain, [34], [PS_QMF_TIME_SLOTS]);
403
19.5k
    INTFLOAT *peak_decay_nrg = ps->peak_decay_nrg;
404
19.5k
    INTFLOAT *power_smooth = ps->power_smooth;
405
19.5k
    INTFLOAT *peak_decay_diff_smooth = ps->peak_decay_diff_smooth;
406
19.5k
    INTFLOAT (*delay)[PS_QMF_TIME_SLOTS + PS_MAX_DELAY][2] = ps->delay;
407
19.5k
    INTFLOAT (*ap_delay)[PS_AP_LINKS][PS_QMF_TIME_SLOTS + PS_MAX_AP_DELAY][2] = ps->ap_delay;
408
19.5k
#if !USE_FIXED
409
19.5k
    const float transient_impact  = 1.5f;
410
19.5k
    const float a_smooth          = 0.25f; ///< Smoothing coefficient
411
19.5k
#endif /* USE_FIXED */
412
19.5k
    const int8_t *const k_to_i = is34 ? ff_k_to_i_34 : ff_k_to_i_20;
413
19.5k
    int i, k, m, n;
414
19.5k
    int n0 = 0, nL = 32;
415
19.5k
    const INTFLOAT peak_decay_factor = Q31(0.76592833836465f);
416
417
19.5k
    memset(power, 0, 34 * sizeof(*power));
418
419
19.5k
    if (is34 != ps->common.is34bands_old) {
420
1.77k
        memset(ps->peak_decay_nrg,         0, sizeof(ps->peak_decay_nrg));
421
1.77k
        memset(ps->power_smooth,           0, sizeof(ps->power_smooth));
422
1.77k
        memset(ps->peak_decay_diff_smooth, 0, sizeof(ps->peak_decay_diff_smooth));
423
1.77k
        memset(ps->delay,                  0, sizeof(ps->delay));
424
1.77k
        memset(ps->ap_delay,               0, sizeof(ps->ap_delay));
425
1.77k
    }
426
427
1.48M
    for (k = 0; k < NR_BANDS[is34]; k++) {
428
1.46M
        int i = k_to_i[k];
429
1.46M
        ps->dsp.add_squares(power[i], s[k], nL - n0);
430
1.46M
    }
431
432
    //Transient detection
433
#if USE_FIXED
434
    for (i = 0; i < NR_PAR_BANDS[is34]; i++) {
435
        for (n = n0; n < nL; n++) {
436
            int decayed_peak;
437
            decayed_peak = (int)(((int64_t)peak_decay_factor * \
438
                                           peak_decay_nrg[i] + 0x40000000) >> 31);
439
            peak_decay_nrg[i] = FFMAX(decayed_peak, power[i][n]);
440
            power_smooth[i] += (power[i][n] + 2LL - power_smooth[i]) >> 2;
441
            peak_decay_diff_smooth[i] += (peak_decay_nrg[i] + 2LL - power[i][n] - \
442
                                          peak_decay_diff_smooth[i]) >> 2;
443
444
            if (peak_decay_diff_smooth[i]) {
445
                transient_gain[i][n] = FFMIN(power_smooth[i]*43691LL / peak_decay_diff_smooth[i], 1<<16);
446
            } else
447
                transient_gain[i][n] = 1 << 16;
448
        }
449
    }
450
#else
451
464k
    for (i = 0; i < NR_PAR_BANDS[is34]; i++) {
452
14.6M
        for (n = n0; n < nL; n++) {
453
14.2M
            float decayed_peak = peak_decay_factor * peak_decay_nrg[i];
454
14.2M
            float denom;
455
14.2M
            peak_decay_nrg[i] = FFMAX(decayed_peak, power[i][n]);
456
14.2M
            power_smooth[i] += a_smooth * (power[i][n] - power_smooth[i]);
457
14.2M
            peak_decay_diff_smooth[i] += a_smooth * (peak_decay_nrg[i] - power[i][n] - peak_decay_diff_smooth[i]);
458
14.2M
            denom = transient_impact * peak_decay_diff_smooth[i];
459
14.2M
            transient_gain[i][n]   = (denom > power_smooth[i]) ?
460
11.2M
                                         power_smooth[i] / denom : 1.0f;
461
14.2M
        }
462
445k
    }
463
464
19.5k
#endif /* USE_FIXED */
465
    //Decorrelation and transient reduction
466
    //                         PS_AP_LINKS - 1
467
    //                               -----
468
    //                                | |  Q_fract_allpass[k][m]*z^-link_delay[m] - a[m]*g_decay_slope[k]
469
    //H[k][z] = z^-2 * phi_fract[k] * | | ----------------------------------------------------------------
470
    //                                | | 1 - a[m]*g_decay_slope[k]*Q_fract_allpass[k][m]*z^-link_delay[m]
471
    //                               m = 0
472
    //d[k][z] (out) = transient_gain_mapped[k][z] * H[k][z] * s[k][z]
473
683k
    for (k = 0; k < NR_ALLPASS_BANDS[is34]; k++) {
474
663k
        int b = k_to_i[k];
475
#if USE_FIXED
476
        int g_decay_slope;
477
478
        if (k - DECAY_CUTOFF[is34] <= 0) {
479
          g_decay_slope = 1 << 30;
480
        }
481
        else if (k - DECAY_CUTOFF[is34] >= 20) {
482
          g_decay_slope = 0;
483
        }
484
        else {
485
          g_decay_slope = (1 << 30) - DECAY_SLOPE * (k - DECAY_CUTOFF[is34]);
486
        }
487
#else
488
663k
        float g_decay_slope = 1.f - DECAY_SLOPE * (k - DECAY_CUTOFF[is34]);
489
663k
        g_decay_slope = av_clipf(g_decay_slope, 0.f, 1.f);
490
663k
#endif /* USE_FIXED */
491
663k
        memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
492
663k
        memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
493
2.65M
        for (m = 0; m < PS_AP_LINKS; m++) {
494
1.99M
            memcpy(ap_delay[k][m],   ap_delay[k][m]+numQMFSlots,           5*sizeof(ap_delay[k][m][0]));
495
1.99M
        }
496
663k
        ps->dsp.decorrelate(out[k], delay[k] + PS_MAX_DELAY - 2, ap_delay[k],
497
663k
                            phi_fract[is34][k],
498
663k
                            (const INTFLOAT (*)[2]) Q_fract_allpass[is34][k],
499
663k
                            transient_gain[b], g_decay_slope, nL - n0);
500
663k
    }
501
254k
    for (; k < SHORT_DELAY_BAND[is34]; k++) {
502
235k
        int i = k_to_i[k];
503
235k
        memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
504
235k
        memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
505
        //H = delay 14
506
235k
        ps->dsp.mul_pair_single(out[k], delay[k] + PS_MAX_DELAY - 14,
507
235k
                                transient_gain[i], nL - n0);
508
235k
    }
509
587k
    for (; k < NR_BANDS[is34]; k++) {
510
567k
        int i = k_to_i[k];
511
567k
        memcpy(delay[k], delay[k]+nL, PS_MAX_DELAY*sizeof(delay[k][0]));
512
567k
        memcpy(delay[k]+PS_MAX_DELAY, s[k], numQMFSlots*sizeof(delay[k][0]));
513
        //H = delay 1
514
567k
        ps->dsp.mul_pair_single(out[k], delay[k] + PS_MAX_DELAY - 1,
515
567k
                                transient_gain[i], nL - n0);
516
567k
    }
517
19.5k
}
518
519
static void remap34(int8_t (**p_par_mapped)[PS_MAX_NR_IIDICC],
520
                    int8_t           (*par)[PS_MAX_NR_IIDICC],
521
                    int num_par, int num_env, int full)
522
40.1k
{
523
40.1k
    int8_t (*par_mapped)[PS_MAX_NR_IIDICC] = *p_par_mapped;
524
40.1k
    int e;
525
40.1k
    if (num_par == 20 || num_par == 11) {
526
21.9k
        for (e = 0; e < num_env; e++) {
527
15.0k
            map_idx_20_to_34(par_mapped[e], par[e], full);
528
15.0k
        }
529
33.2k
    } else if (num_par == 10 || num_par == 5) {
530
34.2k
        for (e = 0; e < num_env; e++) {
531
23.3k
            map_idx_10_to_34(par_mapped[e], par[e], full);
532
23.3k
        }
533
22.3k
    } else {
534
22.3k
        *p_par_mapped = par;
535
22.3k
    }
536
40.1k
}
aacps_fixed.c:remap34
Line
Count
Source
522
29.0k
{
523
29.0k
    int8_t (*par_mapped)[PS_MAX_NR_IIDICC] = *p_par_mapped;
524
29.0k
    int e;
525
29.0k
    if (num_par == 20 || num_par == 11) {
526
11.8k
        for (e = 0; e < num_env; e++) {
527
8.14k
            map_idx_20_to_34(par_mapped[e], par[e], full);
528
8.14k
        }
529
25.4k
    } else if (num_par == 10 || num_par == 5) {
530
22.2k
        for (e = 0; e < num_env; e++) {
531
14.4k
            map_idx_10_to_34(par_mapped[e], par[e], full);
532
14.4k
        }
533
17.5k
    } else {
534
17.5k
        *p_par_mapped = par;
535
17.5k
    }
536
29.0k
}
aacps_float.c:remap34
Line
Count
Source
522
11.1k
{
523
11.1k
    int8_t (*par_mapped)[PS_MAX_NR_IIDICC] = *p_par_mapped;
524
11.1k
    int e;
525
11.1k
    if (num_par == 20 || num_par == 11) {
526
10.1k
        for (e = 0; e < num_env; e++) {
527
6.90k
            map_idx_20_to_34(par_mapped[e], par[e], full);
528
6.90k
        }
529
7.83k
    } else if (num_par == 10 || num_par == 5) {
530
11.9k
        for (e = 0; e < num_env; e++) {
531
8.91k
            map_idx_10_to_34(par_mapped[e], par[e], full);
532
8.91k
        }
533
4.78k
    } else {
534
4.78k
        *p_par_mapped = par;
535
4.78k
    }
536
11.1k
}
537
538
static void remap20(int8_t (**p_par_mapped)[PS_MAX_NR_IIDICC],
539
                    int8_t           (*par)[PS_MAX_NR_IIDICC],
540
                    int num_par, int num_env, int full)
541
87.4k
{
542
87.4k
    int8_t (*par_mapped)[PS_MAX_NR_IIDICC] = *p_par_mapped;
543
87.4k
    int e;
544
87.4k
    if (num_par == 34 || num_par == 17) {
545
26.1k
        for (e = 0; e < num_env; e++) {
546
14.2k
            map_idx_34_to_20(par_mapped[e], par[e], full);
547
14.2k
        }
548
75.5k
    } else if (num_par == 10 || num_par == 5) {
549
82.4k
        for (e = 0; e < num_env; e++) {
550
54.5k
            map_idx_10_to_20(par_mapped[e], par[e], full);
551
54.5k
        }
552
47.6k
    } else {
553
47.6k
        *p_par_mapped = par;
554
47.6k
    }
555
87.4k
}
aacps_fixed.c:remap20
Line
Count
Source
541
34.6k
{
542
34.6k
    int8_t (*par_mapped)[PS_MAX_NR_IIDICC] = *p_par_mapped;
543
34.6k
    int e;
544
34.6k
    if (num_par == 34 || num_par == 17) {
545
23.2k
        for (e = 0; e < num_env; e++) {
546
12.1k
            map_idx_34_to_20(par_mapped[e], par[e], full);
547
12.1k
        }
548
23.6k
    } else if (num_par == 10 || num_par == 5) {
549
48.6k
        for (e = 0; e < num_env; e++) {
550
32.0k
            map_idx_10_to_20(par_mapped[e], par[e], full);
551
32.0k
        }
552
16.5k
    } else {
553
7.03k
        *p_par_mapped = par;
554
7.03k
    }
555
34.6k
}
aacps_float.c:remap20
Line
Count
Source
541
52.7k
{
542
52.7k
    int8_t (*par_mapped)[PS_MAX_NR_IIDICC] = *p_par_mapped;
543
52.7k
    int e;
544
52.7k
    if (num_par == 34 || num_par == 17) {
545
2.98k
        for (e = 0; e < num_env; e++) {
546
2.09k
            map_idx_34_to_20(par_mapped[e], par[e], full);
547
2.09k
        }
548
51.8k
    } else if (num_par == 10 || num_par == 5) {
549
33.7k
        for (e = 0; e < num_env; e++) {
550
22.4k
            map_idx_10_to_20(par_mapped[e], par[e], full);
551
22.4k
        }
552
40.6k
    } else {
553
40.6k
        *p_par_mapped = par;
554
40.6k
    }
555
52.7k
}
556
557
static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)[32][2], int is34)
558
42.3k
{
559
42.3k
    int e, b, k;
560
561
42.3k
    PSCommonContext *const ps2 = &ps->common;
562
42.3k
    INTFLOAT (*H11)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H11;
563
42.3k
    INTFLOAT (*H12)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H12;
564
42.3k
    INTFLOAT (*H21)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H21;
565
42.3k
    INTFLOAT (*H22)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H22;
566
42.3k
    int8_t *opd_hist = ps->opd_hist;
567
42.3k
    int8_t *ipd_hist = ps->ipd_hist;
568
42.3k
    int8_t iid_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
569
42.3k
    int8_t icc_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
570
42.3k
    int8_t ipd_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
571
42.3k
    int8_t opd_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
572
42.3k
    int8_t (*iid_mapped)[PS_MAX_NR_IIDICC] = iid_mapped_buf;
573
42.3k
    int8_t (*icc_mapped)[PS_MAX_NR_IIDICC] = icc_mapped_buf;
574
42.3k
    int8_t (*ipd_mapped)[PS_MAX_NR_IIDICC] = ipd_mapped_buf;
575
42.3k
    int8_t (*opd_mapped)[PS_MAX_NR_IIDICC] = opd_mapped_buf;
576
42.3k
    const int8_t *const k_to_i = is34 ? ff_k_to_i_34 : ff_k_to_i_20;
577
42.3k
    TABLE_CONST INTFLOAT (*H_LUT)[8][4] = (PS_BASELINE || ps2->icc_mode < 3) ? HA : HB;
578
579
    //Remapping
580
42.3k
    if (ps2->num_env_old) {
581
28.3k
        memcpy(H11[0][0], H11[0][ps2->num_env_old], sizeof(H11[0][0]));
582
28.3k
        memcpy(H11[1][0], H11[1][ps2->num_env_old], sizeof(H11[1][0]));
583
28.3k
        memcpy(H12[0][0], H12[0][ps2->num_env_old], sizeof(H12[0][0]));
584
28.3k
        memcpy(H12[1][0], H12[1][ps2->num_env_old], sizeof(H12[1][0]));
585
28.3k
        memcpy(H21[0][0], H21[0][ps2->num_env_old], sizeof(H21[0][0]));
586
28.3k
        memcpy(H21[1][0], H21[1][ps2->num_env_old], sizeof(H21[1][0]));
587
28.3k
        memcpy(H22[0][0], H22[0][ps2->num_env_old], sizeof(H22[0][0]));
588
28.3k
        memcpy(H22[1][0], H22[1][ps2->num_env_old], sizeof(H22[1][0]));
589
28.3k
    }
590
591
42.3k
    if (is34) {
592
15.6k
        remap34(&iid_mapped, ps2->iid_par, ps2->nr_iid_par, ps2->num_env, 1);
593
15.6k
        remap34(&icc_mapped, ps2->icc_par, ps2->nr_icc_par, ps2->num_env, 1);
594
15.6k
        if (ps2->enable_ipdopd) {
595
4.45k
            remap34(&ipd_mapped, ps2->ipd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
596
4.45k
            remap34(&opd_mapped, ps2->opd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
597
4.45k
        }
598
15.6k
        if (!ps2->is34bands_old) {
599
5.28k
            map_val_20_to_34(H11[0][0]);
600
5.28k
            map_val_20_to_34(H11[1][0]);
601
5.28k
            map_val_20_to_34(H12[0][0]);
602
5.28k
            map_val_20_to_34(H12[1][0]);
603
5.28k
            map_val_20_to_34(H21[0][0]);
604
5.28k
            map_val_20_to_34(H21[1][0]);
605
5.28k
            map_val_20_to_34(H22[0][0]);
606
5.28k
            map_val_20_to_34(H22[1][0]);
607
5.28k
            ipdopd_reset(ipd_hist, opd_hist);
608
5.28k
        }
609
26.7k
    } else {
610
26.7k
        remap20(&iid_mapped, ps2->iid_par, ps2->nr_iid_par, ps2->num_env, 1);
611
26.7k
        remap20(&icc_mapped, ps2->icc_par, ps2->nr_icc_par, ps2->num_env, 1);
612
26.7k
        if (ps2->enable_ipdopd) {
613
16.9k
            remap20(&ipd_mapped, ps2->ipd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
614
16.9k
            remap20(&opd_mapped, ps2->opd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
615
16.9k
        }
616
26.7k
        if (ps2->is34bands_old) {
617
2.79k
            map_val_34_to_20(H11[0][0]);
618
2.79k
            map_val_34_to_20(H11[1][0]);
619
2.79k
            map_val_34_to_20(H12[0][0]);
620
2.79k
            map_val_34_to_20(H12[1][0]);
621
2.79k
            map_val_34_to_20(H21[0][0]);
622
2.79k
            map_val_34_to_20(H21[1][0]);
623
2.79k
            map_val_34_to_20(H22[0][0]);
624
2.79k
            map_val_34_to_20(H22[1][0]);
625
2.79k
            ipdopd_reset(ipd_hist, opd_hist);
626
2.79k
        }
627
26.7k
    }
628
629
    //Mixing
630
129k
    for (e = 0; e < ps2->num_env; e++) {
631
2.24M
        for (b = 0; b < NR_PAR_BANDS[is34]; b++) {
632
2.15M
            INTFLOAT h11, h12, h21, h22;
633
2.15M
            h11 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][0];
634
2.15M
            h12 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][1];
635
2.15M
            h21 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][2];
636
2.15M
            h22 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][3];
637
638
2.15M
            if (!PS_BASELINE && ps2->enable_ipdopd && b < NR_IPDOPD_BANDS[is34]) {
639
                //The spec say says to only run this smoother when enable_ipdopd
640
                //is set but the reference decoder appears to run it constantly
641
598k
                INTFLOAT h11i, h12i, h21i, h22i;
642
598k
                INTFLOAT ipd_adj_re, ipd_adj_im;
643
598k
                int opd_idx = opd_hist[b] * 8 + opd_mapped[e][b];
644
598k
                int ipd_idx = ipd_hist[b] * 8 + ipd_mapped[e][b];
645
598k
                INTFLOAT opd_re = pd_re_smooth[opd_idx];
646
598k
                INTFLOAT opd_im = pd_im_smooth[opd_idx];
647
598k
                INTFLOAT ipd_re = pd_re_smooth[ipd_idx];
648
598k
                INTFLOAT ipd_im = pd_im_smooth[ipd_idx];
649
598k
                opd_hist[b] = opd_idx & 0x3F;
650
598k
                ipd_hist[b] = ipd_idx & 0x3F;
651
652
598k
                ipd_adj_re = AAC_MADD30(opd_re, ipd_re, opd_im, ipd_im);
653
598k
                ipd_adj_im = AAC_MSUB30(opd_im, ipd_re, opd_re, ipd_im);
654
598k
                h11i = AAC_MUL30(h11,  opd_im);
655
598k
                h11  = AAC_MUL30(h11,  opd_re);
656
598k
                h12i = AAC_MUL30(h12,  ipd_adj_im);
657
598k
                h12  = AAC_MUL30(h12,  ipd_adj_re);
658
598k
                h21i = AAC_MUL30(h21,  opd_im);
659
598k
                h21  = AAC_MUL30(h21,  opd_re);
660
598k
                h22i = AAC_MUL30(h22,  ipd_adj_im);
661
598k
                h22  = AAC_MUL30(h22,  ipd_adj_re);
662
598k
                H11[1][e+1][b] = h11i;
663
598k
                H12[1][e+1][b] = h12i;
664
598k
                H21[1][e+1][b] = h21i;
665
598k
                H22[1][e+1][b] = h22i;
666
598k
            }
667
2.15M
            H11[0][e+1][b] = h11;
668
2.15M
            H12[0][e+1][b] = h12;
669
2.15M
            H21[0][e+1][b] = h21;
670
2.15M
            H22[0][e+1][b] = h22;
671
2.15M
        }
672
6.86M
        for (k = 0; k < NR_BANDS[is34]; k++) {
673
6.77M
            LOCAL_ALIGNED_16(INTFLOAT, h, [2], [4]);
674
6.77M
            LOCAL_ALIGNED_16(INTFLOAT, h_step, [2], [4]);
675
6.77M
            int start = ps2->border_position[e];
676
6.77M
            int stop  = ps2->border_position[e+1];
677
6.77M
            INTFLOAT width = Q30(1.f) / ((stop - start) ? (stop - start) : 1);
678
#if USE_FIXED
679
3.29M
            width = FFMIN(2U*width, INT_MAX);
680
#endif
681
6.77M
            b = k_to_i[k];
682
6.77M
            h[0][0] = H11[0][e][b];
683
6.77M
            h[0][1] = H12[0][e][b];
684
6.77M
            h[0][2] = H21[0][e][b];
685
6.77M
            h[0][3] = H22[0][e][b];
686
6.77M
            if (!PS_BASELINE && ps2->enable_ipdopd) {
687
            //Is this necessary? ps_04_new seems unchanged
688
3.69M
            if ((is34 && k <= 13 && k >= 9) || (!is34 && k <= 1)) {
689
125k
                h[1][0] = -H11[1][e][b];
690
125k
                h[1][1] = -H12[1][e][b];
691
125k
                h[1][2] = -H21[1][e][b];
692
125k
                h[1][3] = -H22[1][e][b];
693
3.57M
            } else {
694
3.57M
                h[1][0] = H11[1][e][b];
695
3.57M
                h[1][1] = H12[1][e][b];
696
3.57M
                h[1][2] = H21[1][e][b];
697
3.57M
                h[1][3] = H22[1][e][b];
698
3.57M
            }
699
3.69M
            }
700
            //Interpolation
701
6.77M
            h_step[0][0] = AAC_MSUB31_V3(H11[0][e+1][b], h[0][0], width);
702
6.77M
            h_step[0][1] = AAC_MSUB31_V3(H12[0][e+1][b], h[0][1], width);
703
6.77M
            h_step[0][2] = AAC_MSUB31_V3(H21[0][e+1][b], h[0][2], width);
704
6.77M
            h_step[0][3] = AAC_MSUB31_V3(H22[0][e+1][b], h[0][3], width);
705
6.77M
            if (!PS_BASELINE && ps2->enable_ipdopd) {
706
3.69M
                h_step[1][0] = AAC_MSUB31_V3(H11[1][e+1][b], h[1][0], width);
707
3.69M
                h_step[1][1] = AAC_MSUB31_V3(H12[1][e+1][b], h[1][1], width);
708
3.69M
                h_step[1][2] = AAC_MSUB31_V3(H21[1][e+1][b], h[1][2], width);
709
3.69M
                h_step[1][3] = AAC_MSUB31_V3(H22[1][e+1][b], h[1][3], width);
710
3.69M
            }
711
6.77M
            if (stop - start)
712
6.37M
                ps->dsp.stereo_interpolate[!PS_BASELINE && ps2->enable_ipdopd](
713
6.37M
                    l[k] + 1 + start, r[k] + 1 + start,
714
6.37M
                    h, h_step, stop - start);
715
6.77M
        }
716
87.0k
    }
717
42.3k
}
aacps_fixed.c:stereo_processing
Line
Count
Source
558
22.7k
{
559
22.7k
    int e, b, k;
560
561
22.7k
    PSCommonContext *const ps2 = &ps->common;
562
22.7k
    INTFLOAT (*H11)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H11;
563
22.7k
    INTFLOAT (*H12)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H12;
564
22.7k
    INTFLOAT (*H21)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H21;
565
22.7k
    INTFLOAT (*H22)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H22;
566
22.7k
    int8_t *opd_hist = ps->opd_hist;
567
22.7k
    int8_t *ipd_hist = ps->ipd_hist;
568
22.7k
    int8_t iid_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
569
22.7k
    int8_t icc_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
570
22.7k
    int8_t ipd_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
571
22.7k
    int8_t opd_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
572
22.7k
    int8_t (*iid_mapped)[PS_MAX_NR_IIDICC] = iid_mapped_buf;
573
22.7k
    int8_t (*icc_mapped)[PS_MAX_NR_IIDICC] = icc_mapped_buf;
574
22.7k
    int8_t (*ipd_mapped)[PS_MAX_NR_IIDICC] = ipd_mapped_buf;
575
22.7k
    int8_t (*opd_mapped)[PS_MAX_NR_IIDICC] = opd_mapped_buf;
576
22.7k
    const int8_t *const k_to_i = is34 ? ff_k_to_i_34 : ff_k_to_i_20;
577
22.7k
    TABLE_CONST INTFLOAT (*H_LUT)[8][4] = (PS_BASELINE || ps2->icc_mode < 3) ? HA : HB;
578
579
    //Remapping
580
22.7k
    if (ps2->num_env_old) {
581
16.6k
        memcpy(H11[0][0], H11[0][ps2->num_env_old], sizeof(H11[0][0]));
582
16.6k
        memcpy(H11[1][0], H11[1][ps2->num_env_old], sizeof(H11[1][0]));
583
16.6k
        memcpy(H12[0][0], H12[0][ps2->num_env_old], sizeof(H12[0][0]));
584
16.6k
        memcpy(H12[1][0], H12[1][ps2->num_env_old], sizeof(H12[1][0]));
585
16.6k
        memcpy(H21[0][0], H21[0][ps2->num_env_old], sizeof(H21[0][0]));
586
16.6k
        memcpy(H21[1][0], H21[1][ps2->num_env_old], sizeof(H21[1][0]));
587
16.6k
        memcpy(H22[0][0], H22[0][ps2->num_env_old], sizeof(H22[0][0]));
588
16.6k
        memcpy(H22[1][0], H22[1][ps2->num_env_old], sizeof(H22[1][0]));
589
16.6k
    }
590
591
22.7k
    if (is34) {
592
11.8k
        remap34(&iid_mapped, ps2->iid_par, ps2->nr_iid_par, ps2->num_env, 1);
593
11.8k
        remap34(&icc_mapped, ps2->icc_par, ps2->nr_icc_par, ps2->num_env, 1);
594
11.8k
        if (ps2->enable_ipdopd) {
595
2.71k
            remap34(&ipd_mapped, ps2->ipd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
596
2.71k
            remap34(&opd_mapped, ps2->opd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
597
2.71k
        }
598
11.8k
        if (!ps2->is34bands_old) {
599
4.01k
            map_val_20_to_34(H11[0][0]);
600
4.01k
            map_val_20_to_34(H11[1][0]);
601
4.01k
            map_val_20_to_34(H12[0][0]);
602
4.01k
            map_val_20_to_34(H12[1][0]);
603
4.01k
            map_val_20_to_34(H21[0][0]);
604
4.01k
            map_val_20_to_34(H21[1][0]);
605
4.01k
            map_val_20_to_34(H22[0][0]);
606
4.01k
            map_val_20_to_34(H22[1][0]);
607
4.01k
            ipdopd_reset(ipd_hist, opd_hist);
608
4.01k
        }
609
11.8k
    } else {
610
10.9k
        remap20(&iid_mapped, ps2->iid_par, ps2->nr_iid_par, ps2->num_env, 1);
611
10.9k
        remap20(&icc_mapped, ps2->icc_par, ps2->nr_icc_par, ps2->num_env, 1);
612
10.9k
        if (ps2->enable_ipdopd) {
613
6.37k
            remap20(&ipd_mapped, ps2->ipd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
614
6.37k
            remap20(&opd_mapped, ps2->opd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
615
6.37k
        }
616
10.9k
        if (ps2->is34bands_old) {
617
2.28k
            map_val_34_to_20(H11[0][0]);
618
2.28k
            map_val_34_to_20(H11[1][0]);
619
2.28k
            map_val_34_to_20(H12[0][0]);
620
2.28k
            map_val_34_to_20(H12[1][0]);
621
2.28k
            map_val_34_to_20(H21[0][0]);
622
2.28k
            map_val_34_to_20(H21[1][0]);
623
2.28k
            map_val_34_to_20(H22[0][0]);
624
2.28k
            map_val_34_to_20(H22[1][0]);
625
2.28k
            ipdopd_reset(ipd_hist, opd_hist);
626
2.28k
        }
627
10.9k
    }
628
629
    //Mixing
630
63.2k
    for (e = 0; e < ps2->num_env; e++) {
631
1.14M
        for (b = 0; b < NR_PAR_BANDS[is34]; b++) {
632
1.10M
            INTFLOAT h11, h12, h21, h22;
633
1.10M
            h11 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][0];
634
1.10M
            h12 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][1];
635
1.10M
            h21 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][2];
636
1.10M
            h22 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][3];
637
638
1.10M
            if (!PS_BASELINE && ps2->enable_ipdopd && b < NR_IPDOPD_BANDS[is34]) {
639
                //The spec say says to only run this smoother when enable_ipdopd
640
                //is set but the reference decoder appears to run it constantly
641
193k
                INTFLOAT h11i, h12i, h21i, h22i;
642
193k
                INTFLOAT ipd_adj_re, ipd_adj_im;
643
193k
                int opd_idx = opd_hist[b] * 8 + opd_mapped[e][b];
644
193k
                int ipd_idx = ipd_hist[b] * 8 + ipd_mapped[e][b];
645
193k
                INTFLOAT opd_re = pd_re_smooth[opd_idx];
646
193k
                INTFLOAT opd_im = pd_im_smooth[opd_idx];
647
193k
                INTFLOAT ipd_re = pd_re_smooth[ipd_idx];
648
193k
                INTFLOAT ipd_im = pd_im_smooth[ipd_idx];
649
193k
                opd_hist[b] = opd_idx & 0x3F;
650
193k
                ipd_hist[b] = ipd_idx & 0x3F;
651
652
193k
                ipd_adj_re = AAC_MADD30(opd_re, ipd_re, opd_im, ipd_im);
653
193k
                ipd_adj_im = AAC_MSUB30(opd_im, ipd_re, opd_re, ipd_im);
654
193k
                h11i = AAC_MUL30(h11,  opd_im);
655
193k
                h11  = AAC_MUL30(h11,  opd_re);
656
193k
                h12i = AAC_MUL30(h12,  ipd_adj_im);
657
193k
                h12  = AAC_MUL30(h12,  ipd_adj_re);
658
193k
                h21i = AAC_MUL30(h21,  opd_im);
659
193k
                h21  = AAC_MUL30(h21,  opd_re);
660
193k
                h22i = AAC_MUL30(h22,  ipd_adj_im);
661
193k
                h22  = AAC_MUL30(h22,  ipd_adj_re);
662
193k
                H11[1][e+1][b] = h11i;
663
193k
                H12[1][e+1][b] = h12i;
664
193k
                H21[1][e+1][b] = h21i;
665
193k
                H22[1][e+1][b] = h22i;
666
193k
            }
667
1.10M
            H11[0][e+1][b] = h11;
668
1.10M
            H12[0][e+1][b] = h12;
669
1.10M
            H21[0][e+1][b] = h21;
670
1.10M
            H22[0][e+1][b] = h22;
671
1.10M
        }
672
3.33M
        for (k = 0; k < NR_BANDS[is34]; k++) {
673
3.29M
            LOCAL_ALIGNED_16(INTFLOAT, h, [2], [4]);
674
3.29M
            LOCAL_ALIGNED_16(INTFLOAT, h_step, [2], [4]);
675
3.29M
            int start = ps2->border_position[e];
676
3.29M
            int stop  = ps2->border_position[e+1];
677
3.29M
            INTFLOAT width = Q30(1.f) / ((stop - start) ? (stop - start) : 1);
678
3.29M
#if USE_FIXED
679
3.29M
            width = FFMIN(2U*width, INT_MAX);
680
3.29M
#endif
681
3.29M
            b = k_to_i[k];
682
3.29M
            h[0][0] = H11[0][e][b];
683
3.29M
            h[0][1] = H12[0][e][b];
684
3.29M
            h[0][2] = H21[0][e][b];
685
3.29M
            h[0][3] = H22[0][e][b];
686
3.29M
            if (!PS_BASELINE && ps2->enable_ipdopd) {
687
            //Is this necessary? ps_04_new seems unchanged
688
1.15M
            if ((is34 && k <= 13 && k >= 9) || (!is34 && k <= 1)) {
689
44.5k
                h[1][0] = -H11[1][e][b];
690
44.5k
                h[1][1] = -H12[1][e][b];
691
44.5k
                h[1][2] = -H21[1][e][b];
692
44.5k
                h[1][3] = -H22[1][e][b];
693
1.11M
            } else {
694
1.11M
                h[1][0] = H11[1][e][b];
695
1.11M
                h[1][1] = H12[1][e][b];
696
1.11M
                h[1][2] = H21[1][e][b];
697
1.11M
                h[1][3] = H22[1][e][b];
698
1.11M
            }
699
1.15M
            }
700
            //Interpolation
701
3.29M
            h_step[0][0] = AAC_MSUB31_V3(H11[0][e+1][b], h[0][0], width);
702
3.29M
            h_step[0][1] = AAC_MSUB31_V3(H12[0][e+1][b], h[0][1], width);
703
3.29M
            h_step[0][2] = AAC_MSUB31_V3(H21[0][e+1][b], h[0][2], width);
704
3.29M
            h_step[0][3] = AAC_MSUB31_V3(H22[0][e+1][b], h[0][3], width);
705
3.29M
            if (!PS_BASELINE && ps2->enable_ipdopd) {
706
1.15M
                h_step[1][0] = AAC_MSUB31_V3(H11[1][e+1][b], h[1][0], width);
707
1.15M
                h_step[1][1] = AAC_MSUB31_V3(H12[1][e+1][b], h[1][1], width);
708
1.15M
                h_step[1][2] = AAC_MSUB31_V3(H21[1][e+1][b], h[1][2], width);
709
1.15M
                h_step[1][3] = AAC_MSUB31_V3(H22[1][e+1][b], h[1][3], width);
710
1.15M
            }
711
3.29M
            if (stop - start)
712
3.15M
                ps->dsp.stereo_interpolate[!PS_BASELINE && ps2->enable_ipdopd](
713
3.15M
                    l[k] + 1 + start, r[k] + 1 + start,
714
3.15M
                    h, h_step, stop - start);
715
3.29M
        }
716
40.4k
    }
717
22.7k
}
aacps_float.c:stereo_processing
Line
Count
Source
558
19.5k
{
559
19.5k
    int e, b, k;
560
561
19.5k
    PSCommonContext *const ps2 = &ps->common;
562
19.5k
    INTFLOAT (*H11)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H11;
563
19.5k
    INTFLOAT (*H12)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H12;
564
19.5k
    INTFLOAT (*H21)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H21;
565
19.5k
    INTFLOAT (*H22)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H22;
566
19.5k
    int8_t *opd_hist = ps->opd_hist;
567
19.5k
    int8_t *ipd_hist = ps->ipd_hist;
568
19.5k
    int8_t iid_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
569
19.5k
    int8_t icc_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
570
19.5k
    int8_t ipd_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
571
19.5k
    int8_t opd_mapped_buf[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC];
572
19.5k
    int8_t (*iid_mapped)[PS_MAX_NR_IIDICC] = iid_mapped_buf;
573
19.5k
    int8_t (*icc_mapped)[PS_MAX_NR_IIDICC] = icc_mapped_buf;
574
19.5k
    int8_t (*ipd_mapped)[PS_MAX_NR_IIDICC] = ipd_mapped_buf;
575
19.5k
    int8_t (*opd_mapped)[PS_MAX_NR_IIDICC] = opd_mapped_buf;
576
19.5k
    const int8_t *const k_to_i = is34 ? ff_k_to_i_34 : ff_k_to_i_20;
577
19.5k
    TABLE_CONST INTFLOAT (*H_LUT)[8][4] = (PS_BASELINE || ps2->icc_mode < 3) ? HA : HB;
578
579
    //Remapping
580
19.5k
    if (ps2->num_env_old) {
581
11.7k
        memcpy(H11[0][0], H11[0][ps2->num_env_old], sizeof(H11[0][0]));
582
11.7k
        memcpy(H11[1][0], H11[1][ps2->num_env_old], sizeof(H11[1][0]));
583
11.7k
        memcpy(H12[0][0], H12[0][ps2->num_env_old], sizeof(H12[0][0]));
584
11.7k
        memcpy(H12[1][0], H12[1][ps2->num_env_old], sizeof(H12[1][0]));
585
11.7k
        memcpy(H21[0][0], H21[0][ps2->num_env_old], sizeof(H21[0][0]));
586
11.7k
        memcpy(H21[1][0], H21[1][ps2->num_env_old], sizeof(H21[1][0]));
587
11.7k
        memcpy(H22[0][0], H22[0][ps2->num_env_old], sizeof(H22[0][0]));
588
11.7k
        memcpy(H22[1][0], H22[1][ps2->num_env_old], sizeof(H22[1][0]));
589
11.7k
    }
590
591
19.5k
    if (is34) {
592
3.81k
        remap34(&iid_mapped, ps2->iid_par, ps2->nr_iid_par, ps2->num_env, 1);
593
3.81k
        remap34(&icc_mapped, ps2->icc_par, ps2->nr_icc_par, ps2->num_env, 1);
594
3.81k
        if (ps2->enable_ipdopd) {
595
1.73k
            remap34(&ipd_mapped, ps2->ipd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
596
1.73k
            remap34(&opd_mapped, ps2->opd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
597
1.73k
        }
598
3.81k
        if (!ps2->is34bands_old) {
599
1.26k
            map_val_20_to_34(H11[0][0]);
600
1.26k
            map_val_20_to_34(H11[1][0]);
601
1.26k
            map_val_20_to_34(H12[0][0]);
602
1.26k
            map_val_20_to_34(H12[1][0]);
603
1.26k
            map_val_20_to_34(H21[0][0]);
604
1.26k
            map_val_20_to_34(H21[1][0]);
605
1.26k
            map_val_20_to_34(H22[0][0]);
606
1.26k
            map_val_20_to_34(H22[1][0]);
607
1.26k
            ipdopd_reset(ipd_hist, opd_hist);
608
1.26k
        }
609
15.7k
    } else {
610
15.7k
        remap20(&iid_mapped, ps2->iid_par, ps2->nr_iid_par, ps2->num_env, 1);
611
15.7k
        remap20(&icc_mapped, ps2->icc_par, ps2->nr_icc_par, ps2->num_env, 1);
612
15.7k
        if (ps2->enable_ipdopd) {
613
10.6k
            remap20(&ipd_mapped, ps2->ipd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
614
10.6k
            remap20(&opd_mapped, ps2->opd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
615
10.6k
        }
616
15.7k
        if (ps2->is34bands_old) {
617
506
            map_val_34_to_20(H11[0][0]);
618
506
            map_val_34_to_20(H11[1][0]);
619
506
            map_val_34_to_20(H12[0][0]);
620
506
            map_val_34_to_20(H12[1][0]);
621
506
            map_val_34_to_20(H21[0][0]);
622
506
            map_val_34_to_20(H21[1][0]);
623
506
            map_val_34_to_20(H22[0][0]);
624
506
            map_val_34_to_20(H22[1][0]);
625
506
            ipdopd_reset(ipd_hist, opd_hist);
626
506
        }
627
15.7k
    }
628
629
    //Mixing
630
66.2k
    for (e = 0; e < ps2->num_env; e++) {
631
1.10M
        for (b = 0; b < NR_PAR_BANDS[is34]; b++) {
632
1.05M
            INTFLOAT h11, h12, h21, h22;
633
1.05M
            h11 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][0];
634
1.05M
            h12 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][1];
635
1.05M
            h21 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][2];
636
1.05M
            h22 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][3];
637
638
1.05M
            if (!PS_BASELINE && ps2->enable_ipdopd && b < NR_IPDOPD_BANDS[is34]) {
639
                //The spec say says to only run this smoother when enable_ipdopd
640
                //is set but the reference decoder appears to run it constantly
641
405k
                INTFLOAT h11i, h12i, h21i, h22i;
642
405k
                INTFLOAT ipd_adj_re, ipd_adj_im;
643
405k
                int opd_idx = opd_hist[b] * 8 + opd_mapped[e][b];
644
405k
                int ipd_idx = ipd_hist[b] * 8 + ipd_mapped[e][b];
645
405k
                INTFLOAT opd_re = pd_re_smooth[opd_idx];
646
405k
                INTFLOAT opd_im = pd_im_smooth[opd_idx];
647
405k
                INTFLOAT ipd_re = pd_re_smooth[ipd_idx];
648
405k
                INTFLOAT ipd_im = pd_im_smooth[ipd_idx];
649
405k
                opd_hist[b] = opd_idx & 0x3F;
650
405k
                ipd_hist[b] = ipd_idx & 0x3F;
651
652
405k
                ipd_adj_re = AAC_MADD30(opd_re, ipd_re, opd_im, ipd_im);
653
405k
                ipd_adj_im = AAC_MSUB30(opd_im, ipd_re, opd_re, ipd_im);
654
405k
                h11i = AAC_MUL30(h11,  opd_im);
655
405k
                h11  = AAC_MUL30(h11,  opd_re);
656
405k
                h12i = AAC_MUL30(h12,  ipd_adj_im);
657
405k
                h12  = AAC_MUL30(h12,  ipd_adj_re);
658
405k
                h21i = AAC_MUL30(h21,  opd_im);
659
405k
                h21  = AAC_MUL30(h21,  opd_re);
660
405k
                h22i = AAC_MUL30(h22,  ipd_adj_im);
661
405k
                h22  = AAC_MUL30(h22,  ipd_adj_re);
662
405k
                H11[1][e+1][b] = h11i;
663
405k
                H12[1][e+1][b] = h12i;
664
405k
                H21[1][e+1][b] = h21i;
665
405k
                H22[1][e+1][b] = h22i;
666
405k
            }
667
1.05M
            H11[0][e+1][b] = h11;
668
1.05M
            H12[0][e+1][b] = h12;
669
1.05M
            H21[0][e+1][b] = h21;
670
1.05M
            H22[0][e+1][b] = h22;
671
1.05M
        }
672
3.53M
        for (k = 0; k < NR_BANDS[is34]; k++) {
673
3.48M
            LOCAL_ALIGNED_16(INTFLOAT, h, [2], [4]);
674
3.48M
            LOCAL_ALIGNED_16(INTFLOAT, h_step, [2], [4]);
675
3.48M
            int start = ps2->border_position[e];
676
3.48M
            int stop  = ps2->border_position[e+1];
677
3.48M
            INTFLOAT width = Q30(1.f) / ((stop - start) ? (stop - start) : 1);
678
#if USE_FIXED
679
            width = FFMIN(2U*width, INT_MAX);
680
#endif
681
3.48M
            b = k_to_i[k];
682
3.48M
            h[0][0] = H11[0][e][b];
683
3.48M
            h[0][1] = H12[0][e][b];
684
3.48M
            h[0][2] = H21[0][e][b];
685
3.48M
            h[0][3] = H22[0][e][b];
686
3.48M
            if (!PS_BASELINE && ps2->enable_ipdopd) {
687
            //Is this necessary? ps_04_new seems unchanged
688
2.54M
            if ((is34 && k <= 13 && k >= 9) || (!is34 && k <= 1)) {
689
81.4k
                h[1][0] = -H11[1][e][b];
690
81.4k
                h[1][1] = -H12[1][e][b];
691
81.4k
                h[1][2] = -H21[1][e][b];
692
81.4k
                h[1][3] = -H22[1][e][b];
693
2.45M
            } else {
694
2.45M
                h[1][0] = H11[1][e][b];
695
2.45M
                h[1][1] = H12[1][e][b];
696
2.45M
                h[1][2] = H21[1][e][b];
697
2.45M
                h[1][3] = H22[1][e][b];
698
2.45M
            }
699
2.54M
            }
700
            //Interpolation
701
3.48M
            h_step[0][0] = AAC_MSUB31_V3(H11[0][e+1][b], h[0][0], width);
702
3.48M
            h_step[0][1] = AAC_MSUB31_V3(H12[0][e+1][b], h[0][1], width);
703
3.48M
            h_step[0][2] = AAC_MSUB31_V3(H21[0][e+1][b], h[0][2], width);
704
3.48M
            h_step[0][3] = AAC_MSUB31_V3(H22[0][e+1][b], h[0][3], width);
705
3.48M
            if (!PS_BASELINE && ps2->enable_ipdopd) {
706
2.54M
                h_step[1][0] = AAC_MSUB31_V3(H11[1][e+1][b], h[1][0], width);
707
2.54M
                h_step[1][1] = AAC_MSUB31_V3(H12[1][e+1][b], h[1][1], width);
708
2.54M
                h_step[1][2] = AAC_MSUB31_V3(H21[1][e+1][b], h[1][2], width);
709
2.54M
                h_step[1][3] = AAC_MSUB31_V3(H22[1][e+1][b], h[1][3], width);
710
2.54M
            }
711
3.48M
            if (stop - start)
712
3.22M
                ps->dsp.stereo_interpolate[!PS_BASELINE && ps2->enable_ipdopd](
713
3.22M
                    l[k] + 1 + start, r[k] + 1 + start,
714
3.22M
                    h, h_step, stop - start);
715
3.48M
        }
716
46.6k
    }
717
19.5k
}
718
719
int AAC_RENAME(ff_ps_apply)(PSContext *ps, INTFLOAT L[2][38][64], INTFLOAT R[2][38][64], int top)
720
42.3k
{
721
42.3k
    INTFLOAT (*Lbuf)[32][2] = ps->Lbuf;
722
42.3k
    INTFLOAT (*Rbuf)[32][2] = ps->Rbuf;
723
42.3k
    const int len = 32;
724
42.3k
    int is34 = ps->common.is34bands;
725
726
42.3k
    top += NR_BANDS[is34] - 64;
727
42.3k
    memset(ps->delay+top, 0, (NR_BANDS[is34] - top)*sizeof(ps->delay[0]));
728
42.3k
    if (top < NR_ALLPASS_BANDS[is34])
729
415
        memset(ps->ap_delay + top, 0, (NR_ALLPASS_BANDS[is34] - top)*sizeof(ps->ap_delay[0]));
730
731
42.3k
    hybrid_analysis(&ps->dsp, Lbuf, ps->in_buf, L, is34, len);
732
42.3k
    decorrelation(ps, Rbuf, (const INTFLOAT (*)[32][2]) Lbuf, is34);
733
42.3k
    stereo_processing(ps, Lbuf, Rbuf, is34);
734
42.3k
    hybrid_synthesis(&ps->dsp, L, Lbuf, is34, len);
735
42.3k
    hybrid_synthesis(&ps->dsp, R, Rbuf, is34, len);
736
737
42.3k
    return 0;
738
42.3k
}
ff_ps_apply_fixed
Line
Count
Source
720
22.7k
{
721
22.7k
    INTFLOAT (*Lbuf)[32][2] = ps->Lbuf;
722
22.7k
    INTFLOAT (*Rbuf)[32][2] = ps->Rbuf;
723
22.7k
    const int len = 32;
724
22.7k
    int is34 = ps->common.is34bands;
725
726
22.7k
    top += NR_BANDS[is34] - 64;
727
22.7k
    memset(ps->delay+top, 0, (NR_BANDS[is34] - top)*sizeof(ps->delay[0]));
728
22.7k
    if (top < NR_ALLPASS_BANDS[is34])
729
196
        memset(ps->ap_delay + top, 0, (NR_ALLPASS_BANDS[is34] - top)*sizeof(ps->ap_delay[0]));
730
731
22.7k
    hybrid_analysis(&ps->dsp, Lbuf, ps->in_buf, L, is34, len);
732
22.7k
    decorrelation(ps, Rbuf, (const INTFLOAT (*)[32][2]) Lbuf, is34);
733
22.7k
    stereo_processing(ps, Lbuf, Rbuf, is34);
734
22.7k
    hybrid_synthesis(&ps->dsp, L, Lbuf, is34, len);
735
22.7k
    hybrid_synthesis(&ps->dsp, R, Rbuf, is34, len);
736
737
22.7k
    return 0;
738
22.7k
}
ff_ps_apply
Line
Count
Source
720
19.5k
{
721
19.5k
    INTFLOAT (*Lbuf)[32][2] = ps->Lbuf;
722
19.5k
    INTFLOAT (*Rbuf)[32][2] = ps->Rbuf;
723
19.5k
    const int len = 32;
724
19.5k
    int is34 = ps->common.is34bands;
725
726
19.5k
    top += NR_BANDS[is34] - 64;
727
19.5k
    memset(ps->delay+top, 0, (NR_BANDS[is34] - top)*sizeof(ps->delay[0]));
728
19.5k
    if (top < NR_ALLPASS_BANDS[is34])
729
219
        memset(ps->ap_delay + top, 0, (NR_ALLPASS_BANDS[is34] - top)*sizeof(ps->ap_delay[0]));
730
731
19.5k
    hybrid_analysis(&ps->dsp, Lbuf, ps->in_buf, L, is34, len);
732
19.5k
    decorrelation(ps, Rbuf, (const INTFLOAT (*)[32][2]) Lbuf, is34);
733
19.5k
    stereo_processing(ps, Lbuf, Rbuf, is34);
734
19.5k
    hybrid_synthesis(&ps->dsp, L, Lbuf, is34, len);
735
19.5k
    hybrid_synthesis(&ps->dsp, R, Rbuf, is34, len);
736
737
19.5k
    return 0;
738
19.5k
}
739
740
3
av_cold void AAC_RENAME(ff_ps_init)(void) {
741
3
    ps_tableinit();
742
3
}
ff_ps_init_fixed
Line
Count
Source
740
1
av_cold void AAC_RENAME(ff_ps_init)(void) {
741
1
    ps_tableinit();
742
1
}
ff_ps_init
Line
Count
Source
740
2
av_cold void AAC_RENAME(ff_ps_init)(void) {
741
2
    ps_tableinit();
742
2
}