tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

float_dsp.c (4780B)


      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 static void vector_fmul_c(float *dst, const float *src0, const float *src1,
     28                          int len)
     29 {
     30    int i;
     31    for (i = 0; i < len; i++)
     32        dst[i] = src0[i] * src1[i];
     33 }
     34 
     35 static void vector_dmul_c(double *dst, const double *src0, const double *src1,
     36                          int len)
     37 {
     38    int i;
     39    for (i = 0; i < len; i++)
     40        dst[i] = src0[i] * src1[i];
     41 }
     42 
     43 static void vector_fmac_scalar_c(float *dst, const float *src, float mul,
     44                                 int len)
     45 {
     46    int i;
     47    for (i = 0; i < len; i++)
     48        dst[i] += src[i] * mul;
     49 }
     50 
     51 static void vector_dmac_scalar_c(double *dst, const double *src, double mul,
     52                                 int len)
     53 {
     54    int i;
     55    for (i = 0; i < len; i++)
     56        dst[i] += src[i] * mul;
     57 }
     58 
     59 static void vector_fmul_scalar_c(float *dst, const float *src, float mul,
     60                                 int len)
     61 {
     62    int i;
     63    for (i = 0; i < len; i++)
     64        dst[i] = src[i] * mul;
     65 }
     66 
     67 static void vector_dmul_scalar_c(double *dst, const double *src, double mul,
     68                                 int len)
     69 {
     70    int i;
     71    for (i = 0; i < len; i++)
     72        dst[i] = src[i] * mul;
     73 }
     74 
     75 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    dst  += len;
     81    win  += len;
     82    src0 += len;
     83 
     84    for (i = -len, j = len - 1; i < 0; i++, j--) {
     85        float s0 = src0[i];
     86        float s1 = src1[j];
     87        float wi = win[i];
     88        float wj = win[j];
     89        dst[i] = s0 * wj - s1 * wi;
     90        dst[j] = s0 * wi + s1 * wj;
     91    }
     92 }
     93 
     94 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    for (i = 0; i < len; i++)
     99        dst[i] = src0[i] * src1[i] + src2[i];
    100 }
    101 
    102 static void vector_fmul_reverse_c(float *dst, const float *src0,
    103                                  const float *src1, int len)
    104 {
    105    int i;
    106 
    107    src1 += len-1;
    108    for (i = 0; i < len; i++)
    109        dst[i] = src0[i] * src1[-i];
    110 }
    111 
    112 static void butterflies_float_c(float *restrict v1, float *restrict v2,
    113                                int len)
    114 {
    115    int i;
    116 
    117    for (i = 0; i < len; i++) {
    118        float t = v1[i] - v2[i];
    119        v1[i] += v2[i];
    120        v2[i] = t;
    121    }
    122 }
    123 
    124 float avpriv_scalarproduct_float_c(const float *v1, const float *v2, int len)
    125 {
    126    float p = 0.0;
    127    int i;
    128 
    129    for (i = 0; i < len; i++)
    130        p += v1[i] * v2[i];
    131 
    132    return p;
    133 }
    134 
    135 double ff_scalarproduct_double_c(const double *v1, const double *v2,
    136                                 size_t len)
    137 {
    138    double p = 0.0;
    139 
    140    for (size_t i = 0; i < len; i++)
    141        p += v1[i] * v2[i];
    142 
    143    return p;
    144 }
    145 
    146 av_cold AVFloatDSPContext *avpriv_float_dsp_alloc(int bit_exact)
    147 {
    148    AVFloatDSPContext *fdsp = av_mallocz(sizeof(AVFloatDSPContext));
    149    if (!fdsp)
    150        return NULL;
    151 
    152    fdsp->vector_fmul = vector_fmul_c;
    153    fdsp->vector_dmul = vector_dmul_c;
    154    fdsp->vector_fmac_scalar = vector_fmac_scalar_c;
    155    fdsp->vector_fmul_scalar = vector_fmul_scalar_c;
    156    fdsp->vector_dmac_scalar = vector_dmac_scalar_c;
    157    fdsp->vector_dmul_scalar = vector_dmul_scalar_c;
    158    fdsp->vector_fmul_window = vector_fmul_window_c;
    159    fdsp->vector_fmul_add = vector_fmul_add_c;
    160    fdsp->vector_fmul_reverse = vector_fmul_reverse_c;
    161    fdsp->butterflies_float = butterflies_float_c;
    162    fdsp->scalarproduct_float = avpriv_scalarproduct_float_c;
    163    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    ff_float_dsp_init_x86(fdsp);
    175 #elif ARCH_MIPS
    176    ff_float_dsp_init_mips(fdsp);
    177 #endif
    178    return fdsp;
    179 }