diff Plugins/Input/mpg123/decode_4to1.c @ 127:05d824e30afd trunk

[svn] Synchronize mpg123 code with mpg123-0.59s.mc3. This brings us superior accuracy to libMAD, apparently.
author nenolod
date Wed, 09 Nov 2005 16:40:03 -0800
parents fa848bd484d8
children 0f294f2b0a9b
line wrap: on
line diff
--- a/Plugins/Input/mpg123/decode_4to1.c	Tue Nov 08 12:04:15 2005 -0800
+++ b/Plugins/Input/mpg123/decode_4to1.c	Wed Nov 09 16:40:03 2005 -0800
@@ -1,4 +1,3 @@
-
 /*
  * Mpeg Layer-1,2,3 audio decoder
  * ------------------------------
@@ -20,245 +19,217 @@
   else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
   else { *(samples) = sum; }
 
-int
-mpg123_synth_4to1_8bit(real * bandPtr, int channel,
-                       unsigned char *samples, int *pnt)
+int mpg123_synth_4to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
 {
-    short samples_tmp[16];
-    short *tmp1 = samples_tmp + channel;
-    int i, ret;
-    int pnt1 = 0;
+  short samples_tmp[16];
+  short *tmp1 = samples_tmp + channel;
+  int i,ret;
+  int pnt1 = 0;
 
-    ret =
-        mpg123_synth_4to1(bandPtr, channel, (unsigned char *) samples_tmp,
-                          &pnt1);
-    samples += channel + *pnt;
+  ret = mpg123_synth_4to1(bandPtr,channel,(unsigned char *) samples_tmp,&pnt1);
+  samples += channel + *pnt;
 
-    for (i = 0; i < 8; i++) {
-        *samples = (*tmp1 >> 8) ^ 128;
-        samples += 2;
-        tmp1 += 2;
-    }
-    *pnt += 16;
+  for(i=0;i<8;i++) {
+    *samples = mpg123_conv16to8[*tmp1>>AUSHIFT];
+    samples += 2;
+    tmp1 += 2;
+  }
+  *pnt += 16;
 
-    return ret;
+  return ret;
 }
 
-int
-mpg123_synth_4to1_8bit_mono(real * bandPtr, unsigned char *samples, int *pnt)
+int mpg123_synth_4to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
 {
-    short samples_tmp[16];
-    short *tmp1 = samples_tmp;
-    int i, ret;
-    int pnt1 = 0;
+  short samples_tmp[16];
+  short *tmp1 = samples_tmp;
+  int i,ret;
+  int pnt1 = 0;
+
+  ret = mpg123_synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
+  samples += *pnt;
+
+  for(i=0;i<8;i++) {
+    *samples++ = mpg123_conv16to8[*tmp1>>AUSHIFT];
+    tmp1 += 2;
+  }
+  *pnt += 8;
+
+  return ret;
+}
 
-    ret = mpg123_synth_4to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
-    samples += *pnt;
+
+int mpg123_synth_4to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
+{
+  short samples_tmp[16];
+  short *tmp1 = samples_tmp;
+  int i,ret;
+  int pnt1 = 0;
 
-    for (i = 0; i < 8; i++) {
-        *samples++ = (*tmp1 >> 8) ^ 128;
-        tmp1 += 2;
-    }
-    *pnt += 8;
+  ret = mpg123_synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
+  samples += *pnt;
 
-    return ret;
+  for(i=0;i<8;i++) {
+    *samples++ = mpg123_conv16to8[*tmp1>>AUSHIFT];
+    *samples++ = mpg123_conv16to8[*tmp1>>AUSHIFT];
+    tmp1 += 2;
+  }
+  *pnt += 16;
+
+  return ret;
 }
 
-#if 0
-int
-mpg123_synth_4to1_8bit_mono2stereo(real * bandPtr,
-                                   unsigned char *samples, int *pnt)
+int mpg123_synth_4to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
 {
-    short samples_tmp[16];
-    short *tmp1 = samples_tmp;
-    int i, ret;
-    int pnt1 = 0;
+  short samples_tmp[16];
+  short *tmp1 = samples_tmp;
+  int i,ret;
+  int pnt1 = 0;
 
-    ret = mpg123_synth_4to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
-    samples += *pnt;
+  ret = mpg123_synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
+  samples += *pnt;
 
-    for (i = 0; i < 8; i++) {
-        *samples++ = (*tmp1 >> 8) ^ 128;
-        *samples++ = (*tmp1 >> 8) ^ 128;
-        tmp1 += 2;
-    }
-    *pnt += 16;
+  for(i=0;i<8;i++) {
+    *( (short *)samples) = *tmp1;
+    samples += 2;
+    tmp1 += 2;
+  }
+  *pnt += 16;
 
-    return ret;
+  return ret;
 }
-#endif
 
-int
-mpg123_synth_4to1_mono(real * bandPtr, unsigned char *samples, int *pnt)
+int mpg123_synth_4to1_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
 {
-    short samples_tmp[16];
-    short *tmp1 = samples_tmp;
-    int i, ret;
-    int pnt1 = 0;
+  int i,ret;
 
-    ret = mpg123_synth_4to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
-    samples += *pnt;
+  ret = mpg123_synth_4to1(bandPtr,0,samples,pnt);
+  samples = samples + *pnt - 32;
 
-    for (i = 0; i < 8; i++) {
-        *((short *) samples) = *tmp1;
-        samples += 2;
-        tmp1 += 2;
-    }
-    *pnt += 16;
+  for(i=0;i<8;i++) {
+    ((short *)samples)[1] = ((short *)samples)[0];
+    samples+=4;
+  }
 
-    return ret;
+  return ret;
 }
 
-#if 0
-int
-mpg123_synth_4to1_mono2stereo(real * bandPtr, unsigned char *samples,
-                              int *pnt)
+int mpg123_synth_4to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
 {
-    int i, ret;
-
-    ret = mpg123_synth_4to1(bandPtr, 0, samples, pnt);
-    samples = samples + *pnt - 32;
+  static real buffs[2][2][0x110];
+  static const int step = 2;
+  static int bo = 1;
+  short *samples = (short *) (out + *pnt);
 
-    for (i = 0; i < 8; i++) {
-        ((short *) samples)[1] = ((short *) samples)[0];
-        samples += 4;
-    }
+  real *b0,(*buf)[0x110];
+  int clip = 0; 
+  int bo1;
 
-    return ret;
-}
-#endif
-
-int
-mpg123_synth_4to1(real * bandPtr, int channel, unsigned char *out, int *pnt)
-{
-    static real buffs[2][2][0x110];
-    static const int step = 2;
-    static int bo = 1;
-    short *samples = (short *) (out + *pnt);
+  if(!channel) {
+    bo--;
+    bo &= 0xf;
+    buf = buffs[0];
+  }
+  else {
+    samples++;
+    buf = buffs[1];
+  }
 
-    real *b0, (*buf)[0x110];
-    int clip = 0;
-    int bo1;
+  if(bo & 0x1) {
+    b0 = buf[0];
+    bo1 = bo;
+    mpg123_dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr);
+  }
+  else {
+    b0 = buf[1];
+    bo1 = bo+1;
+    mpg123_dct64(buf[0]+bo,buf[1]+bo+1,bandPtr);
+  }
 
-/*  if(param.equalizer)
-   do_equalizer(bandPtr,channel); */
+  {
+    register int j;
+    real *window = mpg123_decwin + 16 - bo1;
 
-    if (!channel) {
-        bo--;
-        bo &= 0xf;
-        buf = buffs[0];
-    }
-    else {
-        samples++;
-        buf = buffs[1];
-    }
+    for (j=4;j;j--,b0+=0x30,window+=0x70)
+    {
+      real sum;
+      sum  = *window++ * *b0++;
+      sum -= *window++ * *b0++;
+      sum += *window++ * *b0++;
+      sum -= *window++ * *b0++;
+      sum += *window++ * *b0++;
+      sum -= *window++ * *b0++;
+      sum += *window++ * *b0++;
+      sum -= *window++ * *b0++;
+      sum += *window++ * *b0++;
+      sum -= *window++ * *b0++;
+      sum += *window++ * *b0++;
+      sum -= *window++ * *b0++;
+      sum += *window++ * *b0++;
+      sum -= *window++ * *b0++;
+      sum += *window++ * *b0++;
+      sum -= *window++ * *b0++;
 
-    if (bo & 0x1) {
-        b0 = buf[0];
-        bo1 = bo;
-        mpg123_dct64(buf[1] + ((bo + 1) & 0xf), buf[0] + bo, bandPtr);
-    }
-    else {
-        b0 = buf[1];
-        bo1 = bo + 1;
-        mpg123_dct64(buf[0] + bo, buf[1] + bo + 1, bandPtr);
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
+#if 0
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
+#endif
     }
 
     {
-        register int j;
-        real *window = mpg123_decwin + 16 - bo1;
-
-        for (j = 4; j; j--, b0 += 0x30, window += 0x70) {
-            real sum;
-
-            sum = *window++ * *b0++;
-            sum -= *window++ * *b0++;
-            sum += *window++ * *b0++;
-            sum -= *window++ * *b0++;
-            sum += *window++ * *b0++;
-            sum -= *window++ * *b0++;
-            sum += *window++ * *b0++;
-            sum -= *window++ * *b0++;
-            sum += *window++ * *b0++;
-            sum -= *window++ * *b0++;
-            sum += *window++ * *b0++;
-            sum -= *window++ * *b0++;
-            sum += *window++ * *b0++;
-            sum -= *window++ * *b0++;
-            sum += *window++ * *b0++;
-            sum -= *window++ * *b0++;
-
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
-#if 0
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
-#endif
-        }
-
-        {
-            real sum;
-
-            sum = window[0x0] * b0[0x0];
-            sum += window[0x2] * b0[0x2];
-            sum += window[0x4] * b0[0x4];
-            sum += window[0x6] * b0[0x6];
-            sum += window[0x8] * b0[0x8];
-            sum += window[0xA] * b0[0xA];
-            sum += window[0xC] * b0[0xC];
-            sum += window[0xE] * b0[0xE];
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
+      real sum;
+      sum  = window[0x0] * b0[0x0];
+      sum += window[0x2] * b0[0x2];
+      sum += window[0x4] * b0[0x4];
+      sum += window[0x6] * b0[0x6];
+      sum += window[0x8] * b0[0x8];
+      sum += window[0xA] * b0[0xA];
+      sum += window[0xC] * b0[0xC];
+      sum += window[0xE] * b0[0xE];
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
 #if 0
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
 #endif
-            b0 -= 0x40, window -= 0x80;
-        }
-        window += bo1 << 1;
-
-        for (j = 3; j; j--, b0 -= 0x50, window -= 0x70) {
-            real sum;
+      b0-=0x40,window-=0x80;
+    }
+    window += bo1<<1;
 
-            sum = -*(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
-            sum -= *(--window) * *b0++;
+    for (j=3;j;j--,b0-=0x50,window-=0x70)
+    {
+      real sum;
+      sum = -*(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
+      sum -= *(--window) * *b0++;
 
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
 #if 0
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
-            WRITE_SAMPLE(samples, sum, clip);
-            samples += step;
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
+      WRITE_SAMPLE(samples,sum,clip); samples += step;
 #endif
-        }
     }
+  }
+  
+  *pnt += 32;
 
-    *pnt += 32;
+  return clip;
+}
 
-    return clip;
-}
+