123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- #include "MPEGHeader.h"
- #include <math.h>
- // [mpeg_version][layer][index]
- static const int bitrates[4][4][15] =
- {
- {
- // MPEG-2.5
- { 0,},
- { 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000}, // Layer 3
- { 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000}, // Layer 2
- { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000}, // Layer 1
- },
- {
- // invalid
- { 0, },
- { 0, },
- { 0, },
- { 0, },
- },
- {
- // MPEG-2
- { 0,},
- { 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000}, // Layer 3
- { 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000}, // Layer 2
- { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000}, // Layer 1
- },
- {
- // MPEG-1
- { 0,},
- { 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000}, // Layer 3
- { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000}, // Layer 2
- { 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000}, // Layer 1
- },
- };
- // [mpeg_version][index]
- static const int sample_rates[4][4] =
- {
- {11025, 12000, 8000, 0}, // MPEG-2.5
- {0, },
- {22050, 24000, 16000, 0}, // MPEG-2
- {44100, 48000, 32000, 0}, // MPEG-1
- };
- // [mpeg_version][layer]
- static const int samples_per_frame[4][4] =
- {
- // Layer 3, Layer 2, Layer 1
- { 0, 576, 1152, 384}, // MPEG2.5
- { 0, },
- { 0, 576, 1152, 384}, // MPEG2
- { 0, 1152, 1152, 384}, // MPEG1
- };
- // [layer]
- static const int bits_per_slot[4] = { 0, 8, 8, 32 };
- void MPEGHeader::ReadBuffer(const uint8_t *buffer)
- {
- sync = ((uint16_t)buffer[0] << 3) | (buffer[1] >> 5);
- mpeg_version = (buffer[1] >> 3) & 3;
- layer = (buffer[1] >> 1) & 3;
- protection = (buffer[1]) & 1;
- bitrate_index = (buffer[2] >> 4) & 0xF;
- sample_rate_index = (buffer[2] >> 2) & 3;
- padding_bit = (buffer[2] >> 1) & 1;
- private_bit = buffer[2] & 1;
- channel_mode = (buffer[3] >> 6) & 3;
- mode_extension = (buffer[3] >> 4) & 3;
- copyright = (buffer[3] >> 3) & 1;
- original = (buffer[3] >> 2) & 1;
- emphasis = (buffer[3]) & 3;
- }
- bool MPEGHeader::IsSync() const
- {
- return sync == 0x07FF
- && layer != LayerError
- && mpeg_version != MPEG_Error
- && bitrate_index != 15
- && bitrate_index != 0
- && sample_rate_index != 3
- && !(mpeg_version == MPEG2 && layer != Layer3)
- && !(mpeg_version == MPEG2_5 && layer != Layer3);
- }
- int MPEGHeader::GetBitrate() const
- {
- return bitrates[mpeg_version][layer][bitrate_index];
- }
- int MPEGHeader::HeaderSize() const
- {
- if (protection == CRC)
- return 4 + 2; // 32bits frame header, 16bits CRC
- else
- return 4; // 32bits frame ehader
- }
- int MPEGHeader::GetSampleRate() const
- {
- return sample_rates[mpeg_version][sample_rate_index];
- }
- bool MPEGHeader::IsCopyright() const
- {
- return copyright == 1;
- }
- bool MPEGHeader::IsCRC() const
- {
- return protection == CRC;
- }
- bool MPEGHeader::IsOriginal() const
- {
- return original == 1;
- }
- int MPEGHeader::GetSamplesPerFrame() const
- {
- return samples_per_frame[mpeg_version][layer];
- }
- int MPEGHeader::FrameSize() const
- {
- int nBitsPerSlot;
- int nAvgSlotsPerFrame;
- nBitsPerSlot = bits_per_slot[layer];
- nAvgSlotsPerFrame = (GetSamplesPerFrame() * (bitrates[mpeg_version][layer][bitrate_index] / nBitsPerSlot)) / sample_rates[mpeg_version][sample_rate_index];
- return (nAvgSlotsPerFrame + padding_bit) * nBitsPerSlot / 8;
- }
- int MPEGHeader::GetLayer() const
- {
- switch(layer)
- {
- case Layer1:
- return 1;
- case Layer2:
- return 2;
- case Layer3:
- return 3;
- default:
- return 0;
- }
- }
- int MPEGHeader::GetNumChannels() const
- {
- switch(channel_mode)
- {
- case Stereo:
- return 2;
- case JointStereo:
- return 2;
- case DualChannel:
- return 2;
- case Mono:
- return 1;
- default:
- return 0;
- }
- }
|