public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, ref string tag) { if (stream.IsInitialized) { return; } byte[] header = buffer.ReadBytes(4); int flags = (header[2] << 8) + header[3]; switch ((flags & 0xF000) >> 12) { case 1: // 1/0/0 stream.ChannelCount = 1; stream.LFE = 0; break; case 3: // 2/0/0 stream.ChannelCount = 2; stream.LFE = 0; break; case 4: // 3/0/0 stream.ChannelCount = 3; stream.LFE = 0; break; case 5: // 2/1/0 stream.ChannelCount = 3; stream.LFE = 0; break; case 6: // 3/1/0 stream.ChannelCount = 4; stream.LFE = 0; break; case 7: // 2/2/0 stream.ChannelCount = 4; stream.LFE = 0; break; case 8: // 3/2/0 stream.ChannelCount = 5; stream.LFE = 0; break; case 9: // 3/2/1 stream.ChannelCount = 5; stream.LFE = 1; break; case 10: // 3/4/0 stream.ChannelCount = 7; stream.LFE = 0; break; case 11: // 3/4/1 stream.ChannelCount = 7; stream.LFE = 1; break; default: stream.ChannelCount = 0; stream.LFE = 0; break; } switch ((flags & 0xC0) >> 6) { case 1: stream.BitDepth = 16; break; case 2: stream.BitDepth = 20; break; case 3: stream.BitDepth = 24; break; default: stream.BitDepth = 0; break; } switch ((flags & 0xF00) >> 8) { case 1: stream.SampleRate = 48000; break; case 4: stream.SampleRate = 96000; break; case 5: stream.SampleRate = 192000; break; default: stream.SampleRate = 0; break; } stream.BitRate = (uint) (stream.SampleRate * stream.BitDepth * (stream.ChannelCount + stream.LFE)); stream.IsVBR = false; stream.IsInitialized = true; }
public void Scan(TSAudioStream stream, TSStreamBuffer buffer, ref string tag, long?bitrate) { if (stream.IsInitialized) { return; } var sync = buffer.ReadBytes(2); if (sync == null || sync[0] != 0x0B || sync[1] != 0x77) { return; } var secondFrame = stream.ChannelCount > 0; uint srCode; uint frameSize = 0; uint frameSizeCode = 0; uint channelMode; uint lfeOn; uint dialNorm = 0; uint dialNormExt = 0; uint numBlocks = 0; var hdr = buffer.ReadBytes(4); var bsid = (uint)((hdr[3] & 0xF8) >> 3); buffer.Seek(-4, SeekOrigin.Current); if (bsid <= 10) { buffer.BSSkipBytes(2); srCode = buffer.ReadBits2(2); frameSizeCode = buffer.ReadBits2(6); bsid = buffer.ReadBits2(5); buffer.BSSkipBits(3); channelMode = buffer.ReadBits2(3); if ((channelMode & 0x1) > 0 && channelMode != 0x1) { buffer.BSSkipBits(2); } if ((channelMode & 0x4) > 0) { buffer.BSSkipBits(2); } if (channelMode == 0x2) { var dsurmod = buffer.ReadBits2(2); if (dsurmod == 0x2) { stream.AudioMode = TSAudioMode.Surround; } } lfeOn = buffer.ReadBits2(1); dialNorm = buffer.ReadBits2(5); if (buffer.ReadBool()) { buffer.BSSkipBits(8); } if (buffer.ReadBool()) { buffer.BSSkipBits(8); } if (buffer.ReadBool()) { buffer.BSSkipBits(7); } if (channelMode == 0) { buffer.BSSkipBits(5); if (buffer.ReadBool()) { buffer.BSSkipBits(8); } if (buffer.ReadBool()) { buffer.BSSkipBits(8); } if (buffer.ReadBool()) { buffer.BSSkipBits(7); } } buffer.BSSkipBits(2); if (bsid == 6) { if (buffer.ReadBool()) { buffer.BSSkipBits(14); } if (buffer.ReadBool()) { uint dsurexmod = buffer.ReadBits2(2); uint dheadphonmod = buffer.ReadBits2(2); if (dheadphonmod == 0x2) { // TODO } buffer.BSSkipBits(10); if (dsurexmod == 2) { stream.AudioMode = TSAudioMode.Extended; } } } } else { uint frameType = buffer.ReadBits2(2); buffer.BSSkipBits(3); frameSize = (buffer.ReadBits4(11) + 1) << 1; srCode = buffer.ReadBits2(2); if (srCode == 3) { srCode = buffer.ReadBits2(2); numBlocks = 3; } else { numBlocks = buffer.ReadBits2(2); } channelMode = buffer.ReadBits2(3); lfeOn = buffer.ReadBits2(1); bsid = buffer.ReadBits2(5); dialNormExt = buffer.ReadBits2(5); if (buffer.ReadBool()) { buffer.BSSkipBits(8); } if (channelMode == 0) // 1+1 { buffer.BSSkipBits(5); if (buffer.ReadBool()) { buffer.BSSkipBits(8); } } if (frameType == 1) //dependent stream { stream.CoreStream = (TSAudioStream)stream.Clone(); stream.CoreStream.StreamType = TSStreamType.AC3_AUDIO; if (buffer.ReadBool()) //channel remapping { var chanmap = buffer.ReadBits4(16); stream.ChannelCount = stream.CoreStream.ChannelCount; stream.ChannelCount += AC3ChanMap((int)chanmap); lfeOn = (uint)stream.CoreStream.LFE; } } var emdfFound = false; do { var emdfSync = buffer.ReadBits4(16); if (emdfSync == 0x5838) { emdfFound = true; break; } buffer.Seek(-2, SeekOrigin.Current); buffer.BSSkipBits(1); // skip 1 bit } while (buffer.Position < buffer.Length); if (emdfFound) { var emdfContainerSize = buffer.ReadBits4(16); var remainAfterEmdf = buffer.DataBitStreamRemain() - emdfContainerSize * 8; uint emdfVersion = buffer.ReadBits2(2); //emdf_version if (emdfVersion == 3) { emdfVersion += buffer.ReadBits2(2); } if (emdfVersion > 0) { buffer.BSSkipBits((int)(buffer.DataBitStreamRemain() - remainAfterEmdf)); } else { var temp = buffer.ReadBits2(3); if (temp == 0x7) { buffer.BSSkipBits(2); //skip 3 bits } var emdfPayloadID = buffer.ReadBits2(5); if (emdfPayloadID > 0 && emdfPayloadID < 16) { if (emdfPayloadID == 0x1F) { buffer.BSSkipBits(5); //skip 5 bits } EmdfPayloadConfig(buffer); var emdfPayloadSize = buffer.ReadBits2(8) * 8; buffer.BSSkipBits(emdfPayloadSize + 1); } while ((emdfPayloadID = buffer.ReadBits2(5)) != 14 && buffer.Position < buffer.Length) { if (emdfPayloadID == 0x1F) { buffer.BSSkipBits(5); //skip 5 bits } EmdfPayloadConfig(buffer); var emdfPayloadSize = buffer.ReadBits2(8) * 8; buffer.ReadBits4(emdfPayloadSize + 1); } if (buffer.Position < buffer.Length && emdfPayloadID == 14) { EmdfPayloadConfig(buffer); buffer.BSSkipBits(12); uint jocNumObjectsBits = buffer.ReadBits2(6); if (jocNumObjectsBits > 0) { stream.HasExtensions = true; } } } } } if (channelMode < 8 && stream.ChannelCount == 0) { stream.ChannelCount = AC3Channels[channelMode]; } if (stream.AudioMode == TSAudioMode.Unknown) { switch (channelMode) { case 0: // 1+1 stream.AudioMode = TSAudioMode.DualMono; break; case 2: // 2/0 stream.AudioMode = TSAudioMode.Stereo; break; default: stream.AudioMode = TSAudioMode.Unknown; break; } } switch (srCode) { case 0: stream.SampleRate = 48000; break; case 1: stream.SampleRate = 44100; break; case 2: stream.SampleRate = 32000; break; default: stream.SampleRate = 0; break; } if (bsid <= 10) { var fSize = frameSizeCode >> 1; if (fSize < 19) { stream.BitRate = AC3Bitrate[fSize] * 1000; } } else { stream.BitRate = (long)(4.0 * frameSize * stream.SampleRate / (numBlocks * 256)); if (stream.CoreStream != null) { stream.BitRate += stream.CoreStream.BitRate; } } stream.LFE = (int)lfeOn; if (stream.StreamType != TSStreamType.AC3_PLUS_SECONDARY_AUDIO) { if (stream.StreamType == TSStreamType.AC3_PLUS_AUDIO && bsid == 6 || stream.StreamType == TSStreamType.AC3_AUDIO) { stream.DialNorm = (int)dialNorm * -1; } else if (stream.StreamType == TSStreamType.AC3_PLUS_AUDIO && secondFrame) { stream.DialNorm = (int)dialNormExt * -1; } } stream.IsVBR = false; if (stream.StreamType == TSStreamType.AC3_PLUS_AUDIO && bsid == 6 && !secondFrame) { stream.IsInitialized = false; } else { stream.IsInitialized = true; } }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, ref string tag) { if (stream.IsInitialized) return; byte[] header = buffer.ReadBytes(4); int flags = (header[2] << 8) + header[3]; switch ((flags & 0xF000) >> 12) { case 1: // 1/0/0 stream.ChannelCount = 1; stream.LFE = 0; break; case 3: // 2/0/0 stream.ChannelCount = 2; stream.LFE = 0; break; case 4: // 3/0/0 stream.ChannelCount = 3; stream.LFE = 0; break; case 5: // 2/1/0 stream.ChannelCount = 3; stream.LFE = 0; break; case 6: // 3/1/0 stream.ChannelCount = 4; stream.LFE = 0; break; case 7: // 2/2/0 stream.ChannelCount = 4; stream.LFE = 0; break; case 8: // 3/2/0 stream.ChannelCount = 5; stream.LFE = 0; break; case 9: // 3/2/1 stream.ChannelCount = 5; stream.LFE = 1; break; case 10: // 3/4/0 stream.ChannelCount = 7; stream.LFE = 0; break; case 11: // 3/4/1 stream.ChannelCount = 7; stream.LFE = 1; break; default: stream.ChannelCount = 0; stream.LFE = 0; break; } switch ((flags & 0xC0) >> 6) { case 1: stream.BitDepth = 16; break; case 2: stream.BitDepth = 20; break; case 3: stream.BitDepth = 24; break; default: stream.BitDepth = 0; break; } switch ((flags & 0xF00) >> 8) { case 1: stream.SampleRate = 48000; break; case 4: stream.SampleRate = 96000; break; case 5: stream.SampleRate = 192000; break; default: stream.SampleRate = 0; break; } stream.BitRate = (uint) (stream.SampleRate * stream.BitDepth * (stream.ChannelCount + stream.LFE)); stream.IsVBR = false; stream.IsInitialized = true; }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, ref string tag) { if (stream.IsInitialized) return; byte[] sync = buffer.ReadBytes(2); if (sync == null || sync[0] != 0x0B || sync[1] != 0x77) { return; } int sr_code = 0; int frame_size = 0; int frame_size_code = 0; int channel_mode = 0; int lfe_on = 0; int dial_norm = 0; int num_blocks = 0; byte[] hdr = buffer.ReadBytes(4); int bsid = (hdr[3] & 0xF8) >> 3; buffer.Seek(-4, SeekOrigin.Current); if (bsid <= 10) { byte[] crc = buffer.ReadBytes(2); sr_code = buffer.ReadBits(2); frame_size_code = buffer.ReadBits(6); bsid = buffer.ReadBits(5); int bsmod = buffer.ReadBits(3); channel_mode = buffer.ReadBits(3); int cmixlev = 0; if (((channel_mode & 0x1) > 0) && (channel_mode != 0x1)) { cmixlev = buffer.ReadBits(2); } int surmixlev = 0; if ((channel_mode & 0x4) > 0) { surmixlev = buffer.ReadBits(2); } int dsurmod = 0; if (channel_mode == 0x2) { dsurmod = buffer.ReadBits(2); if (dsurmod == 0x2) { stream.AudioMode = TSAudioMode.Surround; } } lfe_on = buffer.ReadBits(1); dial_norm = buffer.ReadBits(5); int compr = 0; if (1 == buffer.ReadBits(1)) { compr = buffer.ReadBits(8); } int langcod = 0; if (1 == buffer.ReadBits(1)) { langcod = buffer.ReadBits(8); } int mixlevel = 0; int roomtyp = 0; if (1 == buffer.ReadBits(1)) { mixlevel = buffer.ReadBits(5); roomtyp = buffer.ReadBits(2); } if (channel_mode == 0) { int dialnorm2 = buffer.ReadBits(5); int compr2 = 0; if (1 == buffer.ReadBits(1)) { compr2 = buffer.ReadBits(8); } int langcod2 = 0; if (1 == buffer.ReadBits(1)) { langcod2 = buffer.ReadBits(8); } int mixlevel2 = 0; int roomtyp2 = 0; if (1 == buffer.ReadBits(1)) { mixlevel2 = buffer.ReadBits(5); roomtyp2 = buffer.ReadBits(2); } } int copyrightb = buffer.ReadBits(1); int origbs = buffer.ReadBits(1); if (bsid == 6) { if (1 == buffer.ReadBits(1)) { int dmixmod = buffer.ReadBits(2); int ltrtcmixlev = buffer.ReadBits(3); int ltrtsurmixlev = buffer.ReadBits(3); int lorocmixlev = buffer.ReadBits(3); int lorosurmixlev = buffer.ReadBits(3); } if (1 == buffer.ReadBits(1)) { int dsurexmod = buffer.ReadBits(2); int dheadphonmod = buffer.ReadBits(2); if (dheadphonmod == 0x2) { // TODO } int adconvtyp = buffer.ReadBits(1); int xbsi2 = buffer.ReadBits(8); int encinfo = buffer.ReadBits(1); if (dsurexmod == 2) { stream.AudioMode = TSAudioMode.Extended; } } } } else { int frame_type = buffer.ReadBits(2); int substreamid = buffer.ReadBits(3); frame_size = (buffer.ReadBits(11) + 1) << 1; sr_code = buffer.ReadBits(2); if (sr_code == 3) { sr_code = buffer.ReadBits(2); } else { num_blocks = buffer.ReadBits(2); } channel_mode = buffer.ReadBits(3); lfe_on = buffer.ReadBits(1); } switch (channel_mode) { case 0: // 1+1 stream.ChannelCount = 2; if (stream.AudioMode == TSAudioMode.Unknown) { stream.AudioMode = TSAudioMode.DualMono; } break; case 1: // 1/0 stream.ChannelCount = 1; break; case 2: // 2/0 stream.ChannelCount = 2; if (stream.AudioMode == TSAudioMode.Unknown) { stream.AudioMode = TSAudioMode.Stereo; } break; case 3: // 3/0 stream.ChannelCount = 3; break; case 4: // 2/1 stream.ChannelCount = 3; break; case 5: // 3/1 stream.ChannelCount = 4; break; case 6: // 2/2 stream.ChannelCount = 4; break; case 7: // 3/2 stream.ChannelCount = 5; break; default: stream.ChannelCount = 0; break; } switch (sr_code) { case 0: stream.SampleRate = 48000; break; case 1: stream.SampleRate = 44100; break; case 2: stream.SampleRate = 32000; break; default: stream.SampleRate = 0; break; } if (bsid <= 10) { switch (frame_size_code >> 1) { case 18: stream.BitRate = 640000; break; case 17: stream.BitRate = 576000; break; case 16: stream.BitRate = 512000; break; case 15: stream.BitRate = 448000; break; case 14: stream.BitRate = 384000; break; case 13: stream.BitRate = 320000; break; case 12: stream.BitRate = 256000; break; case 11: stream.BitRate = 224000; break; case 10: stream.BitRate = 192000; break; case 9: stream.BitRate = 160000; break; case 8: stream.BitRate = 128000; break; case 7: stream.BitRate = 112000; break; case 6: stream.BitRate = 96000; break; case 5: stream.BitRate = 80000; break; case 4: stream.BitRate = 64000; break; case 3: stream.BitRate = 56000; break; case 2: stream.BitRate = 48000; break; case 1: stream.BitRate = 40000; break; case 0: stream.BitRate = 32000; break; default: stream.BitRate = 0; break; } } else { stream.BitRate = (long) (4.0 * frame_size * stream.SampleRate / (num_blocks * 256)); } stream.LFE = lfe_on; if (stream.StreamType != TSStreamType.AC3_PLUS_AUDIO && stream.StreamType != TSStreamType.AC3_PLUS_SECONDARY_AUDIO) { stream.DialNorm = dial_norm - 31; } stream.IsVBR = false; stream.IsInitialized = true; }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, ref string tag) { if (stream.IsInitialized) { return; } byte[] sync = buffer.ReadBytes(2); if (sync == null || sync[0] != 0x0B || sync[1] != 0x77) { return; } int sr_code = 0; int frame_size = 0; int frame_size_code = 0; int channel_mode = 0; int lfe_on = 0; int dial_norm = 0; int num_blocks = 0; byte[] hdr = buffer.ReadBytes(4); int bsid = (hdr[3] & 0xF8) >> 3; buffer.Seek(-4, SeekOrigin.Current); if (bsid <= 10) { byte[] crc = buffer.ReadBytes(2); sr_code = buffer.ReadBits(2); frame_size_code = buffer.ReadBits(6); bsid = buffer.ReadBits(5); int bsmod = buffer.ReadBits(3); channel_mode = buffer.ReadBits(3); int cmixlev = 0; if (((channel_mode & 0x1) > 0) && (channel_mode != 0x1)) { cmixlev = buffer.ReadBits(2); } int surmixlev = 0; if ((channel_mode & 0x4) > 0) { surmixlev = buffer.ReadBits(2); } int dsurmod = 0; if (channel_mode == 0x2) { dsurmod = buffer.ReadBits(2); if (dsurmod == 0x2) { stream.AudioMode = TSAudioMode.Surround; } } lfe_on = buffer.ReadBits(1); dial_norm = buffer.ReadBits(5); int compr = 0; if (1 == buffer.ReadBits(1)) { compr = buffer.ReadBits(8); } int langcod = 0; if (1 == buffer.ReadBits(1)) { langcod = buffer.ReadBits(8); } int mixlevel = 0; int roomtyp = 0; if (1 == buffer.ReadBits(1)) { mixlevel = buffer.ReadBits(5); roomtyp = buffer.ReadBits(2); } if (channel_mode == 0) { int dialnorm2 = buffer.ReadBits(5); int compr2 = 0; if (1 == buffer.ReadBits(1)) { compr2 = buffer.ReadBits(8); } int langcod2 = 0; if (1 == buffer.ReadBits(1)) { langcod2 = buffer.ReadBits(8); } int mixlevel2 = 0; int roomtyp2 = 0; if (1 == buffer.ReadBits(1)) { mixlevel2 = buffer.ReadBits(5); roomtyp2 = buffer.ReadBits(2); } } int copyrightb = buffer.ReadBits(1); int origbs = buffer.ReadBits(1); if (bsid == 6) { if (1 == buffer.ReadBits(1)) { int dmixmod = buffer.ReadBits(2); int ltrtcmixlev = buffer.ReadBits(3); int ltrtsurmixlev = buffer.ReadBits(3); int lorocmixlev = buffer.ReadBits(3); int lorosurmixlev = buffer.ReadBits(3); } if (1 == buffer.ReadBits(1)) { int dsurexmod = buffer.ReadBits(2); int dheadphonmod = buffer.ReadBits(2); if (dheadphonmod == 0x2) { // TODO } int adconvtyp = buffer.ReadBits(1); int xbsi2 = buffer.ReadBits(8); int encinfo = buffer.ReadBits(1); if (dsurexmod == 2) { stream.AudioMode = TSAudioMode.Extended; } } } } else { int frame_type = buffer.ReadBits(2); int substreamid = buffer.ReadBits(3); frame_size = (buffer.ReadBits(11) + 1) << 1; sr_code = buffer.ReadBits(2); if (sr_code == 3) { sr_code = buffer.ReadBits(2); } else { num_blocks = buffer.ReadBits(2); } channel_mode = buffer.ReadBits(3); lfe_on = buffer.ReadBits(1); } switch (channel_mode) { case 0: // 1+1 stream.ChannelCount = 2; if (stream.AudioMode == TSAudioMode.Unknown) { stream.AudioMode = TSAudioMode.DualMono; } break; case 1: // 1/0 stream.ChannelCount = 1; break; case 2: // 2/0 stream.ChannelCount = 2; if (stream.AudioMode == TSAudioMode.Unknown) { stream.AudioMode = TSAudioMode.Stereo; } break; case 3: // 3/0 stream.ChannelCount = 3; break; case 4: // 2/1 stream.ChannelCount = 3; break; case 5: // 3/1 stream.ChannelCount = 4; break; case 6: // 2/2 stream.ChannelCount = 4; break; case 7: // 3/2 stream.ChannelCount = 5; break; default: stream.ChannelCount = 0; break; } switch (sr_code) { case 0: stream.SampleRate = 48000; break; case 1: stream.SampleRate = 44100; break; case 2: stream.SampleRate = 32000; break; default: stream.SampleRate = 0; break; } if (bsid <= 10) { switch (frame_size_code >> 1) { case 18: stream.BitRate = 640000; break; case 17: stream.BitRate = 576000; break; case 16: stream.BitRate = 512000; break; case 15: stream.BitRate = 448000; break; case 14: stream.BitRate = 384000; break; case 13: stream.BitRate = 320000; break; case 12: stream.BitRate = 256000; break; case 11: stream.BitRate = 224000; break; case 10: stream.BitRate = 192000; break; case 9: stream.BitRate = 160000; break; case 8: stream.BitRate = 128000; break; case 7: stream.BitRate = 112000; break; case 6: stream.BitRate = 96000; break; case 5: stream.BitRate = 80000; break; case 4: stream.BitRate = 64000; break; case 3: stream.BitRate = 56000; break; case 2: stream.BitRate = 48000; break; case 1: stream.BitRate = 40000; break; case 0: stream.BitRate = 32000; break; default: stream.BitRate = 0; break; } } else { stream.BitRate = (long) (4.0 * frame_size * stream.SampleRate / (num_blocks * 256)); } stream.LFE = lfe_on; if (stream.StreamType != TSStreamType.AC3_PLUS_AUDIO && stream.StreamType != TSStreamType.AC3_PLUS_SECONDARY_AUDIO) { stream.DialNorm = dial_norm - 31; } stream.IsVBR = false; stream.IsInitialized = true; }