Go to the documentation of this file.
29 const int8_t hf_vq[1024][32],
31 ptrdiff_t sb_start, ptrdiff_t sb_end,
32 ptrdiff_t ofs, ptrdiff_t
len)
36 for (
i = sb_start;
i < sb_end;
i++) {
37 const int8_t *
coeff = hf_vq[vq_index[
i]];
39 for (j = 0; j <
len; j++)
40 dst[
i][j + ofs] =
clip23(
coeff[j] * scale + (1 << 3) >> 4);
46 ptrdiff_t sb_start, ptrdiff_t sb_end,
47 ptrdiff_t ofs, ptrdiff_t
len)
51 for (
i = sb_start;
i < sb_end;
i++) {
53 for (j = 0; j <
len; j++)
59 const float *filter_coeff, ptrdiff_t npcmblocks,
63 int factor = 64 << dec_select;
64 int ncoeffs = 8 >> dec_select;
65 int nlfesamples = npcmblocks >> (dec_select + 1);
68 for (
i = 0;
i < nlfesamples;
i++) {
70 for (j = 0; j <
factor / 2; j++) {
74 for (k = 0; k < ncoeffs; k++) {
75 a += filter_coeff[ j * ncoeffs + k] * lfe_samples[-k];
76 b += filter_coeff[255 - j * ncoeffs - k] * lfe_samples[-k];
80 pcm_samples[
factor / 2 + j] =
b;
89 const float *filter_coeff, ptrdiff_t npcmblocks)
95 const float *filter_coeff, ptrdiff_t npcmblocks)
101 float *hist, ptrdiff_t
len)
106 for (
i = 0;
i <
len;
i++) {
107 float a = 0.25f *
src[
i] + 0.75f * prev;
108 float b = 0.75f *
src[
i] + 0.25f * prev;
122 float *hist1,
int *
offset,
float *hist2,
123 const float *filter_coeff, ptrdiff_t npcmblocks,
129 for (j = 0; j < npcmblocks; j++) {
131 for (
i = 0;
i < 32;
i++) {
133 input[
i] = -subband_samples_lo[
i][j];
135 input[
i] = subband_samples_lo[
i][j];
141 pcm_samples,
input, scale);
151 float *hist1,
int *
offset,
float *hist2,
152 const float *filter_coeff, ptrdiff_t npcmblocks,
158 if (!subband_samples_hi)
161 for (j = 0; j < npcmblocks; j++) {
163 if (subband_samples_hi) {
165 for (
i = 0;
i < 32;
i++) {
167 input[
i] = -subband_samples_lo[
i][j] - subband_samples_hi[
i][j];
169 input[
i] = subband_samples_lo[
i][j] + subband_samples_hi[
i][j];
171 for (
i = 32;
i < 64;
i++) {
173 input[
i] = -subband_samples_hi[
i][j];
175 input[
i] = subband_samples_hi[
i][j];
179 for (
i = 0;
i < 32;
i++) {
181 input[
i] = -subband_samples_lo[
i][j];
183 input[
i] = subband_samples_lo[
i][j];
190 pcm_samples,
input, scale);
196 const int32_t *filter_coeff, ptrdiff_t npcmblocks)
199 int nlfesamples = npcmblocks >> 1;
202 for (
i = 0;
i < nlfesamples;
i++) {
204 for (j = 0; j < 32; j++) {
208 for (k = 0; k < 8; k++) {
209 a += (int64_t)filter_coeff[ j * 8 + k] * lfe_samples[-k];
210 b += (int64_t)filter_coeff[255 - j * 8 - k] * lfe_samples[-k];
228 for (
i = 0;
i <
len;
i++) {
229 int64_t
a = INT64_C(2097471) *
src[
i] + INT64_C(6291137) * prev;
230 int64_t
b = INT64_C(6291137) *
src[
i] + INT64_C(2097471) * prev;
245 const int32_t *filter_coeff, ptrdiff_t npcmblocks)
250 for (j = 0; j < npcmblocks; j++) {
252 for (
i = 0;
i < 32;
i++)
253 input[
i] = subband_samples_lo[
i][j];
269 const int32_t *filter_coeff, ptrdiff_t npcmblocks)
274 if (!subband_samples_hi)
277 for (j = 0; j < npcmblocks; j++) {
279 if (subband_samples_hi) {
281 for (
i = 0;
i < 32;
i++)
282 input[
i] = subband_samples_lo[
i][j] + subband_samples_hi[
i][j];
283 for (
i = 32;
i < 64;
i++)
284 input[
i] = subband_samples_hi[
i][j];
287 for (
i = 0;
i < 32;
i++)
288 input[
i] = subband_samples_lo[
i][j];
312 for (
i = 0;
i <
len;
i++) {
348 dst[
i] =
mul16(dst[
i], scale_inv);
377 for (
i = 0;
i < 8;
i++,
src0--) {
383 for (
i = 0;
i <
len;
i++) {
390 const float *
coeff, ptrdiff_t ofs, ptrdiff_t
len)
392 float SW0 =
coeff[0];
393 float SW1 =
coeff[1];
394 float SW2 =
coeff[2];
395 float SW3 =
coeff[3];
402 float AL1 =
coeff[8];
403 float AL2 =
coeff[9];
408 for (
i = 0;
i <
len;
i++) {
411 float a =
src[-4] * SW0 -
src[-1] * SW3;
412 float b =
src[-3] * SW1 -
src[-2] * SW2;
413 float c =
src[ 2] * SW1 +
src[ 1] * SW2;
414 float d =
src[ 3] * SW0 +
src[ 0] * SW3;
423 for (
i = 12;
i <
len - 1;
i++) {
436 const float iir[5][4],
float hist[5][2],
442 for (
i = 0;
i < 64;
i++) {
445 for (j = 0; j <
factor; j++) {
446 for (k = 0; k < 5; k++) {
447 tmp = hist[k][0] * iir[k][0] + hist[k][1] * iir[k][1] + res;
448 res = hist[k][0] * iir[k][2] + hist[k][1] * iir[k][3] +
tmp;
450 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 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)
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]