tor-browser

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

fixed_dsp.c (5704B)


      1 /*
      2 * Copyright (c) 2012
      3 *      MIPS Technologies, Inc., California.
      4 *
      5 * Redistribution and use in source and binary forms, with or without
      6 * modification, are permitted provided that the following conditions
      7 * are met:
      8 * 1. Redistributions of source code must retain the above copyright
      9 *    notice, this list of conditions and the following disclaimer.
     10 * 2. Redistributions in binary form must reproduce the above copyright
     11 *    notice, this list of conditions and the following disclaimer in the
     12 *    documentation and/or other materials provided with the distribution.
     13 * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
     14 *    contributors may be used to endorse or promote products derived from
     15 *    this software without specific prior written permission.
     16 *
     17 * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
     18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
     21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     27 * SUCH DAMAGE.
     28 *
     29 * Author:  Nedeljko Babic (nedeljko.babic imgtec com)
     30 *
     31 * This file is part of FFmpeg.
     32 *
     33 * FFmpeg is free software; you can redistribute it and/or
     34 * modify it under the terms of the GNU Lesser General Public
     35 * License as published by the Free Software Foundation; either
     36 * version 2.1 of the License, or (at your option) any later version.
     37 *
     38 * FFmpeg is distributed in the hope that it will be useful,
     39 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     40 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     41 * Lesser General Public License for more details.
     42 *
     43 * You should have received a copy of the GNU Lesser General Public
     44 * License along with FFmpeg; if not, write to the Free Software
     45 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     46 */
     47 
     48 #include "common.h"
     49 #include "fixed_dsp.h"
     50 #include "mem.h"
     51 
     52 static void vector_fmul_add_c(int *dst, const int *src0, const int *src1, const int *src2, int len){
     53    int i;
     54    int64_t accu;
     55 
     56    for (i=0; i<len; i++) {
     57        accu = (int64_t)src0[i] * src1[i];
     58        dst[i] = src2[i] + (int)((accu + 0x40000000) >> 31);
     59    }
     60 }
     61 
     62 static void vector_fmul_reverse_c(int *dst, const int *src0, const int *src1, int len)
     63 {
     64    int i;
     65    int64_t accu;
     66 
     67    src1 += len-1;
     68    for (i=0; i<len; i++) {
     69        accu = (int64_t)src0[i] * src1[-i];
     70        dst[i] = (int)((accu+0x40000000) >> 31);
     71    }
     72 }
     73 
     74 static void vector_fmul_window_scaled_c(int16_t *dst, const int32_t *src0,
     75                                       const int32_t *src1, const int32_t *win,
     76                                       int len, uint8_t bits)
     77 {
     78    int32_t s0, s1, wi, wj, i,j, round;
     79 
     80    dst += len;
     81    win += len;
     82    src0+= len;
     83    round = bits? 1 << (bits-1) : 0;
     84 
     85    for (i=-len, j=len-1; i<0; i++, j--) {
     86        s0 = src0[i];
     87        s1 = src1[j];
     88        wi = win[i];
     89        wj = win[j];
     90        dst[i] = av_clip_int16(((((int64_t)s0*wj - (int64_t)s1*wi + 0x40000000) >> 31) + round) >> bits);
     91        dst[j] = av_clip_int16(((((int64_t)s0*wi + (int64_t)s1*wj + 0x40000000) >> 31) + round) >> bits);
     92    }
     93 }
     94 
     95 static void vector_fmul_window_c(int32_t *dst, const int32_t *src0,
     96                                       const int32_t *src1, const int32_t *win,
     97                                       int len)
     98 {
     99    int32_t s0, s1, wi, wj, i, j;
    100 
    101    dst += len;
    102    win += len;
    103    src0+= len;
    104 
    105    for (i=-len, j=len-1; i<0; i++, j--) {
    106        s0 = src0[i];
    107        s1 = src1[j];
    108        wi = win[i];
    109        wj = win[j];
    110        dst[i] = ((int64_t)s0*wj - (int64_t)s1*wi + 0x40000000) >> 31;
    111        dst[j] = ((int64_t)s0*wi + (int64_t)s1*wj + 0x40000000) >> 31;
    112    }
    113 }
    114 
    115 static void vector_fmul_c(int *dst, const int *src0, const int *src1, int len)
    116 {
    117    int i;
    118    int64_t accu;
    119 
    120    for (i = 0; i < len; i++){
    121        accu = (int64_t)src0[i] * src1[i];
    122        dst[i] = (int)((accu+0x40000000) >> 31);
    123    }
    124 }
    125 
    126 static int scalarproduct_fixed_c(const int *v1, const int *v2, int len)
    127 {
    128    /** p is initialized with 0x40000000 so that the proper rounding will occur
    129      * at the end */
    130    int64_t p = 0x40000000;
    131    int i;
    132 
    133    for (i = 0; i < len; i++)
    134        p += (int64_t)v1[i] * v2[i];
    135 
    136    return (int)(p >> 31);
    137 }
    138 
    139 static void butterflies_fixed_c(int *restrict v1s, int *restrict v2, int len)
    140 {
    141    int i;
    142    unsigned int *v1 = v1s;
    143 
    144    for (i = 0; i < len; i++){
    145        int t = v1[i] - v2[i];
    146        v1[i] += v2[i];
    147        v2[i] = t;
    148    }
    149 }
    150 
    151 AVFixedDSPContext * avpriv_alloc_fixed_dsp(int bit_exact)
    152 {
    153    AVFixedDSPContext * fdsp = av_malloc(sizeof(AVFixedDSPContext));
    154 
    155    if (!fdsp)
    156        return NULL;
    157 
    158    fdsp->vector_fmul_window_scaled = vector_fmul_window_scaled_c;
    159    fdsp->vector_fmul_window = vector_fmul_window_c;
    160    fdsp->vector_fmul = vector_fmul_c;
    161    fdsp->vector_fmul_add = vector_fmul_add_c;
    162    fdsp->vector_fmul_reverse = vector_fmul_reverse_c;
    163    fdsp->butterflies_fixed = butterflies_fixed_c;
    164    fdsp->scalarproduct_fixed = scalarproduct_fixed_c;
    165 
    166 #if ARCH_RISCV
    167    ff_fixed_dsp_init_riscv(fdsp);
    168 #elif ARCH_X86
    169    ff_fixed_dsp_init_x86(fdsp);
    170 #endif
    171 
    172    return fdsp;
    173 }