diff --git a/libavcodec/dca.h b/libavcodec/dca.h index a85470d10649720200d81e1d1d9bd91da4339271..787a9c74deb9f5f2de6219adbd881c22225ee459 100644 --- a/libavcodec/dca.h +++ b/libavcodec/dca.h @@ -147,7 +147,7 @@ typedef struct DCAAudioHeader { } DCAAudioHeader; typedef struct DCAChan { - DECLARE_ALIGNED(32, int32_t, subband_samples)[DCA_BLOCKS_MAX][DCA_SUBBANDS][8]; + DECLARE_ALIGNED(32, int32_t, subband_samples)[DCA_BLOCKS_MAX][DCA_SUBBANDS][SAMPLES_PER_SUBBAND]; /* Subband samples history (for ADPCM) */ DECLARE_ALIGNED(32, int32_t, subband_samples_hist)[DCA_SUBBANDS][4]; diff --git a/libavcodec/dcadec.c b/libavcodec/dcadec.c index a25436cdec879178ce17b82ac2403ac50808d76c..43992ddfb85d14a2e2150e8ada43327a2268ada9 100644 --- a/libavcodec/dcadec.c +++ b/libavcodec/dcadec.c @@ -140,8 +140,6 @@ static const uint64_t dca_core_channel_layout[] = { #define DCA_NSYNCAUX 0x9A1105A0 -#define SAMPLES_PER_SUBBAND 8 // number of samples per subband per subsubframe - /** Bit allocation */ typedef struct BitAlloc { int offset; ///< code values offset @@ -544,7 +542,7 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index) } static void qmf_32_subbands(DCAContext *s, int chans, - float samples_in[32][SAMPLES_PER_SUBBAND], float *samples_out, + float samples_in[DCA_SUBBANDS][SAMPLES_PER_SUBBAND], float *samples_out, float scale) { const float *prCoeff; @@ -592,7 +590,8 @@ static QMF64_table *qmf64_precompute(void) /* FIXME: Totally unoptimized. Based on the reference code and * http://multimedia.cx/mirror/dca-transform.pdf, with guessed tweaks * for doubling the size. */ -static void qmf_64_subbands(DCAContext *s, int chans, float samples_in[64][SAMPLES_PER_SUBBAND], +static void qmf_64_subbands(DCAContext *s, int chans, + float samples_in[DCA_SUBBANDS_X96K][SAMPLES_PER_SUBBAND], float *samples_out, float scale) { float raXin[64]; @@ -601,7 +600,7 @@ static void qmf_64_subbands(DCAContext *s, int chans, float samples_in[64][SAMPL float *raZ = s->dca_chan[chans].subband_fir_noidea; unsigned i, j, k, subindex; - for (i = s->audio_header.subband_activity[chans]; i < 64; i++) + for (i = s->audio_header.subband_activity[chans]; i < DCA_SUBBANDS_X96K; i++) raXin[i] = 0.0; for (subindex = 0; subindex < SAMPLES_PER_SUBBAND; subindex++) { for (i = 0; i < s->audio_header.subband_activity[chans]; i++) @@ -622,14 +621,14 @@ static void qmf_64_subbands(DCAContext *s, int chans, float samples_in[64][SAMPL raX[63 - k] = s->qmf64_table->rsin[k] * (A[k] - B[k]); } - for (i = 0; i < 64; i++) { + for (i = 0; i < DCA_SUBBANDS_X96K; i++) { float out = raZ[i]; for (j = 0; j < 1024; j += 128) out += ff_dca_fir_64bands[j + i] * (raX[j + i] - raX[j + 63 - i]); *samples_out++ = out * scale; } - for (i = 0; i < 64; i++) { + for (i = 0; i < DCA_SUBBANDS_X96K; i++) { float hist = 0.0; for (j = 0; j < 1024; j += 128) hist += ff_dca_fir_64bands[64 + j + i] * (-raX[i + j] - raX[j + 63 - i]); @@ -938,7 +937,7 @@ static int dca_filter_channels(DCAContext *s, int block_index, int upsample) int k; if (upsample) { - LOCAL_ALIGNED(32, float, samples, [64], [SAMPLES_PER_SUBBAND]); + LOCAL_ALIGNED(32, float, samples, [DCA_SUBBANDS_X96K], [SAMPLES_PER_SUBBAND]); if (!s->qmf64_table) { s->qmf64_table = qmf64_precompute(); @@ -952,7 +951,7 @@ static int dca_filter_channels(DCAContext *s, int block_index, int upsample) s->dca_chan[k].subband_samples[block_index]; s->fmt_conv.int32_to_float(samples[0], subband_samples[0], - 64 * SAMPLES_PER_SUBBAND); + DCA_SUBBANDS_X96K * SAMPLES_PER_SUBBAND); if (s->channel_order_tab[k] >= 0) qmf_64_subbands(s, k, samples, @@ -962,14 +961,14 @@ static int dca_filter_channels(DCAContext *s, int block_index, int upsample) } } else { /* 32 subbands QMF */ - LOCAL_ALIGNED(32, float, samples, [32], [SAMPLES_PER_SUBBAND]); + LOCAL_ALIGNED(32, float, samples, [DCA_SUBBANDS], [SAMPLES_PER_SUBBAND]); for (k = 0; k < s->audio_header.prim_channels; k++) { int32_t (*subband_samples)[SAMPLES_PER_SUBBAND] = s->dca_chan[k].subband_samples[block_index]; s->fmt_conv.int32_to_float(samples[0], subband_samples[0], - 32 * SAMPLES_PER_SUBBAND); + DCA_SUBBANDS * SAMPLES_PER_SUBBAND); if (s->channel_order_tab[k] >= 0) qmf_32_subbands(s, k, samples, diff --git a/libavcodec/dcadsp.c b/libavcodec/dcadsp.c index ec3561dd54c4b24dded4ceb4910b6fe3e206f4ce..beec2007f63587b130956911995fafcb6692ff80 100644 --- a/libavcodec/dcadsp.c +++ b/libavcodec/dcadsp.c @@ -27,7 +27,7 @@ #include "dcadsp.h" #include "dcamath.h" -static void decode_hf_c(int32_t 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], @@ -62,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], @@ -103,7 +103,7 @@ static void dequantize_c(int32_t *samples, uint32_t step_size, uint32_t scale) shift = 0; step_scale = (int32_t)(step >> shift); - for (i = 0; i < 8; i++) + for (i = 0; i < SAMPLES_PER_SUBBAND; i++) samples[i] = dca_clip23(dca_norm((int64_t)samples[i] * step_scale, 22 - shift)); } diff --git a/libavcodec/dcadsp.h b/libavcodec/dcadsp.h index ad361bfd018cebc4b13c2931f46738d18a7fedd5..9ea89ea7afec98de0ebe7a9ea197e06a0939b4c8 100644 --- a/libavcodec/dcadsp.h +++ b/libavcodec/dcadsp.h @@ -22,17 +22,20 @@ #include "avfft.h" #include "synth_filter.h" -#define DCA_SUBBANDS 32 +#define DCA_SUBBANDS_X96K 64 +#define DCA_SUBBANDS 32 +#define SAMPLES_PER_SUBBAND 8 // number of samples per subband per subsubframe + typedef struct DCADSPContext { void (*lfe_fir[2])(float *out, const float *in, const float *coefs); - void (*qmf_32_subbands)(float samples_in[32][8], int sb_act, + void (*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], const float window[512], float *samples_out, float raXin[32], float scale); - void (*decode_hf)(int32_t dst[DCA_SUBBANDS][8], + void (*decode_hf)(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],