adxenc: avoid stereo deinterleaving
authorJustin Ruggles <justin.ruggles@gmail.com>
Mon, 19 Dec 2011 14:52:32 +0000 (09:52 -0500)
committerJustin Ruggles <justin.ruggles@gmail.com>
Tue, 3 Jan 2012 23:47:41 +0000 (18:47 -0500)
libavcodec/adxenc.c

index 43f7801..4f434ba 100644 (file)
  */
 
 static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
  */
 
 static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
-                       ADXChannelState *prev)
+                       ADXChannelState *prev, int channels)
 {
     PutBitContext pb;
     int scale;
 {
     PutBitContext pb;
     int scale;
-    int i;
+    int i, j;
     int s0, s1, s2, d;
     int max = 0;
     int min = 0;
     int s0, s1, s2, d;
     int max = 0;
     int min = 0;
@@ -46,10 +46,10 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
 
     s1 = prev->s1;
     s2 = prev->s2;
 
     s1 = prev->s1;
     s2 = prev->s2;
-    for (i = 0; i < 32; i++) {
+    for (i = 0, j = 0; j < 32; i += channels, j++) {
         s0 = wav[i];
         d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
         s0 = wav[i];
         d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
-        data[i] = d;
+        data[j] = d;
         if (max < d)
             max = d;
         if (min > d)
         if (max < d)
             max = d;
         if (min > d)
@@ -138,23 +138,15 @@ static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame,
 
     if (avctx->channels == 1) {
         while (rest >= 32) {
 
     if (avctx->channels == 1) {
         while (rest >= 32) {
-            adx_encode(c, dst, samples, c->prev);
+            adx_encode(c, dst, samples, c->prev, avctx->channels);
             dst     += 18;
             samples += 32;
             rest    -= 32;
         }
     } else {
         while (rest >= 32*2) {
             dst     += 18;
             samples += 32;
             rest    -= 32;
         }
     } else {
         while (rest >= 32*2) {
-            int16_t tmpbuf[32*2];
-            int i;
-
-            for (i = 0; i < 32; i++) {
-                tmpbuf[i   ] = samples[i*2  ];
-                tmpbuf[i+32] = samples[i*2+1];
-            }
-
-            adx_encode(c, dst,      tmpbuf,      c->prev    );
-            adx_encode(c, dst + 18, tmpbuf + 32, c->prev + 1);
+            adx_encode(c, dst,      samples,     c->prev,     avctx->channels);
+            adx_encode(c, dst + 18, samples + 1, c->prev + 1, avctx->channels);
             dst     += 18*2;
             samples += 32*2;
             rest    -= 32*2;
             dst     += 18*2;
             samples += 32*2;
             rest    -= 32*2;