Mercurial > libavcodec.hg
annotate acelp_math.h @ 6920:d02af7474bff libavcodec
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
fixes CID84 RUN2
CID85 RUN2
CID86 RUN2
CID87 RUN2
CID88 RUN2
CID89 RUN2
CID90 RUN2
CID91 RUN2
CID92 RUN2
CID93 RUN2
CID94 RUN2
CID95 RUN2
CID96 RUN2
CID97 RUN2
CID98 RUN2
CID99 RUN2
CID100 RUN2
CID101 RUN2
CID102 RUN2
CID103 RUN2
CID104 RUN2
CID105 RUN2
CID106 RUN2
author | michael |
---|---|
date | Wed, 28 May 2008 11:59:41 +0000 |
parents | 6f402a181803 |
children | ff5ef7becd94 |
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 #ifndef FFMPEG_ACELP_MATH_H |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
24 #define FFMPEG_ACELP_MATH_H |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
25 |
6735 | 26 #include <stdint.h> |
27 | |
6682
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
28 /** |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
29 * \brief fixed-point implementation of cosine in [0; PI) domain |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
30 * \param arg fixed-point cosine argument, 0 <= arg < 0x4000 |
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 * \return value of (1<<15) * cos(arg * PI / (1<<14)), -0x8000 <= result <= 0x7fff |
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 int16_t ff_cos(uint16_t arg); |
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 /** |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
37 * \brief fixed-point implementation of exp2(x) in [0; 1] domain |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
38 * \param power argument to exp2, 0 <= power <= 0x7fff |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
39 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
40 * \return value of (1<<20) * exp2(power / (1<<15)) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
41 * 0x8000c <= result <= 0xfffea |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
42 */ |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
43 int ff_exp2(uint16_t power); |
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 * \brief Calculates log2(x) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
47 * \param value function argument, 0 < value <= 7fff ffff |
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 * \return value of (1<<15) * log2(value) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
50 */ |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
51 int ff_log2(uint32_t value); |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
52 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
53 /** |
6706
2cb901474f6f
Grammar fixes and improvements for the new ACELP code
superdump
parents:
6682
diff
changeset
|
54 * \brief Calculates sum of array element multiplications |
2cb901474f6f
Grammar fixes and improvements for the new ACELP code
superdump
parents:
6682
diff
changeset
|
55 * \param speech input data array |
2cb901474f6f
Grammar fixes and improvements for the new ACELP code
superdump
parents:
6682
diff
changeset
|
56 * \param length number of elements |
2cb901474f6f
Grammar fixes and improvements for the new ACELP code
superdump
parents:
6682
diff
changeset
|
57 * \param offset offset for calculation of sum of s[i]*s[i+offset] |
6682
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
58 * \param shift right shift by this value will be done before multiplication |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
59 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
60 * \return sum of multiplications |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
61 * |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
62 * \note array must be at least length+offset long! |
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 static int sum_of_squares(const int16_t* speech, int length, int offset, int shift) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
65 { |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
66 const int16_t* speech_end; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
67 int sum = 0; |
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 for(speech_end=speech+length; speech<speech_end; speech++) |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
70 sum += (speech[0] * speech[offset]) >> shift; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
71 |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
72 return sum; |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
73 } |
1064be7fea22
Fixed-point implementation of ff_cos, ff_log2, ff_exp2.
voroshil
parents:
diff
changeset
|
74 |
6777
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
75 /** |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
76 * \brief Shift value left or right depending on sign of offset parameter. |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
77 * \param value value to shift |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
78 * \param offset shift offset |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
79 * |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
80 * \return value << offset, if offset>=0; value >> -offset - otherwise |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
81 */ |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
82 static inline int bidir_sal(int value, int offset) |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
83 { |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
84 if(offset < 0) return value >> -offset; |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
85 else return value << offset; |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
86 } |
6f402a181803
Implement bidirectional (positive offset - left, negative - right)
voroshil
parents:
6739
diff
changeset
|
87 |
6739
4db65caccc9b
cosmetics: Consistently use C-style comments in #endif preprocessor directives.
diego
parents:
6735
diff
changeset
|
88 #endif /* FFMPEG_ACELP_MATH_H */ |