Mercurial > libavcodec.hg
annotate acelp_filters.c @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 7f9d077af2e4 |
children | 0516f4062307 |
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 |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
117 void ff_acelp_apply_order_2_transfer_function(float *buf, |
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++) { |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
126 tmp = gain * buf[i] - pole_coeffs[0] * mem[0] - pole_coeffs[1] * mem[1]; |
cfb009484d2d
Add a function that can apply an order 2 rational transfer function in-place.
superdump
parents:
9792
diff
changeset
|
127 buf[i] = tmp + zero_coeffs[0] * mem[0] + zero_coeffs[1] * mem[1]; |
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 |