You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.8KB

  1. #ifndef _mp3_header_h_
  2. #define _mp3_header_h_
  3. // https://en.wikipedia.org/wiki/MP3
  4. #if defined(__cplusplus)
  5. extern "C" {
  6. #endif
  7. /*
  8. ISO/IEC 11172-3
  9. 2.4.1.3 Header
  10. unsigned int sync: 12
  11. unsigned int version: 1
  12. unsigned int layer: 2
  13. unsigned int error protection: 1
  14. unsigned int bitrate_index: 4
  15. unsigned int sampling_frequency: 2
  16. unsigned int padding: 1
  17. unsigned int private: 1
  18. unsigned int mode: 2
  19. unsigned int mode extension: 2
  20. unsigned int copyright: 1
  21. unsigned int original: 1
  22. unsigned int emphasis: 2
  23. bit_rate_index Layer I Layer II Layer III
  24. '0000' free format free format free format
  25. '0001' 32 kbit/s 32 kbit/s 32 kbit/s
  26. '0010' 64 kbit/s 48 kbit/s 40 kbit/s
  27. '0011' 96 kbit/s 56 kbit/s 48 kbit/s
  28. '0100' 128 kbit/s 64 kbit/s 56 kbit/s
  29. '0101' 160 kbit/s 80 kbit/s 64 kbit/s
  30. '0110' 192 kbit/s 96 kbit/s 80 kbit/s
  31. '0111' 224 kbit/s 112 kbit/s 96 kbit/s
  32. '1000' 256 kbit/s 128 kbit/s 112 kbit/s
  33. '1001' 288 kbit/s 160 kbit/s 128 kbit/s
  34. '1010' 320 kbit/s 192 kbit/s 160 kbit/s
  35. '1011' 352 kbit/s 224 kbit/s 192 kbit/s
  36. '1100' 384 kbit/s 256 kbit/s 224 kbit/s
  37. '1101' 416 kbit/s 320 kbit/s 256 kbit/s
  38. '1110' 448 kbit/s 384 kbit/s 320 kbit/s
  39. sampling_frequency
  40. '00' 44.1 kHz
  41. '01' 48 kHz
  42. '10' 32 kHz
  43. '11' reserved
  44. mode
  45. '00' stereo
  46. '01' joint_stereo (intensity_stereo and/or ms_stereo)
  47. '10' dual_channel
  48. '11' single_channel
  49. mode_extension
  50. '00' subbands 4-31 in intensity_stereo, bound==4
  51. '01' subbands 8-31 in intensity_stereo, bound==8
  52. '10' subbands 12-31 in intensity_stereo, bound==12
  53. '11' subbands 16-31 in intensity_stereo, bound==16
  54. emphasis
  55. '00' no emphasis
  56. '01' 50/15 microsec. emphasis
  57. '10' reserved
  58. '11' CCITT J.17
  59. */
  60. struct mp3_header_t
  61. {
  62. unsigned int version : 2; // 0-MPEG 2.5, 1-undefined, 2-MPEG-2, 3-MPEG-1
  63. unsigned int layer : 2; // 3-Layer I, 2-Layer II, 1-Layer III, 0-reserved
  64. unsigned int protection : 1;
  65. unsigned int bitrate_index : 4; //0-free,
  66. unsigned int sampling_frequency : 2;
  67. unsigned int priviate : 1;
  68. unsigned int mode : 2;
  69. unsigned int mode_extension : 2;
  70. unsigned int copyright : 1;
  71. unsigned int original : 1;
  72. unsigned int emphasis : 2;
  73. };
  74. // version
  75. #define MP3_MPEG1 3
  76. #define MP3_MPEG2 2
  77. #define MP3_MPEG2_5 0
  78. // layer
  79. #define MP3_LAYER1 3
  80. #define MP3_LAYER2 2
  81. #define MP3_LAYER3 1
  82. #define MP3_BITS_PER_SAMPLE 16
  83. ///MP3 Header size: 4
  84. int mp3_header_load(struct mp3_header_t* mp3, const void* data, int bytes);
  85. int mp3_header_save(const struct mp3_header_t* mp3, void* data, int bytes);
  86. int mp3_get_channel(const struct mp3_header_t* mp3);
  87. int mp3_get_bitrate(const struct mp3_header_t* mp3);
  88. int mp3_set_bitrate(struct mp3_header_t* mp3, int bitrate);
  89. int mp3_get_frequency(const struct mp3_header_t* mp3);
  90. int mp3_set_frequency(struct mp3_header_t* mp3, int frequency);
  91. #if defined(__cplusplus)
  92. }
  93. #endif
  94. #endif /* !_mp3_header_h_ */