Mercurial > libavcodec.hg
annotate acelp_filters.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 | 0516f4062307 |
children |
rev | line source |
---|---|
6772 | 1 /* |
2 * various filters for ACELP-based codecs | |
3 * | |
4 * Copyright (c) 2008 Vladimir Voroshilov | |
5 * | |
6 * This file is part of FFmpeg. | |
7 * | |
8 * FFmpeg is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU Lesser General Public | |
10 * License as published by the Free Software Foundation; either | |
11 * version 2.1 of the License, or (at your option) any later version. | |
12 * | |
13 * FFmpeg is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
19 * License along with FFmpeg; if not, write to the Free Software | |
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 */ | |
22 | |
23 #include <inttypes.h> | |
24 | |
25 #include "avcodec.h" | |
26 #include "acelp_filters.h" | |
27 | |
9792 | 28 const int16_t ff_acelp_interp_filter[61] = { /* (0.15) */ |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
29 29443, 28346, 25207, 20449, 14701, 8693, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
30 3143, -1352, -4402, -5865, -5850, -4673, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
31 -2783, -672, 1211, 2536, 3130, 2991, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
32 2259, 1170, 0, -1001, -1652, -1868, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
33 -1666, -1147, -464, 218, 756, 1060, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
34 1099, 904, 550, 135, -245, -514, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
35 -634, -602, -451, -231, 0, 191, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
36 308, 340, 296, 198, 78, -36, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
37 -120, -163, -165, -132, -79, -19, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
38 34, 73, 91, 89, 70, 38, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
39 0, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
40 }; |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
41 |
9792 | 42 void ff_acelp_interpolate(int16_t* out, const int16_t* in, |
43 const int16_t* filter_coeffs, int precision, | |
44 int frac_pos, int filter_length, int length) | |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
45 { |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
46 int n, i; |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
47 |
10844
7f9d077af2e4
10l: Fix forgotten variable rename from r14893 (fixes issue 1675).
cehoyos
parents:
10463
diff
changeset
|
48 assert(frac_pos >= 0 && frac_pos < precision); |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
49 |
9792 | 50 for (n = 0; n < length; n++) { |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
51 int idx = 0; |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
52 int v = 0x4000; |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
53 |
9792 | 54 for (i = 0; i < filter_length;) { |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
55 |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
56 /* The reference G.729 and AMR fixed point code performs clipping after |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
57 each of the two following accumulations. |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
58 Since clipping affects only the synthetic OVERFLOW test without |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
59 causing an int type overflow, it was moved outside the loop. */ |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
60 |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
61 /* R(x):=ac_v[-k+x] |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
62 v += R(n-i)*ff_acelp_interp_filter(t+6i) |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
63 v += R(n+i+1)*ff_acelp_interp_filter(6-t+6i) */ |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
64 |
7649 | 65 v += in[n + i] * filter_coeffs[idx + frac_pos]; |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
66 idx += precision; |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
67 i++; |
7649 | 68 v += in[n - i] * filter_coeffs[idx - frac_pos]; |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
69 } |
9792 | 70 if (av_clip_int16(v >> 15) != (v >> 15)) |
7692
3ced4fb23342
Replace cliping in ff_acelp_interpolate() by a check&av_log, this should be the
michael
parents:
7653
diff
changeset
|
71 av_log(NULL, AV_LOG_WARNING, "overflow that would need cliping in ff_acelp_interpolate()\n"); |
3ced4fb23342
Replace cliping in ff_acelp_interpolate() by a check&av_log, this should be the
michael
parents:
7653
diff
changeset
|
72 out[n] = v >> 15; |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
73 } |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
74 } |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6775
diff
changeset
|
75 |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
76 void ff_acelp_interpolatef(float *out, const float *in, |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
77 const float *filter_coeffs, int precision, |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
78 int frac_pos, int filter_length, int length) |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
79 { |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
80 int n, i; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
81 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
82 for (n = 0; n < length; n++) { |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
83 int idx = 0; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
84 float v = 0; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
85 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
86 for (i = 0; i < filter_length;) { |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
87 v += in[n + i] * filter_coeffs[idx + frac_pos]; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
88 idx += precision; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
89 i++; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
90 v += in[n - i] * filter_coeffs[idx - frac_pos]; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
91 } |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
92 out[n] = v; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
93 } |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
94 } |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
95 |
6772 | 96 |
9792 | 97 void ff_acelp_high_pass_filter(int16_t* out, int hpf_f[2], |
98 const int16_t* in, int length) | |
6772 | 99 { |
100 int i; | |
101 int tmp; | |
102 | |
9792 | 103 for (i = 0; i < length; i++) { |
104 tmp = (hpf_f[0]* 15836LL) >> 13; | |
105 tmp += (hpf_f[1]* -7667LL) >> 13; | |
7695 | 106 tmp += 7699 * (in[i] - 2*in[i-1] + in[i-2]); |
6772 | 107 |
7696
76cf62255b28
(cosmetics) Describe for which tests clipping is required.
voroshil
parents:
7695
diff
changeset
|
108 /* With "+0x800" rounding, clipping is needed |
76cf62255b28
(cosmetics) Describe for which tests clipping is required.
voroshil
parents:
7695
diff
changeset
|
109 for ALGTHM and SPEECH tests. */ |
7695 | 110 out[i] = av_clip_int16((tmp + 0x800) >> 12); |
6772 | 111 |
112 hpf_f[1] = hpf_f[0]; | |
113 hpf_f[0] = tmp; | |
114 } | |
115 } | |
10057
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
116 |
11648
0516f4062307
Split input/output data arguments to ff_acelp_apply_order_2_transfer_function().
rbultje
parents:
10844
diff
changeset
|
117 void ff_acelp_apply_order_2_transfer_function(float *out, const float *in, |
10057
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
118 const float zero_coeffs[2], |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
119 const float pole_coeffs[2], |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
120 float gain, float mem[2], int n) |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
121 { |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
122 int i; |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
123 float tmp; |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
124 |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
125 for (i = 0; i < n; i++) { |
11648
0516f4062307
Split input/output data arguments to ff_acelp_apply_order_2_transfer_function().
rbultje
parents:
10844
diff
changeset
|
126 tmp = gain * in[i] - pole_coeffs[0] * mem[0] - pole_coeffs[1] * mem[1]; |
0516f4062307
Split input/output data arguments to ff_acelp_apply_order_2_transfer_function().
rbultje
parents:
10844
diff
changeset
|
127 out[i] = tmp + zero_coeffs[0] * mem[0] + zero_coeffs[1] * mem[1]; |
10057
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
128 |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
129 mem[1] = mem[0]; |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
130 mem[0] = tmp; |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
131 } |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
132 } |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
133 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
134 void ff_tilt_compensation(float *mem, float tilt, float *samples, int size) |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
135 { |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
136 float new_tilt_mem = samples[size - 1]; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
137 int i; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
138 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
139 for (i = size - 1; i > 0; i--) |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
140 samples[i] -= tilt * samples[i - 1]; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
141 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
142 samples[0] -= tilt * *mem; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
143 *mem = new_tilt_mem; |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
144 } |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10057
diff
changeset
|
145 |