Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #include "bstream.h"
  2. #include "mp3dec.h"
  3. #include <math.h>
  4.  
  5. extern MPEG_DECODE_OPTION m_option;
  6. extern int m_frequency;
  7.  
  8. extern float m_sample[2304];
  9. extern int m_nsb_limit;
  10. extern int m_max_sb;
  11. extern SBT_PROC m_sbt_proc;
  12.  
  13. extern float m_sf_table[64];
  14. extern float m_look_c_valueL2[18];
  15. extern char m_group3_table[32][3];
  16. extern char m_group5_table[128][3];
  17. extern short m_group9_table[1024][3];
  18. extern int m_nbat[4];// = {3, 8, 12, 7};
  19. extern int m_bat[4][16];
  20.  
  21. /* ABCD_INDEX = lookqt[mode][sr_index][br_index]  */
  22. /* -1 = invalid  */
  23. static const char lookqt[4][3][16] =
  24. {
  25.    1, -1, -1, -1, 2, -1, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1,         /*  44ks stereo */
  26.    0, -1, -1, -1, 2, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1,         /*  48ks */
  27.    1, -1, -1, -1, 3, -1, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1,         /*  32ks */
  28.    1, -1, -1, -1, 2, -1, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1,         /*  44ks joint stereo */
  29.    0, -1, -1, -1, 2, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1,         /*  48ks */
  30.    1, -1, -1, -1, 3, -1, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1,         /*  32ks */
  31.    1, -1, -1, -1, 2, -1, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1,         /*  44ks dual chan */
  32.    0, -1, -1, -1, 2, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1,         /*  48ks */
  33.    1, -1, -1, -1, 3, -1, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1,         /*  32ks */
  34. // mono extended beyond legal br index
  35. //  1,2,2,0,0,0,1,1,1,1,1,1,1,1,1,-1,          /*  44ks single chan */
  36. //  0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,-1,          /*  48ks */
  37. //  1,3,3,0,0,0,1,1,1,1,1,1,1,1,1,-1,          /*  32ks */
  38. // legal mono
  39.    1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,         /*  44ks single chan */
  40.    0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1,         /*  48ks */
  41.    1, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,         /*  32ks */
  42. };
  43.  
  44. /* bit allocation table look up */
  45. /* table per mpeg spec tables 3b2a/b/c/d  /e is mpeg2 */
  46. /* look_bat[abcd_index][4][16]  */
  47. static const unsigned char look_bat[5][4][16] =
  48. {
  49. /* LOOK_BATA */
  50.    0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
  51.    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17,
  52.    0, 1, 2, 3, 4, 5, 6, 17, 0, 0, 0, 0, 0, 0, 0, 0,
  53.    0, 1, 2, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  54. /* LOOK_BATB */
  55.    0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
  56.    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17,
  57.    0, 1, 2, 3, 4, 5, 6, 17, 0, 0, 0, 0, 0, 0, 0, 0,
  58.    0, 1, 2, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  59. /* LOOK_BATC */
  60.    0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
  61.    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  62.    0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0,
  63.    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  64. /* LOOK_BATD */
  65.    0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
  66.    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  67.    0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0,
  68.    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  69. /* LOOK_BATE */
  70.    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  71.    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  72.    0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0,
  73.    0, 1, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  74. };
  75.  
  76. /* look_nbat[abcd_index]][4] */
  77. static const unsigned char look_nbat[5][4] =
  78. {
  79.    3, 8, 12, 4,
  80.    3, 8, 12, 7,
  81.    2, 0, 6, 0,
  82.    2, 0, 10, 0,
  83.    4, 0, 7, 19,
  84. };
  85.  
  86. //extern "sbt.c"
  87. void sbt_mono(float *sample, signed short *pcm, int ch);
  88. void sbt_dual(float *sample, signed short *pcm, int ch);
  89. void sbt16_mono(float *sample, signed short *pcm, int ch);
  90. void sbt16_dual(float *sample, signed short *pcm, int ch);
  91. void sbt8_mono(float *sample, signed short *pcm, int ch);
  92. void sbt8_dual(float *sample, signed short *pcm, int ch);
  93. void sbtB_mono(float *sample, unsigned char *pcm, int ch);
  94. void sbtB_dual(float *sample, unsigned char *pcm, int ch);
  95. void sbtB16_mono(float *sample, unsigned char *pcm, int ch);
  96. void sbtB16_dual(float *sample, unsigned char *pcm, int ch);
  97. void sbtB8_mono(float *sample, unsigned char *pcm, int ch);
  98. void sbtB8_dual(float *sample, unsigned char *pcm, int ch);
  99.  
  100. static const SBT_PROC sbt_table[2][3][2] =
  101. {
  102.         sbt_mono,
  103.         sbt_dual,
  104.         sbt16_mono,
  105.         sbt16_dual,
  106.         sbt8_mono,
  107.         sbt8_dual,
  108.         sbtB_mono,
  109.         sbtB_dual,
  110.         sbtB16_mono,
  111.         sbtB16_dual,
  112.         sbtB8_mono,
  113.         sbtB8_dual,
  114. };
  115.  
  116. void L2table_init()
  117. {
  118.         int i, j, code;
  119.         long stepL2[18] = {
  120.                 0, 3, 5, 7, 9, 15, 31, 63, 127,
  121.                 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535
  122.         };
  123.         //c_values (dequant)
  124.         for (i = 1; i < 18; i++) {
  125.                 m_look_c_valueL2[i] = 2.0F / stepL2[i];
  126.         }
  127.         //scale factor table, scale by 32768 for 16 pcm output
  128.         for (i = 0; i < 64; i++) {
  129.                 m_sf_table[i] = (float) (32768.0 * 2.0 * pow_test(2.0, -i / 3.0));
  130.         }
  131.         //grouped 3 level lookup table 5 bit token
  132.         for (i = 0; i < 32; i++) {
  133.                 code = i;
  134.                 for (j = 0; j < 3; j++) {
  135.                         m_group3_table[i][j] = (char) ((code % 3) - 1);
  136.                         code /= 3;
  137.                 }
  138.         }
  139.         //grouped 5 level lookup table 7 bit token
  140.         for (i = 0; i < 128; i++) {
  141.                 code = i;
  142.                 for (j = 0; j < 3; j++) {
  143.                         m_group5_table[i][j] = (char) ((code % 5) - 2);
  144.                         code /= 5;
  145.                 }
  146.         }
  147.         //grouped 9 level lookup table 10 bit token
  148.         for (i = 0; i < 1024; i++) {
  149.                 code = i;
  150.                 for (j = 0; j < 3; j++) {
  151.                         m_group9_table[i][j] = (short) ((code % 9) - 4);
  152.                         code /= 9;
  153.                 }
  154.         }
  155. }
  156.  
  157. int L2decode_start(MPEG_HEADER* h)
  158. {
  159.         int i, j, k, bit_code, limit;
  160.         int abcd_index;
  161.  
  162. // compute abcd index for bit allo table selection
  163.         if (h->version == 1) // MPEG-1
  164.                 abcd_index = lookqt[h->mode][h->fr_index][h->br_index];
  165.         else
  166.                 abcd_index = 4; // MPEG-2, MPEG-2.5
  167.         if (abcd_index < 0)
  168.                 return 0;               // fail invalid Layer II bit rate index
  169.  
  170.         for (i = 0; i < 4; i++) {
  171.                 m_nbat[i] = look_nbat[abcd_index][i];
  172.                 for (j = 0; j < 16; j++) {
  173.                         m_bat[i][j] = look_bat[abcd_index][i][j];
  174.                 }
  175.         }
  176.         m_max_sb = m_nbat[0] + m_nbat[1] + m_nbat[2] + m_nbat[3];
  177. // compute nsb_limit
  178.         m_nsb_limit = (m_option.freqLimit * 64L + m_frequency / 2) / m_frequency;
  179. // caller limit
  180. // limit = 0.94*(32>>reduction_code);
  181.         limit = (32 >> m_option.reduction);
  182.         if (limit > 8)
  183.                 limit--;
  184.         if (m_nsb_limit > limit)
  185.                 m_nsb_limit = limit;
  186.         if (m_nsb_limit > m_max_sb)
  187.                 m_nsb_limit = m_max_sb;
  188.  
  189.         if (h->mode != 3) {
  190.                 // adjust for 2 channel modes
  191.                 for (i = 0; i < 4; i++)
  192.                         m_nbat[i] *= 2;
  193.                 m_max_sb *= 2;
  194.                 m_nsb_limit *= 2;
  195.         }
  196.  
  197. // set sbt function
  198.         bit_code = (m_option.convert & 8) ? 1 : 0;
  199.         k = (h->mode == 3) ? 0 : (1 + m_option.convert);
  200.         m_sbt_proc = sbt_table[bit_code][m_option.reduction][k];//[2][3][2]
  201. // clear sample buffer, unused sub bands must be 0
  202.         for (i = 0; i < 2304; i++)
  203.                 m_sample[i] = 0.0F;
  204.         return 1;
  205. }
  206.