private static Channel ParseChannel(byte[] frameHeader) { Channel channel; switch (BitTools.MaskBits(frameHeader, 24, 2)) { case 0: channel = Channel.Stereo; break; case 1: channel = Channel.JointStereo; break; case 2: channel = Channel.DualChannel; break; case 3: channel = Channel.SingleChannel; break; default: channel = Channel.SingleChannel; break; } return(channel); }
public MpegFrame(Stream stream, byte[] data) { this.frameHeader = new byte[4]; if (data != null) { for (int index = 0; index < this.frameHeader.Length; ++index) { this.frameHeader[index] = data[index]; } } else if (stream.Read(this.frameHeader, 0, 4) != 4) { goto label_7; } if (BitTools.MaskBits(this.frameHeader, 0, 11) == 2047) { this.Version = MpegFrame.ParseVersion(this.frameHeader); this.Layer = MpegFrame.ParseLayer(this.frameHeader); this.IsProtected = BitTools.MaskBits(this.frameHeader, 15, 1) != 1; this.BitrateIndex = BitTools.MaskBits(this.frameHeader, 16, 4); this.SamplingRateIndex = BitTools.MaskBits(this.frameHeader, 20, 2); this.Padding = BitTools.MaskBits(this.frameHeader, 22, 1); this.Channels = MpegFrame.ParseChannel(this.frameHeader); return; } label_7: this.frameHeader = (byte[])null; }
/// <summary> /// Parses which complexity layer of the MPEG standard this frame conforms to from the frame header. /// </summary> /// <param name="frameHeader">The 4 byte header for this frame.</param> /// <returns>The complexity layer this frame conforms to.</returns> private static int ParseLayer(byte[] frameHeader) { int layer; int layerValue = BitTools.MaskBits(frameHeader, 13, 2); switch (layerValue) { case 3: layer = 1; break; case 2: layer = 2; break; case 1: layer = 3; break; default: layer = -1; break; } return(layer); }
/// <summary> /// Parses the version of the MPEG standard this frame header conforms to from the frame header. /// </summary> /// <param name="frameHeader"> The 4 byte header for this frame. </param> /// <returns> /// The version of the MPEG standard this frame conforms to. /// 1 = Mpeg 1 /// 2 = Mpeg 2 /// 3 = Mpeg 2.5 /// </returns> private static int ParseVersion(byte[] frameHeader) { int version; int versionValue = BitTools.MaskBits(frameHeader, 11, 2); switch (versionValue) { case 3: version = 1; break; case 2: version = 2; break; case 0: version = 3; break; default: version = -1; // ERROR break; } return(version); }
/// <summary> /// Initializes a new instance of the MpegFrame class. /// </summary> /// <param name="stream"> /// A stream with its position at the SyncPoint of the header. /// </param> /// <param name="data"> /// The first 4 bytes of the audiostream. This should contain the MpegFrame's /// header data. /// </param> public MpegFrame(Stream stream, byte[] data) { this.frameHeader = new byte[FrameHeaderSize]; if (data != null) { for (int i = 0; i < this.frameHeader.Length; i++) { this.frameHeader[i] = data[i]; } } else { // Guard against a read error if (stream.Read(this.frameHeader, 0, FrameHeaderSize) != FrameHeaderSize) { goto cleanup; } } // Sync int value = BitTools.MaskBits(this.frameHeader, 0, 11); if (!(value == SyncValue)) { goto cleanup; } this.Version = ParseVersion(this.frameHeader); this.Layer = ParseLayer(this.frameHeader); this.IsProtected = BitTools.MaskBits(this.frameHeader, 15, 1) == 1 ? false : true; this.BitrateIndex = BitTools.MaskBits(this.frameHeader, 16, 4); this.SamplingRateIndex = BitTools.MaskBits(this.frameHeader, 20, 2); this.Padding = BitTools.MaskBits(this.frameHeader, 22, 1); //// Private Bit = BitTools.MaskBits(_mp3FrameHeader,8,1); //USELESS this.Channels = ParseChannel(this.frameHeader); //// Joint Mode = ParseJoitMode(_mp3FrameHeader); //Not used by Mp3MSS //// CopyRight = BitTools.MaskBits(_mp3FrameHeader,3,1); //Not used by Mp3MSS //// Original = BitTools.MaskBits(_mp3FrameHeader,2,1); //Not used by Mp3MSS //// Emphasis = ParseEmphasis(_mp3FrameHeader); //Not used by Mp3MSS return; cleanup: this.frameHeader = null; return; }
private static int ParseLayer(byte[] frameHeader) { int num; switch (BitTools.MaskBits(frameHeader, 13, 2)) { case 1: num = 3; break; case 2: num = 2; break; case 3: num = 1; break; default: num = -1; break; } return(num); }