X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdcadsp.c;h=32b149d09c0baacec9896d238973de6ab76468e8;hb=1fec347ef56bc3f501ffdfe0d253e768666aac7f;hp=b32d962c339ae6951e4ea4b4a7b520037ea403af;hpb=a38b50c3ff0b49cf4c04196ff889d35f105b50c8;p=ffmpeg diff --git a/libavcodec/dcadsp.c b/libavcodec/dcadsp.c index b32d962c339..32b149d09c0 100644 --- a/libavcodec/dcadsp.c +++ b/libavcodec/dcadsp.c @@ -25,22 +25,20 @@ #include "libavutil/intreadwrite.h" #include "dcadsp.h" +#include "dcamath.h" -static void decode_hf_c(float dst[DCA_SUBBANDS][8], +static void decode_hf_c(int32_t dst[DCA_SUBBANDS][SAMPLES_PER_SUBBAND], const int32_t vq_num[DCA_SUBBANDS], const int8_t hf_vq[1024][32], intptr_t vq_offset, int32_t scale[DCA_SUBBANDS][2], intptr_t start, intptr_t end) { - int i, l; + int i, j; - for (l = start; l < end; l++) { - /* 1 vector -> 32 samples but we only need the 8 samples - * for this subsubframe. */ - const int8_t *ptr = &hf_vq[vq_num[l]][vq_offset]; - float fscale = scale[l][0] * (1 / 16.0); + for (j = start; j < end; j++) { + const int8_t *ptr = &hf_vq[vq_num[j]][vq_offset]; for (i = 0; i < 8; i++) - dst[l][i] = ptr[i] * fscale; + dst[j][i] = ptr[i] * scale[j][0] + 8 >> 4; } } @@ -64,7 +62,7 @@ static inline void dca_lfe_fir(float *out, const float *in, const float *coefs, } } -static void dca_qmf_32_subbands(float samples_in[32][8], int sb_act, +static void dca_qmf_32_subbands(float samples_in[DCA_SUBBANDS][SAMPLES_PER_SUBBAND], int sb_act, SynthFilterContext *synth, FFTContext *imdct, float synth_buf_ptr[512], int *synth_buf_offset, float synth_buf2[32], @@ -93,6 +91,22 @@ static void dca_qmf_32_subbands(float samples_in[32][8], int sb_act, } } +static void dequantize_c(int32_t *samples, uint32_t step_size, uint32_t scale) +{ + int64_t step = (int64_t)step_size * scale; + int shift, i; + int32_t step_scale; + + if (step > (1 << 23)) + shift = av_log2(step >> 23) + 1; + else + shift = 0; + step_scale = (int32_t)(step >> shift); + + for (i = 0; i < SAMPLES_PER_SUBBAND; i++) + samples[i] = dca_clip23(dca_norm((int64_t)samples[i] * step_scale, 22 - shift)); +} + static void dca_lfe_fir0_c(float *out, const float *in, const float *coefs) { dca_lfe_fir(out, in, coefs, 32); @@ -109,7 +123,10 @@ av_cold void ff_dcadsp_init(DCADSPContext *s) s->lfe_fir[1] = dca_lfe_fir1_c; s->qmf_32_subbands = dca_qmf_32_subbands; s->decode_hf = decode_hf_c; + s->dequantize = dequantize_c; + if (ARCH_AARCH64) + ff_dcadsp_init_aarch64(s); if (ARCH_ARM) ff_dcadsp_init_arm(s); if (ARCH_X86)