Mercurial > foo_out_sdl
comparison foosdk/sdk/foobar2000/helpers/mp3_utils.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:e9bb126753e7 | 1:20d02a178406 |
|---|---|
| 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 } |
