|
1
|
1 #pragma once
|
|
|
2
|
|
|
3 namespace mp3_utils
|
|
|
4 {
|
|
|
5
|
|
|
6 enum {
|
|
|
7 MPG_MD_STEREO=0,
|
|
|
8 MPG_MD_JOINT_STEREO=1,
|
|
|
9 MPG_MD_DUAL_CHANNEL=2,
|
|
|
10 MPG_MD_MONO=3,
|
|
|
11 };
|
|
|
12
|
|
|
13 typedef t_uint8 byte;
|
|
|
14
|
|
|
15 enum {MPEG_1, MPEG_2, MPEG_25};
|
|
|
16
|
|
|
17 struct TMPEGFrameInfo
|
|
|
18 {
|
|
|
19 unsigned m_bytes;
|
|
|
20 unsigned m_bitrate_idx; // original bitrate index value
|
|
|
21 unsigned m_bitrate; // kbps
|
|
|
22 unsigned m_sample_rate_idx; // original samples per second index value
|
|
|
23 unsigned m_sample_rate; // samples per second
|
|
|
24 unsigned m_layer; // 1, 2 or 3
|
|
|
25 unsigned m_mpegversion; // MPEG_1, MPEG_2, MPEG_25
|
|
|
26 unsigned m_channels; // 1 or 2
|
|
|
27 unsigned m_duration; // samples
|
|
|
28 unsigned m_channel_mode; // MPG_MD_*
|
|
|
29 unsigned m_channel_mode_ext;
|
|
|
30 bool m_crc;
|
|
|
31 };
|
|
|
32
|
|
|
33
|
|
|
34 bool ParseMPEGFrameHeader(TMPEGFrameInfo & p_info,const t_uint8 p_header[4]);
|
|
|
35 bool ParseMPEGFrameHeader(TMPEGFrameInfo & p_info, const void * bytes, size_t bytesAvail);
|
|
|
36 bool IsValidMPEGFrameHeader(const void* fourbytes);
|
|
|
37 bool ValidateFrameCRC(const t_uint8 * frameData, t_size frameSize);
|
|
|
38 bool ValidateFrameCRC(const t_uint8 * frameData, t_size frameSize, TMPEGFrameInfo const & frameInfo);
|
|
|
39
|
|
|
40 //! Assumes valid frame with CRC (frameInfo.m_crc set, frameInfo.m_bytes <= frameSize).
|
|
|
41 t_uint16 ExtractFrameCRC(const t_uint8 * frameData, t_size frameSize, TMPEGFrameInfo const & frameInfo);
|
|
|
42 //! Assumes valid frame with CRC (frameInfo.m_crc set, frameInfo.m_bytes <= frameSize).
|
|
|
43 t_uint16 CalculateFrameCRC(const t_uint8 * frameData, t_size frameSize, TMPEGFrameInfo const & frameInfo);
|
|
|
44 //! Assumes valid frame with CRC (frameInfo.m_crc set, frameInfo.m_bytes <= frameSize).
|
|
|
45 void RecalculateFrameCRC(t_uint8 * frameData, t_size frameSize, TMPEGFrameInfo const & frameInfo);
|
|
|
46
|
|
|
47 unsigned QueryMPEGFrameSize(const t_uint8 p_header[4]);
|
|
|
48 bool IsSameStream(TMPEGFrameInfo const & p_frame1,TMPEGFrameInfo const & p_frame2);
|
|
|
49 };
|
|
|
50
|
|
|
51 class mp3header
|
|
|
52 {
|
|
|
53 t_uint8 bytes[4];
|
|
|
54 public:
|
|
|
55
|
|
|
56 inline void copy(const mp3header & src) {memcpy(bytes,src.bytes,4);}
|
|
|
57 inline void copy_raw(const void * src) {memcpy(bytes,src,4);}
|
|
|
58
|
|
|
59 inline void get_bytes(void * out) {memcpy(out,bytes,4);}
|
|
|
60 inline unsigned get_frame_size() const {return mp3_utils::QueryMPEGFrameSize(bytes);}
|
|
|
61 inline bool decode(mp3_utils::TMPEGFrameInfo & p_out) {return mp3_utils::ParseMPEGFrameHeader(p_out,bytes);}
|
|
|
62
|
|
|
63 unsigned get_samples_per_frame();
|
|
|
64 };
|
|
|
65
|
|
|
66 static inline mp3header mp3header_from_buffer(const void * p_buffer)
|
|
|
67 {
|
|
|
68 mp3header temp;
|
|
|
69 temp.copy_raw(p_buffer);
|
|
|
70 return temp;
|
|
|
71 } |