changeset 7724:ea9aa2aa4caa libavcodec

dca: Do float -> int16 interleaving in-place using s->dsp.float_to_int16_interleave()
author andoma
date Fri, 29 Aug 2008 10:09:51 +0000
parents 20b105281e87
children 2cddcef36256
files dca.c
diffstat 1 files changed, 7 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }