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