annotate acelp_filters.c @ 12329:6644e439130d libavcodec

Calculate an exact frame size before writing. Now the buffer size requirements can be known exactly, so larger frame sizes can be safely encoded without buffer overwrite.
author jbr
date Sat, 31 Jul 2010 20:32:12 +0000
parents 0516f4062307
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
1 /*
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
2 * various filters for ACELP-based codecs
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
3 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
4 * Copyright (c) 2008 Vladimir Voroshilov
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
5 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
6 * This file is part of FFmpeg.
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
7 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
12 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
16 * Lesser General Public License for more details.
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
17 *
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
21 */
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
22
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
23 #include <inttypes.h>
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
24
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
25 #include "avcodec.h"
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
26 #include "acelp_filters.h"
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
27
9792
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
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
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
42 void ff_acelp_interpolate(int16_t* out, const int16_t* in,
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
43 const int16_t* filter_coeffs, int precision,
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
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
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
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
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
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
8c5d7ede9c96 rename pitch_delay_frac in ff_acelp_interpolate()
michael
parents: 7641
diff changeset
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
8c5d7ede9c96 rename pitch_delay_frac in ff_acelp_interpolate()
michael
parents: 7641
diff changeset
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
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
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
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
96
9792
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
97 void ff_acelp_high_pass_filter(int16_t* out, int hpf_f[2],
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
98 const int16_t* in, int length)
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
99 {
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
100 int i;
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
101 int tmp;
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
102
9792
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
103 for (i = 0; i < length; i++) {
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
104 tmp = (hpf_f[0]* 15836LL) >> 13;
05ea4942df9b cosmetics: K&R style reformatting
diego
parents: 8049
diff changeset
105 tmp += (hpf_f[1]* -7667LL) >> 13;
7695
073847371624 (cosmetics) Remove wrong comments.
voroshil
parents: 7692
diff changeset
106 tmp += 7699 * (in[i] - 2*in[i-1] + in[i-2]);
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
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
073847371624 (cosmetics) Remove wrong comments.
voroshil
parents: 7692
diff changeset
110 out[i] = av_clip_int16((tmp + 0x800) >> 12);
6772
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
111
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
112 hpf_f[1] = hpf_f[0];
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
113 hpf_f[0] = tmp;
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
114 }
695f4ab2db4c various filters for ACELP-based codecs
voroshil
parents:
diff changeset
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