PageRenderTime 13ms CodeModel.GetById 2ms app.highlight 9ms RepoModel.GetById 1ms app.codeStats 0ms

/project/jni/sdl_sound/decoders/mpglib/layer1.c

https://github.com/aichunyu/FFPlayer
C | 148 lines | 122 code | 17 blank | 9 comment | 36 complexity | 0594dcae487d38afcb9474db7ddbf887 MD5 | raw file
  1/* 
  2 * Mpeg Layer-1 audio decoder 
  3 * --------------------------
  4 * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
  5 * near unoptimzed ...
  6 *
  7 * may have a few bugs after last optimization ... 
  8 *
  9 */
 10
 11#include "mpg123_sdlsound.h"
 12
 13void I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],struct frame *fr)
 14{
 15  unsigned int *ba=balloc;
 16  unsigned int *sca = (unsigned int *) scale_index;
 17
 18  if(fr->stereo) {
 19    int i;
 20    int jsbound = fr->jsbound;
 21    for (i=0;i<jsbound;i++) { 
 22      *ba++ = getbits(4);
 23      *ba++ = getbits(4);
 24    }
 25    for (i=jsbound;i<SBLIMIT;i++)
 26      *ba++ = getbits(4);
 27
 28    ba = balloc;
 29
 30    for (i=0;i<jsbound;i++) {
 31      if ((*ba++))
 32        *sca++ = getbits(6);
 33      if ((*ba++))
 34        *sca++ = getbits(6);
 35    }
 36    for (i=jsbound;i<SBLIMIT;i++)
 37      if ((*ba++)) {
 38        *sca++ =  getbits(6);
 39        *sca++ =  getbits(6);
 40      }
 41  }
 42  else {
 43    int i;
 44    for (i=0;i<SBLIMIT;i++)
 45      *ba++ = getbits(4);
 46    ba = balloc;
 47    for (i=0;i<SBLIMIT;i++)
 48      if ((*ba++))
 49        *sca++ = getbits(6);
 50  }
 51}
 52
 53void I_step_two(real fraction[2][SBLIMIT],unsigned int balloc[2*SBLIMIT],
 54	unsigned int scale_index[2][SBLIMIT],struct frame *fr)
 55{
 56  int i,n;
 57  int smpb[2*SBLIMIT]; /* values: 0-65535 */
 58  int *sample;
 59  register unsigned int *ba;
 60  register unsigned int *sca = (unsigned int *) scale_index;
 61
 62  if(fr->stereo) {
 63    int jsbound = fr->jsbound;
 64    register real *f0 = fraction[0];
 65    register real *f1 = fraction[1];
 66    ba = balloc;
 67    for (sample=smpb,i=0;i<jsbound;i++)  {
 68      if ((n = *ba++))
 69        *sample++ = getbits(n+1);
 70      if ((n = *ba++))
 71        *sample++ = getbits(n+1);
 72    }
 73    for (i=jsbound;i<SBLIMIT;i++) 
 74      if ((n = *ba++))
 75        *sample++ = getbits(n+1);
 76
 77    ba = balloc;
 78    for (sample=smpb,i=0;i<jsbound;i++) {
 79      if((n=*ba++))
 80        *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
 81      else
 82        *f0++ = 0.0;
 83      if((n=*ba++))
 84        *f1++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
 85      else
 86        *f1++ = 0.0;
 87    }
 88    for (i=jsbound;i<SBLIMIT;i++) {
 89      if ((n=*ba++)) {
 90        real samp = ( ((-1)<<n) + (*sample++) + 1);
 91        *f0++ = samp * muls[n+1][*sca++];
 92        *f1++ = samp * muls[n+1][*sca++];
 93      }
 94      else
 95        *f0++ = *f1++ = 0.0;
 96    }
 97  }
 98  else {
 99    register real *f0 = fraction[0];
100    ba = balloc;
101    for (sample=smpb,i=0;i<SBLIMIT;i++)
102      if ((n = *ba++))
103        *sample++ = getbits(n+1);
104    ba = balloc;
105    for (sample=smpb,i=0;i<SBLIMIT;i++) {
106      if((n=*ba++))
107        *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
108      else
109        *f0++ = 0.0;
110    }
111  }
112}
113
114int do_layer1(struct frame *fr,unsigned char *pcm_sample,
115              int *pcm_point,struct mpstr *mp)
116{
117  int clip=0;
118  int i,stereo = fr->stereo;
119  unsigned int balloc[2*SBLIMIT];
120  unsigned int scale_index[2][SBLIMIT];
121  real fraction[2][SBLIMIT];
122  int single = fr->single;
123
124  fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32;
125
126  if(stereo == 1 || single == 3)
127    single = 0;
128
129  I_step_one(balloc,scale_index,fr);
130
131  for (i=0;i<SCALE_BLOCK;i++)
132  {
133    I_step_two(fraction,balloc,scale_index,fr);
134
135      if(single >= 0) {
136        clip += synth_1to1_mono( (real*)fraction[single],pcm_sample,pcm_point,mp);
137      }
138      else {
139        int p1 = *pcm_point;
140        clip += synth_1to1( (real*)fraction[0],0,pcm_sample,&p1,mp);
141        clip += synth_1to1( (real*)fraction[1],1,pcm_sample,pcm_point,mp);
142      }
143  }
144
145  return clip;
146}
147
148