3 #include "../exceptions.h" 5 #include <c++utilities/io/binaryreader.h> 18 case MpegChannelMode::Stereo:
return "2 channels: stereo";
19 case MpegChannelMode::JointStereo:
return "2 channels: joint stereo";
20 case MpegChannelMode::DualChannel:
return "2 channels: dual channel";
21 case MpegChannelMode::SingleChannel:
return "1 channel: single channel";
22 default:
return nullptr;
26 const uint64 MpegAudioFrame::m_xingHeaderOffset = 0x24;
33 const int MpegAudioFrame::m_bitrateTable[0x2][0x3][0xF] =
35 {{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
36 {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
37 {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}},
38 {{0,32,48,56,64,80,96,112,128,144,160,176,192,224,256},
39 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160},
40 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160}}
43 const uint32 MpegAudioFrame::m_sync = 0xFFE00000u;
50 void MpegAudioFrame::parseHeader(BinaryReader &reader)
52 m_header = reader.readUInt32BE();
56 reader.stream()->seekg(m_xingHeaderOffset - 4, ios_base::cur);
57 m_xingHeader = reader.readUInt64BE();
58 m_xingHeaderFlags =
static_cast<XingHeaderFlags>(m_xingHeader & 0xffffffffuL);
59 if(isXingHeaderAvailable()) {
60 if(isXingFramefieldPresent()) {
61 m_xingFramefield = reader.readUInt32BE();
63 if(isXingBytesfieldPresent()) {
64 m_xingBytesfield = reader.readUInt32BE();
66 if(isXingTocFieldPresent()) {
67 reader.stream()->seekg(64, ios_base::cur);
69 if(isXingQualityIndicatorFieldPresent()) {
70 m_xingQualityIndicator = reader.readUInt32BE();
78 double MpegAudioFrame::mpegVersion()
const 80 switch(m_header & 0x180000u) {
95 int MpegAudioFrame::layer()
const 97 switch (m_header & 0x60000u) {
112 uint32 MpegAudioFrame::samplingFrequency()
const 114 switch (m_header & 0xc00u) {
118 switch (m_header & 0x180000u) {
128 switch (m_header & 0x180000u) {
138 switch (m_header & 0x180000u) {
157 switch (m_header & 0xc0u) {
159 return MpegChannelMode::SingleChannel;
161 return MpegChannelMode::DualChannel;
163 return MpegChannelMode::JointStereo;
165 return MpegChannelMode::Stereo;
170 return MpegChannelMode::Unspecifed;
176 uint32 MpegAudioFrame::sampleCount()
const 178 switch (m_header & 0x60000u) {
184 switch (m_header & 0x180000u) {
200 uint32 MpegAudioFrame::size()
const 202 switch (m_header & 0x60000u) {
204 return static_cast<uint32
>(((
static_cast<double>(
bitrate()) * 1024.0 / 8.0) /
static_cast<double>(samplingFrequency())) *
static_cast<double>(sampleCount()) + static_cast<double>(paddingSize()));
207 return static_cast<uint32
>(((
static_cast<double>(
bitrate()) * 1024.0 / 8.0) /
static_cast<double>(samplingFrequency())) *
static_cast<double>(sampleCount()) + static_cast<double>(paddingSize()));
Contains utility classes helping to read and write streams.