MP3_Common.c
上传用户:kingbiz
上传日期:2022-06-24
资源大小:2524k
文件大小:3k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /*============================================================================*/
  2. /*============================================================================*/
  3. /*============================================================================*/
  4. #include "mp3_common.h"
  5. /*============================================================================*/
  6. /*============================================================================*/
  7. static char *mode_names[4] = { "stereo", "j-stereo", "dual-ch", "single-ch" };
  8. static char *layer_names[3] = { "I", "II", "III" };
  9. static S16 buffer[BUFFER_SIZE];
  10. /*============================================================================*/
  11. /*============================================================================*/
  12. /* open the device to read the bit stream from it */
  13. void open_bit_stream_r()
  14. {
  15. bs.buf =buffer;
  16. bs.read_ptr =0;
  17. bs.write_ptr =0;
  18. bs.bit_len =8;
  19. bs.totbit =0;
  20. bs.eof  = FALSE;
  21. bs.eobs  = FALSE;
  22. // quest_stream(&bs.write_ptr);
  23. }
  24. /*return the status of the bit stream*/
  25. /* returns 1 if end of bit stream was reached */
  26. /* returns 0 if end of bit stream was not reached */
  27. int seek_sync(unsigned int sync)
  28. {
  29. unsigned int aligning;
  30. unsigned int val;
  31.     aligning = bs.totbit%ALIGNING;
  32.     if (aligning)
  33. getbit((int)(ALIGNING-aligning));   //字节对齐
  34.     val = getbit(12);
  35. while( ((val&0xfff)!= sync) && (!bs.eobs))
  36. {
  37. val<<=ALIGNING;
  38. val|=getbit(ALIGNING);
  39. }
  40. if (bs.eobs)
  41. return(0);
  42. else
  43. return(1);
  44. }
  45. int js_bound(int lay, int m_ext)
  46. {
  47. static int jsb_table[3][4] =  {
  48. { 4, 8, 12, 16 },
  49. { 4, 8, 12, 16},
  50. { 0, 4, 8, 16}
  51. };  /* lay+m_e -> jsbound */
  52.  //   if(lay<1 || lay >3 || m_ext<0 || m_ext>3) {
  53.  //       fprintf(stderr, "js_bound bad layer/modext (%d/%d)n", lay, m_ext);
  54.  //       exit(1);
  55. //    }
  56. return(jsb_table[lay-1][m_ext]);
  57. }
  58. /* interpret data in hdr str to fields in fr_ps */
  59. void hdr_to_frps() 
  60. {
  61. layer *hdr = fr_ps.header;     /* (or pass in as arg?) */
  62. fr_ps.actual_mode = hdr->mode;
  63. fr_ps.stereo = (hdr->mode == MPG_MD_MONO) ? 1 : 2;
  64. fr_ps.sblimit = SBLIMIT;
  65. if(hdr->mode == MPG_MD_JOINT_STEREO)
  66. fr_ps.jsbound = js_bound(hdr->lay, hdr->mode_ext);
  67. else
  68. fr_ps.jsbound = fr_ps.sblimit;
  69. }
  70.  
  71. int putmask[9]={0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};
  72. /*read N bit from the bit stream */
  73. //#define MIN(A, B) ((A) < (B) ? (A) : (B))
  74. U32 getbit(int N)
  75. {
  76. U32 val;
  77. U32 temp;
  78. int j;
  79. int i;
  80. /////
  81. j =N;
  82. val =0;
  83. if(N>MAX_LENGTH)
  84. {
  85. DbgUart_Printf("nwrong length!");
  86. }
  87. ///
  88. bs.totbit+=j;
  89. while(j>0)
  90. {
  91. if(!bs.bit_len)
  92. {
  93. bs.bit_len=8;
  94. if(++bs.read_ptr>=mp3_dat_size)
  95. { //mp3的长度
  96. DbgUart_Printf("bs.read_ptr=%08XH(%d)n",bs.read_ptr,bs.read_ptr);
  97. bs.eobs=1;
  98. }
  99. }
  100. i=MIN(bs.bit_len,j);
  101. //temp=mp3_data[bs.read_ptr]&putmask[bs.bit_len];
  102. temp=mp3_src[bs.read_ptr]&putmask[bs.bit_len];
  103. bs.bit_len-=i;
  104. j-=i;
  105. temp>>=bs.bit_len;
  106. val|=(temp<<j);
  107. }
  108. return val;
  109. }
  110. /*
  111. void quest_stream(unsigned int *ptr)
  112. {
  113. ptr=ptr;
  114. }
  115. */