/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 | } 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 | } |
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 | } 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 | } |
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 | } 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 | } |
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 | } 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 | } |
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 | } 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 | } |
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 | } Line | Count | Source | 740 | 1 | av_cold void AAC_RENAME(ff_ps_init)(void) { | 741 | 1 | ps_tableinit(); | 742 | 1 | } |
Line | Count | Source | 740 | 2 | av_cold void AAC_RENAME(ff_ps_init)(void) { | 741 | 2 | ps_tableinit(); | 742 | 2 | } |
|