Mercurial > libavcodec.hg
annotate acelp_filters.h @ 8130:c45366b01126 libavcodec
ARM: fix j_rev_dct_ARM
This is a bugfix for ARMv4 assembly implementation of 'j_rev_dct'
function.
The problem was in the incorrect partially empty row detection. Even
if the first two coefficients in the row were nonzero, it handled this
just like the case with only the first nonzero coefficient.
Now this function produces exactly the same output as the stripped
down reference C version of 'j_rev_dct' (with the nested checks like
'if (d6) { if (d2) { ...' always evaluated as true, avoiding shortcut
branches).
author | mru |
---|---|
date | Wed, 12 Nov 2008 20:23:36 +0000 |
parents | 611a21e4b01b |
children | 05ea4942df9b |
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 | |
7760 | 23 #ifndef AVCODEC_ACELP_FILTERS_H |
24 #define AVCODEC_ACELP_FILTERS_H | |
6772 | 25 |
6796 | 26 #include <stdint.h> |
27 | |
6772 | 28 /** |
7643 | 29 * low-pass Finite Impulse Response filter coefficients. |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
30 * |
7644
3d5972069016
Mention the fixed-point scale of the FIR filter coefficients.
michael
parents:
7643
diff
changeset
|
31 * Hamming windowed sinc filter with cutoff freq 3/40 of the sampling freq, |
3d5972069016
Mention the fixed-point scale of the FIR filter coefficients.
michael
parents:
7643
diff
changeset
|
32 * the coefficients are scaled by 2^15. |
7643 | 33 * This array only contains the right half of the filter. |
34 * This filter is likely identical to the one used in G.729, though this | |
35 * could not be determined from the original comments with certainity. | |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
36 */ |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
37 extern const int16_t ff_acelp_interp_filter[61]; |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
38 |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
39 /** |
7647 | 40 * Generic FIR interpolation routine. |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
41 * @param out [out] buffer for interpolated data |
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
42 * @param in input data |
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
43 * @param filter_coeffs interpolation filter coefficients (0.15) |
7648
4df1c17c034c
Try to improve parameter doxy of ff_acelp_interpolate().
michael
parents:
7647
diff
changeset
|
44 * @param precision sub sample factor, that is the precision of the position |
4df1c17c034c
Try to improve parameter doxy of ff_acelp_interpolate().
michael
parents:
7647
diff
changeset
|
45 * @param frac_pos fractional part of position [0..precision-1] |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
46 * @param filter_length filter length |
7646
9b769aa9c665
Correct incorrect length parameter doxy for ff_acelp_interpolate().
michael
parents:
7645
diff
changeset
|
47 * @param length length of output |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
48 * |
7645
dcfbc11cfd7d
Right half is clearer than positive half for specifying which part of
michael
parents:
7644
diff
changeset
|
49 * filter_coeffs contains coefficients of the right half of the symmetric |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
50 * interpolation filter. filter_coeffs[0] should the central (unpaired) coefficient. |
7249 | 51 * See ff_acelp_interp_filter for an example. |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
52 * |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
53 */ |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
54 void ff_acelp_interpolate( |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
55 int16_t* out, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
56 const int16_t* in, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
57 const int16_t* filter_coeffs, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
58 int precision, |
7648
4df1c17c034c
Try to improve parameter doxy of ff_acelp_interpolate().
michael
parents:
7647
diff
changeset
|
59 int frac_pos, |
6856
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
60 int filter_length, |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
61 int length); |
94465a2c3b34
Move pitch vector interpolation code to acelp_filters
voroshil
parents:
6814
diff
changeset
|
62 |
6772 | 63 |
64 /** | |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
65 * high-pass filtering and upscaling (4.2.5 of G.729). |
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
66 * @param out [out] output buffer for filtered speech data |
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
67 * @param hpf_f [in/out] past filtered data from previous (2 items long) |
6772 | 68 * frames (-0x20000000 <= (14.13) < 0x20000000) |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
69 * @param in speech data to process |
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
70 * @param length input data size |
6772 | 71 * |
72 * out[i] = 0.93980581 * in[i] - 1.8795834 * in[i-1] + 0.93980581 * in[i-2] + | |
73 * 1.9330735 * out[i-1] - 0.93589199 * out[i-2] | |
74 * | |
7654
999b818c33cc
Mention cut-off freq of ff_acelp_high_pass_filter() instead of some
michael
parents:
7651
diff
changeset
|
75 * The filter has a cut-off frequency of 1/80 of the sampling freq |
6772 | 76 * |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
77 * @note Two items before the top of the out buffer must contain two items from the |
6772 | 78 * tail of the previous subframe. |
79 * | |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
80 * @remark It is safe to pass the same array in in and out parameters. |
6772 | 81 * |
7642
1fbf9b2060ce
Make doxygen comments consistent with the rest of FFmpeg.
michael
parents:
7249
diff
changeset
|
82 * @remark AMR uses mostly the same filter (cut-off frequency 60Hz, same formula, |
6772 | 83 * but constants differs in 5th sign after comma). Fortunately in |
84 * fixed-point all coefficients are the same as in G.729. Thus this | |
85 * routine can be used for the fixed-point AMR decoder, too. | |
86 */ | |
87 void ff_acelp_high_pass_filter( | |
88 int16_t* out, | |
89 int hpf_f[2], | |
90 const int16_t* in, | |
91 int length); | |
92 | |
7760 | 93 #endif /* AVCODEC_ACELP_FILTERS_H */ |