public static void Scan( TSVideoStream stream, TSStreamBuffer buffer, ref string tag) { stream.IsVBR = true; stream.IsInitialized = true; }
/// <summary> /// Adds the video stream. /// </summary> /// <param name="streams">The streams.</param> /// <param name="videoStream">The video stream.</param> private void AddVideoStream(List <MediaStream> streams, TSVideoStream videoStream) { var mediaStream = new MediaStream { BitRate = Convert.ToInt32(videoStream.BitRate), Width = videoStream.Width, Height = videoStream.Height, Codec = videoStream.CodecShortName, IsInterlaced = videoStream.IsInterlaced, Type = MediaStreamType.Video, Index = streams.Count }; if (videoStream.FrameRateDenominator > 0) { float frameRateEnumerator = videoStream.FrameRateEnumerator; float frameRateDenominator = videoStream.FrameRateDenominator; mediaStream.AverageFrameRate = mediaStream.RealFrameRate = frameRateEnumerator / frameRateDenominator; } streams.Add(mediaStream); }
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; 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 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) { 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 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( 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; } } }