Mercurial > libavcodec.hg
annotate acelp_vectors.c @ 12197:fbf4d5b1b664 libavcodec
Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than
regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag,
FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that
have been checked specifically on such CPUs and are actually faster than
their MMX counterparts.
In addition, use this flag to enable particular VP8 and LPC SSE2 functions
that are faster than their MMX counterparts.
Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author | rbultje |
---|---|
date | Mon, 19 Jul 2010 22:38:23 +0000 |
parents | 26aabf52f578 |
children |
rev | line source |
---|---|
6846
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
1 /* |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
2 * adaptive and fixed codebook vector operations for ACELP-based codecs |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
3 * |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
4 * Copyright (c) 2008 Vladimir Voroshilov |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
5 * |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
6 * This file is part of FFmpeg. |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
7 * |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
10 * License as published by the Free Software Foundation; either |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
12 * |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
16 * Lesser General Public License for more details. |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
17 * |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
21 */ |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
22 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
23 #include <inttypes.h> |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
24 #include "avcodec.h" |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
25 #include "acelp_vectors.h" |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
26 #include "celp_math.h" |
6846
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
27 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
28 const uint8_t ff_fc_2pulses_9bits_track1[16] = |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
29 { |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
30 1, 3, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
31 6, 8, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
32 11, 13, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
33 16, 18, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
34 21, 23, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
35 26, 28, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
36 31, 33, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
37 36, 38 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
38 }; |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
39 const uint8_t ff_fc_2pulses_9bits_track1_gray[16] = |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
40 { |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
41 1, 3, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
42 8, 6, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
43 18, 16, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
44 11, 13, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
45 38, 36, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
46 31, 33, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
47 21, 23, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
48 28, 26, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
49 }; |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
50 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
51 const uint8_t ff_fc_2pulses_9bits_track2_gray[32] = |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
52 { |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
53 0, 2, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
54 5, 4, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
55 12, 10, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
56 7, 9, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
57 25, 24, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
58 20, 22, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
59 14, 15, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
60 19, 17, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
61 36, 31, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
62 21, 26, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
63 1, 6, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
64 16, 11, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
65 27, 29, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
66 32, 30, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
67 39, 37, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
68 34, 35, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
69 }; |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
70 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
71 const uint8_t ff_fc_4pulses_8bits_tracks_13[16] = |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
72 { |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
73 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
74 }; |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
75 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
76 const uint8_t ff_fc_4pulses_8bits_track_4[32] = |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
77 { |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
78 3, 4, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
79 8, 9, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
80 13, 14, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
81 18, 19, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
82 23, 24, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
83 28, 29, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
84 33, 34, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
85 38, 39, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
86 43, 44, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
87 48, 49, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
88 53, 54, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
89 58, 59, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
90 63, 64, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
91 68, 69, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
92 73, 74, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
93 78, 79, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
94 }; |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
95 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
96 #if 0 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
97 static uint8_t gray_decode[32] = |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
98 { |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
99 0, 1, 3, 2, 7, 6, 4, 5, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
100 15, 14, 12, 13, 8, 9, 11, 10, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
101 31, 30, 28, 29, 24, 25, 27, 26, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
102 16, 17, 19, 18, 23, 22, 20, 21 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
103 }; |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
104 #endif |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
105 |
10698 | 106 const float ff_pow_0_7[10] = { |
107 0.700000, 0.490000, 0.343000, 0.240100, 0.168070, | |
108 0.117649, 0.082354, 0.057648, 0.040354, 0.028248 | |
109 }; | |
110 | |
111 const float ff_pow_0_75[10] = { | |
112 0.750000, 0.562500, 0.421875, 0.316406, 0.237305, | |
113 0.177979, 0.133484, 0.100113, 0.075085, 0.056314 | |
114 }; | |
115 | |
116 const float ff_pow_0_55[10] = { | |
117 0.550000, 0.302500, 0.166375, 0.091506, 0.050328, | |
118 0.027681, 0.015224, 0.008373, 0.004605, 0.002533 | |
119 }; | |
120 | |
121 const float ff_b60_sinc[61] = { | |
122 0.898529 , 0.865051 , 0.769257 , 0.624054 , 0.448639 , 0.265289 , | |
123 0.0959167 , -0.0412598 , -0.134338 , -0.178986 , -0.178528 , -0.142609 , | |
124 -0.0849304 , -0.0205078 , 0.0369568 , 0.0773926 , 0.0955200 , 0.0912781 , | |
125 0.0689392 , 0.0357056 , 0. , -0.0305481 , -0.0504150 , -0.0570068 , | |
126 -0.0508423 , -0.0350037 , -0.0141602 , 0.00665283, 0.0230713 , 0.0323486 , | |
127 0.0335388 , 0.0275879 , 0.0167847 , 0.00411987, -0.00747681, -0.0156860 , | |
128 -0.0193481 , -0.0183716 , -0.0137634 , -0.00704956, 0. , 0.00582886 , | |
129 0.00939941, 0.0103760 , 0.00903320, 0.00604248, 0.00238037, -0.00109863 , | |
130 -0.00366211, -0.00497437, -0.00503540, -0.00402832, -0.00241089, -0.000579834, | |
131 0.00103760, 0.00222778, 0.00277710, 0.00271606, 0.00213623, 0.00115967 , | |
132 0. | |
133 }; | |
134 | |
6846
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
135 void ff_acelp_fc_pulse_per_track( |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
136 int16_t* fc_v, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
137 const uint8_t *tab1, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
138 const uint8_t *tab2, |
6905
d163c4f3f4ab
consistency cosmetics: indices --> indexes in variable names
diego
parents:
6846
diff
changeset
|
139 int pulse_indexes, |
6846
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
140 int pulse_signs, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
141 int pulse_count, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
142 int bits) |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
143 { |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
144 int mask = (1 << bits) - 1; |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
145 int i; |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
146 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
147 for(i=0; i<pulse_count; i++) |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
148 { |
6905
d163c4f3f4ab
consistency cosmetics: indices --> indexes in variable names
diego
parents:
6846
diff
changeset
|
149 fc_v[i + tab1[pulse_indexes & mask]] += |
6846
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
150 (pulse_signs & 1) ? 8191 : -8192; // +/-1 in (2.13) |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
151 |
6905
d163c4f3f4ab
consistency cosmetics: indices --> indexes in variable names
diego
parents:
6846
diff
changeset
|
152 pulse_indexes >>= bits; |
6846
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
153 pulse_signs >>= 1; |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
154 } |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
155 |
6905
d163c4f3f4ab
consistency cosmetics: indices --> indexes in variable names
diego
parents:
6846
diff
changeset
|
156 fc_v[tab2[pulse_indexes]] += (pulse_signs & 1) ? 8191 : -8192; |
6846
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
157 } |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
158 |
10676 | 159 void ff_decode_10_pulses_35bits(const int16_t *fixed_index, |
160 AMRFixed *fixed_sparse, | |
161 const uint8_t *gray_decode, | |
162 int half_pulse_count, int bits) | |
163 { | |
164 int i; | |
165 int mask = (1 << bits) - 1; | |
166 | |
11052
00fcecde822b
Add no_repeat_mask option, so that single-pulse vectors can also be
rbultje
parents:
11044
diff
changeset
|
167 fixed_sparse->no_repeat_mask = 0; |
10676 | 168 fixed_sparse->n = 2 * half_pulse_count; |
169 for (i = 0; i < half_pulse_count; i++) { | |
170 const int pos1 = gray_decode[fixed_index[2*i+1] & mask] + i; | |
171 const int pos2 = gray_decode[fixed_index[2*i ] & mask] + i; | |
172 const float sign = (fixed_index[2*i+1] & (1 << bits)) ? -1.0 : 1.0; | |
173 fixed_sparse->x[2*i+1] = pos1; | |
174 fixed_sparse->x[2*i ] = pos2; | |
175 fixed_sparse->y[2*i+1] = sign; | |
176 fixed_sparse->y[2*i ] = pos2 < pos1 ? -sign : sign; | |
177 } | |
178 } | |
179 | |
6846
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
180 void ff_acelp_weighted_vector_sum( |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
181 int16_t* out, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
182 const int16_t *in_a, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
183 const int16_t *in_b, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
184 int16_t weight_coeff_a, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
185 int16_t weight_coeff_b, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
186 int16_t rounder, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
187 int shift, |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
188 int length) |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
189 { |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
190 int i; |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
191 |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
192 // Clipping required here; breaks OVERFLOW test. |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
193 for(i=0; i<length; i++) |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
194 out[i] = av_clip_int16(( |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
195 in_a[i] * weight_coeff_a + |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
196 in_b[i] * weight_coeff_b + |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
197 rounder) >> shift); |
4346441afca6
adaptive and fixed codebook vector operations for ACELP-based codecs
voroshil
parents:
diff
changeset
|
198 } |
9156
139d30c8c274
Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents:
6905
diff
changeset
|
199 |
139d30c8c274
Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents:
6905
diff
changeset
|
200 void ff_weighted_vector_sumf(float *out, const float *in_a, const float *in_b, |
139d30c8c274
Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents:
6905
diff
changeset
|
201 float weight_coeff_a, float weight_coeff_b, int length) |
139d30c8c274
Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents:
6905
diff
changeset
|
202 { |
139d30c8c274
Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents:
6905
diff
changeset
|
203 int i; |
139d30c8c274
Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents:
6905
diff
changeset
|
204 |
139d30c8c274
Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents:
6905
diff
changeset
|
205 for(i=0; i<length; i++) |
139d30c8c274
Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents:
6905
diff
changeset
|
206 out[i] = weight_coeff_a * in_a[i] |
139d30c8c274
Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents:
6905
diff
changeset
|
207 + weight_coeff_b * in_b[i]; |
139d30c8c274
Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents:
6905
diff
changeset
|
208 } |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
209 |
11647
26aabf52f578
Split the input/output data arguments to ff_adaptive_gain_control().
rbultje
parents:
11462
diff
changeset
|
210 void ff_adaptive_gain_control(float *out, const float *in, float speech_energ, |
11462 | 211 int size, float alpha, float *gain_mem) |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
212 { |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
213 int i; |
11647
26aabf52f578
Split the input/output data arguments to ff_adaptive_gain_control().
rbultje
parents:
11462
diff
changeset
|
214 float postfilter_energ = ff_dot_productf(in, in, size); |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
215 float gain_scale_factor = 1.0; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
216 float mem = *gain_mem; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
217 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
218 if (postfilter_energ) |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
219 gain_scale_factor = sqrt(speech_energ / postfilter_energ); |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
220 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
221 gain_scale_factor *= 1.0 - alpha; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
222 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
223 for (i = 0; i < size; i++) { |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
224 mem = alpha * mem + gain_scale_factor; |
11647
26aabf52f578
Split the input/output data arguments to ff_adaptive_gain_control().
rbultje
parents:
11462
diff
changeset
|
225 out[i] = in[i] * mem; |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
226 } |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
227 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
228 *gain_mem = mem; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
9156
diff
changeset
|
229 } |
10493
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
230 |
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
231 void ff_scale_vector_to_given_sum_of_squares(float *out, const float *in, |
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
232 float sum_of_squares, const int n) |
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
233 { |
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
234 int i; |
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
235 float scalefactor = ff_dot_productf(in, in, n); |
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
236 if (scalefactor) |
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
237 scalefactor = sqrt(sum_of_squares / scalefactor); |
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
238 for (i = 0; i < n; i++) |
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
239 out[i] = in[i] * scalefactor; |
5f2ced30548b
Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents:
10463
diff
changeset
|
240 } |
10676 | 241 |
242 void ff_set_fixed_vector(float *out, const AMRFixed *in, float scale, int size) | |
243 { | |
244 int i; | |
245 | |
246 for (i=0; i < in->n; i++) { | |
11052
00fcecde822b
Add no_repeat_mask option, so that single-pulse vectors can also be
rbultje
parents:
11044
diff
changeset
|
247 int x = in->x[i], repeats = !((in->no_repeat_mask >> i) & 1); |
10676 | 248 float y = in->y[i] * scale; |
249 | |
11044
3f66d1d80e03
Simplify. See "[PATCH] simplify ff_set_fixed_vector()" thread on mailinglist.
rbultje
parents:
10698
diff
changeset
|
250 do { |
3f66d1d80e03
Simplify. See "[PATCH] simplify ff_set_fixed_vector()" thread on mailinglist.
rbultje
parents:
10698
diff
changeset
|
251 out[x] += y; |
10676 | 252 y *= in->pitch_fac; |
253 x += in->pitch_lag; | |
11052
00fcecde822b
Add no_repeat_mask option, so that single-pulse vectors can also be
rbultje
parents:
11044
diff
changeset
|
254 } while (x < size && repeats); |
10676 | 255 } |
256 } | |
257 | |
258 void ff_clear_fixed_vector(float *out, const AMRFixed *in, int size) | |
259 { | |
260 int i; | |
261 | |
262 for (i=0; i < in->n; i++) { | |
11052
00fcecde822b
Add no_repeat_mask option, so that single-pulse vectors can also be
rbultje
parents:
11044
diff
changeset
|
263 int x = in->x[i], repeats = !((in->no_repeat_mask >> i) & 1); |
10676 | 264 |
11044
3f66d1d80e03
Simplify. See "[PATCH] simplify ff_set_fixed_vector()" thread on mailinglist.
rbultje
parents:
10698
diff
changeset
|
265 do { |
10676 | 266 out[x] = 0.0; |
267 x += in->pitch_lag; | |
11052
00fcecde822b
Add no_repeat_mask option, so that single-pulse vectors can also be
rbultje
parents:
11044
diff
changeset
|
268 } while (x < size && repeats); |
10676 | 269 } |
270 } |