Tag Parser  9.1.2
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
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 
9 namespace CppUtilities {
10 class BinaryReader;
11 }
12 
13 namespace TagParser {
14 
18 enum class MpegChannelMode {
19  Stereo,
20  JointStereo,
21  DualChannel,
23  Unspecifed
24 };
25 
27 
28 enum class XingHeaderFlags {
29  None = 0x0u,
30  HasFramesField = 0x1u,
31  HasBytesField = 0x2u,
32  HasTocField = 0x4u,
33  HasQualityIndicator = 0x8u
34 };
35 
37 public:
38  constexpr MpegAudioFrame();
39 
40  void parseHeader(CppUtilities::BinaryReader &reader, Diagnostics &diag);
41 
42  constexpr bool isValid() const;
43  double mpegVersion() const;
44  int layer() const;
45  constexpr bool isProtectedByCrc() const;
46  std::uint16_t bitrate() const;
47  std::uint32_t samplingFrequency() const;
48  constexpr std::uint32_t paddingSize() const;
49  MpegChannelMode channelMode() const;
50  constexpr bool hasCopyright() const;
51  constexpr bool isOriginal() const;
52  std::uint32_t sampleCount() const;
53  std::uint32_t size() const;
54  constexpr bool isXingHeaderAvailable() const;
55  constexpr XingHeaderFlags xingHeaderFlags() const;
56  constexpr bool isXingFramefieldPresent() const;
57  constexpr bool isXingBytesfieldPresent() const;
58  constexpr bool isXingTocFieldPresent() const;
59  constexpr bool isXingQualityIndicatorFieldPresent() const;
60  constexpr std::uint32_t xingFrameCount() const;
61  constexpr std::uint32_t xingBytesfield() const;
62  constexpr std::uint32_t xingQualityIndicator() const;
63 
64 private:
65  static constexpr std::uint64_t s_xingHeaderOffset = 0x24;
66  static constexpr std::uint32_t s_sync = 0xFFE00000u;
67  static const std::uint16_t s_bitrateTable[0x2][0x3][0xF];
68  std::uint32_t m_header;
69  std::uint64_t m_xingHeader;
70  XingHeaderFlags m_xingHeaderFlags;
71  std::uint32_t m_xingFramefield;
72  std::uint32_t m_xingBytesfield;
73  std::uint32_t m_xingQualityIndicator;
74 };
75 
80  : m_header(0)
81  , m_xingHeader(0)
82  , m_xingHeaderFlags(XingHeaderFlags::None)
83  , m_xingFramefield(0)
84  , m_xingBytesfield(0)
85  , m_xingQualityIndicator(0)
86 {
87 }
88 
92 constexpr bool MpegAudioFrame::isValid() const
93 {
94  return (m_header & s_sync) == s_sync;
95 }
96 
100 constexpr bool MpegAudioFrame::isProtectedByCrc() const
101 {
102  return (m_header & 0x10000u) != 0x10000u;
103 }
104 
108 inline std::uint16_t MpegAudioFrame::bitrate() const
109 {
110  if (mpegVersion() > 0.0 && layer() > 0) {
111  return s_bitrateTable[mpegVersion() == 1.0 ? 0 : 1][layer() - 1][(m_header & 0xf000u) >> 12];
112  } else {
113  return 0;
114  }
115 }
116 
120 constexpr std::uint32_t MpegAudioFrame::paddingSize() const
121 {
122  if (isValid()) {
123  return (m_header & 0x60000u) == 0x60000u ? 4u : 1u * (m_header & 0x200u);
124  } else {
125  return 0;
126  }
127 }
128 
132 constexpr bool MpegAudioFrame::hasCopyright() const
133 {
134  return (m_header & 0x8u) == 0x8u;
135 }
136 
140 constexpr bool MpegAudioFrame::isOriginal() const
141 {
142  return (m_header & 0x4u) == 0x4u;
143 }
144 
146 {
147  return static_cast<XingHeaderFlags>(static_cast<int>(lhs) | static_cast<int>(rhs));
148 }
149 
151 {
152  return static_cast<XingHeaderFlags>(static_cast<int>(lhs) & static_cast<int>(rhs));
153 }
154 
159 {
160  return ((m_xingHeader & 0x58696e6700000000uL) == 0x58696e6700000000uL) || ((m_xingHeader & 0x496e666f00000000uL) == 0x496e666f00000000uL);
161 }
162 
167 {
168  return m_xingHeaderFlags;
169 }
170 
175 {
176  return (isXingHeaderAvailable()) ? ((m_xingHeaderFlags & XingHeaderFlags::HasFramesField) == XingHeaderFlags::HasFramesField) : false;
177 }
178 
183 {
184  return (isXingHeaderAvailable()) ? ((m_xingHeaderFlags & XingHeaderFlags::HasFramesField) == XingHeaderFlags::HasFramesField) : false;
185 }
186 
191 {
192  return (isXingHeaderAvailable()) ? ((m_xingHeaderFlags & XingHeaderFlags::HasTocField) == XingHeaderFlags::HasTocField) : false;
193 }
194 
199 {
201 }
202 
206 constexpr std::uint32_t MpegAudioFrame::xingFrameCount() const
207 {
208  return m_xingFramefield;
209 }
210 
214 constexpr std::uint32_t MpegAudioFrame::xingBytesfield() const
215 {
216  return m_xingBytesfield;
217 }
218 
222 constexpr std::uint32_t MpegAudioFrame::xingQualityIndicator() const
223 {
224  return m_xingQualityIndicator;
225 }
226 
227 } // namespace TagParser
228 
229 #endif // TAG_PARSER_MP3FRAMEAUDIOSTREAM_H
TagParser::SubFormats::None
@ None
Definition: mediaformat.h:110
TagParser::MpegAudioFrame::isOriginal
constexpr bool isOriginal() const
Returns an indication whether the frame labeled as original.
Definition: mpegaudioframe.h:140
TagParser::MpegAudioFrame::MpegAudioFrame
constexpr MpegAudioFrame()
Constructs a new frame.
Definition: mpegaudioframe.h:79
TagParser::MpegAudioFrame::isXingQualityIndicatorFieldPresent
constexpr bool isXingQualityIndicatorFieldPresent() const
Returns an indication whether the Xing quality indicator field is present.
Definition: mpegaudioframe.h:198
TagParser::MpegAudioFrame::xingQualityIndicator
constexpr std::uint32_t xingQualityIndicator() const
Returns the Xing quality indicator if known; otherwise returns 0.
Definition: mpegaudioframe.h:222
TagParser::MpegAudioFrame::layer
int layer() const
Returns the MPEG layer if known (1, 2, or 3); otherwise returns 0.
Definition: mpegaudioframe.cpp:93
TagParser::MpegAudioFrame::isValid
constexpr bool isValid() const
Returns an indication whether the frame is valid.
Definition: mpegaudioframe.h:92
TagParser::MpegChannelMode::DualChannel
@ DualChannel
TagParser::MpegAudioFrame::hasCopyright
constexpr bool hasCopyright() const
Returns an indication whether the frame is copyrighted.
Definition: mpegaudioframe.h:132
TagParser::MpegAudioFrame
The MpegAudioFrame class is used to parse MPEG audio frames.
Definition: mpegaudioframe.h:36
TagParser::MpegChannelMode
MpegChannelMode
Specifies the channel mode.
Definition: mpegaudioframe.h:18
TagParser::MpegAudioFrame::isXingHeaderAvailable
constexpr bool isXingHeaderAvailable() const
Returns an indication whether a Xing header is present.
Definition: mpegaudioframe.h:158
TagParser::Diagnostics
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
TagParser
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
TagParser::MpegChannelMode::Unspecifed
@ Unspecifed
TagParser::MpegChannelMode::Stereo
@ Stereo
TagParser::XingHeaderFlags::None
@ None
TagParser::MpegAudioFrame::bitrate
std::uint16_t bitrate() const
Returns the bitrate of the frame if known; otherwise returns 0.
Definition: mpegaudioframe.h:108
TagParser::MpegAudioFrame::isXingBytesfieldPresent
constexpr bool isXingBytesfieldPresent() const
Returns an indication whether the Xing bytes field is present.
Definition: mpegaudioframe.h:182
TagParser::MpegChannelMode::SingleChannel
@ SingleChannel
TagParser::mpegChannelModeString
const TAG_PARSER_EXPORT char * mpegChannelModeString(MpegChannelMode channelMode)
Returns the string representation for the specified channelMode.
Definition: mpegaudioframe.cpp:15
TagParser::MpegAudioFrame::isXingTocFieldPresent
constexpr bool isXingTocFieldPresent() const
Returns an indication whether the Xing TOC is present.
Definition: mpegaudioframe.h:190
TagParser::operator|
constexpr XingHeaderFlags operator|(XingHeaderFlags lhs, XingHeaderFlags rhs)
Definition: mpegaudioframe.h:145
TagParser::MpegAudioFrame::xingHeaderFlags
constexpr XingHeaderFlags xingHeaderFlags() const
Returns the Xing header flags.
Definition: mpegaudioframe.h:166
TagParser::XingHeaderFlags::HasTocField
@ HasTocField
CppUtilities
Definition: abstractcontainer.h:15
TagParser::XingHeaderFlags::HasBytesField
@ HasBytesField
TagParser::MpegAudioFrame::xingFrameCount
constexpr std::uint32_t xingFrameCount() const
Returns an indication whether the Xing frame count is present.
Definition: mpegaudioframe.h:206
TagParser::MpegAudioFrame::isXingFramefieldPresent
constexpr bool isXingFramefieldPresent() const
Returns an indication whether the Xing frame field is present.
Definition: mpegaudioframe.h:174
TagParser::MpegAudioFrame::paddingSize
constexpr std::uint32_t paddingSize() const
Returns the padding size if known; otherwise returns 0.
Definition: mpegaudioframe.h:120
TagParser::MpegAudioFrame::xingBytesfield
constexpr std::uint32_t xingBytesfield() const
Returns the Xing bytes field if known; otherwise returns 0.
Definition: mpegaudioframe.h:214
TagParser::MatroskaTagIds::TrackSpecific::bitrate
constexpr const TAG_PARSER_EXPORT char * bitrate()
The track's bit rate in bits per second.
Definition: matroskatagid.h:463
TAG_PARSER_EXPORT
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
TagParser::operator&
constexpr XingHeaderFlags operator&(XingHeaderFlags lhs, XingHeaderFlags rhs)
Definition: mpegaudioframe.h:150
TagParser::MpegAudioFrame::isProtectedByCrc
constexpr bool isProtectedByCrc() const
Returns an indication whether the frame is protected by CRC.
Definition: mpegaudioframe.h:100
TagParser::XingHeaderFlags
XingHeaderFlags
Definition: mpegaudioframe.h:28
TagParser::XingHeaderFlags::HasFramesField
@ HasFramesField
TagParser::MpegChannelMode::JointStereo
@ JointStereo
TagParser::MpegAudioFrame::mpegVersion
double mpegVersion() const
Returns the MPEG version if known (1.0, 2.0 or 2.5); otherwise returns 0.
Definition: mpegaudioframe.cpp:76
TagParser::XingHeaderFlags::HasQualityIndicator
@ HasQualityIndicator