110 lines
2.8 KiB
C
110 lines
2.8 KiB
C
|
#ifndef _mp3_header_h_
|
||
|
#define _mp3_header_h_
|
||
|
|
||
|
// https://en.wikipedia.org/wiki/MP3
|
||
|
|
||
|
#if defined(__cplusplus)
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
ISO/IEC 11172-3
|
||
|
2.4.1.3 Header
|
||
|
unsigned int sync: 12
|
||
|
unsigned int version: 1
|
||
|
unsigned int layer: 2
|
||
|
unsigned int error protection: 1
|
||
|
unsigned int bitrate_index: 4
|
||
|
unsigned int sampling_frequency: 2
|
||
|
unsigned int padding: 1
|
||
|
unsigned int private: 1
|
||
|
unsigned int mode: 2
|
||
|
unsigned int mode extension: 2
|
||
|
unsigned int copyright: 1
|
||
|
unsigned int original: 1
|
||
|
unsigned int emphasis: 2
|
||
|
|
||
|
bit_rate_index Layer I Layer II Layer III
|
||
|
'0000' free format free format free format
|
||
|
'0001' 32 kbit/s 32 kbit/s 32 kbit/s
|
||
|
'0010' 64 kbit/s 48 kbit/s 40 kbit/s
|
||
|
'0011' 96 kbit/s 56 kbit/s 48 kbit/s
|
||
|
'0100' 128 kbit/s 64 kbit/s 56 kbit/s
|
||
|
'0101' 160 kbit/s 80 kbit/s 64 kbit/s
|
||
|
'0110' 192 kbit/s 96 kbit/s 80 kbit/s
|
||
|
'0111' 224 kbit/s 112 kbit/s 96 kbit/s
|
||
|
'1000' 256 kbit/s 128 kbit/s 112 kbit/s
|
||
|
'1001' 288 kbit/s 160 kbit/s 128 kbit/s
|
||
|
'1010' 320 kbit/s 192 kbit/s 160 kbit/s
|
||
|
'1011' 352 kbit/s 224 kbit/s 192 kbit/s
|
||
|
'1100' 384 kbit/s 256 kbit/s 224 kbit/s
|
||
|
'1101' 416 kbit/s 320 kbit/s 256 kbit/s
|
||
|
'1110' 448 kbit/s 384 kbit/s 320 kbit/s
|
||
|
|
||
|
sampling_frequency
|
||
|
'00' 44.1 kHz
|
||
|
'01' 48 kHz
|
||
|
'10' 32 kHz
|
||
|
'11' reserved
|
||
|
|
||
|
mode
|
||
|
'00' stereo
|
||
|
'01' joint_stereo (intensity_stereo and/or ms_stereo)
|
||
|
'10' dual_channel
|
||
|
'11' single_channel
|
||
|
|
||
|
mode_extension
|
||
|
'00' subbands 4-31 in intensity_stereo, bound==4
|
||
|
'01' subbands 8-31 in intensity_stereo, bound==8
|
||
|
'10' subbands 12-31 in intensity_stereo, bound==12
|
||
|
'11' subbands 16-31 in intensity_stereo, bound==16
|
||
|
|
||
|
emphasis
|
||
|
'00' no emphasis
|
||
|
'01' 50/15 microsec. emphasis
|
||
|
'10' reserved
|
||
|
'11' CCITT J.17
|
||
|
*/
|
||
|
|
||
|
struct mp3_header_t
|
||
|
{
|
||
|
unsigned int version : 2; // 0-MPEG 2.5, 1-undefined, 2-MPEG-2, 3-MPEG-1
|
||
|
unsigned int layer : 2; // 3-Layer I, 2-Layer II, 1-Layer III, 0-reserved
|
||
|
unsigned int protection : 1;
|
||
|
unsigned int bitrate_index : 4; //0-free,
|
||
|
unsigned int sampling_frequency : 2;
|
||
|
unsigned int priviate : 1;
|
||
|
unsigned int mode : 2;
|
||
|
unsigned int mode_extension : 2;
|
||
|
unsigned int copyright : 1;
|
||
|
unsigned int original : 1;
|
||
|
unsigned int emphasis : 2;
|
||
|
};
|
||
|
|
||
|
// version
|
||
|
#define MP3_MPEG1 3
|
||
|
#define MP3_MPEG2 2
|
||
|
#define MP3_MPEG2_5 0
|
||
|
|
||
|
// layer
|
||
|
#define MP3_LAYER1 3
|
||
|
#define MP3_LAYER2 2
|
||
|
#define MP3_LAYER3 1
|
||
|
|
||
|
#define MP3_BITS_PER_SAMPLE 16
|
||
|
|
||
|
///MP3 Header size: 4
|
||
|
int mp3_header_load(struct mp3_header_t* mp3, const void* data, int bytes);
|
||
|
int mp3_header_save(const struct mp3_header_t* mp3, void* data, int bytes);
|
||
|
|
||
|
int mp3_get_channel(const struct mp3_header_t* mp3);
|
||
|
int mp3_get_bitrate(const struct mp3_header_t* mp3);
|
||
|
int mp3_set_bitrate(struct mp3_header_t* mp3, int bitrate);
|
||
|
int mp3_get_frequency(const struct mp3_header_t* mp3);
|
||
|
int mp3_set_frequency(struct mp3_header_t* mp3, int frequency);
|
||
|
|
||
|
#if defined(__cplusplus)
|
||
|
}
|
||
|
#endif
|
||
|
#endif /* !_mp3_header_h_ */
|