Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * Copyright 2005 Balatoni Denes | ||
3 | * Copyright 2006 Loren Merritt | ||
4 | * | ||
5 | * This file is part of FFmpeg. | ||
6 | * | ||
7 | * FFmpeg is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU Lesser General Public | ||
9 | * License as published by the Free Software Foundation; either | ||
10 | * version 2.1 of the License, or (at your option) any later version. | ||
11 | * | ||
12 | * FFmpeg is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * Lesser General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU Lesser General Public | ||
18 | * License along with FFmpeg; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | */ | ||
21 | |||
22 | #include "config.h" | ||
23 | #include "attributes.h" | ||
24 | #include "float_dsp.h" | ||
25 | #include "mem.h" | ||
26 | |||
27 | 533733 | static void vector_fmul_c(float *dst, const float *src0, const float *src1, | |
28 | int len) | ||
29 | { | ||
30 | int i; | ||
31 |
2/2✓ Branch 0 taken 61685120 times.
✓ Branch 1 taken 533733 times.
|
62218853 | for (i = 0; i < len; i++) |
32 | 61685120 | dst[i] = src0[i] * src1[i]; | |
33 | 533733 | } | |
34 | |||
35 | 3 | static void vector_dmul_c(double *dst, const double *src0, const double *src1, | |
36 | int len) | ||
37 | { | ||
38 | int i; | ||
39 |
2/2✓ Branch 0 taken 768 times.
✓ Branch 1 taken 3 times.
|
771 | for (i = 0; i < len; i++) |
40 | 768 | dst[i] = src0[i] * src1[i]; | |
41 | 3 | } | |
42 | |||
43 | 24606 | static void vector_fmac_scalar_c(float *dst, const float *src, float mul, | |
44 | int len) | ||
45 | { | ||
46 | int i; | ||
47 |
2/2✓ Branch 0 taken 11660704 times.
✓ Branch 1 taken 24606 times.
|
11685310 | for (i = 0; i < len; i++) |
48 | 11660704 | dst[i] += src[i] * mul; | |
49 | 24606 | } | |
50 | |||
51 | 3 | static void vector_dmac_scalar_c(double *dst, const double *src, double mul, | |
52 | int len) | ||
53 | { | ||
54 | int i; | ||
55 |
2/2✓ Branch 0 taken 768 times.
✓ Branch 1 taken 3 times.
|
771 | for (i = 0; i < len; i++) |
56 | 768 | dst[i] += src[i] * mul; | |
57 | 3 | } | |
58 | |||
59 | 863113 | static void vector_fmul_scalar_c(float *dst, const float *src, float mul, | |
60 | int len) | ||
61 | { | ||
62 | int i; | ||
63 |
2/2✓ Branch 0 taken 21726672 times.
✓ Branch 1 taken 863113 times.
|
22589785 | for (i = 0; i < len; i++) |
64 | 21726672 | dst[i] = src[i] * mul; | |
65 | 863113 | } | |
66 | |||
67 | 3 | static void vector_dmul_scalar_c(double *dst, const double *src, double mul, | |
68 | int len) | ||
69 | { | ||
70 | int i; | ||
71 |
2/2✓ Branch 0 taken 768 times.
✓ Branch 1 taken 3 times.
|
771 | for (i = 0; i < len; i++) |
72 | 768 | dst[i] = src[i] * mul; | |
73 | 3 | } | |
74 | |||
75 | 222283 | static void vector_fmul_window_c(float *dst, const float *src0, | |
76 | const float *src1, const float *win, int len) | ||
77 | { | ||
78 | int i, j; | ||
79 | |||
80 | 222283 | dst += len; | |
81 | 222283 | win += len; | |
82 | 222283 | src0 += len; | |
83 | |||
84 |
2/2✓ Branch 0 taken 44435460 times.
✓ Branch 1 taken 222283 times.
|
44657743 | for (i = -len, j = len - 1; i < 0; i++, j--) { |
85 | 44435460 | float s0 = src0[i]; | |
86 | 44435460 | float s1 = src1[j]; | |
87 | 44435460 | float wi = win[i]; | |
88 | 44435460 | float wj = win[j]; | |
89 | 44435460 | dst[i] = s0 * wj - s1 * wi; | |
90 | 44435460 | dst[j] = s0 * wi + s1 * wj; | |
91 | } | ||
92 | 222283 | } | |
93 | |||
94 | 3865569 | static void vector_fmul_add_c(float *dst, const float *src0, const float *src1, | |
95 | const float *src2, int len){ | ||
96 | int i; | ||
97 | |||
98 |
2/2✓ Branch 0 taken 231203968 times.
✓ Branch 1 taken 3865569 times.
|
235069537 | for (i = 0; i < len; i++) |
99 | 231203968 | dst[i] = src0[i] * src1[i] + src2[i]; | |
100 | 3865569 | } | |
101 | |||
102 | 407140 | static void vector_fmul_reverse_c(float *dst, const float *src0, | |
103 | const float *src1, int len) | ||
104 | { | ||
105 | int i; | ||
106 | |||
107 | 407140 | src1 += len-1; | |
108 |
2/2✓ Branch 0 taken 134153856 times.
✓ Branch 1 taken 407140 times.
|
134560996 | for (i = 0; i < len; i++) |
109 | 134153856 | dst[i] = src0[i] * src1[-i]; | |
110 | 407140 | } | |
111 | |||
112 | 589994 | static void butterflies_float_c(float *restrict v1, float *restrict v2, | |
113 | int len) | ||
114 | { | ||
115 | int i; | ||
116 | |||
117 |
2/2✓ Branch 0 taken 8691336 times.
✓ Branch 1 taken 589994 times.
|
9281330 | for (i = 0; i < len; i++) { |
118 | 8691336 | float t = v1[i] - v2[i]; | |
119 | 8691336 | v1[i] += v2[i]; | |
120 | 8691336 | v2[i] = t; | |
121 | } | ||
122 | 589994 | } | |
123 | |||
124 | 1419518 | float avpriv_scalarproduct_float_c(const float *v1, const float *v2, int len) | |
125 | { | ||
126 | 1419518 | float p = 0.0; | |
127 | int i; | ||
128 | |||
129 |
2/2✓ Branch 0 taken 44109540 times.
✓ Branch 1 taken 1419518 times.
|
45529058 | for (i = 0; i < len; i++) |
130 | 44109540 | p += v1[i] * v2[i]; | |
131 | |||
132 | 1419518 | return p; | |
133 | } | ||
134 | |||
135 | 836465 | double ff_scalarproduct_double_c(const double *v1, const double *v2, | |
136 | size_t len) | ||
137 | { | ||
138 | 836465 | double p = 0.0; | |
139 | |||
140 |
2/2✓ Branch 0 taken 6692578 times.
✓ Branch 1 taken 836465 times.
|
7529043 | for (size_t i = 0; i < len; i++) |
141 | 6692578 | p += v1[i] * v2[i]; | |
142 | |||
143 | 836465 | return p; | |
144 | } | ||
145 | |||
146 | 990 | av_cold AVFloatDSPContext *avpriv_float_dsp_alloc(int bit_exact) | |
147 | { | ||
148 | 990 | AVFloatDSPContext *fdsp = av_mallocz(sizeof(AVFloatDSPContext)); | |
149 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 990 times.
|
990 | if (!fdsp) |
150 | ✗ | return NULL; | |
151 | |||
152 | 990 | fdsp->vector_fmul = vector_fmul_c; | |
153 | 990 | fdsp->vector_dmul = vector_dmul_c; | |
154 | 990 | fdsp->vector_fmac_scalar = vector_fmac_scalar_c; | |
155 | 990 | fdsp->vector_fmul_scalar = vector_fmul_scalar_c; | |
156 | 990 | fdsp->vector_dmac_scalar = vector_dmac_scalar_c; | |
157 | 990 | fdsp->vector_dmul_scalar = vector_dmul_scalar_c; | |
158 | 990 | fdsp->vector_fmul_window = vector_fmul_window_c; | |
159 | 990 | fdsp->vector_fmul_add = vector_fmul_add_c; | |
160 | 990 | fdsp->vector_fmul_reverse = vector_fmul_reverse_c; | |
161 | 990 | fdsp->butterflies_float = butterflies_float_c; | |
162 | 990 | fdsp->scalarproduct_float = avpriv_scalarproduct_float_c; | |
163 | 990 | fdsp->scalarproduct_double = ff_scalarproduct_double_c; | |
164 | |||
165 | #if ARCH_AARCH64 | ||
166 | ff_float_dsp_init_aarch64(fdsp); | ||
167 | #elif ARCH_ARM | ||
168 | ff_float_dsp_init_arm(fdsp); | ||
169 | #elif ARCH_PPC | ||
170 | ff_float_dsp_init_ppc(fdsp, bit_exact); | ||
171 | #elif ARCH_RISCV | ||
172 | ff_float_dsp_init_riscv(fdsp); | ||
173 | #elif ARCH_X86 | ||
174 | 990 | ff_float_dsp_init_x86(fdsp); | |
175 | #elif ARCH_MIPS | ||
176 | ff_float_dsp_init_mips(fdsp); | ||
177 | #endif | ||
178 | 990 | return fdsp; | |
179 | } | ||
180 |