Tag Parser  8.0.1
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 <c++utilities/conversion/types.h>
7 
8 #include <iostream>
9 
10 namespace IoUtilities {
11 class BinaryReader;
12 }
13 
14 namespace TagParser {
15 
19 enum class MpegChannelMode {
20  Stereo,
21  JointStereo,
22  DualChannel,
24  Unspecifed
25 };
26 
28 
29 enum class XingHeaderFlags {
30  None = 0x0u,
31  HasFramesField = 0x1u,
32  HasBytesField = 0x2u,
33  HasTocField = 0x4u,
34  HasQualityIndicator = 0x8u
35 };
36 
38 public:
39  constexpr MpegAudioFrame();
40 
41  void parseHeader(IoUtilities::BinaryReader &reader, Diagnostics &diag);
42 
43  constexpr bool isValid() const;
44  double mpegVersion() const;
45  int layer() const;
46  constexpr bool isProtectedByCrc() const;
47  uint16 bitrate() const;
48  uint32 samplingFrequency() const;
49  constexpr uint32 paddingSize() const;
50  MpegChannelMode channelMode() const;
51  constexpr bool hasCopyright() const;
52  constexpr bool isOriginal() const;
53  uint32 sampleCount() const;
54  uint32 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 uint32 xingFrameCount() const;
62  constexpr uint32 xingBytesfield() const;
63  constexpr uint32 xingQualityIndicator() const;
64 
65 private:
66  static constexpr uint64 s_xingHeaderOffset = 0x24;
67  static constexpr uint32 s_sync = 0xFFE00000u;
68  static const uint16 s_bitrateTable[0x2][0x3][0xF];
69  uint32 m_header;
70  uint64 m_xingHeader;
71  XingHeaderFlags m_xingHeaderFlags;
72  uint32 m_xingFramefield;
73  uint32 m_xingBytesfield;
74  uint32 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 
93 constexpr bool MpegAudioFrame::isValid() const
94 {
95  return (m_header & s_sync) == s_sync;
96 }
97 
101 constexpr bool MpegAudioFrame::isProtectedByCrc() const
102 {
103  return (m_header & 0x10000u) != 0x10000u;
104 }
105 
109 inline uint16 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 
121 constexpr uint32 MpegAudioFrame::paddingSize() const
122 {
123  if (isValid()) {
124  return (m_header & 0x60000u) == 0x60000u ? 4u : 1u * (m_header & 0x200u);
125  } else {
126  return 0;
127  }
128 }
129 
133 constexpr bool MpegAudioFrame::hasCopyright() const
134 {
135  return (m_header & 0x8u) == 0x8u;
136 }
137 
141 constexpr 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 
176 {
177  return (isXingHeaderAvailable()) ? ((m_xingHeaderFlags & XingHeaderFlags::HasFramesField) == XingHeaderFlags::HasFramesField) : false;
178 }
179 
184 {
185  return (isXingHeaderAvailable()) ? ((m_xingHeaderFlags & XingHeaderFlags::HasFramesField) == XingHeaderFlags::HasFramesField) : false;
186 }
187 
192 {
193  return (isXingHeaderAvailable()) ? ((m_xingHeaderFlags & XingHeaderFlags::HasTocField) == XingHeaderFlags::HasTocField) : false;
194 }
195 
200 {
202 }
203 
207 constexpr uint32 MpegAudioFrame::xingFrameCount() const
208 {
209  return m_xingFramefield;
210 }
211 
215 constexpr uint32 MpegAudioFrame::xingBytesfield() const
216 {
217  return m_xingBytesfield;
218 }
219 
223 constexpr uint32 MpegAudioFrame::xingQualityIndicator() const
224 {
225  return m_xingQualityIndicator;
226 }
227 
228 } // namespace TagParser
229 
230 #endif // TAG_PARSER_MP3FRAMEAUDIOSTREAM_H
The MpegAudioFrame class is used to parse MPEG audio frames.
MpegChannelMode
Specifies the channel mode.
double mpegVersion() const
Returns the MPEG version if known (1.0, 2.0 or 2.5); otherwise returns 0.
constexpr MpegAudioFrame()
Constructs a new frame.
constexpr uint32 paddingSize() const
Returns the padding size if known; otherwise returns 0.
constexpr XingHeaderFlags operator &(XingHeaderFlags lhs, XingHeaderFlags rhs)
constexpr bool isOriginal() const
Returns an indication whether the frame labeled as original.
constexpr bool hasCopyright() const
Returns an indication whether the frame is copyrighted.
constexpr XingHeaderFlags operator|(XingHeaderFlags lhs, XingHeaderFlags rhs)
constexpr bool isXingFramefieldPresent() const
Returns an indication whether the Xing frame field is present.
int layer() const
Returns the MPEG layer if known (1, 2, or 3); otherwise returns 0.
Contains utility classes helping to read and write streams.
constexpr bool isXingHeaderAvailable() const
Returns an indication whether a Xing header is present.
constexpr bool isXingBytesfieldPresent() const
Returns an indication whether the Xing bytes field is present.
TAG_PARSER_EXPORT const char * mpegChannelModeString(MpegChannelMode channelMode)
Returns the string representation for the specified channelMode.
constexpr bool isXingQualityIndicatorFieldPresent() const
Returns an indication whether the Xing quality indicator field is present.
constexpr XingHeaderFlags xingHeaderFlags() const
Returns the Xing header flags.
uint16 bitrate() const
Returns the bitrate of the frame if known; otherwise returns 0.
constexpr bool isValid() const
Returns an indication whether the frame is valid.
constexpr bool isXingTocFieldPresent() const
Returns an indication whether the Xing TOC is present.
constexpr bool isProtectedByCrc() const
Returns an indication whether the frame is protected by CRC.
constexpr TAG_PARSER_EXPORT const char * bitrate()
The track&#39;s bit rate in bits per second.
constexpr uint32 xingQualityIndicator() const
Returns the Xing quality indicator if known; otherwise returns 0.
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:9
constexpr uint32 xingFrameCount() const
Returns an indication whether the Xing frame count is present.
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
constexpr uint32 xingBytesfield() const
Returns the Xing bytes field if known; otherwise returns 0.
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156