Go to the documentation of this file.
   28                         const int8_t hf_vq[1024][32],
 
   30                         ptrdiff_t sb_start, ptrdiff_t sb_end,
 
   31                         ptrdiff_t ofs, ptrdiff_t 
len)
 
   35     for (
i = sb_start; 
i < sb_end; 
i++) {
 
   36         const int8_t *
coeff = hf_vq[vq_index[
i]];
 
   38         for (j = 0; j < 
len; j++)
 
   45                            ptrdiff_t sb_start, ptrdiff_t sb_end,
 
   46                            ptrdiff_t ofs, ptrdiff_t 
len)
 
   50     for (
i = sb_start; 
i < sb_end; 
i++) {
 
   52         for (j = 0; j < 
len; j++)
 
   58                             const float *filter_coeff, ptrdiff_t npcmblocks,
 
   62     int factor = 64 << dec_select;
 
   63     int ncoeffs = 8 >> dec_select;
 
   64     int nlfesamples = npcmblocks >> (dec_select + 1);
 
   67     for (
i = 0; 
i < nlfesamples; 
i++) {
 
   69         for (j = 0; j < 
factor / 2; j++) {
 
   73             for (k = 0; k < ncoeffs; k++) {
 
   74                 a += filter_coeff[      j * ncoeffs + k] * lfe_samples[-k];
 
   75                 b += filter_coeff[255 - j * ncoeffs - k] * lfe_samples[-k];
 
   79             pcm_samples[
factor / 2 + j] = 
b;
 
   88                              const float *filter_coeff, ptrdiff_t npcmblocks)
 
   94                              const float *filter_coeff, ptrdiff_t npcmblocks)
 
  100                             float *hist, ptrdiff_t 
len)
 
  105     for (
i = 0; 
i < 
len; 
i++) {
 
  106         float a = 0.25f * 
src[
i] + 0.75f * prev;
 
  107         float b = 0.75f * 
src[
i] + 0.25f * prev;
 
  121                               float *hist1, 
int *
offset, 
float *hist2,
 
  122                               const float *filter_coeff, ptrdiff_t npcmblocks,
 
  128     for (j = 0; j < npcmblocks; j++) {
 
  130         for (
i = 0; 
i < 32; 
i++) {
 
  132                 input[
i] = -subband_samples_lo[
i][j];
 
  134                 input[
i] =  subband_samples_lo[
i][j];
 
  150                               float *hist1, 
int *
offset, 
float *hist2,
 
  151                               const float *filter_coeff, ptrdiff_t npcmblocks,
 
  157     if (!subband_samples_hi)
 
  160     for (j = 0; j < npcmblocks; j++) {
 
  162         if (subband_samples_hi) {
 
  164             for (
i =  0; 
i < 32; 
i++) {
 
  166                     input[
i] = -subband_samples_lo[
i][j] - subband_samples_hi[
i][j];
 
  168                     input[
i] =  subband_samples_lo[
i][j] + subband_samples_hi[
i][j];
 
  170             for (
i = 32; 
i < 64; 
i++) {
 
  172                     input[
i] = -subband_samples_hi[
i][j];
 
  174                     input[
i] =  subband_samples_hi[
i][j];
 
  178             for (
i =  0; 
i < 32; 
i++) {
 
  180                     input[
i] = -subband_samples_lo[
i][j];
 
  182                     input[
i] =  subband_samples_lo[
i][j];
 
  195                             const int32_t *filter_coeff, ptrdiff_t npcmblocks)
 
  198     int nlfesamples = npcmblocks >> 1;
 
  201     for (
i = 0; 
i < nlfesamples; 
i++) {
 
  203         for (j = 0; j < 32; j++) {
 
  207             for (k = 0; k < 8; k++) {
 
  208                 a += (int64_t)filter_coeff[      j * 8 + k] * lfe_samples[-k];
 
  209                 b += (int64_t)filter_coeff[255 - j * 8 - k] * lfe_samples[-k];
 
  227     for (
i = 0; 
i < 
len; 
i++) {
 
  228         int64_t 
a = INT64_C(2097471) * 
src[
i] + INT64_C(6291137) * prev;
 
  229         int64_t 
b = INT64_C(6291137) * 
src[
i] + INT64_C(2097471) * prev;
 
  244                               const int32_t *filter_coeff, ptrdiff_t npcmblocks)
 
  249     for (j = 0; j < npcmblocks; j++) {
 
  251         for (
i = 0; 
i < 32; 
i++)
 
  252             input[
i] = subband_samples_lo[
i][j];
 
  268                               const int32_t *filter_coeff, ptrdiff_t npcmblocks)
 
  273     if (!subband_samples_hi)
 
  276     for (j = 0; j < npcmblocks; j++) {
 
  278         if (subband_samples_hi) {
 
  280             for (
i =  0; 
i < 32; 
i++)
 
  281                 input[
i] = subband_samples_lo[
i][j] + subband_samples_hi[
i][j];
 
  282             for (
i = 32; 
i < 64; 
i++)
 
  283                 input[
i] = subband_samples_hi[
i][j];
 
  286             for (
i =  0; 
i < 32; 
i++)
 
  287                 input[
i] = subband_samples_lo[
i][j];
 
  311     for (
i = 0; 
i < 
len; 
i++) {
 
  347         dst[
i] = 
mul16(dst[
i], scale_inv);
 
  376     for (
i = 0; 
i < 8; 
i++, 
src0--) {
 
  382     for (
i = 0; 
i < 
len; 
i++) {
 
  389                        const float *
coeff, ptrdiff_t ofs, ptrdiff_t 
len)
 
  391     float SW0 = 
coeff[0];
 
  392     float SW1 = 
coeff[1];
 
  393     float SW2 = 
coeff[2];
 
  394     float SW3 = 
coeff[3];
 
  401     float AL1 = 
coeff[8];
 
  402     float AL2 = 
coeff[9];
 
  407     for (
i = 0; 
i < 
len; 
i++) {
 
  410         float a = 
src[-4] * SW0 - 
src[-1] * SW3;
 
  411         float b = 
src[-3] * SW1 - 
src[-2] * SW2;
 
  412         float c = 
src[ 2] * SW1 + 
src[ 1] * SW2;
 
  413         float d = 
src[ 3] * SW0 + 
src[ 0] * SW3;
 
  422     for (
i = 12; 
i < 
len - 1; 
i++) {
 
  435                       const float iir[5][4], 
float hist[5][2],
 
  441     for (
i = 0; 
i < 64; 
i++) {
 
  444         for (j = 0; j < 
factor; j++) {
 
  445             for (k = 0; k < 5; k++) {
 
  446                 tmp = hist[k][0] * iir[k][0] + hist[k][1] * iir[k][1] + res;
 
  447                 res = hist[k][0] * iir[k][2] + hist[k][1] * iir[k][3] + 
tmp;
 
  449                 hist[k][0] = hist[k][1];
 
  
static int32_t mul22(int32_t a, int32_t b)
static void lfe_iir_c(float *output, const float *input, const float iir[5][4], float hist[5][2], ptrdiff_t factor)
static int32_t mul17(int32_t a, int32_t b)
static void filter1(SUINT32 *dst, const int32_t *src, int32_t coeff, ptrdiff_t len)
static int32_t mul15(int32_t a, int32_t b)
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce output
void(* synth_filter_float)(FFTContext *imdct, float *synth_buf_ptr, int *synth_buf_offset, float synth_buf2[32], const float window[512], float out[32], const float in[32], float scale)
static void dmix_sub_xch_c(int32_t *dst1, int32_t *dst2, const int32_t *src, ptrdiff_t len)
static int32_t mul23(int32_t a, int32_t b)
static void decode_hf_c(int32_t **dst, const int32_t *vq_index, const int8_t hf_vq[1024][32], int32_t scale_factors[32][2], ptrdiff_t sb_start, ptrdiff_t sb_end, ptrdiff_t ofs, ptrdiff_t len)
static void lbr_bank_c(float output[32][4], float **input, const float *coeff, ptrdiff_t ofs, ptrdiff_t len)
static av_always_inline float scale(float x, float s)
static int32_t clip23(int32_t a)
void(* synth_filter_fixed_64)(DCADCTContext *imdct, int32_t *synth_buf_ptr, int *synth_buf_offset, int32_t synth_buf2[64], const int32_t window[1024], int32_t out[64], const int32_t in[64])
static void dmix_sub_c(int32_t *dst, const int32_t *src, int coeff, ptrdiff_t len)
static void sub_qmf32_fixed_c(SynthFilterContext *synth, DCADCTContext *imdct, int32_t *pcm_samples, int32_t **subband_samples_lo, int32_t **subband_samples_hi, int32_t *hist1, int *offset, int32_t *hist2, const int32_t *filter_coeff, ptrdiff_t npcmblocks)
void(* synth_filter_fixed)(DCADCTContext *imdct, int32_t *synth_buf_ptr, int *synth_buf_offset, int32_t synth_buf2[32], const int32_t window[512], int32_t out[32], const int32_t in[32])
static void decode_joint_c(int32_t **dst, int32_t **src, const int32_t *scale_factors, ptrdiff_t sb_start, ptrdiff_t sb_end, ptrdiff_t ofs, ptrdiff_t len)
static void dmix_add_c(int32_t *dst, const int32_t *src, int coeff, ptrdiff_t len)
static void lfe_fir0_float_c(float *pcm_samples, int32_t *lfe_samples, const float *filter_coeff, ptrdiff_t npcmblocks)
static int32_t mul16(int32_t a, int32_t b)
static void lfe_fir_float_c(float *pcm_samples, int32_t *lfe_samples, const float *filter_coeff, ptrdiff_t npcmblocks, int dec_select)
static void assemble_freq_bands_c(int32_t *dst, int32_t *src0, int32_t *src1, const int32_t *coeff, ptrdiff_t len)
static void dmix_scale_inv_c(int32_t *dst, int scale_inv, ptrdiff_t len)
static void dmix_scale_c(int32_t *dst, int scale, ptrdiff_t len)
#define LOCAL_ALIGNED_32(t, v,...)
static void sub_qmf64_float_c(SynthFilterContext *synth, FFTContext *imdct, float *pcm_samples, int32_t **subband_samples_lo, int32_t **subband_samples_hi, float *hist1, int *offset, float *hist2, const float *filter_coeff, ptrdiff_t npcmblocks, float scale)
static void sub_qmf64_fixed_c(SynthFilterContext *synth, DCADCTContext *imdct, int32_t *pcm_samples, int32_t **subband_samples_lo, int32_t **subband_samples_hi, int32_t *hist1, int *offset, int32_t *hist2, const int32_t *filter_coeff, ptrdiff_t npcmblocks)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
av_cold void ff_dcadsp_init(DCADSPContext *s)
void(* synth_filter_float_64)(FFTContext *imdct, float *synth_buf_ptr, int *synth_buf_offset, float synth_buf2[64], const float window[1024], float out[64], const float in[64], float scale)
static void decor_c(int32_t *dst, const int32_t *src, int coeff, ptrdiff_t len)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
static void lfe_x96_float_c(float *dst, const float *src, float *hist, ptrdiff_t len)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some input
static void lfe_fir1_float_c(float *pcm_samples, int32_t *lfe_samples, const float *filter_coeff, ptrdiff_t npcmblocks)
static void lfe_x96_fixed_c(int32_t *dst, const int32_t *src, int32_t *hist, ptrdiff_t len)
#define i(width, name, range_min, range_max)
static void sub_qmf32_float_c(SynthFilterContext *synth, FFTContext *imdct, float *pcm_samples, int32_t **subband_samples_lo, int32_t **subband_samples_hi, float *hist1, int *offset, float *hist2, const float *filter_coeff, ptrdiff_t npcmblocks, float scale)
static int32_t norm23(int64_t a)
static const int factor[16]
static void filter0(SUINT32 *dst, const int32_t *src, int32_t coeff, ptrdiff_t len)
av_cold void ff_dcadsp_init_x86(DCADSPContext *s)
static void lfe_fir_fixed_c(int32_t *pcm_samples, int32_t *lfe_samples, const int32_t *filter_coeff, ptrdiff_t npcmblocks)
static const double coeff[2][5]