tor-browser

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

flacdsp.c (4786B)


      1 /*
      2 * Copyright (c) 2012 Mans Rullgard <mans@mansr.com>
      3 *
      4 * This file is part of FFmpeg.
      5 *
      6 * FFmpeg is free software; you can redistribute it and/or
      7 * modify it under the terms of the GNU Lesser General Public
      8 * License as published by the Free Software Foundation; either
      9 * version 2.1 of the License, or (at your option) any later version.
     10 *
     11 * FFmpeg is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14 * Lesser General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU Lesser General Public
     17 * License along with FFmpeg; if not, write to the Free Software
     18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     19 */
     20 
     21 #include "libavutil/attributes.h"
     22 #include "libavutil/internal.h"
     23 #include "libavutil/samplefmt.h"
     24 #include "flacdsp.h"
     25 #include "config.h"
     26 
     27 #define SAMPLE_SIZE 16
     28 #define PLANAR 0
     29 #include "flacdsp_template.c"
     30 
     31 #undef  PLANAR
     32 #define PLANAR 1
     33 #include "flacdsp_template.c"
     34 
     35 #undef  SAMPLE_SIZE
     36 #undef  PLANAR
     37 #define SAMPLE_SIZE 32
     38 #define PLANAR 0
     39 #include "flacdsp_template.c"
     40 
     41 #undef  PLANAR
     42 #define PLANAR 1
     43 #include "flacdsp_template.c"
     44 
     45 static void flac_lpc_16_c(int32_t *decoded, const int coeffs[32],
     46                          int pred_order, int qlevel, int len)
     47 {
     48    int i, j;
     49 
     50    for (i = pred_order; i < len - 1; i += 2, decoded += 2) {
     51        SUINT c = coeffs[0];
     52        SUINT d = decoded[0];
     53        int s0 = 0, s1 = 0;
     54        for (j = 1; j < pred_order; j++) {
     55            s0 += c*d;
     56            d = decoded[j];
     57            s1 += c*d;
     58            c = coeffs[j];
     59        }
     60        s0 += c*d;
     61        d = decoded[j] += (SUINT)(s0 >> qlevel);
     62        s1 += c*d;
     63        decoded[j + 1] += (SUINT)(s1 >> qlevel);
     64    }
     65    if (i < len) {
     66        int sum = 0;
     67        for (j = 0; j < pred_order; j++)
     68            sum += coeffs[j] * (SUINT)decoded[j];
     69        decoded[j] = decoded[j] + (unsigned)(sum >> qlevel);
     70    }
     71 }
     72 
     73 static void flac_lpc_32_c(int32_t *decoded, const int coeffs[32],
     74                          int pred_order, int qlevel, int len)
     75 {
     76    int i, j;
     77 
     78    for (i = pred_order; i < len; i++, decoded++) {
     79        int64_t sum = 0;
     80        for (j = 0; j < pred_order; j++)
     81            sum += (int64_t)coeffs[j] * decoded[j];
     82        decoded[j] += sum >> qlevel;
     83    }
     84 
     85 }
     86 
     87 static void flac_lpc_33_c(int64_t *decoded, const int32_t *residual,
     88                          const int coeffs[32], int pred_order,
     89                          int qlevel, int len)
     90 {
     91    int i, j;
     92 
     93    for (i = pred_order; i < len; i++, decoded++) {
     94        int64_t sum = 0;
     95        for (j = 0; j < pred_order; j++)
     96            sum += (int64_t)coeffs[j] * (uint64_t)decoded[j];
     97        decoded[j] = residual[i] + (sum >> qlevel);
     98    }
     99 }
    100 
    101 static void flac_wasted_32_c(int32_t *decoded, int wasted, int len)
    102 {
    103    for (int i = 0; i < len; i++)
    104        decoded[i] = (unsigned)decoded[i] << wasted;
    105 }
    106 
    107 static void flac_wasted_33_c(int64_t *decoded, const int32_t *residual,
    108                             int wasted, int len)
    109 {
    110    for (int i = 0; i < len; i++)
    111        decoded[i] = (uint64_t)residual[i] << wasted;
    112 }
    113 
    114 av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt, int channels)
    115 {
    116    c->lpc16        = flac_lpc_16_c;
    117    c->lpc32        = flac_lpc_32_c;
    118    c->lpc33        = flac_lpc_33_c;
    119 
    120    c->wasted32     = flac_wasted_32_c;
    121    c->wasted33     = flac_wasted_33_c;
    122 
    123    switch (fmt) {
    124    case AV_SAMPLE_FMT_S32:
    125        c->decorrelate[0] = flac_decorrelate_indep_c_32;
    126        c->decorrelate[1] = flac_decorrelate_ls_c_32;
    127        c->decorrelate[2] = flac_decorrelate_rs_c_32;
    128        c->decorrelate[3] = flac_decorrelate_ms_c_32;
    129        break;
    130 
    131    case AV_SAMPLE_FMT_S32P:
    132        c->decorrelate[0] = flac_decorrelate_indep_c_32p;
    133        c->decorrelate[1] = flac_decorrelate_ls_c_32p;
    134        c->decorrelate[2] = flac_decorrelate_rs_c_32p;
    135        c->decorrelate[3] = flac_decorrelate_ms_c_32p;
    136        break;
    137 
    138    case AV_SAMPLE_FMT_S16:
    139        c->decorrelate[0] = flac_decorrelate_indep_c_16;
    140        c->decorrelate[1] = flac_decorrelate_ls_c_16;
    141        c->decorrelate[2] = flac_decorrelate_rs_c_16;
    142        c->decorrelate[3] = flac_decorrelate_ms_c_16;
    143        break;
    144 
    145    case AV_SAMPLE_FMT_S16P:
    146        c->decorrelate[0] = flac_decorrelate_indep_c_16p;
    147        c->decorrelate[1] = flac_decorrelate_ls_c_16p;
    148        c->decorrelate[2] = flac_decorrelate_rs_c_16p;
    149        c->decorrelate[3] = flac_decorrelate_ms_c_16p;
    150        break;
    151    }
    152 
    153 #if ARCH_ARM
    154    ff_flacdsp_init_arm(c, fmt, channels);
    155 #elif ARCH_RISCV
    156    ff_flacdsp_init_riscv(c, fmt, channels);
    157 #elif ARCH_X86
    158    ff_flacdsp_init_x86(c, fmt, channels);
    159 #endif
    160 }