⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 layer3.c

📁 MP3的代码很实用 MP3的代码很实用
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
 * $Id: layer3.c,v 1.1.1.1 2004/12/22 10:02:27 zyu Exp $
 */

/* 
 * Mpeg Layer-3 audio decoder 
 * --------------------------
 * copyright (c) 1995,1996,1997 by Michael Hipp.
 * All rights reserved. See also 'README'
 */

#include "mpg123.h"
#include "mpglib.h"
#include "huffman.h"


#if (defined MPEG2||defined MPEG25)
static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */
static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */
#endif

//unsigned char rval;
#define GET1BIT()  {\
  rval = *bufpointer << bitindex;\
  bitindex++;\
  bufpointer += (bitindex>>3);\
  bitindex &= 7;\
  rval= rval>>7;\
}


/* 
 * init tables for layer-3 
 */
 int mapbuf0[9][152];
 int mapbuf1[9][156];
 int mapbuf2[9][44];
 int *mp;
 int cb,lwin;
 short *bdf;
 int len[4] = { 36,36,12,36 };

void init_layer3(int down_sample_sblimit)
{
  int i,j;
 
  for(i=0;i<16;i++)
  	b0x[i] = 0;
/*
 * Modified by DSA 2003.10.31 ok
 */
  /*for(j=0;j<4;j++) {
    int len[4] = { 36,36,12,36 };
    for(i=0;i<len[j];i+=2)
      win1[j][i] = + win[j][i];
    for(i=1;i<len[j];i+=2)
      win1[j][i] = - win[j][i];
  }*/
  
  for(j=0;j<4;j++) {
    for(i=0;i<len[j];i+=2)
      win1[j][i] = + win[j][i];
    for(i=1;i<len[j];i+=2)
      win1[j][i] = - win[j][i];
  }
  
  for(j=0;j<9;j++)
  {
   struct bandInfoStruct *bi = &bandInfo[j];
   /*int *mp;
   int cb,lwin;
   short *bdf;*/

   mp = map[j][0] = mapbuf0[j];
   bdf = bi->longDiff;
   for(i=0,cb = 0; cb < 8 ; cb++,i+=*bdf++) {
     *mp++ = (*bdf) >> 1;
     *mp++ = i;
     *mp++ = 3;
     *mp++ = cb;
   }
   bdf = bi->shortDiff+3;
   for(cb=3;cb<13;cb++) {
     int l = (*bdf++) >> 1;
     for(lwin=0;lwin<3;lwin++) {
       *mp++ = l;
       *mp++ = i + lwin;
       *mp++ = lwin;
       *mp++ = cb;
     }
     i += 6*l;
   }
   mapend[j][0] = mp;

   mp = map[j][1] = mapbuf1[j];
   bdf = bi->shortDiff+0;
   for(i=0,cb=0;cb<13;cb++) {
     int l = (*bdf++) >> 1;
     for(lwin=0;lwin<3;lwin++) {
       *mp++ = l;
       *mp++ = i + lwin;
       *mp++ = lwin;
       *mp++ = cb;
     }
     i += 6*l;
   }
   mapend[j][1] = mp;

   mp = map[j][2] = mapbuf2[j];
   bdf = bi->longDiff;
   for(cb = 0; cb < 22 ; cb++) {
     *mp++ = (*bdf++) >> 1;
     *mp++ = cb;
   }
   mapend[j][2] = mp;

  }

  for(j=0;j<9;j++) {
    for(i=0;i<23;i++) {
      longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1;
      if(longLimit[j][i] > (down_sample_sblimit) )
        longLimit[j][i] = down_sample_sblimit;
    }
    for(i=0;i<14;i++) {
      shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1;
      if(shortLimit[j][i] > (down_sample_sblimit) )
        shortLimit[j][i] = down_sample_sblimit;
    }
  }

#if (defined MPEG2||defined MPEG25)
  for(i=0;i<5;i++) {
    for(j=0;j<6;j++) {
      for(k=0;k<6;k++) {
        int n = k + j * 6 + i * 36;
        i_slen2[n] = i|(j<<3)|(k<<6)|(3<<12);
      }
    }
  }
  for(i=0;i<4;i++) {
    for(j=0;j<4;j++) {
      for(k=0;k<4;k++) {
        int n = k + j * 4 + i * 16;
        i_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12);
      }
    }
  }
  for(i=0;i<4;i++) {
    for(j=0;j<3;j++) {
      int n = j + i * 3;
      i_slen2[n+244] = i|(j<<3) | (5<<12);
      n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15);
    }
  }

  for(i=0;i<5;i++) {
    for(j=0;j<5;j++) {
      for(k=0;k<4;k++) {
        for(l=0;l<4;l++) {
          int n = l + k * 4 + j * 16 + i * 80;
          n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12);
        }
      }
    }
  }
  for(i=0;i<5;i++) {
    for(j=0;j<5;j++) {
      for(k=0;k<4;k++) {
        int n = k + j * 4 + i * 20;
        n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12);
      }
    }
  }
