1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#ifndef AVUTIL_FLOAT_DSP_H 20cabdff1aSopenharmony_ci#define AVUTIL_FLOAT_DSP_H 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "config.h" 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_citypedef struct AVFloatDSPContext { 25cabdff1aSopenharmony_ci /** 26cabdff1aSopenharmony_ci * Calculate the entry wise product of two vectors of floats and store the result in 27cabdff1aSopenharmony_ci * a vector of floats. 28cabdff1aSopenharmony_ci * 29cabdff1aSopenharmony_ci * @param dst output vector 30cabdff1aSopenharmony_ci * constraints: 32-byte aligned 31cabdff1aSopenharmony_ci * @param src0 first input vector 32cabdff1aSopenharmony_ci * constraints: 32-byte aligned 33cabdff1aSopenharmony_ci * @param src1 second input vector 34cabdff1aSopenharmony_ci * constraints: 32-byte aligned 35cabdff1aSopenharmony_ci * @param len number of elements in the input 36cabdff1aSopenharmony_ci * constraints: multiple of 16 37cabdff1aSopenharmony_ci */ 38cabdff1aSopenharmony_ci void (*vector_fmul)(float *dst, const float *src0, const float *src1, 39cabdff1aSopenharmony_ci int len); 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci /** 42cabdff1aSopenharmony_ci * Multiply a vector of floats by a scalar float and add to 43cabdff1aSopenharmony_ci * destination vector. Source and destination vectors must 44cabdff1aSopenharmony_ci * overlap exactly or not at all. 45cabdff1aSopenharmony_ci * 46cabdff1aSopenharmony_ci * @param dst result vector 47cabdff1aSopenharmony_ci * constraints: 32-byte aligned 48cabdff1aSopenharmony_ci * @param src input vector 49cabdff1aSopenharmony_ci * constraints: 32-byte aligned 50cabdff1aSopenharmony_ci * @param mul scalar value 51cabdff1aSopenharmony_ci * @param len length of vector 52cabdff1aSopenharmony_ci * constraints: multiple of 16 53cabdff1aSopenharmony_ci */ 54cabdff1aSopenharmony_ci void (*vector_fmac_scalar)(float *dst, const float *src, float mul, 55cabdff1aSopenharmony_ci int len); 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci /** 58cabdff1aSopenharmony_ci * Multiply a vector of doubles by a scalar double and add to 59cabdff1aSopenharmony_ci * destination vector. Source and destination vectors must 60cabdff1aSopenharmony_ci * overlap exactly or not at all. 61cabdff1aSopenharmony_ci * 62cabdff1aSopenharmony_ci * @param dst result vector 63cabdff1aSopenharmony_ci * constraints: 32-byte aligned 64cabdff1aSopenharmony_ci * @param src input vector 65cabdff1aSopenharmony_ci * constraints: 32-byte aligned 66cabdff1aSopenharmony_ci * @param mul scalar value 67cabdff1aSopenharmony_ci * @param len length of vector 68cabdff1aSopenharmony_ci * constraints: multiple of 16 69cabdff1aSopenharmony_ci */ 70cabdff1aSopenharmony_ci void (*vector_dmac_scalar)(double *dst, const double *src, double mul, 71cabdff1aSopenharmony_ci int len); 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_ci /** 74cabdff1aSopenharmony_ci * Multiply a vector of floats by a scalar float. Source and 75cabdff1aSopenharmony_ci * destination vectors must overlap exactly or not at all. 76cabdff1aSopenharmony_ci * 77cabdff1aSopenharmony_ci * @param dst result vector 78cabdff1aSopenharmony_ci * constraints: 16-byte aligned 79cabdff1aSopenharmony_ci * @param src input vector 80cabdff1aSopenharmony_ci * constraints: 16-byte aligned 81cabdff1aSopenharmony_ci * @param mul scalar value 82cabdff1aSopenharmony_ci * @param len length of vector 83cabdff1aSopenharmony_ci * constraints: multiple of 4 84cabdff1aSopenharmony_ci */ 85cabdff1aSopenharmony_ci void (*vector_fmul_scalar)(float *dst, const float *src, float mul, 86cabdff1aSopenharmony_ci int len); 87cabdff1aSopenharmony_ci 88cabdff1aSopenharmony_ci /** 89cabdff1aSopenharmony_ci * Multiply a vector of double by a scalar double. Source and 90cabdff1aSopenharmony_ci * destination vectors must overlap exactly or not at all. 91cabdff1aSopenharmony_ci * 92cabdff1aSopenharmony_ci * @param dst result vector 93cabdff1aSopenharmony_ci * constraints: 32-byte aligned 94cabdff1aSopenharmony_ci * @param src input vector 95cabdff1aSopenharmony_ci * constraints: 32-byte aligned 96cabdff1aSopenharmony_ci * @param mul scalar value 97cabdff1aSopenharmony_ci * @param len length of vector 98cabdff1aSopenharmony_ci * constraints: multiple of 8 99cabdff1aSopenharmony_ci */ 100cabdff1aSopenharmony_ci void (*vector_dmul_scalar)(double *dst, const double *src, double mul, 101cabdff1aSopenharmony_ci int len); 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci /** 104cabdff1aSopenharmony_ci * Overlap/add with window function. 105cabdff1aSopenharmony_ci * Used primarily by MDCT-based audio codecs. 106cabdff1aSopenharmony_ci * Source and destination vectors must overlap exactly or not at all. 107cabdff1aSopenharmony_ci * 108cabdff1aSopenharmony_ci * @param dst result vector 109cabdff1aSopenharmony_ci * constraints: 16-byte aligned 110cabdff1aSopenharmony_ci * @param src0 first source vector 111cabdff1aSopenharmony_ci * constraints: 16-byte aligned 112cabdff1aSopenharmony_ci * @param src1 second source vector 113cabdff1aSopenharmony_ci * constraints: 16-byte aligned 114cabdff1aSopenharmony_ci * @param win half-window vector 115cabdff1aSopenharmony_ci * constraints: 16-byte aligned 116cabdff1aSopenharmony_ci * @param len length of vector 117cabdff1aSopenharmony_ci * constraints: multiple of 4 118cabdff1aSopenharmony_ci */ 119cabdff1aSopenharmony_ci void (*vector_fmul_window)(float *dst, const float *src0, 120cabdff1aSopenharmony_ci const float *src1, const float *win, int len); 121cabdff1aSopenharmony_ci 122cabdff1aSopenharmony_ci /** 123cabdff1aSopenharmony_ci * Calculate the entry wise product of two vectors of floats, add a third vector of 124cabdff1aSopenharmony_ci * floats and store the result in a vector of floats. 125cabdff1aSopenharmony_ci * 126cabdff1aSopenharmony_ci * @param dst output vector 127cabdff1aSopenharmony_ci * constraints: 32-byte aligned 128cabdff1aSopenharmony_ci * @param src0 first input vector 129cabdff1aSopenharmony_ci * constraints: 32-byte aligned 130cabdff1aSopenharmony_ci * @param src1 second input vector 131cabdff1aSopenharmony_ci * constraints: 32-byte aligned 132cabdff1aSopenharmony_ci * @param src2 third input vector 133cabdff1aSopenharmony_ci * constraints: 32-byte aligned 134cabdff1aSopenharmony_ci * @param len number of elements in the input 135cabdff1aSopenharmony_ci * constraints: multiple of 16 136cabdff1aSopenharmony_ci */ 137cabdff1aSopenharmony_ci void (*vector_fmul_add)(float *dst, const float *src0, const float *src1, 138cabdff1aSopenharmony_ci const float *src2, int len); 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci /** 141cabdff1aSopenharmony_ci * Calculate the entry wise product of two vectors of floats, and store the result 142cabdff1aSopenharmony_ci * in a vector of floats. The second vector of floats is iterated over 143cabdff1aSopenharmony_ci * in reverse order. 144cabdff1aSopenharmony_ci * 145cabdff1aSopenharmony_ci * @param dst output vector 146cabdff1aSopenharmony_ci * constraints: 32-byte aligned 147cabdff1aSopenharmony_ci * @param src0 first input vector 148cabdff1aSopenharmony_ci * constraints: 32-byte aligned 149cabdff1aSopenharmony_ci * @param src1 second input vector 150cabdff1aSopenharmony_ci * constraints: 32-byte aligned 151cabdff1aSopenharmony_ci * @param len number of elements in the input 152cabdff1aSopenharmony_ci * constraints: multiple of 16 153cabdff1aSopenharmony_ci */ 154cabdff1aSopenharmony_ci void (*vector_fmul_reverse)(float *dst, const float *src0, 155cabdff1aSopenharmony_ci const float *src1, int len); 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci /** 158cabdff1aSopenharmony_ci * Calculate the sum and difference of two vectors of floats. 159cabdff1aSopenharmony_ci * 160cabdff1aSopenharmony_ci * @param v1 first input vector, sum output, 16-byte aligned 161cabdff1aSopenharmony_ci * @param v2 second input vector, difference output, 16-byte aligned 162cabdff1aSopenharmony_ci * @param len length of vectors, multiple of 4 163cabdff1aSopenharmony_ci */ 164cabdff1aSopenharmony_ci void (*butterflies_float)(float *av_restrict v1, float *av_restrict v2, int len); 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci /** 167cabdff1aSopenharmony_ci * Calculate the scalar product of two vectors of floats. 168cabdff1aSopenharmony_ci * 169cabdff1aSopenharmony_ci * @param v1 first vector, 16-byte aligned 170cabdff1aSopenharmony_ci * @param v2 second vector, 16-byte aligned 171cabdff1aSopenharmony_ci * @param len length of vectors, multiple of 4 172cabdff1aSopenharmony_ci * 173cabdff1aSopenharmony_ci * @return sum of elementwise products 174cabdff1aSopenharmony_ci */ 175cabdff1aSopenharmony_ci float (*scalarproduct_float)(const float *v1, const float *v2, int len); 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci /** 178cabdff1aSopenharmony_ci * Calculate the entry wise product of two vectors of doubles and store the result in 179cabdff1aSopenharmony_ci * a vector of doubles. 180cabdff1aSopenharmony_ci * 181cabdff1aSopenharmony_ci * @param dst output vector 182cabdff1aSopenharmony_ci * constraints: 32-byte aligned 183cabdff1aSopenharmony_ci * @param src0 first input vector 184cabdff1aSopenharmony_ci * constraints: 32-byte aligned 185cabdff1aSopenharmony_ci * @param src1 second input vector 186cabdff1aSopenharmony_ci * constraints: 32-byte aligned 187cabdff1aSopenharmony_ci * @param len number of elements in the input 188cabdff1aSopenharmony_ci * constraints: multiple of 16 189cabdff1aSopenharmony_ci */ 190cabdff1aSopenharmony_ci void (*vector_dmul)(double *dst, const double *src0, const double *src1, 191cabdff1aSopenharmony_ci int len); 192cabdff1aSopenharmony_ci} AVFloatDSPContext; 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci/** 195cabdff1aSopenharmony_ci * Return the scalar product of two vectors. 196cabdff1aSopenharmony_ci * 197cabdff1aSopenharmony_ci * @param v1 first input vector 198cabdff1aSopenharmony_ci * @param v2 first input vector 199cabdff1aSopenharmony_ci * @param len number of elements 200cabdff1aSopenharmony_ci * 201cabdff1aSopenharmony_ci * @return sum of elementwise products 202cabdff1aSopenharmony_ci */ 203cabdff1aSopenharmony_cifloat avpriv_scalarproduct_float_c(const float *v1, const float *v2, int len); 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_civoid ff_float_dsp_init_aarch64(AVFloatDSPContext *fdsp); 206cabdff1aSopenharmony_civoid ff_float_dsp_init_arm(AVFloatDSPContext *fdsp); 207cabdff1aSopenharmony_civoid ff_float_dsp_init_ppc(AVFloatDSPContext *fdsp, int strict); 208cabdff1aSopenharmony_civoid ff_float_dsp_init_x86(AVFloatDSPContext *fdsp); 209cabdff1aSopenharmony_civoid ff_float_dsp_init_mips(AVFloatDSPContext *fdsp); 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_ci/** 212cabdff1aSopenharmony_ci * Allocate a float DSP context. 213cabdff1aSopenharmony_ci * 214cabdff1aSopenharmony_ci * @param strict setting to non-zero avoids using functions which may not be IEEE-754 compliant 215cabdff1aSopenharmony_ci */ 216cabdff1aSopenharmony_ciAVFloatDSPContext *avpriv_float_dsp_alloc(int strict); 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ci#endif /* AVUTIL_FLOAT_DSP_H */ 219