public static void Scan( TSVideoStream stream, TSStreamBuffer buffer, ref string tag) { uint parse = 0; byte accessUnitDelimiterParse = 0; byte sequenceParameterSetParse = 0; string profile = null; string level = null; byte constraintSet0Flag = 0; byte constraintSet1Flag = 0; byte constraintSet2Flag = 0; byte constraintSet3Flag = 0; for (int i = 0; i < buffer.Length; i++) { parse = (parse << 8) + buffer.ReadByte(); if (parse == 0x00000109) { accessUnitDelimiterParse = 1; } else if (accessUnitDelimiterParse > 0) { --accessUnitDelimiterParse; if (accessUnitDelimiterParse == 0) { switch ((parse & 0xFF) >> 5) { case 0: // I case 3: // SI case 5: // I, SI tag = "I"; break; case 1: // I, P case 4: // SI, SP case 6: // I, SI, P, SP tag = "P"; break; case 2: // I, P, B case 7: // I, SI, P, SP, B tag = "B"; break; } if (stream.IsInitialized) { return; } } } else if (parse == 0x00000127 || parse == 0x00000167) { sequenceParameterSetParse = 3; } else if (sequenceParameterSetParse > 0) { --sequenceParameterSetParse; switch (sequenceParameterSetParse) { case 2: switch (parse & 0xFF) { case 66: profile = "Baseline Profile"; break; case 77: profile = "Main Profile"; break; case 88: profile = "Extended Profile"; break; case 100: profile = "High Profile"; break; case 110: profile = "High 10 Profile"; break; case 122: profile = "High 4:2:2 Profile"; break; case 144: profile = "High 4:4:4 Profile"; break; default: profile = "Unknown Profile"; break; } break; case 1: constraintSet0Flag = (byte) ((parse & 0x80) >> 7); constraintSet1Flag = (byte) ((parse & 0x40) >> 6); constraintSet2Flag = (byte) ((parse & 0x20) >> 5); constraintSet3Flag = (byte) ((parse & 0x10) >> 4); break; case 0: byte b = (byte)(parse & 0xFF); if (b == 11 && constraintSet3Flag == 1) { level = "1b"; } else { level = string.Format( "{0:D}.{1:D}", b / 10, (b - ((b / 10) * 10))); } stream.EncodingProfile = string.Format( "{0} {1}", profile, level); stream.IsVBR = true; stream.IsInitialized = true; break; } } } return; }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, long bitrate, ref string tag) { if (stream.IsInitialized && (stream.StreamType == TSStreamType.DTS_HD_SECONDARY_AUDIO || (stream.CoreStream != null && stream.CoreStream.IsInitialized))) return; bool syncFound = false; uint sync = 0; for (int i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0x64582025) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; if (stream.CoreStream == null) { stream.CoreStream = new TSAudioStream(); stream.CoreStream.StreamType = TSStreamType.DTS_AUDIO; } if (!stream.CoreStream.IsInitialized) { buffer.BeginRead(); TSCodecDTS.Scan(stream.CoreStream, buffer, bitrate, ref tag); } return; } tag = "HD"; int temp1 = buffer.ReadBits(8); int nuSubStreamIndex = buffer.ReadBits(2); int nuExtSSHeaderSize = 0; int nuExtSSFSize = 0; int bBlownUpHeader = buffer.ReadBits(1); if (1 == bBlownUpHeader) { nuExtSSHeaderSize = buffer.ReadBits(12) + 1; nuExtSSFSize = buffer.ReadBits(20) + 1; } else { nuExtSSHeaderSize = buffer.ReadBits(8) + 1; nuExtSSFSize = buffer.ReadBits(16) + 1; } int nuNumAudioPresent = 1; int nuNumAssets = 1; int bStaticFieldsPresent = buffer.ReadBits(1); if (1 == bStaticFieldsPresent) { int nuRefClockCode = buffer.ReadBits(2); int nuExSSFrameDurationCode = buffer.ReadBits(3) + 1; long nuTimeStamp = 0; if (1 == buffer.ReadBits(1)) { nuTimeStamp = (buffer.ReadBits(18) << 18) + buffer.ReadBits(18); } nuNumAudioPresent = buffer.ReadBits(3) + 1; nuNumAssets = buffer.ReadBits(3) + 1; int[] nuActiveExSSMask = new int[nuNumAudioPresent]; for (int i = 0; i < nuNumAudioPresent; i++) { nuActiveExSSMask[i] = buffer.ReadBits(nuSubStreamIndex + 1); //? } for (int i = 0; i < nuNumAudioPresent; i++) { for (int j = 0; j < nuSubStreamIndex + 1; j++) { if (((j + 1) % 2) == 1) { int mask = buffer.ReadBits(8); } } } if (1 == buffer.ReadBits(1)) { int nuMixMetadataAdjLevel = buffer.ReadBits(2); int nuBits4MixOutMask = buffer.ReadBits(2) * 4 + 4; int nuNumMixOutConfigs = buffer.ReadBits(2) + 1; int[] nuMixOutChMask = new int[nuNumMixOutConfigs]; for (int i = 0; i < nuNumMixOutConfigs; i++) { nuMixOutChMask[i] = buffer.ReadBits(nuBits4MixOutMask); } } } int[] AssetSizes = new int[nuNumAssets]; for (int i = 0; i < nuNumAssets; i++) { if (1 == bBlownUpHeader) { AssetSizes[i] = buffer.ReadBits(20) + 1; } else { AssetSizes[i] = buffer.ReadBits(16) + 1; } } for (int i = 0; i < nuNumAssets; i++) { long bufferPosition = buffer.Position; int nuAssetDescriptorFSIZE = buffer.ReadBits(9) + 1; int DescriptorDataForAssetIndex = buffer.ReadBits(3); if (1 == bStaticFieldsPresent) { int AssetTypeDescrPresent = buffer.ReadBits(1); if (1 == AssetTypeDescrPresent) { int AssetTypeDescriptor = buffer.ReadBits(4); } int LanguageDescrPresent = buffer.ReadBits(1); if (1 == LanguageDescrPresent) { int LanguageDescriptor = buffer.ReadBits(24); } int bInfoTextPresent = buffer.ReadBits(1); if (1 == bInfoTextPresent) { int nuInfoTextByteSize = buffer.ReadBits(10) + 1; int[] InfoText = new int[nuInfoTextByteSize]; for (int j = 0; j < nuInfoTextByteSize; j++) { InfoText[j] = buffer.ReadBits(8); } } int nuBitResolution = buffer.ReadBits(5) + 1; int nuMaxSampleRate = buffer.ReadBits(4); int nuTotalNumChs = buffer.ReadBits(8) + 1; int bOne2OneMapChannels2Speakers = buffer.ReadBits(1); int nuSpkrActivityMask = 0; if (1 == bOne2OneMapChannels2Speakers) { int bEmbeddedStereoFlag = 0; if (nuTotalNumChs > 2) { bEmbeddedStereoFlag = buffer.ReadBits(1); } int bEmbeddedSixChFlag = 0; if (nuTotalNumChs > 6) { bEmbeddedSixChFlag = buffer.ReadBits(1); } int bSpkrMaskEnabled = buffer.ReadBits(1); int nuNumBits4SAMask = 0; if (1 == bSpkrMaskEnabled) { nuNumBits4SAMask = buffer.ReadBits(2); nuNumBits4SAMask = nuNumBits4SAMask * 4 + 4; nuSpkrActivityMask = buffer.ReadBits(nuNumBits4SAMask); } // TODO... } stream.SampleRate = SampleRates[nuMaxSampleRate]; stream.BitDepth = nuBitResolution; stream.LFE = 0; if ((nuSpkrActivityMask & 0x8) == 0x8) { ++stream.LFE; } if ((nuSpkrActivityMask & 0x1000) == 0x1000) { ++stream.LFE; } stream.ChannelCount = nuTotalNumChs - stream.LFE; } if (nuNumAssets > 1) { // TODO... break; } } // TODO if (stream.CoreStream != null) { TSAudioStream coreStream = (TSAudioStream)stream.CoreStream; if (coreStream.AudioMode == TSAudioMode.Extended && stream.ChannelCount == 5) { stream.AudioMode = TSAudioMode.Extended; } /* if (coreStream.DialNorm != 0) { stream.DialNorm = coreStream.DialNorm; } */ } if (stream.StreamType == TSStreamType.DTS_HD_MASTER_AUDIO) { stream.IsVBR = true; stream.IsInitialized = true; } else if (bitrate > 0) { stream.IsVBR = false; stream.BitRate = bitrate; if (stream.CoreStream != null) { stream.BitRate += stream.CoreStream.BitRate; stream.IsInitialized = true; } stream.IsInitialized = (stream.BitRate > 0 ? true : false); } }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, long bitrate, ref string tag) { if (stream.IsInitialized) { return; } bool syncFound = false; uint sync = 0; for (int i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0x7FFE8001) { syncFound = true; break; } } if (!syncFound) { return; } int frame_type = buffer.ReadBits(1); int samples_deficit = buffer.ReadBits(5); int crc_present = buffer.ReadBits(1); int sample_blocks = buffer.ReadBits(7); int frame_size = buffer.ReadBits(14); if (frame_size < 95) { return; } int amode = buffer.ReadBits(6); int sample_rate = buffer.ReadBits(4); if (sample_rate < 0 || sample_rate >= dca_sample_rates.Length) { return; } int bit_rate = buffer.ReadBits(5); if (bit_rate < 0 || bit_rate >= dca_bit_rates.Length) { return; } int downmix = buffer.ReadBits(1); int dynrange = buffer.ReadBits(1); int timestamp = buffer.ReadBits(1); int aux_data = buffer.ReadBits(1); int hdcd = buffer.ReadBits(1); int ext_descr = buffer.ReadBits(3); int ext_coding = buffer.ReadBits(1); int aspf = buffer.ReadBits(1); int lfe = buffer.ReadBits(2); int predictor_history = buffer.ReadBits(1); if (crc_present == 1) { int crc = buffer.ReadBits(16); } int multirate_inter = buffer.ReadBits(1); int version = buffer.ReadBits(4); int copy_history = buffer.ReadBits(2); int source_pcm_res = buffer.ReadBits(3); int front_sum = buffer.ReadBits(1); int surround_sum = buffer.ReadBits(1); int dialog_norm = buffer.ReadBits(4); if (source_pcm_res < 0 || source_pcm_res >= dca_bits_per_sample.Length) { return; } int subframes = buffer.ReadBits(4); int total_channels = buffer.ReadBits(3) + 1 + ext_coding; stream.SampleRate = dca_sample_rates[sample_rate]; stream.ChannelCount = total_channels; stream.LFE = (lfe > 0 ? 1 : 0); stream.BitDepth = dca_bits_per_sample[source_pcm_res]; stream.DialNorm = -dialog_norm; if ((source_pcm_res & 0x1) == 0x1) { stream.AudioMode = TSAudioMode.Extended; } stream.BitRate = (uint)dca_bit_rates[bit_rate]; switch (stream.BitRate) { case 1: if (bitrate > 0) { stream.BitRate = bitrate; stream.IsVBR = false; stream.IsInitialized = true; } else { stream.BitRate = 0; } break; case 2: case 3: stream.IsVBR = true; stream.IsInitialized = true; break; default: stream.IsVBR = false; stream.IsInitialized = true; break; } }
public static void Scan( TSVideoStream stream, TSStreamBuffer buffer, ref string tag) { int parse = 0; byte frameHeaderParse = 0; byte sequenceHeaderParse = 0; bool isInterlaced = false; for (int i = 0; i < buffer.Length; i++) { parse = (parse << 8) + buffer.ReadByte(); if (parse == 0x0000010D) { frameHeaderParse = 4; } else if (frameHeaderParse > 0) { --frameHeaderParse; if (frameHeaderParse == 0) { uint pictureType = 0; if (isInterlaced) { if ((parse & 0x80000000) == 0) { pictureType = (uint)((parse & 0x78000000) >> 13); } else { pictureType = (uint)((parse & 0x3c000000) >> 12); } } else { pictureType = (uint)((parse & 0xf0000000) >> 14); } if ((pictureType & 0x20000) == 0) { tag = "P"; } else if ((pictureType & 0x10000) == 0) { tag = "B"; } else if ((pictureType & 0x8000) == 0) { tag = "I"; } else if ((pictureType & 0x4000) == 0) { tag = "BI"; } else { tag = null; } if (stream.IsInitialized) { return; } } } else if (parse == 0x0000010F) { sequenceHeaderParse = 6; } else if (sequenceHeaderParse > 0) { --sequenceHeaderParse; switch (sequenceHeaderParse) { case 5: int profileLevel = ((parse & 0x38) >> 3); if (((parse & 0xC0) >> 6) == 3) { stream.EncodingProfile = string.Format( "Advanced Profile {0}", profileLevel); } else { stream.EncodingProfile = string.Format( "Main Profile {0}", profileLevel); } break; case 0: if (((parse & 0x40) >> 6) > 0) { isInterlaced = true; } else { isInterlaced = false; } break; } stream.IsVBR = true; stream.IsInitialized = true; } } }
public void Scan(TSAudioStream stream, TSStreamBuffer buffer, ref string tag, long?bitrate) { if (stream.IsInitialized && (stream.StreamType == TSStreamType.DTS_HD_SECONDARY_AUDIO || stream.CoreStream != null && stream.CoreStream.IsInitialized)) { return; } var syncFound = false; uint sync = 0; for (var i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0x64582025) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; if (stream.CoreStream == null) { stream.CoreStream = new TSAudioStream { StreamType = TSStreamType.DTS_AUDIO } } ; if (!stream.CoreStream.IsInitialized) { buffer.BeginRead(); (new TSCodecDTS()).Scan(stream.CoreStream, buffer, ref tag, bitrate); } return; } tag = "HD"; buffer.BSSkipBits(8); var nuSubStreamIndex = buffer.ReadBits4(2); var bBlownUpHeader = buffer.ReadBool(); buffer.BSSkipBits(bBlownUpHeader ? 32 : 24); var nuNumAssets = 1; var bStaticFieldsPresent = buffer.ReadBool(); if (bStaticFieldsPresent) { buffer.BSSkipBits(5); if (buffer.ReadBool()) { buffer.BSSkipBits(36); } var nuNumAudioPresent = buffer.ReadBits2(3) + 1; nuNumAssets = buffer.ReadBits2(3) + 1; var nuActiveExSsMask = new uint[nuNumAudioPresent]; for (var i = 0; i < nuNumAudioPresent; i++) { nuActiveExSsMask[i] = buffer.ReadBits4((int)(nuSubStreamIndex + 1)); //? } for (var i = 0; i < nuNumAudioPresent; i++) { for (var j = 0; j < nuSubStreamIndex + 1; j++) { if ((j + 1) % 2 == 1) { buffer.BSSkipBits(8); } } } if (buffer.ReadBool()) { buffer.BSSkipBits(2); var nuBits4MixOutMask = buffer.ReadBits2(2) * 4 + 4; var nuNumMixOutConfigs = buffer.ReadBits2(2) + 1; var nuMixOutChMask = new uint[nuNumMixOutConfigs]; for (var i = 0; i < nuNumMixOutConfigs; i++) { nuMixOutChMask[i] = buffer.ReadBits4(nuBits4MixOutMask); } } } var assetSizes = new uint[nuNumAssets]; for (var i = 0; i < nuNumAssets; i++) { if (bBlownUpHeader) { assetSizes[i] = buffer.ReadBits4(20) + 1; } else { assetSizes[i] = buffer.ReadBits4(16) + 1; } } for (var i = 0; i < nuNumAssets; i++) { buffer.BSSkipBits(12); if (bStaticFieldsPresent) { if (buffer.ReadBool()) { buffer.BSSkipBits(4); } if (buffer.ReadBool()) { buffer.BSSkipBits(24); } if (buffer.ReadBool()) { var nuInfoTextByteSize = buffer.ReadBits2(10) + 1; var infoText = new ushort[nuInfoTextByteSize]; for (var j = 0; j < nuInfoTextByteSize; j++) { infoText[j] = buffer.ReadBits2(8); } } var nuBitResolution = buffer.ReadBits2(5) + 1; int nuMaxSampleRate = buffer.ReadBits2(4); var nuTotalNumChs = buffer.ReadBits2(8) + 1; uint nuSpkrActivityMask = 0; if (buffer.ReadBool()) { if (nuTotalNumChs > 2) { buffer.BSSkipBits(1); } if (nuTotalNumChs > 6) { buffer.BSSkipBits(1); } if (buffer.ReadBool()) { int nuNumBits4SAMask = buffer.ReadBits2(2); nuNumBits4SAMask = nuNumBits4SAMask * 4 + 4; nuSpkrActivityMask = buffer.ReadBits4(nuNumBits4SAMask); } // TODO... } stream.SampleRate = SampleRates[nuMaxSampleRate]; stream.BitDepth = nuBitResolution; stream.LFE = 0; if ((nuSpkrActivityMask & 0x8) == 0x8) { ++stream.LFE; } if ((nuSpkrActivityMask & 0x1000) == 0x1000) { ++stream.LFE; } stream.ChannelCount = nuTotalNumChs - stream.LFE; } if (nuNumAssets > 1) { // TODO... break; } } uint temp2 = 0; while (buffer.Position < buffer.Length) { temp2 = (temp2 << 8) + buffer.ReadByte(); switch (temp2) { case 0x41A29547: // XLL Extended data case 0x655E315E: // XBR Extended data case 0x0A801921: // XSA Extended data case 0x1D95F262: // X96k case 0x47004A03: // XXch case 0x5A5A5A5A: // Xch var temp3 = 0; for (var i = (int)buffer.Position; i < buffer.Length; i++) { temp3 = (temp3 << 8) + buffer.ReadByte(); if (temp3 == 0x02000850) //DTS:X Pattern { stream.HasExtensions = true; break; } } break; } if (stream.HasExtensions) { break; } } // TODO if (stream.CoreStream != null) { var coreStream = stream.CoreStream; if (coreStream.AudioMode == TSAudioMode.Extended && stream.ChannelCount == 5) { stream.AudioMode = TSAudioMode.Extended; } /* * if (coreStream.DialNorm != 0) * { * stream.DialNorm = coreStream.DialNorm; * } */ } if (stream.StreamType == TSStreamType.DTS_HD_MASTER_AUDIO) { stream.IsVBR = true; stream.IsInitialized = true; } else if (bitrate.HasValue && bitrate > 0) { stream.IsVBR = false; stream.BitRate = bitrate.Value; if (stream.CoreStream != null) { stream.BitRate += stream.CoreStream.BitRate; stream.IsInitialized = true; } stream.IsInitialized = stream.BitRate > 0; } } }
public static void Scan( TSVideoStream stream, TSStreamBuffer buffer, ref string tag) { int parse = 0; int pictureParse = 0; int sequenceHeaderParse = 0; int extensionParse = 0; int sequenceExtensionParse = 0; for (int i = 0; i < buffer.Length; i++) { parse = (parse << 8) + buffer.ReadByte(); if (parse == 0x00000100) { pictureParse = 2; } else if (parse == 0x000001B3) { sequenceHeaderParse = 7; } else if (sequenceHeaderParse > 0) { --sequenceHeaderParse; switch (sequenceHeaderParse) { #if DEBUG case 6: break; case 5: break; case 4: stream.Width = (int)((parse & 0xFFF000) >> 12); stream.Height = (int)(parse & 0xFFF); break; case 3: stream.AspectRatio = (TSAspectRatio)((parse & 0xF0) >> 4); switch ((parse & 0xF0) >> 4) { case 0: // Forbidden break; case 1: // Square break; case 2: // 4:3 break; case 3: // 16:9 break; case 4: // 2.21:1 break; default: // Reserved break; } switch (parse & 0xF) { case 0: // Forbidden break; case 1: // 23.976 stream.FrameRateEnumerator = 24000; stream.FrameRateDenominator = 1001; break; case 2: // 24 stream.FrameRateEnumerator = 24000; stream.FrameRateDenominator = 1000; break; case 3: // 25 stream.FrameRateEnumerator = 25000; stream.FrameRateDenominator = 1000; break; case 4: // 29.97 stream.FrameRateEnumerator = 30000; stream.FrameRateDenominator = 1001; break; case 5: // 30 stream.FrameRateEnumerator = 30000; stream.FrameRateDenominator = 1000; break; case 6: // 50 stream.FrameRateEnumerator = 50000; stream.FrameRateDenominator = 1000; break; case 7: // 59.94 stream.FrameRateEnumerator = 60000; stream.FrameRateDenominator = 1001; break; case 8: // 60 stream.FrameRateEnumerator = 60000; stream.FrameRateDenominator = 1000; break; default: // Reserved stream.FrameRateEnumerator = 0; stream.FrameRateDenominator = 0; break; } break; case 2: break; case 1: break; #endif case 0: #if DEBUG stream.BitRate = (((parse & 0xFFFFC0) >> 6) * 200); #endif stream.IsVBR = true; stream.IsInitialized = true; break; } } else if (pictureParse > 0) { --pictureParse; if (pictureParse == 0) { switch ((parse & 0x38) >> 3) { case 1: tag = "I"; break; case 2: tag = "P"; break; case 3: tag = "B"; break; default: break; } if (stream.IsInitialized) return; } } else if (parse == 0x000001B5) { extensionParse = 1; } else if (extensionParse > 0) { --extensionParse; if (extensionParse == 0) { if ((parse & 0xF0) == 0x10) { sequenceExtensionParse = 1; } } } else if (sequenceExtensionParse > 0) { --sequenceExtensionParse; #if DEBUG if (sequenceExtensionParse == 0) { uint sequenceExtension = ((parse & 0x8) >> 3); if (sequenceExtension == 0) { stream.IsInterlaced = true; } else { stream.IsInterlaced = false; } } #endif } } }
public static void Scan( TSVideoStream stream, TSStreamBuffer buffer, ref string tag) { uint parse = 0; byte accessUnitDelimiterParse = 0; byte sequenceParameterSetParse = 0; string profile = null; string level = null; byte constraintSet0Flag = 0; byte constraintSet1Flag = 0; byte constraintSet2Flag = 0; byte constraintSet3Flag = 0; for (int i = 0; i < buffer.Length; i++) { parse = (parse << 8) + buffer.ReadByte(); if (parse == 0x00000109) { accessUnitDelimiterParse = 1; } else if (accessUnitDelimiterParse > 0) { --accessUnitDelimiterParse; if (accessUnitDelimiterParse == 0) { switch ((parse & 0xFF) >> 5) { case 0: // I case 3: // SI case 5: // I, SI tag = "I"; break; case 1: // I, P case 4: // SI, SP case 6: // I, SI, P, SP tag = "P"; break; case 2: // I, P, B case 7: // I, SI, P, SP, B tag = "B"; break; } if (stream.IsInitialized) return; } } else if (parse == 0x00000127 || parse == 0x00000167) { sequenceParameterSetParse = 3; } else if (sequenceParameterSetParse > 0) { --sequenceParameterSetParse; switch (sequenceParameterSetParse) { case 2: switch (parse & 0xFF) { case 66: profile = "Baseline Profile"; break; case 77: profile = "Main Profile"; break; case 88: profile = "Extended Profile"; break; case 100: profile = "High Profile"; break; case 110: profile = "High 10 Profile"; break; case 122: profile = "High 4:2:2 Profile"; break; case 144: profile = "High 4:4:4 Profile"; break; default: profile = "Unknown Profile"; break; } break; case 1: constraintSet0Flag = (byte) ((parse & 0x80) >> 7); constraintSet1Flag = (byte) ((parse & 0x40) >> 6); constraintSet2Flag = (byte) ((parse & 0x20) >> 5); constraintSet3Flag = (byte) ((parse & 0x10) >> 4); break; case 0: byte b = (byte)(parse & 0xFF); if (b == 11 && constraintSet3Flag == 1) { level = "1b"; } else { level = string.Format( "{0:D}.{1:D}", b / 10, (b - ((b / 10) * 10))); } stream.EncodingProfile = string.Format( "{0} {1}", profile, level); stream.IsVBR = true; stream.IsInitialized = true; break; } } } return; }
public static void Scan( TSVideoStream stream, TSStreamBuffer buffer, ref string tag) { int parse = 0; int pictureParse = 0; int sequenceHeaderParse = 0; int extensionParse = 0; int sequenceExtensionParse = 0; for (int i = 0; i < buffer.Length; i++) { parse = (parse << 8) + buffer.ReadByte(); if (parse == 0x00000100) { pictureParse = 2; } else if (parse == 0x000001B3) { sequenceHeaderParse = 7; } else if (sequenceHeaderParse > 0) { --sequenceHeaderParse; switch (sequenceHeaderParse) { #if DEBUG case 6: break; case 5: break; case 4: stream.Width = (int)((parse & 0xFFF000) >> 12); stream.Height = (int)(parse & 0xFFF); break; case 3: stream.AspectRatio = (TSAspectRatio)((parse & 0xF0) >> 4); switch ((parse & 0xF0) >> 4) { case 0: // Forbidden break; case 1: // Square break; case 2: // 4:3 break; case 3: // 16:9 break; case 4: // 2.21:1 break; default: // Reserved break; } switch (parse & 0xF) { case 0: // Forbidden break; case 1: // 23.976 stream.FrameRateEnumerator = 24000; stream.FrameRateDenominator = 1001; break; case 2: // 24 stream.FrameRateEnumerator = 24000; stream.FrameRateDenominator = 1000; break; case 3: // 25 stream.FrameRateEnumerator = 25000; stream.FrameRateDenominator = 1000; break; case 4: // 29.97 stream.FrameRateEnumerator = 30000; stream.FrameRateDenominator = 1001; break; case 5: // 30 stream.FrameRateEnumerator = 30000; stream.FrameRateDenominator = 1000; break; case 6: // 50 stream.FrameRateEnumerator = 50000; stream.FrameRateDenominator = 1000; break; case 7: // 59.94 stream.FrameRateEnumerator = 60000; stream.FrameRateDenominator = 1001; break; case 8: // 60 stream.FrameRateEnumerator = 60000; stream.FrameRateDenominator = 1000; break; default: // Reserved stream.FrameRateEnumerator = 0; stream.FrameRateDenominator = 0; break; } break; case 2: break; case 1: break; #endif case 0: #if DEBUG stream.BitRate = (((parse & 0xFFFFC0) >> 6) * 200); #endif stream.IsVBR = true; stream.IsInitialized = true; break; } } else if (pictureParse > 0) { --pictureParse; if (pictureParse == 0) { switch ((parse & 0x38) >> 3) { case 1: tag = "I"; break; case 2: tag = "P"; break; case 3: tag = "B"; break; default: break; } if (stream.IsInitialized) { return; } } } else if (parse == 0x000001B5) { extensionParse = 1; } else if (extensionParse > 0) { --extensionParse; if (extensionParse == 0) { if ((parse & 0xF0) == 0x10) { sequenceExtensionParse = 1; } } } else if (sequenceExtensionParse > 0) { --sequenceExtensionParse; #if DEBUG if (sequenceExtensionParse == 0) { uint sequenceExtension = ((parse & 0x8) >> 3); if (sequenceExtension == 0) { stream.IsInterlaced = true; } else { stream.IsInterlaced = false; } } #endif } } }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, ref string tag) { if (stream.IsInitialized && stream.CoreStream != null && stream.CoreStream.IsInitialized) { return; } bool syncFound = false; uint sync = 0; for (int i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0xF8726FBA) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; if (stream.CoreStream == null) { stream.CoreStream = new TSAudioStream(); stream.CoreStream.StreamType = TSStreamType.AC3_AUDIO; } if (!stream.CoreStream.IsInitialized) { buffer.BeginRead(); TSCodecAC3.Scan(stream.CoreStream, buffer, ref tag); } return; } tag = "HD"; int ratebits = buffer.ReadBits(4); if (ratebits != 0xF) { stream.SampleRate = (((ratebits & 8) > 0 ? 44100 : 48000) << (ratebits & 7)); } int temp1 = buffer.ReadBits(8); int channels_thd_stream1 = buffer.ReadBits(5); int temp2 = buffer.ReadBits(2); stream.ChannelCount = 0; stream.LFE = 0; int c_LFE2 = buffer.ReadBits(1); if (c_LFE2 == 1) { stream.LFE += 1; } int c_Cvh = buffer.ReadBits(1); if (c_Cvh == 1) { stream.ChannelCount += 1; } int c_LRw = buffer.ReadBits(1); if (c_LRw == 1) { stream.ChannelCount += 2; } int c_LRsd = buffer.ReadBits(1); if (c_LRsd == 1) { stream.ChannelCount += 2; } int c_Ts = buffer.ReadBits(1); if (c_Ts == 1) { stream.ChannelCount += 1; } int c_Cs = buffer.ReadBits(1); if (c_Cs == 1) { stream.ChannelCount += 1; } int c_LRrs = buffer.ReadBits(1); if (c_LRrs == 1) { stream.ChannelCount += 2; } int c_LRc = buffer.ReadBits(1); if (c_LRc == 1) { stream.ChannelCount += 2; } int c_LRvh = buffer.ReadBits(1); if (c_LRvh == 1) { stream.ChannelCount += 2; } int c_LRs = buffer.ReadBits(1); if (c_LRs == 1) { stream.ChannelCount += 2; } int c_LFE = buffer.ReadBits(1); if (c_LFE == 1) { stream.LFE += 1; } int c_C = buffer.ReadBits(1); if (c_C == 1) { stream.ChannelCount += 1; } int c_LR = buffer.ReadBits(1); if (c_LR == 1) { stream.ChannelCount += 2; } int access_unit_size = 40 << (ratebits & 7); int access_unit_size_pow2 = 64 << (ratebits & 7); int a1 = buffer.ReadBits(16); int a2 = buffer.ReadBits(16); int a3 = buffer.ReadBits(16); int is_vbr = buffer.ReadBits(1); int peak_bitrate = buffer.ReadBits(15); peak_bitrate = (peak_bitrate * stream.SampleRate) >> 4; double peak_bitdepth = (double)peak_bitrate / (stream.ChannelCount + stream.LFE) / stream.SampleRate; if (peak_bitdepth > 14) { stream.BitDepth = 24; } else { stream.BitDepth = 16; } #if DEBUG System.Diagnostics.Debug.WriteLine(string.Format( "{0}\t{1}\t{2:F2}", stream.PID, peak_bitrate, peak_bitdepth)); #endif /* * // TODO: Get THD dialnorm from metadata * if (stream.CoreStream != null) * { * TSAudioStream coreStream = (TSAudioStream)stream.CoreStream; * if (coreStream.DialNorm != 0) * { * stream.DialNorm = coreStream.DialNorm; * } * } */ stream.IsVBR = true; stream.IsInitialized = true; }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, long bitrate, ref string tag) { if (stream.IsInitialized && (stream.StreamType == TSStreamType.DTS_HD_SECONDARY_AUDIO || (stream.CoreStream != null && stream.CoreStream.IsInitialized))) { return; } bool syncFound = false; uint sync = 0; for (int i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0x64582025) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; if (stream.CoreStream == null) { stream.CoreStream = new TSAudioStream(); stream.CoreStream.StreamType = TSStreamType.DTS_AUDIO; } if (!stream.CoreStream.IsInitialized) { buffer.BeginRead(); TSCodecDTS.Scan(stream.CoreStream, buffer, bitrate, ref tag); } return; } tag = "HD"; int temp1 = buffer.ReadBits(8); int nuSubStreamIndex = buffer.ReadBits(2); int nuExtSSHeaderSize = 0; int nuExtSSFSize = 0; int bBlownUpHeader = buffer.ReadBits(1); if (1 == bBlownUpHeader) { nuExtSSHeaderSize = buffer.ReadBits(12) + 1; nuExtSSFSize = buffer.ReadBits(20) + 1; } else { nuExtSSHeaderSize = buffer.ReadBits(8) + 1; nuExtSSFSize = buffer.ReadBits(16) + 1; } int nuNumAudioPresent = 1; int nuNumAssets = 1; int bStaticFieldsPresent = buffer.ReadBits(1); if (1 == bStaticFieldsPresent) { int nuRefClockCode = buffer.ReadBits(2); int nuExSSFrameDurationCode = buffer.ReadBits(3) + 1; long nuTimeStamp = 0; if (1 == buffer.ReadBits(1)) { nuTimeStamp = (buffer.ReadBits(18) << 18) + buffer.ReadBits(18); } nuNumAudioPresent = buffer.ReadBits(3) + 1; nuNumAssets = buffer.ReadBits(3) + 1; int[] nuActiveExSSMask = new int[nuNumAudioPresent]; for (int i = 0; i < nuNumAudioPresent; i++) { nuActiveExSSMask[i] = buffer.ReadBits(nuSubStreamIndex + 1); //? } for (int i = 0; i < nuNumAudioPresent; i++) { for (int j = 0; j < nuSubStreamIndex + 1; j++) { if (((j + 1) % 2) == 1) { int mask = buffer.ReadBits(8); } } } if (1 == buffer.ReadBits(1)) { int nuMixMetadataAdjLevel = buffer.ReadBits(2); int nuBits4MixOutMask = buffer.ReadBits(2) * 4 + 4; int nuNumMixOutConfigs = buffer.ReadBits(2) + 1; int[] nuMixOutChMask = new int[nuNumMixOutConfigs]; for (int i = 0; i < nuNumMixOutConfigs; i++) { nuMixOutChMask[i] = buffer.ReadBits(nuBits4MixOutMask); } } } int[] AssetSizes = new int[nuNumAssets]; for (int i = 0; i < nuNumAssets; i++) { if (1 == bBlownUpHeader) { AssetSizes[i] = buffer.ReadBits(20) + 1; } else { AssetSizes[i] = buffer.ReadBits(16) + 1; } } for (int i = 0; i < nuNumAssets; i++) { long bufferPosition = buffer.Position; int nuAssetDescriptorFSIZE = buffer.ReadBits(9) + 1; int DescriptorDataForAssetIndex = buffer.ReadBits(3); if (1 == bStaticFieldsPresent) { int AssetTypeDescrPresent = buffer.ReadBits(1); if (1 == AssetTypeDescrPresent) { int AssetTypeDescriptor = buffer.ReadBits(4); } int LanguageDescrPresent = buffer.ReadBits(1); if (1 == LanguageDescrPresent) { int LanguageDescriptor = buffer.ReadBits(24); } int bInfoTextPresent = buffer.ReadBits(1); if (1 == bInfoTextPresent) { int nuInfoTextByteSize = buffer.ReadBits(10) + 1; int[] InfoText = new int[nuInfoTextByteSize]; for (int j = 0; j < nuInfoTextByteSize; j++) { InfoText[j] = buffer.ReadBits(8); } } int nuBitResolution = buffer.ReadBits(5) + 1; int nuMaxSampleRate = buffer.ReadBits(4); int nuTotalNumChs = buffer.ReadBits(8) + 1; int bOne2OneMapChannels2Speakers = buffer.ReadBits(1); int nuSpkrActivityMask = 0; if (1 == bOne2OneMapChannels2Speakers) { int bEmbeddedStereoFlag = 0; if (nuTotalNumChs > 2) { bEmbeddedStereoFlag = buffer.ReadBits(1); } int bEmbeddedSixChFlag = 0; if (nuTotalNumChs > 6) { bEmbeddedSixChFlag = buffer.ReadBits(1); } int bSpkrMaskEnabled = buffer.ReadBits(1); int nuNumBits4SAMask = 0; if (1 == bSpkrMaskEnabled) { nuNumBits4SAMask = buffer.ReadBits(2); nuNumBits4SAMask = nuNumBits4SAMask * 4 + 4; nuSpkrActivityMask = buffer.ReadBits(nuNumBits4SAMask); } // TODO... } stream.SampleRate = SampleRates[nuMaxSampleRate]; stream.BitDepth = nuBitResolution; stream.LFE = 0; if ((nuSpkrActivityMask & 0x8) == 0x8) { ++stream.LFE; } if ((nuSpkrActivityMask & 0x1000) == 0x1000) { ++stream.LFE; } stream.ChannelCount = nuTotalNumChs - stream.LFE; } if (nuNumAssets > 1) { // TODO... break; } } // TODO if (stream.CoreStream != null) { TSAudioStream coreStream = (TSAudioStream)stream.CoreStream; if (coreStream.AudioMode == TSAudioMode.Extended && stream.ChannelCount == 5) { stream.AudioMode = TSAudioMode.Extended; } /* * if (coreStream.DialNorm != 0) * { * stream.DialNorm = coreStream.DialNorm; * } */ } if (stream.StreamType == TSStreamType.DTS_HD_MASTER_AUDIO) { stream.IsVBR = true; stream.IsInitialized = true; } else if (bitrate > 0) { stream.IsVBR = false; stream.BitRate = bitrate; if (stream.CoreStream != null) { stream.BitRate += stream.CoreStream.BitRate; stream.IsInitialized = true; } stream.IsInitialized = (stream.BitRate > 0 ? true : false); } }
public void Scan(TSVideoStream stream, TSStreamBuffer buffer, ref string tag) { var parse = 0; byte frameHeaderParse = 0; byte sequenceHeaderParse = 0; var isInterlaced = false; for (var i = 0; i < buffer.Length; i++) { parse = (parse << 8) + buffer.ReadByte(); if (parse == 0x0000010D) { frameHeaderParse = 4; } else if (frameHeaderParse > 0) { --frameHeaderParse; if (frameHeaderParse != 0) { continue; } uint pictureType = 0; if (isInterlaced) { if ((parse & 0x80000000) == 0) { pictureType = (uint)((parse & 0x78000000) >> 13); } else { pictureType = (uint)((parse & 0x3c000000) >> 12); } } else { pictureType = (uint)((parse & 0xf0000000) >> 14); } if ((pictureType & 0x20000) == 0) { tag = "P"; } else if ((pictureType & 0x10000) == 0) { tag = "B"; } else if ((pictureType & 0x8000) == 0) { tag = "I"; } else if ((pictureType & 0x4000) == 0) { tag = "BI"; } else { tag = null; } if (stream.IsInitialized) { return; } } else if (parse == 0x0000010F) { sequenceHeaderParse = 6; } else if (sequenceHeaderParse > 0) { --sequenceHeaderParse; switch (sequenceHeaderParse) { case 5: var profileLevel = (parse & 0x38) >> 3; stream.EncodingProfile = (parse & 0xC0) >> 6 == 3 ? $"Advanced Profile {profileLevel}" : $"Main Profile {profileLevel}"; break; case 0: isInterlaced = (parse & 0x40) >> 6 > 0; break; } stream.IsVBR = true; stream.IsInitialized = true; } } }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, ref string tag) { if (stream.IsInitialized && stream.CoreStream != null && stream.CoreStream.IsInitialized) return; bool syncFound = false; uint sync = 0; for (int i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0xF8726FBA) { syncFound = true; break; } } if (!syncFound) { tag = "CORE"; if (stream.CoreStream == null) { stream.CoreStream = new TSAudioStream(); stream.CoreStream.StreamType = TSStreamType.AC3_AUDIO; } if (!stream.CoreStream.IsInitialized) { buffer.BeginRead(); TSCodecAC3.Scan(stream.CoreStream, buffer, ref tag); } return; } tag = "HD"; int ratebits = buffer.ReadBits(4); if (ratebits != 0xF) { stream.SampleRate = (((ratebits & 8) > 0 ? 44100 : 48000) << (ratebits & 7)); } int temp1 = buffer.ReadBits(8); int channels_thd_stream1 = buffer.ReadBits(5); int temp2 = buffer.ReadBits(2); stream.ChannelCount = 0; stream.LFE = 0; int c_LFE2 = buffer.ReadBits(1); if (c_LFE2 == 1) { stream.LFE += 1; } int c_Cvh = buffer.ReadBits(1); if (c_Cvh == 1) { stream.ChannelCount += 1; } int c_LRw = buffer.ReadBits(1); if (c_LRw == 1) { stream.ChannelCount += 2; } int c_LRsd = buffer.ReadBits(1); if (c_LRsd == 1) { stream.ChannelCount += 2; } int c_Ts = buffer.ReadBits(1); if (c_Ts == 1) { stream.ChannelCount += 1; } int c_Cs = buffer.ReadBits(1); if (c_Cs == 1) { stream.ChannelCount += 1; } int c_LRrs = buffer.ReadBits(1); if (c_LRrs == 1) { stream.ChannelCount += 2; } int c_LRc = buffer.ReadBits(1); if (c_LRc == 1) { stream.ChannelCount += 2; } int c_LRvh = buffer.ReadBits(1); if (c_LRvh == 1) { stream.ChannelCount += 2; } int c_LRs = buffer.ReadBits(1); if (c_LRs == 1) { stream.ChannelCount += 2; } int c_LFE = buffer.ReadBits(1); if (c_LFE == 1) { stream.LFE += 1; } int c_C = buffer.ReadBits(1); if (c_C == 1) { stream.ChannelCount += 1; } int c_LR = buffer.ReadBits(1); if (c_LR == 1) { stream.ChannelCount += 2; } int access_unit_size = 40 << (ratebits & 7); int access_unit_size_pow2 = 64 << (ratebits & 7); int a1 = buffer.ReadBits(16); int a2 = buffer.ReadBits(16); int a3 = buffer.ReadBits(16); int is_vbr = buffer.ReadBits(1); int peak_bitrate = buffer.ReadBits(15); peak_bitrate = (peak_bitrate * stream.SampleRate) >> 4; double peak_bitdepth = (double)peak_bitrate / (stream.ChannelCount + stream.LFE) / stream.SampleRate; if (peak_bitdepth > 14) { stream.BitDepth = 24; } else { stream.BitDepth = 16; } #if DEBUG System.Diagnostics.Debug.WriteLine(string.Format( "{0}\t{1}\t{2:F2}", stream.PID, peak_bitrate, peak_bitdepth)); #endif /* // TODO: Get THD dialnorm from metadata if (stream.CoreStream != null) { TSAudioStream coreStream = (TSAudioStream)stream.CoreStream; if (coreStream.DialNorm != 0) { stream.DialNorm = coreStream.DialNorm; } } */ stream.IsVBR = true; stream.IsInitialized = true; }
public static void Scan( TSAudioStream stream, TSStreamBuffer buffer, long bitrate, ref string tag) { if (stream.IsInitialized) return; bool syncFound = false; uint sync = 0; for (int i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0x7FFE8001) { syncFound = true; break; } } if (!syncFound) return; int frame_type = buffer.ReadBits(1); int samples_deficit = buffer.ReadBits(5); int crc_present = buffer.ReadBits(1); int sample_blocks = buffer.ReadBits(7); int frame_size = buffer.ReadBits(14); if (frame_size < 95) { return; } int amode = buffer.ReadBits(6); int sample_rate = buffer.ReadBits(4); if (sample_rate < 0 || sample_rate >= dca_sample_rates.Length) { return; } int bit_rate = buffer.ReadBits(5); if (bit_rate < 0 || bit_rate >= dca_bit_rates.Length) { return; } int downmix = buffer.ReadBits(1); int dynrange = buffer.ReadBits(1); int timestamp = buffer.ReadBits(1); int aux_data = buffer.ReadBits(1); int hdcd = buffer.ReadBits(1); int ext_descr = buffer.ReadBits(3); int ext_coding = buffer.ReadBits(1); int aspf = buffer.ReadBits(1); int lfe = buffer.ReadBits(2); int predictor_history = buffer.ReadBits(1); if (crc_present == 1) { int crc = buffer.ReadBits(16); } int multirate_inter = buffer.ReadBits(1); int version = buffer.ReadBits(4); int copy_history = buffer.ReadBits(2); int source_pcm_res = buffer.ReadBits(3); int front_sum = buffer.ReadBits(1); int surround_sum = buffer.ReadBits(1); int dialog_norm = buffer.ReadBits(4); if (source_pcm_res < 0 || source_pcm_res >= dca_bits_per_sample.Length) { return; } int subframes = buffer.ReadBits(4); int total_channels = buffer.ReadBits(3) + 1 + ext_coding; stream.SampleRate = dca_sample_rates[sample_rate]; stream.ChannelCount = total_channels; stream.LFE = (lfe > 0 ? 1 : 0); stream.BitDepth = dca_bits_per_sample[source_pcm_res]; stream.DialNorm = -dialog_norm; if ((source_pcm_res & 0x1) == 0x1) { stream.AudioMode = TSAudioMode.Extended; } stream.BitRate = (uint)dca_bit_rates[bit_rate]; switch (stream.BitRate) { case 1: if (bitrate > 0) { stream.BitRate = bitrate; stream.IsVBR = false; stream.IsInitialized = true; } else { stream.BitRate = 0; } break; case 2: case 3: stream.IsVBR = true; stream.IsInitialized = true; break; default: stream.IsVBR = false; stream.IsInitialized = true; break; } }
public static void Scan( TSVideoStream stream, TSStreamBuffer buffer, ref string tag) { int parse = 0; byte frameHeaderParse = 0; byte sequenceHeaderParse = 0; bool isInterlaced = false; for (int i = 0; i < buffer.Length; i++) { parse = (parse << 8) + buffer.ReadByte(); if (parse == 0x0000010D) { frameHeaderParse = 4; } else if (frameHeaderParse > 0) { --frameHeaderParse; if (frameHeaderParse == 0) { uint pictureType = 0; if (isInterlaced) { if ((parse & 0x80000000) == 0) { pictureType = (uint)((parse & 0x78000000) >> 13); } else { pictureType = (uint)((parse & 0x3c000000) >> 12); } } else { pictureType = (uint)((parse & 0xf0000000) >> 14); } if ((pictureType & 0x20000) == 0) { tag = "P"; } else if ((pictureType & 0x10000) == 0) { tag = "B"; } else if ((pictureType & 0x8000) == 0) { tag = "I"; } else if ((pictureType & 0x4000) == 0) { tag = "BI"; } else { tag = null; } if (stream.IsInitialized) return; } } else if (parse == 0x0000010F) { sequenceHeaderParse = 6; } else if (sequenceHeaderParse > 0) { --sequenceHeaderParse; switch (sequenceHeaderParse) { case 5: int profileLevel = ((parse & 0x38) >> 3); if (((parse & 0xC0) >> 6) == 3) { stream.EncodingProfile = string.Format( "Advanced Profile {0}", profileLevel); } else { stream.EncodingProfile = string.Format( "Main Profile {0}", profileLevel); } break; case 0: if (((parse & 0x40) >> 6) > 0) { isInterlaced = true; } else { isInterlaced = false; } break; } stream.IsVBR = true; stream.IsInitialized = true; } } }
public void Scan(TSAudioStream stream, TSStreamBuffer buffer, ref string tag, long?bitrate) { if (stream.IsInitialized) { return; } var syncFound = false; uint sync = 0; for (var i = 0; i < buffer.Length; i++) { sync = (sync << 8) + buffer.ReadByte(); if (sync == 0x7FFE8001) { syncFound = true; break; } } if (!syncFound) { return; } buffer.BSSkipBits(6); var crcPresent = buffer.ReadBits4(1); buffer.BSSkipBits(7); var frameSize = buffer.ReadBits4(14); if (frameSize < 95) { return; } buffer.BSSkipBits(6); var sampleRate = buffer.ReadBits4(4); if (sampleRate >= DcaSampleRates.Length) { return; } var bitRate = buffer.ReadBits4(5); if (bitRate >= DcaBitRates.Length) { return; } buffer.BSSkipBits(8); var extCoding = buffer.ReadBits4(1); buffer.BSSkipBits(1); var lfe = buffer.ReadBits4(2); buffer.BSSkipBits(1); if (crcPresent == 1) { buffer.BSSkipBits(16); } buffer.BSSkipBits(7); var sourcePcmRes = buffer.ReadBits4(3); buffer.BSSkipBits(2); var dialogNorm = buffer.ReadBits4(4); if (sourcePcmRes >= DcaBitsPerSample.Length) { return; } buffer.BSSkipBits(4); var totalChannels = buffer.ReadBits4(3) + 1 + extCoding; stream.SampleRate = DcaSampleRates[sampleRate]; stream.ChannelCount = (int)totalChannels; stream.LFE = lfe > 0 ? 1 : 0; stream.BitDepth = DcaBitsPerSample[sourcePcmRes]; stream.DialNorm = (int)-dialogNorm; if ((sourcePcmRes & 0x1) == 0x1) { stream.AudioMode = TSAudioMode.Extended; } stream.BitRate = (uint)DcaBitRates[bitRate]; switch (stream.BitRate) { case 1: if (bitrate != null && bitrate > 0) { stream.BitRate = bitrate.Value; stream.IsVBR = false; stream.IsInitialized = true; } else { stream.BitRate = 0; } break; case 2: case 3: stream.IsVBR = true; stream.IsInitialized = true; break; default: stream.IsVBR = false; stream.IsInitialized = true; break; } }