decode.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:29k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include "common.h"
  4. #include "decode.h"
  5. #include "huffman.h"
  6. void decode_info(Bit_stream_struc *bs, frame_params *fr_ps)
  7. {
  8.     layer *hdr = fr_ps->header;
  9.     hdr->version = get1bit(bs);
  10.     hdr->lay = 4-getbits(bs,2);
  11.     hdr->error_protection = !get1bit(bs); /* 错误保护. TRUE/FALSE */
  12.     hdr->bitrate_index = getbits(bs,4);
  13.     hdr->sampling_frequency = getbits(bs,2);
  14.     hdr->padding = get1bit(bs);
  15.     hdr->extension = get1bit(bs);
  16.     hdr->mode = getbits(bs,2);
  17.     hdr->mode_ext = getbits(bs,2);
  18.     hdr->copyright = get1bit(bs);
  19.     hdr->original = get1bit(bs);
  20.     hdr->emphasis = getbits(bs,2);
  21. }
  22. void III_get_side_info(Bit_stream_struc *bs, III_side_info_t *si, frame_params *fr_ps)
  23. {
  24. int ch, gr, i;
  25. int stereo = fr_ps->stereo;
  26. si->main_data_begin = getbits(bs, 9);
  27. if (stereo == 1)
  28. si->private_bits = getbits(bs,5);
  29. else
  30. si->private_bits = getbits(bs,3);
  31. for (ch=0; ch<stereo; ch++)
  32. for (i=0; i<4; i++)
  33. si->ch[ch].scfsi[i] = get1bit(bs);
  34. for (gr=0; gr<2; gr++) {
  35. for (ch=0; ch<stereo; ch++) {
  36. si->ch[ch].gr[gr].part2_3_length = getbits(bs, 12);
  37. si->ch[ch].gr[gr].big_values = getbits(bs, 9);
  38. si->ch[ch].gr[gr].global_gain = getbits(bs, 8);
  39. si->ch[ch].gr[gr].scalefac_compress = getbits(bs, 4);
  40. si->ch[ch].gr[gr].window_switching_flag = get1bit(bs);
  41. if (si->ch[ch].gr[gr].window_switching_flag) {
  42. si->ch[ch].gr[gr].block_type = getbits(bs, 2);
  43. si->ch[ch].gr[gr].mixed_block_flag = get1bit(bs);
  44. for (i=0; i<2; i++)
  45. si->ch[ch].gr[gr].table_select[i] = getbits(bs, 5);
  46. for (i=0; i<3; i++)
  47. si->ch[ch].gr[gr].subblock_gain[i] = getbits(bs, 3);
  48. /* Set region_count parameters since they are implicit in this case. */
  49. if (si->ch[ch].gr[gr].block_type == 0) {
  50. printf("Side info bad: block_type == 0 in split block.n");
  51. exit(0);
  52. }
  53. else if (si->ch[ch].gr[gr].block_type == 2
  54. && si->ch[ch].gr[gr].mixed_block_flag == 0)
  55. si->ch[ch].gr[gr].region0_count = 8; /* MI 9; */
  56. else si->ch[ch].gr[gr].region0_count = 7; /* MI 8; */
  57. si->ch[ch].gr[gr].region1_count = 20 - si->ch[ch].gr[gr].region0_count;
  58. }
  59. else {
  60. for (i=0; i<3; i++)
  61. si->ch[ch].gr[gr].table_select[i] = getbits(bs, 5);
  62. si->ch[ch].gr[gr].region0_count = getbits(bs, 4);
  63. si->ch[ch].gr[gr].region1_count = getbits(bs, 3);
  64. si->ch[ch].gr[gr].block_type = 0;
  65. }
  66. si->ch[ch].gr[gr].preflag = get1bit(bs);
  67. si->ch[ch].gr[gr].scalefac_scale = get1bit(bs);
  68. si->ch[ch].gr[gr].count1table_select = get1bit(bs);
  69.          }
  70. }
  71. }
  72. struct {
  73. int l[5];
  74. int s[3];
  75. } sfbtable = {
  76. {0, 6, 11, 16, 21},
  77. {0, 6, 12}
  78. };
  79. int slen[2][16]={
  80. {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
  81. {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
  82. };
  83. struct {
  84. int l[23];
  85. int s[14];
  86. } sfBandIndex[3]= {
  87. {{0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},
  88. {0,4,8,12,16,22,30,40,52,66,84,106,136,192}},
  89. {{0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},
  90. {0,4,8,12,16,22,28,38,50,64,80,100,126,192}},
  91. {{0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},
  92. {0,4,8,12,16,22,30,42,58,78,104,138,180,192}}
  93. };
  94. void III_get_scale_factors(III_scalefac_t *scalefac, III_side_info_t *si, int gr, int ch, frame_params *fr_ps)
  95. {
  96. int sfb, i, window;
  97. struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]);
  98. if (gr_info->window_switching_flag && (gr_info->block_type == 2)) {
  99. if (gr_info->mixed_block_flag) { /* MIXED */ /* NEW - ag 11/25 */
  100. for (sfb = 0; sfb < 8; sfb++)
  101. (*scalefac)[ch].l[sfb] = hgetbits(
  102. slen[0][gr_info->scalefac_compress]);
  103. for (sfb = 3; sfb < 6; sfb++)
  104. for (window=0; window<3; window++)
  105. (*scalefac)[ch].s[window][sfb] = hgetbits(
  106. slen[0][gr_info->scalefac_compress]);
  107. for (sfb = 6; sfb < 12; sfb++)
  108. for (window=0; window<3; window++)
  109. (*scalefac)[ch].s[window][sfb] = hgetbits(
  110. slen[1][gr_info->scalefac_compress]);
  111. for (sfb=12,window=0; window<3; window++)
  112. (*scalefac)[ch].s[window][sfb] = 0;
  113. }
  114. else {  /* SHORT*/
  115. for (i=0; i<2; i++)
  116. for (sfb = sfbtable.s[i]; sfb < sfbtable.s[i+1]; sfb++)
  117. for (window=0; window<3; window++)
  118. (*scalefac)[ch].s[window][sfb] = hgetbits(
  119. slen[i][gr_info->scalefac_compress]);
  120. for (sfb=12,window=0; window<3; window++)
  121. (*scalefac)[ch].s[window][sfb] = 0;
  122. }
  123. }
  124. else {   /* LONG types 0,1,3 */
  125. for (i=0; i<4; i++) {
  126. if ((si->ch[ch].scfsi[i] == 0) || (gr == 0))
  127. for (sfb = sfbtable.l[i]; sfb < sfbtable.l[i+1]; sfb++)
  128. (*scalefac)[ch].l[sfb] = hgetbits(
  129. slen[(i<2)?0:1][gr_info->scalefac_compress]);
  130. }
  131. (*scalefac)[ch].l[22] = 0;
  132. }
  133. }
  134. /* 已经在 huffman.c中声明
  135. struct huffcodetab ht[HTN];
  136. */
  137. int huffman_initialized = FALSE;
  138. void initialize_huffman()
  139. {
  140. FILE *fi;
  141. if (huffman_initialized) return;
  142. if (!(fi = OpenTableFile("huffdec.txt") )) {
  143. printf("Please check huffman table 'huffdec.txt'n");
  144. exit(1);
  145. }
  146. if (fi==NULL) {
  147. fprintf(stderr,"decoder table open errorn");
  148. exit(3);
  149. }
  150. if (read_decoder_table(fi) != HTN) {
  151. fprintf(stderr,"decoder table read errorn");
  152. exit(4);
  153. }
  154. huffman_initialized = TRUE;
  155. }
  156. void III_hufman_decode(long int is[SBLIMIT][SSLIMIT], III_side_info_t *si, int ch, int gr, int part2_start, frame_params *fr_ps)
  157. {
  158.    int i, x, y;
  159.    int v, w;
  160.    struct huffcodetab *h;
  161.    int region1Start;
  162.    int region2Start;
  163.    int bt = (*si).ch[ch].gr[gr].window_switching_flag && ((*si).ch[ch].gr[gr].block_type == 2);
  164.    initialize_huffman();
  165.    /* 查找区域边界 */
  166.    if ( ((*si).ch[ch].gr[gr].window_switching_flag) &&
  167.         ((*si).ch[ch].gr[gr].block_type == 2) ) {
  168.       /* Region2. */
  169.       region1Start = 36;  /* sfb[9/3]*3=36 */
  170.       region2Start = 576; /* No Region2 for short block case. */
  171.    }
  172.    else {          /* 查找长块情况下的区域边界. */
  173.       region1Start = sfBandIndex[fr_ps->header->sampling_frequency]
  174.                            .l[(*si).ch[ch].gr[gr].region0_count + 1]; /* MI */
  175.       region2Start = sfBandIndex[fr_ps->header->sampling_frequency]
  176.                               .l[(*si).ch[ch].gr[gr].region0_count +
  177.                               (*si).ch[ch].gr[gr].region1_count + 2]; /* MI */
  178.       }
  179.    /* 读取大值区域Read bigvalues area. */
  180.    for (i=0; i<(*si).ch[ch].gr[gr].big_values*2; i+=2) {
  181.       if      (i<region1Start) h = &ht[(*si).ch[ch].gr[gr].table_select[0]];
  182.       else if (i<region2Start) h = &ht[(*si).ch[ch].gr[gr].table_select[1]];
  183.            else                h = &ht[(*si).ch[ch].gr[gr].table_select[2]];
  184.       huffman_decoder(h, &x, &y, &v, &w);
  185.       is[i/SSLIMIT][i%SSLIMIT] = x;
  186.       is[(i+1)/SSLIMIT][(i+1)%SSLIMIT] = y;
  187.       }
  188.    /* Read count1 area. */
  189.    h = &ht[(*si).ch[ch].gr[gr].count1table_select+32];
  190.    while ((hsstell() < part2_start + (*si).ch[ch].gr[gr].part2_3_length ) &&
  191.      ( i < SSLIMIT*SBLIMIT )) {
  192.       huffman_decoder(h, &x, &y, &v, &w);
  193.       is[i/SSLIMIT][i%SSLIMIT] = v;
  194.       is[(i+1)/SSLIMIT][(i+1)%SSLIMIT] = w;
  195.       is[(i+2)/SSLIMIT][(i+2)%SSLIMIT] = x;
  196.       is[(i+3)/SSLIMIT][(i+3)%SSLIMIT] = y;
  197.       i += 4;
  198.       }
  199.    if (hsstell() > part2_start + (*si).ch[ch].gr[gr].part2_3_length)
  200.    {  i -=4;
  201.       rewindNbits(hsstell()-part2_start - (*si).ch[ch].gr[gr].part2_3_length);
  202.    }
  203.    /* Dismiss stuffing Bits */
  204.    if ( hsstell() < part2_start + (*si).ch[ch].gr[gr].part2_3_length )
  205.       hgetbits( part2_start + (*si).ch[ch].gr[gr].part2_3_length - hsstell());
  206.    /* Zero out rest. */
  207.    for (; i<SSLIMIT*SBLIMIT; i++)
  208.       is[i/SSLIMIT][i%SSLIMIT] = 0;
  209. }
  210. int pretab[22] = {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0};
  211. void III_dequantize_sample(long int is[SBLIMIT][SSLIMIT], double xr[SBLIMIT][SSLIMIT], III_scalefac_t *scalefac, struct gr_info_s *gr_info, int ch, frame_params *fr_ps)
  212. {
  213. int ss,sb,cb=0,sfreq=fr_ps->header->sampling_frequency;
  214. int stereo = fr_ps->stereo;
  215. int next_cb_boundary, cb_begin, cb_width, sign;
  216. /* choose correct scalefactor band per block type, initalize boundary */
  217. if (gr_info->window_switching_flag && (gr_info->block_type == 2) )
  218. if (gr_info->mixed_block_flag)
  219. next_cb_boundary=sfBandIndex[sfreq].l[1];  /* LONG blocks: 0,1,3 */
  220. else {
  221. next_cb_boundary=sfBandIndex[sfreq].s[1]*3; /* pure SHORT block */
  222. cb_width = sfBandIndex[sfreq].s[1];
  223. cb_begin = 0;
  224. }
  225. else
  226. next_cb_boundary=sfBandIndex[sfreq].l[1];  /* LONG blocks: 0,1,3 */
  227. /* apply formula per block type */
  228. for (sb=0 ; sb < SBLIMIT ; sb++) {
  229. for (ss=0 ; ss < SSLIMIT ; ss++) {
  230. if ( (sb*18)+ss == next_cb_boundary) { /* Adjust critical band boundary */
  231. if (gr_info->window_switching_flag && (gr_info->block_type == 2)) {
  232. if (gr_info->mixed_block_flag) {
  233. if (((sb*18)+ss) == sfBandIndex[sfreq].l[8])  {
  234. next_cb_boundary=sfBandIndex[sfreq].s[4]*3;
  235. cb = 3;
  236. cb_width = sfBandIndex[sfreq].s[cb+1] -
  237. sfBandIndex[sfreq].s[cb];
  238. cb_begin = sfBandIndex[sfreq].s[cb]*3;
  239. }
  240. else if (((sb*18)+ss) < sfBandIndex[sfreq].l[8])
  241. next_cb_boundary = sfBandIndex[sfreq].l[(++cb)+1];
  242. else {
  243. next_cb_boundary = sfBandIndex[sfreq].s[(++cb)+1]*3;
  244. cb_width = sfBandIndex[sfreq].s[cb+1] -
  245. sfBandIndex[sfreq].s[cb];
  246. cb_begin = sfBandIndex[sfreq].s[cb]*3;
  247. }
  248. }
  249. else {
  250. next_cb_boundary = sfBandIndex[sfreq].s[(++cb)+1]*3;
  251. cb_width = sfBandIndex[sfreq].s[cb+1] -
  252. sfBandIndex[sfreq].s[cb];
  253. cb_begin = sfBandIndex[sfreq].s[cb]*3;
  254. }
  255. }
  256.             else /* long blocks */
  257.            next_cb_boundary = sfBandIndex[sfreq].l[(++cb)+1];
  258. }
  259. /* Compute overall (global) scaling. */
  260. xr[sb][ss] = pow( 2.0 , (0.25 * (gr_info->global_gain - 210.0)));
  261. /* Do long/short dependent scaling operations. */
  262. if (gr_info->window_switching_flag && (
  263. ((gr_info->block_type == 2) && (gr_info->mixed_block_flag == 0)) ||
  264. ((gr_info->block_type == 2) && gr_info->mixed_block_flag && (sb >= 2)) )) {
  265. xr[sb][ss] *= pow(2.0, 0.25 * -8.0 *
  266. gr_info->subblock_gain[(((sb*18)+ss) - cb_begin)/cb_width]);
  267. xr[sb][ss] *= pow(2.0, 0.25 * -2.0 * (1.0+gr_info->scalefac_scale)
  268. * (*scalefac)[ch].s[(((sb*18)+ss) - cb_begin)/cb_width][cb]);
  269. }
  270. else {   /* LONG block types 0,1,3 & 1st 2 subbands of switched blocks */
  271. xr[sb][ss] *= pow(2.0, -0.5 * (1.0+gr_info->scalefac_scale)
  272. * ((*scalefac)[ch].l[cb]
  273. + gr_info->preflag * pretab[cb]));
  274. }
  275. /* Scale quantized value. */
  276. sign = (is[sb][ss]<0) ? 1 : 0;
  277. xr[sb][ss] *= pow( (double) abs(is[sb][ss]), ((double)4.0/3.0) );
  278. if (sign) xr[sb][ss] = -xr[sb][ss];
  279. }
  280. }
  281. }
  282. void III_reorder(double xr[SBLIMIT][SSLIMIT], double ro[SBLIMIT][SSLIMIT], struct gr_info_s *gr_info, frame_params *fr_ps)
  283. {
  284.    int sfreq=fr_ps->header->sampling_frequency;
  285.    int sfb, sfb_start, sfb_lines;
  286.    int sb, ss, window, freq, src_line, des_line;
  287.    for(sb=0;sb<SBLIMIT;sb++)
  288.       for(ss=0;ss<SSLIMIT;ss++)
  289.          ro[sb][ss] = 0;
  290.    if (gr_info->window_switching_flag && (gr_info->block_type == 2)) {
  291.       if (gr_info->mixed_block_flag) {
  292.          /* NO REORDER FOR LOW 2 SUBBANDS */
  293.          for (sb=0 ; sb < 2 ; sb++)
  294.             for (ss=0 ; ss < SSLIMIT ; ss++) {
  295.                ro[sb][ss] = xr[sb][ss];
  296.             }
  297.          /* REORDERING FOR REST SWITCHED SHORT */
  298.          for(sfb=3,sfb_start=sfBandIndex[sfreq].s[3],
  299.             sfb_lines=sfBandIndex[sfreq].s[4] - sfb_start;
  300.             sfb < 13; sfb++,sfb_start=sfBandIndex[sfreq].s[sfb],
  301.             (sfb_lines=sfBandIndex[sfreq].s[sfb+1] - sfb_start))
  302.                for(window=0; window<3; window++)
  303.                   for(freq=0;freq<sfb_lines;freq++) {
  304.                      src_line = sfb_start*3 + window*sfb_lines + freq;
  305.                      des_line = (sfb_start*3) + window + (freq*3);
  306.                      ro[des_line/SSLIMIT][des_line%SSLIMIT] =
  307.                                     xr[src_line/SSLIMIT][src_line%SSLIMIT];
  308.                }
  309.       }
  310.       else {  /* pure short */
  311.          for(sfb=0,sfb_start=0,sfb_lines=sfBandIndex[sfreq].s[1];
  312.             sfb < 13; sfb++,sfb_start=sfBandIndex[sfreq].s[sfb],
  313.             (sfb_lines=sfBandIndex[sfreq].s[sfb+1] - sfb_start))
  314.                for(window=0; window<3; window++)
  315.                   for(freq=0;freq<sfb_lines;freq++) {
  316.                      src_line = sfb_start*3 + window*sfb_lines + freq;
  317.                      des_line = (sfb_start*3) + window + (freq*3);
  318.                      ro[des_line/SSLIMIT][des_line%SSLIMIT] =
  319.                                     xr[src_line/SSLIMIT][src_line%SSLIMIT];
  320.                }
  321.       }
  322.    }
  323.    else {   /*long blocks */
  324.       for (sb=0 ; sb < SBLIMIT ; sb++)
  325.          for (ss=0 ; ss < SSLIMIT ; ss++)
  326.             ro[sb][ss] = xr[sb][ss];
  327.    }
  328. }
  329. void III_stereo(double xr[2][SBLIMIT][SSLIMIT], double lr[2][SBLIMIT][SSLIMIT], III_scalefac_t *scalefac, struct gr_info_s *gr_info, frame_params *fr_ps)
  330. {
  331.    int sfreq = fr_ps->header->sampling_frequency;
  332.    int stereo = fr_ps->stereo;
  333.    int ms_stereo = (fr_ps->header->mode == MPG_MD_JOINT_STEREO) &&
  334.                    (fr_ps->header->mode_ext & 0x2);
  335.    int i_stereo = (fr_ps->header->mode == MPG_MD_JOINT_STEREO) &&
  336.                   (fr_ps->header->mode_ext & 0x1);
  337.    int sfb;
  338.    int i,j,sb,ss,ch,is_pos[576];
  339.    double is_ratio[576];
  340.    /* intialization */
  341.    for ( i=0; i<576; i++ )
  342.       is_pos[i] = 7;
  343.    if ((stereo == 2) && i_stereo )
  344.    {  if (gr_info->window_switching_flag && (gr_info->block_type == 2))
  345.       {  if( gr_info->mixed_block_flag )
  346.          {  int max_sfb = 0;
  347.             for ( j=0; j<3; j++ )
  348.             {  int sfbcnt;
  349.                sfbcnt = 2;
  350.                for( sfb=12; sfb >=3; sfb-- )
  351.                {  int lines;
  352.                   lines = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];
  353.                   i = 3*sfBandIndex[sfreq].s[sfb] + (j+1) * lines - 1;
  354.                   while ( lines > 0 )
  355.                   {  if ( xr[1][i/SSLIMIT][i%SSLIMIT] != 0.0 )
  356.                      {  sfbcnt = sfb;
  357.                         sfb = -10;
  358.                         lines = -10;
  359.                      }
  360.                      lines--;
  361.                      i--;
  362.                   }
  363.                }
  364.                sfb = sfbcnt + 1;
  365.                if ( sfb > max_sfb )
  366.                   max_sfb = sfb;
  367.                while( sfb<12 )
  368.                {  sb = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];
  369.                   i = 3*sfBandIndex[sfreq].s[sfb] + j * sb;
  370.                   for ( ; sb > 0; sb--)
  371.                   {  is_pos[i] = (*scalefac)[1].s[j][sfb];
  372.                      if ( is_pos[i] != 7 )
  373.                         is_ratio[i] = tan( is_pos[i] * (PI / 12));
  374.                      i++;
  375.                   }
  376.                   sfb++;
  377.                }
  378.                sb = sfBandIndex[sfreq].s[11]-sfBandIndex[sfreq].s[10];
  379.                sfb = 3*sfBandIndex[sfreq].s[10] + j * sb;
  380.                sb = sfBandIndex[sfreq].s[12]-sfBandIndex[sfreq].s[11];
  381.                i = 3*sfBandIndex[sfreq].s[11] + j * sb;
  382.                for ( ; sb > 0; sb-- )
  383.                {  is_pos[i] = is_pos[sfb];
  384.                   is_ratio[i] = is_ratio[sfb];
  385.                   i++;
  386.                }
  387.              }
  388.              if ( max_sfb <= 3 )
  389.              {  i = 2;
  390.                 ss = 17;
  391.                 sb = -1;
  392.                 while ( i >= 0 )
  393.                 {  if ( xr[1][i][ss] != 0.0 )
  394.                    {  sb = i*18+ss;
  395.                       i = -1;
  396.                    } else
  397.                    {  ss--;
  398.                       if ( ss < 0 )
  399.                       {  i--;
  400.                          ss = 17;
  401.                       }
  402.                    }
  403.                 }
  404.                 i = 0;
  405.                 while ( sfBandIndex[sfreq].l[i] <= sb )
  406.                    i++;
  407.                 sfb = i;
  408.                 i = sfBandIndex[sfreq].l[i];
  409.                 for ( ; sfb<8; sfb++ )
  410.                 {  sb = sfBandIndex[sfreq].l[sfb+1]-sfBandIndex[sfreq].l[sfb];
  411.                    for ( ; sb > 0; sb--)
  412.                    {  is_pos[i] = (*scalefac)[1].l[sfb];
  413.                       if ( is_pos[i] != 7 )
  414.                          is_ratio[i] = tan( is_pos[i] * (PI / 12));
  415.                       i++;
  416.                    }
  417.                 }
  418.             }
  419.          } else
  420.          {  for ( j=0; j<3; j++ )
  421.             {  int sfbcnt;
  422.                sfbcnt = -1;
  423.                for( sfb=12; sfb >=0; sfb-- )
  424.                {  int lines;
  425.                   lines = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];
  426.                   i = 3*sfBandIndex[sfreq].s[sfb] + (j+1) * lines - 1;
  427.                   while ( lines > 0 )
  428.                   {  if ( xr[1][i/SSLIMIT][i%SSLIMIT] != 0.0 )
  429.                      {  sfbcnt = sfb;
  430.                         sfb = -10;
  431.                         lines = -10;
  432.                      }
  433.                      lines--;
  434.                      i--;
  435.                   }
  436.                }
  437.                sfb = sfbcnt + 1;
  438.                while( sfb<12 )
  439.                {  sb = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];
  440.                   i = 3*sfBandIndex[sfreq].s[sfb] + j * sb;
  441.                   for ( ; sb > 0; sb--)
  442.                   {  is_pos[i] = (*scalefac)[1].s[j][sfb];
  443.                      if ( is_pos[i] != 7 )
  444.                         is_ratio[i] = tan( is_pos[i] * (PI / 12));
  445.                      i++;
  446.                   }
  447.                   sfb++;
  448.                }
  449.                sb = sfBandIndex[sfreq].s[11]-sfBandIndex[sfreq].s[10];
  450.                sfb = 3*sfBandIndex[sfreq].s[10] + j * sb;
  451.                sb = sfBandIndex[sfreq].s[12]-sfBandIndex[sfreq].s[11];
  452.                i = 3*sfBandIndex[sfreq].s[11] + j * sb;
  453.                for ( ; sb > 0; sb-- )
  454.                {  is_pos[i] = is_pos[sfb];
  455.                   is_ratio[i] = is_ratio[sfb];
  456.                   i++;
  457.                }
  458.             }
  459.          }
  460.       } else
  461.       {  i = 31;
  462.          ss = 17;
  463.          sb = 0;
  464.          while ( i >= 0 )
  465.          {  if ( xr[1][i][ss] != 0.0 )
  466.             {  sb = i*18+ss;
  467.                i = -1;
  468.             } else
  469.             {  ss--;
  470.                if ( ss < 0 )
  471.                {  i--;
  472.                   ss = 17;
  473.                }
  474.             }
  475.          }
  476.          i = 0;
  477.          while ( sfBandIndex[sfreq].l[i] <= sb )
  478.             i++;
  479.          sfb = i;
  480.          i = sfBandIndex[sfreq].l[i];
  481.          for ( ; sfb<21; sfb++ )
  482.          {  sb = sfBandIndex[sfreq].l[sfb+1] - sfBandIndex[sfreq].l[sfb];
  483.             for ( ; sb > 0; sb--)
  484.             {  is_pos[i] = (*scalefac)[1].l[sfb];
  485.                if ( is_pos[i] != 7 )
  486.                   is_ratio[i] = tan( is_pos[i] * (PI / 12));
  487.                i++;
  488.             }
  489.          }
  490.          sfb = sfBandIndex[sfreq].l[20];
  491.          for ( sb = 576 - sfBandIndex[sfreq].l[21]; sb > 0; sb-- )
  492.          {  is_pos[i] = is_pos[sfb];
  493.             is_ratio[i] = is_ratio[sfb];
  494.             i++;
  495.          }
  496.       }
  497.    }
  498.    for(ch=0;ch<2;ch++)
  499.       for(sb=0;sb<SBLIMIT;sb++)
  500.          for(ss=0;ss<SSLIMIT;ss++)
  501.             lr[ch][sb][ss] = 0;
  502.    if (stereo==2)
  503.       for(sb=0;sb<SBLIMIT;sb++)
  504.          for(ss=0;ss<SSLIMIT;ss++) {
  505.             i = (sb*18)+ss;
  506.             if ( is_pos[i] == 7 ) {
  507.                if ( ms_stereo ) {
  508.                   lr[0][sb][ss] = (xr[0][sb][ss]+xr[1][sb][ss])/1.41421356;
  509.                   lr[1][sb][ss] = (xr[0][sb][ss]-xr[1][sb][ss])/1.41421356;
  510.                }
  511.                else {
  512.                   lr[0][sb][ss] = xr[0][sb][ss];
  513.                   lr[1][sb][ss] = xr[1][sb][ss];
  514.                }
  515.             }
  516.             else if (i_stereo ) {
  517.                lr[0][sb][ss] = xr[0][sb][ss] * (is_ratio[i]/(1+is_ratio[i]));
  518.                lr[1][sb][ss] = xr[0][sb][ss] * (1/(1+is_ratio[i]));
  519.             }
  520.             else {
  521.                printf("Error in streo processingn");
  522.             }
  523.          }
  524.    else  /* mono , bypass xr[0][][] to lr[0][][]*/
  525.       for(sb=0;sb<SBLIMIT;sb++)
  526.          for(ss=0;ss<SSLIMIT;ss++)
  527.             lr[0][sb][ss] = xr[0][sb][ss];
  528. }
  529. double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};
  530. void III_antialias(double xr[SBLIMIT][SSLIMIT], double hybridIn[SBLIMIT][SSLIMIT], struct gr_info_s *gr_info, frame_params *fr_ps)
  531. {
  532.    static int    init = 1;
  533.    static double ca[8],cs[8];
  534.    double        bu,bd;  /* upper and lower butterfly inputs */
  535.    int           ss,sb,sblim;
  536.    if (init) {
  537.       int i;
  538.       double    sq;
  539.       for (i=0;i<8;i++) {
  540.          sq=sqrt(1.0+Ci[i]*Ci[i]);
  541.          cs[i] = 1.0/sq;
  542.          ca[i] = Ci[i]/sq;
  543.       }
  544.       init = 0;
  545.    }
  546.    /* clear all inputs */
  547.     for(sb=0;sb<SBLIMIT;sb++)
  548.        for(ss=0;ss<SSLIMIT;ss++)
  549.           hybridIn[sb][ss] = xr[sb][ss];
  550.    if  (gr_info->window_switching_flag && (gr_info->block_type == 2) &&
  551.        !gr_info->mixed_block_flag ) return;
  552.    if ( gr_info->window_switching_flag && gr_info->mixed_block_flag &&
  553.      (gr_info->block_type == 2))
  554.       sblim = 1;
  555.    else
  556.       sblim = SBLIMIT-1;
  557.    /* 31 alias-reduction operations between each pair of sub-bands */
  558.    /* with 8 butterflies between each pair                         */
  559.    for(sb=0;sb<sblim;sb++)
  560.       for(ss=0;ss<8;ss++) {
  561.          bu = xr[sb][17-ss];
  562.          bd = xr[sb+1][ss];
  563.          hybridIn[sb][17-ss] = (bu * cs[ss]) - (bd * ca[ss]);
  564.          hybridIn[sb+1][ss] = (bd * cs[ss]) + (bu * ca[ss]);
  565.          }
  566. }
  567. /*------------------------------------------------------------------*/
  568. /*                                                                  */
  569. /*    Function: Calculation of the inverse MDCT                     */
  570. /*    In the case of short blocks the 3 output vectors are already  */
  571. /*    overlapped and added in this modul.                           */
  572. /*                                                                  */
  573. /*    New layer3                                                    */
  574. /*                                                                  */
  575. /*------------------------------------------------------------------*/
  576. void inv_mdct(double in[18], double out[36], int block_type)
  577. {
  578. int     i,m,N,p;
  579. double  tmp[12],sum;
  580. static  double  win[4][36];
  581. static  int init=0;
  582. static  double COS[4*36];
  583.     if(init==0){
  584.     /* type 0 */
  585.       for(i=0;i<36;i++)
  586.          win[0][i] = sin( PI/36 *(i+0.5) );
  587.     /* type 1*/
  588.       for(i=0;i<18;i++)
  589.          win[1][i] = sin( PI/36 *(i+0.5) );
  590.       for(i=18;i<24;i++)
  591.          win[1][i] = 1.0;
  592.       for(i=24;i<30;i++)
  593.          win[1][i] = sin( PI/12 *(i+0.5-18) );
  594.       for(i=30;i<36;i++)
  595.          win[1][i] = 0.0;
  596.     /* type 3*/
  597.       for(i=0;i<6;i++)
  598.          win[3][i] = 0.0;
  599.       for(i=6;i<12;i++)
  600.          win[3][i] = sin( PI/12 *(i+0.5-6) );
  601.       for(i=12;i<18;i++)
  602.          win[3][i] =1.0;
  603.       for(i=18;i<36;i++)
  604.          win[3][i] = sin( PI/36*(i+0.5) );
  605.     /* type 2*/
  606.       for(i=0;i<12;i++)
  607.          win[2][i] = sin( PI/12*(i+0.5) ) ;
  608.       for(i=12;i<36;i++)
  609.          win[2][i] = 0.0 ;
  610.       for (i=0; i<4*36; i++)
  611.          COS[i] = cos(PI/(2*36) * i);
  612.       init++;
  613.     }
  614.     for(i=0;i<36;i++)
  615.        out[i]=0;
  616.     if(block_type == 2){
  617.        N=12;
  618.        for(i=0;i<3;i++){
  619.           for(p= 0;p<N;p++){
  620.              sum = 0.0;
  621.              for(m=0;m<N/2;m++)
  622.                 sum += in[i+3*m] * cos( PI/(2*N)*(2*p+1+N/2)*(2*m+1) );
  623.              tmp[p] = sum * win[block_type][p] ;
  624.           }
  625.           for(p=0;p<N;p++)
  626.              out[6*i+p+6] += tmp[p];
  627.        }
  628.     }
  629.     else{
  630.       N=36;
  631.       for(p= 0;p<N;p++){
  632.          sum = 0.0;
  633.          for(m=0;m<N/2;m++)
  634.            sum += in[m] * COS[((2*p+1+N/2)*(2*m+1))%(4*36)];
  635.          out[p] = sum * win[block_type][p];
  636.       }
  637.     }
  638. }
  639. void III_hybrid(double fsIn[SSLIMIT], double tsOut[SSLIMIT], int sb, int ch, struct gr_info_s *gr_info, frame_params *fr_ps)
  640. /* fsIn:freq samples per subband in */
  641. /* tsOut:time samples per subband out */
  642. {
  643.    int ss;
  644.    double rawout[36];
  645.    static double prevblck[2][SBLIMIT][SSLIMIT];
  646.    static int init = 1;
  647.    int bt;
  648.    if (init) {
  649.       int i,j,k;
  650.       for(i=0;i<2;i++)
  651.          for(j=0;j<SBLIMIT;j++)
  652.             for(k=0;k<SSLIMIT;k++)
  653.                prevblck[i][j][k]=0.0;
  654.       init = 0;
  655.    }
  656.    bt = (gr_info->window_switching_flag && gr_info->mixed_block_flag &&
  657.           (sb < 2)) ? 0 : gr_info->block_type;
  658.    inv_mdct( fsIn, rawout, bt);
  659.    /* overlap addition */
  660.    for(ss=0; ss<SSLIMIT; ss++) {
  661.       tsOut[ss] = rawout[ss] + prevblck[ch][sb][ss];
  662.       prevblck[ch][sb][ss] = rawout[ss+18];
  663.    }
  664. }
  665. /*************************************************************
  666. /*
  667. /*   Pass the subband sample through the synthesis window
  668. /*
  669. /**************************************************************/
  670. /* create in synthesis filter */
  671. void create_syn_filter(double filter[64][SBLIMIT])
  672. {
  673. register int i,k;
  674. for (i=0; i<64; i++)
  675. for (k=0; k<32; k++) {
  676. if ((filter[i][k] = 1e9*cos((double)((PI64*i+PI4)*(2*k+1)))) >= 0)
  677. modf(filter[i][k]+0.5, &filter[i][k]);
  678. else
  679. modf(filter[i][k]-0.5, &filter[i][k]);
  680. filter[i][k] *= 1e-9;
  681. }
  682. }
  683. /***************************************************************
  684. /*
  685. /*   Window the restored sample
  686. /*
  687. /***************************************************************/
  688. /* read in synthesis window */
  689. void read_syn_window(double window[HAN_SIZE])
  690. {
  691.     int i,j[4];
  692.     FILE *fp;
  693.     double f[4];
  694.     char t[150];
  695.     if (!(fp = OpenTableFile("dewindow.txt") )) {
  696.         printf("Please check synthesis window table 'dewindow.txt'n");
  697.         exit(1);
  698.     }
  699.     for (i=0;i<512;i+=4) {
  700.         fgets(t, 150, fp);
  701.         sscanf(t,"D[%d] = %lf D[%d] = %lf D[%d] = %lf D[%d] = %lfn",
  702.                j, f,j+1,f+1,j+2,f+2,j+3,f+3);
  703.         if (i==j[0]) {
  704.             window[i] = f[0];
  705.             window[i+1] = f[1];
  706.             window[i+2] = f[2];
  707.             window[i+3] = f[3];
  708.         }
  709.         else {
  710.             printf("Check index in synthesis window tablen");
  711.             exit(1);
  712.         }
  713.         fgets(t,150,fp);
  714.     }
  715.     fclose(fp);
  716. }
  717. int SubBandSynthesis (double *bandPtr, int channel, short *samples)
  718. {
  719. register int i,j,k;
  720. register double *bufOffsetPtr, sum;
  721. static int init = 1;
  722. typedef double NN[64][32];
  723. static NN *filter;
  724. typedef double BB[2][2*HAN_SIZE];
  725. static BB *buf;
  726. static int bufOffset[2] = {64,64};
  727. static double *window;
  728. int clip = 0;               /* count & return how many samples clipped */
  729. if (init) {
  730. buf = (BB *) mem_alloc(sizeof(BB),"BB");
  731. filter = (NN *) mem_alloc(sizeof(NN), "NN");
  732. create_syn_filter(*filter);
  733. window = (double *) mem_alloc(sizeof(double) * HAN_SIZE, "WIN");
  734. read_syn_window(window);
  735. init = 0;
  736. }
  737. /*    if (channel == 0) */
  738. bufOffset[channel] = (bufOffset[channel] - 64) & 0x3ff;
  739. bufOffsetPtr = &((*buf)[channel][bufOffset[channel]]);
  740. for (i=0; i<64; i++) {
  741. sum = 0;
  742. for (k=0; k<32; k++)
  743. sum += bandPtr[k] * (*filter)[i][k];
  744. bufOffsetPtr[i] = sum;
  745. }
  746. /*  S(i,j) = D(j+32i) * U(j+32i+((i+1)>>1)*64)  */
  747. /*  samples(i,j) = MWindow(j+32i) * bufPtr(j+32i+((i+1)>>1)*64)  */
  748. for (j=0; j<32; j++) {
  749. sum = 0;
  750. for (i=0; i<16; i++) {
  751. k = j + (i<<5);
  752. sum += window[k] * (*buf) [channel] [( (k + ( ((i+1)>>1) <<6) ) +
  753. bufOffset[channel]) & 0x3ff];
  754. }
  755. {
  756. /*long foo = (sum > 0) ? sum * SCALE + 0.5 : sum * SCALE - 0.5; */
  757. long foo = sum * SCALE;
  758. if (foo >= (long) SCALE)      {samples[j] = SCALE-1; ++clip;}
  759. else if (foo < (long) -SCALE) {samples[j] = -SCALE;  ++clip;}
  760. else                           samples[j] = foo;
  761. }
  762. }
  763.     return(clip);
  764. }
  765. void out_fifo(short pcm_sample[2][SSLIMIT][SBLIMIT], int num, frame_params *fr_ps, int done, FILE *outFile, unsigned long *psampFrames)
  766. {
  767. int i,j,l;
  768. int stereo = fr_ps->stereo;
  769. int sblimit = fr_ps->sblimit;
  770. static short int outsamp[1600];
  771. static long k = 0;
  772.     if (!done)
  773.         for (i=0;i<num;i++) for (j=0;j<SBLIMIT;j++) {
  774.             (*psampFrames)++;
  775.             for (l=0;l<stereo;l++) {
  776.                 if (!(k%1600) && k) {
  777.                     fwrite(outsamp,2,1600,outFile);
  778.                     k = 0;
  779.                 }
  780.                 outsamp[k++] = pcm_sample[l][i][j];
  781.             }
  782.         }
  783.     else {
  784.         fwrite(outsamp,2,(int)k,outFile);
  785.         k = 0;
  786.     }
  787. }
  788. void  buffer_CRC(Bit_stream_struc *bs, unsigned int *old_crc)
  789. {
  790.     *old_crc = getbits(bs, 16);
  791. }
  792. extern int bitrate[3][15];
  793. extern double s_freq[4];
  794. /* Return the number of slots for main data of current frame, */
  795. int main_data_slots(frame_params fr_ps)
  796. {
  797. int nSlots;
  798. nSlots = (144 * bitrate[2][fr_ps.header->bitrate_index])
  799. / s_freq[fr_ps.header->sampling_frequency];
  800. if (fr_ps.header->padding) nSlots++;
  801. nSlots -= 4;
  802. if (fr_ps.header->error_protection)
  803. nSlots -= 2;
  804. if (fr_ps.stereo == 1)
  805. nSlots -= 17;
  806. else
  807. nSlots -=32;
  808. return(nSlots);
  809. }