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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
459fe563a4dc add necessary #includes in headers
mru
parents: 6706
diff changeset
26 #include <stdint.h>
459fe563a4dc add necessary #includes in headers
mru
parents: 6706
diff changeset
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 */