Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavutil
float_dsp.c
Go to the documentation of this file.
1
/*
2
* This file is part of Libav.
3
*
4
* Libav is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2.1 of the License, or (at your option) any later version.
8
*
9
* Libav is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
13
*
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with Libav; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
*/
18
19
#include "config.h"
20
21
#include "
float_dsp.h
"
22
23
static
void
vector_fmul_c
(
float
*dst,
const
float
*src0,
const
float
*src1,
24
int
len
)
25
{
26
int
i;
27
for
(i = 0; i <
len
; i++)
28
dst[i] = src0[i] * src1[i];
29
}
30
31
static
void
vector_fmac_scalar_c
(
float
*dst,
const
float
*src,
float
mul,
32
int
len
)
33
{
34
int
i;
35
for
(i = 0; i <
len
; i++)
36
dst[i] += src[i] * mul;
37
}
38
39
static
void
vector_fmul_scalar_c
(
float
*dst,
const
float
*src,
float
mul,
40
int
len
)
41
{
42
int
i;
43
for
(i = 0; i <
len
; i++)
44
dst[i] = src[i] * mul;
45
}
46
47
static
void
vector_dmul_scalar_c
(
double
*dst,
const
double
*src,
double
mul,
48
int
len
)
49
{
50
int
i;
51
for
(i = 0; i <
len
; i++)
52
dst[i] = src[i] * mul;
53
}
54
55
static
void
vector_fmul_window_c
(
float
*dst,
const
float
*src0,
56
const
float
*src1,
const
float
*win,
int
len
)
57
{
58
int
i, j;
59
60
dst +=
len
;
61
win +=
len
;
62
src0 +=
len
;
63
64
for
(i = -len, j = len - 1; i < 0; i++, j--) {
65
float
s0
= src0[i];
66
float
s1
= src1[j];
67
float
wi = win[i];
68
float
wj = win[j];
69
dst[i] = s0 * wj - s1 * wi;
70
dst[j] = s0 * wi + s1 * wj;
71
}
72
}
73
74
static
void
butterflies_float_c
(
float
*
restrict
v1,
float
*
restrict
v2,
75
int
len
)
76
{
77
int
i;
78
79
for
(i = 0; i <
len
; i++) {
80
float
t
= v1[i] - v2[i];
81
v1[i] += v2[i];
82
v2[i] =
t
;
83
}
84
}
85
86
void
avpriv_float_dsp_init
(
AVFloatDSPContext
*fdsp,
int
bit_exact)
87
{
88
fdsp->
vector_fmul
=
vector_fmul_c
;
89
fdsp->
vector_fmac_scalar
=
vector_fmac_scalar_c
;
90
fdsp->
vector_fmul_scalar
=
vector_fmul_scalar_c
;
91
fdsp->
vector_dmul_scalar
=
vector_dmul_scalar_c
;
92
fdsp->
vector_fmul_window
=
vector_fmul_window_c
;
93
fdsp->
butterflies_float
=
butterflies_float_c
;
94
95
#if ARCH_ARM
96
ff_float_dsp_init_arm
(fdsp);
97
#elif ARCH_PPC
98
ff_float_dsp_init_ppc
(fdsp, bit_exact);
99
#elif ARCH_X86
100
ff_float_dsp_init_x86
(fdsp);
101
#endif
102
}