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