#endif  
#ifdef MMA_X
  /* configure MMA */
  for (i=0; i<4+512+32; ++i)
  	mrambase[i] = decwin_fix[i];
  j = 4+512+32;
  
  /* XXX - fix cos tables for actual MMA because of  only low 20-bits used */
  for (i=0; i<16; ++i)
  	mrambase[j+i] = cos64[i];
  pnts[0] = (real *)&mrambase[j];
  j += 16;
  
  for (i=0; i<8; ++i)
  	mrambase[j+i] = cos32[i];
  pnts[1] = (real *)&mrambase[j];
  j += 8;
  
  for (i=0; i<4; ++i)
  	mrambase[j+i] = cos16[i];
  pnts[2] = (real *)&mrambase[j];
  j += 4;
  
  for (i=0; i<2; ++i)
  	mrambase[j+i] = cos8[i];
  pnts[3] = (real *)&mrambase[j];
  j += 2;
  
  mrambase[j] = cos4[0];
  pnts[4] = (real *)&mrambase[j];
  
#endif /* MMA */
}

/*
 * read additional side information
 */
 #if 1
static void III_get_side_info_1(struct III_sideinfo *si,int stereo,
 int ms_stereo,long sfreq,int single)
{
   int ch, gr;
   int powdiff = (single == 3) ? 4 : 0;

	
   si->main_data_begin = getbits(9);

   
   if (stereo == 1)
     si->private_bits = getbits_fast(5);
   else 
     si->private_bits = getbits_fast(3);
   

   for (ch=0; ch<stereo; ch++) {
       si->ch[ch].gr[0].scfsi = -1;
       si->ch[ch].gr[1].scfsi = getbits_fast(4);
   }

   
   for (gr=0; gr<2; gr++) 
   {
     for (ch=0; ch<stereo; ch++) 
     {
       register struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]);

       gr_info->part2_3_length = getbits(12);
       gr_info->big_values = getbits_fast(9);
       if(gr_info->big_values > 288) {
//          fprintf(stderr,"big_values too large!\n");
          gr_info->big_values = 288;
       }
       gr_info->pow2gain = -46 + 256 - getbits_fast(8) + powdiff;
       if(ms_stereo)
         gr_info->pow2gain += 2;
       gr_info->scalefac_compress = getbits_fast(4);
/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */


	GET1BIT();
	
       if(rval) 
       {
       
 
         gr_info->block_type = getbits_fast(2);
	  	 GET1BIT();
         gr_info->mixed_block_flag = rval;
	  	 //get_1bit(&(gr_info->mixed_block_flag));
         gr_info->table_select[0] = getbits_fast(5);
         gr_info->table_select[1] = getbits_fast(5);
         /*
          * table_select[2] not needed, because there is no region2,
          * but to satisfy some verifications tools we set it either.
          */
         gr_info->table_select[2] = 0;
/*
 * Modified by DSA 2003.10.31 ok
 */
//         for(i=0;i<3;i++)
//           gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(3)<<3);
		 gr_info->full_gain[0] = gr_info->pow2gain + (getbits_fast(3)<<3);
		 gr_info->full_gain[1] = gr_info->pow2gain + (getbits_fast(3)<<3);
		 gr_info->full_gain[2] = gr_info->pow2gain + (getbits_fast(3)<<3);

         if(gr_info->block_type == 0) {
//           fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n");
//           exit(1);
			return;
         }
         /* region_count/start parameters are implicit in this case. */       
         gr_info->region1start = 36>>1;
         gr_info->region2start = 576>>1;
       }
       else 
       {
         int r0c,r1c;
/*
 * Modified by DSA 2003.10.31 ok
 */
//         for (i=0; i<3; i++)
//           gr_info->table_select[i] = getbits_fast(5);


		 
         gr_info->table_select[0] = getbits_fast(5);
         gr_info->table_select[1] = getbits_fast(5);
         gr_info->table_select[2] = getbits_fast(5);
         r0c = getbits_fast(4);
         r1c = getbits_fast(3);
         gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
         gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
         gr_info->block_type = 0;
         gr_info->mixed_block_flag = 0;
       }
       
       
	GET1BIT();
       gr_info->preflag = rval;
	GET1BIT();
       gr_info->scalefac_scale = rval;
	GET1BIT();
       gr_info->count1table_select = rval;
	   //get_1bit(&(gr_info->preflag));
       //get_1bit(&(gr_info->scalefac_scale));
       //get_1bit(&(gr_info->scalefac_scale));
       
       
	
     }
   }
}
#endif

