# HG changeset patch # User andoma # Date 1220004591 0 # Node ID ea9aa2aa4caaae2ac8acd2cbb4a1106d7592eb95 # Parent 20b105281e8766ba648eb79de30a4dcb5bf5bc37 dca: Do float -> int16 interleaving in-place using s->dsp.float_to_int16_interleave() diff -r 20b105281e87 -r ea9aa2aa4caa dca.c --- a/dca.c Fri Aug 29 06:14:53 2008 +0000 +++ b/dca.c Fri Aug 29 10:09:51 2008 +0000 @@ -164,7 +164,7 @@ int bias; ///< output bias DECLARE_ALIGNED_16(float, samples[1536]); /* 6 * 256 = 1536, might only need 5 */ - DECLARE_ALIGNED_16(int16_t, tsamples[1536]); + float *samples_chanptr[6]; uint8_t dca_buffer[DCA_MAX_FRAME_SIZE]; int dca_buffer_size; ///< how much data is in the dca_buffer @@ -1145,7 +1145,7 @@ const uint8_t * buf, int buf_size) { - int i, j, k; + int i; int16_t *samples = data; DCAContext *s = avctx->priv_data; int channels; @@ -1186,13 +1186,8 @@ *data_size = 0; for (i = 0; i < (s->sample_blocks / 8); i++) { dca_decode_block(s); - s->dsp.float_to_int16(s->tsamples, s->samples, 256 * channels); - /* interleave samples */ - for (j = 0; j < 256; j++) { - for (k = 0; k < channels; k++) - samples[k] = s->tsamples[j + k * 256]; - samples += channels; - } + s->dsp.float_to_int16_interleave(samples, s->samples_chanptr, 256, channels); + samples += 256 * channels; *data_size += 256 * sizeof(int16_t) * channels; } @@ -1240,6 +1235,7 @@ static av_cold int dca_decode_init(AVCodecContext * avctx) { DCAContext *s = avctx->priv_data; + int i; s->avctx = avctx; dca_init_vlcs(); @@ -1252,7 +1248,8 @@ avctx->request_channels == 2) { avctx->channels = avctx->request_channels; } - + for(i = 0; i < 6; i++) + s->samples_chanptr[i] = s->samples + i * 256; avctx->sample_fmt = SAMPLE_FMT_S16; return 0; }