Mercurial > libavcodec.hg
annotate celp_math.c @ 9379:d31c367da415 libavcodec
Make sure mpeg2 has its height rounded up to 32 as that is needed
for interlaced stuff.
This might have been exploitable when emu edge was not set though
note this bug has been introduced just a few days ago.
author | michael |
---|---|
date | Fri, 10 Apr 2009 00:09:07 +0000 |
parents | 7818ed859f66 |
children |
rev | line source |
---|---|
6682
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
1 /* |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
2 * Various fixed-point math operations |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
3 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
4 * Copyright (c) 2008 Vladimir Voroshilov |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
5 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
6 * This file is part of FFmpeg. |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
7 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
10 * License as published by the Free Software Foundation; either |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
12 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
16 * Lesser General Public License for more details. |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
17 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
21 */ |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
22 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
23 #include <inttypes.h> |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
24 #include <limits.h> |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
25 #include <assert.h> |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
26 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
27 #include "avcodec.h" |
8048
ecb1962c12f3
Rename acelp_math.[ch] to celp_math.[ch] to prepare for QCELP decoder merge.
diego
parents:
6682
diff
changeset
|
28 #include "celp_math.h" |
6682
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
29 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
30 #ifdef G729_BITEXACT |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
31 /** |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
32 * Cosine table: base_cos[i] = (1<<15) * cos(i*PI/64) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
33 */ |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
34 static const int16_t base_cos[64] = |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
35 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
36 32767, 32729, 32610, 32413, 32138, 31786, 31357, 30853, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
37 30274, 29622, 28899, 28106, 27246, 26320, 25330, 24279, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
38 23170, 22006, 20788, 19520, 18205, 16846, 15447, 14010, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
39 12540, 11039, 9512, 7962, 6393, 4808, 3212, 1608, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
40 0, -1608, -3212, -4808, -6393, -7962, -9512, -11039, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
41 -12540, -14010, -15447, -16846, -18205, -19520, -20788, -22006, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
42 -23170, -24279, -25330, -26320, -27246, -28106, -28899, -29622, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
43 -30274, -30853, -31357, -31786, -32138, -32413, -32610, -32729 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
44 }; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
45 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
46 /** |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
47 * Slope used to compute cos(x) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
48 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
49 * cos(ind*64+offset) = base_cos[ind]+offset*slope_cos[ind] |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
50 * values multiplied by 1<<19 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
51 */ |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
52 static const int16_t slope_cos[64] = |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
53 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
54 -632, -1893, -3150, -4399, -5638, -6863, -8072, -9261, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
55 -10428, -11570, -12684, -13767, -14817, -15832, -16808, -17744, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
56 -18637, -19486, -20287, -21039, -21741, -22390, -22986, -23526, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
57 -24009, -24435, -24801, -25108, -25354, -25540, -25664, -25726, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
58 -25726, -25664, -25540, -25354, -25108, -24801, -24435, -24009, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
59 -23526, -22986, -22390, -21741, -21039, -20287, -19486, -18637, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
60 -17744, -16808, -15832, -14817, -13767, -12684, -11570, -10428, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
61 -9261, -8072, -6863, -5638, -4399, -3150, -1893, -632 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
62 }; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
63 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
64 /** |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
65 * Table used to compute exp2(x) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
66 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
67 * tab_exp2[i] = (1<<14) * exp2(i/32) = 2^(i/32) i=0..32 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
68 */ |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
69 static const uint16_t tab_exp2[33] = |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
70 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
71 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
72 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
73 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
74 31379, 32066, 32767 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
75 }; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
76 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
77 int16_t ff_cos(uint16_t arg) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
78 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
79 uint8_t offset= arg; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
80 uint8_t ind = arg >> 8; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
81 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
82 assert(arg < 0x4000); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
83 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
84 return FFMAX(base_cos[ind] + ((slope_cos[ind] * offset) >> 12), -0x8000); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
85 } |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
86 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
87 int ff_exp2(uint16_t power) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
88 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
89 uint16_t frac_x0; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
90 uint16_t frac_dx; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
91 int result; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
92 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
93 assert(power <= 0x7fff); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
94 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
95 frac_x0 = power >> 10; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
96 frac_dx = (power & 0x03ff) << 5; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
97 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
98 result = tab_exp2[frac_x0] << 15; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
99 result += frac_dx * (tab_exp2[frac_x0+1] - tab_exp2[frac_x0]); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
100 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
101 return result >> 10; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
102 } |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
103 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
104 #else // G729_BITEXACT |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
105 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
106 /** |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
107 * Cosine table: base_cos[i] = (1<<15) * cos(i*PI/64) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
108 */ |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
109 static const int16_t tab_cos[65] = |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
110 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
111 32767, 32738, 32617, 32421, 32145, 31793, 31364, 30860, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
112 30280, 29629, 28905, 28113, 27252, 26326, 25336, 24285, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
113 23176, 22011, 20793, 19525, 18210, 16851, 15451, 14014, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
114 12543, 11043, 9515, 7965, 6395, 4810, 3214, 1609, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
115 1, -1607, -3211, -4808, -6393, -7962, -9513, -11040, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
116 -12541, -14012, -15449, -16848, -18207, -19523, -20791, -22009, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
117 -23174, -24283, -25334, -26324, -27250, -28111, -28904, -29627, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
118 -30279, -30858, -31363, -31792, -32144, -32419, -32616, -32736, -32768, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
119 }; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
120 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
121 static const uint16_t exp2a[]= |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
122 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
123 0, 1435, 2901, 4400, 5931, 7496, 9096, 10730, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
124 12400, 14106, 15850, 17632, 19454, 21315, 23216, 25160, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
125 27146, 29175, 31249, 33368, 35534, 37747, 40009, 42320, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
126 44682, 47095, 49562, 52082, 54657, 57289, 59979, 62727, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
127 }; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
128 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
129 static const uint16_t exp2b[]= |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
130 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
131 3, 712, 1424, 2134, 2845, 3557, 4270, 4982, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
132 5696, 6409, 7124, 7839, 8554, 9270, 9986, 10704, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
133 11421, 12138, 12857, 13576, 14295, 15014, 15734, 16455, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
134 17176, 17898, 18620, 19343, 20066, 20790, 21514, 22238, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
135 }; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
136 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
137 int16_t ff_cos(uint16_t arg) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
138 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
139 uint8_t offset= arg; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
140 uint8_t ind = arg >> 8; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
141 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
142 assert(arg <= 0x3fff); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
143 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
144 return tab_cos[ind] + (offset * (tab_cos[ind+1] - tab_cos[ind]) >> 8); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
145 } |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
146 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
147 int ff_exp2(uint16_t power) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
148 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
149 unsigned int result= exp2a[power>>10] + 0x10000; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
150 |
8097 | 151 assert(power <= 0x7fff); |
6682
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
152 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
153 result= (result<<3) + ((result*exp2b[(power>>5)&31])>>17); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
154 return result + ((result*(power&31)*89)>>22); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
155 } |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
156 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
157 #endif // else G729_BITEXACT |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
158 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
159 /** |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
160 * Table used to compute log2(x) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
161 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
162 * tab_log2[i] = (1<<15) * log2(1 + i/32), i=0..32 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
163 */ |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
164 static const uint16_t tab_log2[33] = |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
165 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
166 #ifdef G729_BITEXACT |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
167 0, 1455, 2866, 4236, 5568, 6863, 8124, 9352, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
168 10549, 11716, 12855, 13967, 15054, 16117, 17156, 18172, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
169 19167, 20142, 21097, 22033, 22951, 23852, 24735, 25603, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
170 26455, 27291, 28113, 28922, 29716, 30497, 31266, 32023, 32767, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
171 #else |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
172 4, 1459, 2870, 4240, 5572, 6867, 8127, 9355, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
173 10552, 11719, 12858, 13971, 15057, 16120, 17158, 18175, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
174 19170, 20145, 21100, 22036, 22954, 23854, 24738, 25605, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
175 26457, 27294, 28116, 28924, 29719, 30500, 31269, 32025, 32769, |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
176 #endif |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
177 }; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
178 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
179 int ff_log2(uint32_t value) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
180 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
181 uint8_t power_int; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
182 uint8_t frac_x0; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
183 uint16_t frac_dx; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
184 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
185 // Stripping zeros from beginning |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
186 power_int = av_log2(value); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
187 value <<= (31 - power_int); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
188 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
189 // b31 is always non-zero now |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
190 frac_x0 = (value & 0x7c000000) >> 26; // b26-b31 and [32..63] -> [0..31] |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
191 frac_dx = (value & 0x03fff800) >> 11; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
192 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
193 value = tab_log2[frac_x0]; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
194 value += (frac_dx * (tab_log2[frac_x0+1] - tab_log2[frac_x0])) >> 15; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
195 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
196 return (power_int << 15) + value; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
197 } |
8090 | 198 |
199 float ff_dot_productf(const float* a, const float* b, int length) | |
200 { | |
201 float sum = 0; | |
202 int i; | |
203 | |
204 for(i=0; i<length; i++) | |
205 sum += a[i] * b[i]; | |
206 | |
207 return sum; | |
208 } |