#if (defined MPEG2||defined MPEG25)
/*
 * Side Info for MPEG 2.0 / LSF
 */
static void III_get_side_info_2(struct III_sideinfo *si,int stereo,
 int ms_stereo,long sfreq,int single)
{
   int ch;
   int powdiff = (single == 3) ? 4 : 0;

   si->main_data_begin = getbits(8);
   if (stereo == 1){
     GET1BIT();
     si->private_bits = rval;
     //get_1bit(&(si->private_bits));}
   else 
     si->private_bits = getbits_fast(2);

   for (ch=0; ch<stereo; ch++) 
   {
       register struct gr_info_s *gr_info = &(si->ch[ch].gr[0]);

       gr_info->part2_3_length = getbits(12);
       gr_info->big_values = getbits_fast(9);
       if(gr_info->big_values > 288) {
         fprintf(stderr,"big_values too large!\n");
         gr_info->big_values = 288;
       }
       gr_info->pow2gain = -46 + 256 - getbits_fast(8) + powdiff;
       if(ms_stereo)
         gr_info->pow2gain += 2;
       gr_info->scalefac_compress = getbits(9);
/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
	GET1BIT();
	if(rval) 
       {
         int i;
         gr_info->block_type = getbits_fast(2);
	  GET1BIT();
         gr_info->mixed_block_flag = rval;
	     //get_1bit(&(gr_info->mixed_block_flag));
         gr_info->table_select[0] = getbits_fast(5);
         gr_info->table_select[1] = getbits_fast(5);
         /*
          * table_select[2] not needed, because there is no region2,
          * but to satisfy some verifications tools we set it either.
          */
         gr_info->table_select[2] = 0;
         for(i=0;i<3;i++)
           gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(3)<<3);

         if(gr_info->block_type == 0) {
           fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n");
           exit(1);
         }
         /* region_count/start parameters are implicit in this case. */       
/* check this again! */
         if(gr_info->block_type == 2)
           gr_info->region1start = 36>>1;
         else if(sfreq == 8)
/* check this for 2.5 and sfreq=8 */
           gr_info->region1start = 108>>1;
         else
           gr_info->region1start = 54>>1;
         gr_info->region2start = 576>>1;
       }
       else 
       {
         int i,r0c,r1c;
         for (i=0; i<3; i++)
           gr_info->table_select[i] = getbits_fast(5);
         r0c = getbits_fast(4);
         r1c = getbits_fast(3);
         gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
         gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
         gr_info->block_type = 0;
         gr_info->mixed_block_flag = 0;
       }
	GET1BIT();
       gr_info->scalefac_scale = rval;
	GET1BIT();
       gr_info->count1table_select = rval;
       //get_1bit(&(gr_info->scalefac_scale));
	   //get_1bit(&(gr_info->scalefac_scale));
   }
}
#endif


/*
 * read scalefactors
 */
 #if 1
static int III_get_scale_factors_1(int *scf,struct gr_info_s *gr_info)
{
   static unsigned char slen[2][16] = {
     {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
     {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -