Tag Parser 12.3.1
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
Loading...
Searching...
No Matches
mpegaudioframe.h
Go to the documentation of this file.
1#ifndef TAG_PARSER_MP3FRAMEAUDIOSTREAM_H
2#define TAG_PARSER_MP3FRAMEAUDIOSTREAM_H
3
4#include "../diagnostics.h"
5
6#include <cstdint>
7#include <iostream>
8#include <string_view>
9
10namespace CppUtilities {
11class BinaryReader;
12}
13
14namespace TagParser {
15
26
27TAG_PARSER_EXPORT std::string_view mpegChannelModeString(MpegChannelMode channelMode);
28
29enum class XingHeaderFlags {
30 None = 0x0u,
31 HasFramesField = 0x1u,
32 HasBytesField = 0x2u,
33 HasTocField = 0x4u,
35};
36
37class TAG_PARSER_EXPORT MpegAudioFrame {
38public:
39 constexpr MpegAudioFrame();
40
41 void parseHeader(CppUtilities::BinaryReader &reader, Diagnostics &diag);
42
43 constexpr bool isValid() const;
44 double mpegVersion() const;
45 int layer() const;
46 constexpr bool isProtectedByCrc() const;
47 std::uint16_t bitrate() const;
48 std::uint32_t samplingFrequency() const;
49 constexpr std::uint32_t paddingSize() const;
50 MpegChannelMode channelMode() const;
51 constexpr bool hasCopyright() const;
52 constexpr bool isOriginal() const;
53 std::uint32_t sampleCount() const;
54 std::uint32_t size() const;
55 constexpr bool isXingHeaderAvailable() const;
56 constexpr XingHeaderFlags xingHeaderFlags() const;
57 constexpr bool isXingFramefieldPresent() const;
58 constexpr bool isXingBytesfieldPresent() const;
59 constexpr bool isXingTocFieldPresent() const;
60 constexpr bool isXingQualityIndicatorFieldPresent() const;
61 constexpr std::uint32_t xingFrameCount() const;
62 constexpr std::uint32_t xingBytesfield() const;
63 constexpr std::uint32_t xingQualityIndicator() const;
64
65private:
66 static constexpr std::uint64_t s_xingHeaderOffset = 0x24;
67 static constexpr std::uint32_t s_sync = 0xFFE00000u;
68 static const std::uint16_t s_bitrateTable[0x2][0x3][0xF];
69 std::uint32_t m_header;
70 std::uint64_t m_xingHeader;
71 XingHeaderFlags m_xingHeaderFlags;
72 std::uint32_t m_xingFramefield;
73 std::uint32_t m_xingBytesfield;
74 std::uint32_t m_xingQualityIndicator;
75};
76
81 : m_header(0)
82 , m_xingHeader(0)
83 , m_xingHeaderFlags(XingHeaderFlags::None)
84 , m_xingFramefield(0)
85 , m_xingBytesfield(0)
86 , m_xingQualityIndicator(0)
87{
88}
89
93constexpr bool MpegAudioFrame::isValid() const
94{
95 return (m_header & s_sync) == s_sync;
96}
97
102{
103 return (m_header & 0x10000u) != 0x10000u;
104}
105
109inline std::uint16_t MpegAudioFrame::bitrate() const
110{
111 if (mpegVersion() > 0.0 && layer() > 0) {
112 return s_bitrateTable[mpegVersion() == 1.0 ? 0 : 1][layer() - 1][(m_header & 0xf000u) >> 12];
113 } else {
114 return 0;
115 }
116}
117
121constexpr std::uint32_t MpegAudioFrame::paddingSize() const
122{
123 if (isValid() && (m_header & 0x200u)) {
124 return (m_header & 0x60000u) == 0x60000u ? 4u /* layer 1 */ : 1u /* layer 2 and 3 */;
125 } else {
126 return 0;
127 }
128}
129
133constexpr bool MpegAudioFrame::hasCopyright() const
134{
135 return (m_header & 0x8u) == 0x8u;
136}
137
141constexpr bool MpegAudioFrame::isOriginal() const
142{
143 return (m_header & 0x4u) == 0x4u;
144}
145
147{
148 return static_cast<XingHeaderFlags>(static_cast<int>(lhs) | static_cast<int>(rhs));
149}
150
152{
153 return static_cast<XingHeaderFlags>(static_cast<int>(lhs) & static_cast<int>(rhs));
154}
155
160{
161 return ((m_xingHeader & 0x58696e6700000000uL) == 0x58696e6700000000uL) || ((m_xingHeader & 0x496e666f00000000uL) == 0x496e666f00000000uL);
162}
163
168{
169 return m_xingHeaderFlags;
170}
171
179
187
192{
194}
195
203
207constexpr std::uint32_t MpegAudioFrame::xingFrameCount() const
208{
209 return m_xingFramefield;
210}
211
215constexpr std::uint32_t MpegAudioFrame::xingBytesfield() const
216{
217 return m_xingBytesfield;
218}
219
223constexpr std::uint32_t MpegAudioFrame::xingQualityIndicator() const
224{
225 return m_xingQualityIndicator;
226}
227
228} // namespace TagParser
229
230#endif // TAG_PARSER_MP3FRAMEAUDIOSTREAM_H
constexpr bool isXingQualityIndicatorFieldPresent() const
Returns an indication whether the Xing quality indicator field is present.
constexpr bool isProtectedByCrc() const
Returns an indication whether the frame is protected by CRC.
constexpr std::uint32_t paddingSize() const
Returns the padding size if known; otherwise returns 0.
constexpr bool hasCopyright() const
Returns an indication whether the frame is copyrighted.
constexpr bool isXingTocFieldPresent() const
Returns an indication whether the Xing TOC is present.
constexpr bool isValid() const
Returns an indication whether the frame is valid.
int layer() const
Returns the MPEG layer if known (1, 2, or 3); otherwise returns 0.
constexpr bool isOriginal() const
Returns an indication whether the frame labeled as original.
std::uint16_t bitrate() const
Returns the bitrate of the frame if known; otherwise returns 0.
constexpr std::uint32_t xingFrameCount() const
Returns an indication whether the Xing frame count is present.
constexpr std::uint32_t xingQualityIndicator() const
Returns the Xing quality indicator if known; otherwise returns 0.
constexpr bool isXingBytesfieldPresent() const
Returns an indication whether the Xing bytes field is present.
constexpr bool isXingHeaderAvailable() const
Returns an indication whether a Xing header is present.
constexpr XingHeaderFlags xingHeaderFlags() const
Returns the Xing header flags.
double mpegVersion() const
Returns the MPEG version if known (1.0, 2.0 or 2.5); otherwise returns 0.
constexpr bool isXingFramefieldPresent() const
Returns an indication whether the Xing frame field is present.
constexpr std::uint32_t xingBytesfield() const
Returns the Xing bytes field if known; otherwise returns 0.
constexpr MpegAudioFrame()
Constructs a new frame.
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
Definition global.h:14
Contains all classes and functions of the TagInfo library.
Definition aaccodebook.h:10
TAG_PARSER_EXPORT std::string_view mpegChannelModeString(MpegChannelMode channelMode)
Returns the string representation for the specified channelMode.
constexpr XingHeaderFlags operator|(XingHeaderFlags lhs, XingHeaderFlags rhs)
constexpr XingHeaderFlags operator&(XingHeaderFlags lhs, XingHeaderFlags rhs)
MpegChannelMode
Specifies the channel mode.