/// <inheritdoc /> /// <summary> /// </summary> /// <param name="bytes"></param> /// <param name="start"></param> /// <param name="finish"></param> public MovieFragmentHeaderBox(byte[] bytes, int start, int finish) : base(Mp4Identifier.Mfhd) { if (finish - start == 8) { start += 4; SequenceNumber = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(bytes, 4, ref start, finish), 0); } else { throw new Exception(); } }
/// <inheritdoc /> /// <summary> /// </summary> /// <param name="boxBytes"></param> /// <param name="start"></param> /// <param name="end"></param> public TrackRunBox(byte[] boxBytes, int start, int end) : base(Mp4Identifier.Trun) { TrFlags = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, end), 0); DataOffsetPresent = (1u & TrFlags) != 0u; FirstSampleFlagsPresent = (4u & TrFlags) != 0u; SampleDurationPresent = (256u & TrFlags) != 0u; SampleSizePresent = (512u & TrFlags) != 0u; SampleFlagsPresent = (1024u & TrFlags) != 0u; SampleCompositionTimeOffsetsPresent = (2048u & TrFlags) != 0u; SampleCount = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, end), 0); if (DataOffsetPresent) { DataOffset = BitConverter.ToInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, end), 0); } if (FirstSampleFlagsPresent) { FirstSampleFlags = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, end), 0); } Array = new Element[SampleCount]; for (var offset = 0; offset < Array.Length; offset++) { var sampleDuration = 0u; var sampleSize = 0u; var sampleFlags = 0u; var sampleCompositionTimeOffset = 0u; if (SampleDurationPresent) { sampleDuration = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, end), 0); } if (SampleSizePresent) { sampleSize = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, end), 0); } if (SampleFlagsPresent) { sampleFlags = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, end), 0); } if (SampleCompositionTimeOffsetsPresent) { sampleCompositionTimeOffset = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, end), 0); } Array[offset] = new Element(sampleDuration, sampleSize, sampleFlags, sampleCompositionTimeOffset); } }
/// <summary> /// </summary> /// <param name="bytes"></param> /// <param name="version"></param> /// <param name="start"></param> /// <param name="finish"></param> public Element(byte[] bytes, byte version, ref int start, int finish) { if (version == 0) { FragmentAbsoluteTime = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(bytes, 4, ref start, finish), 0); FragmentDuration = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(bytes, 4, ref start, finish), 0); } else if (version == 1) { FragmentAbsoluteTime = BitConverter.ToUInt64(Mp4Utils.ReadReverseBytes(bytes, 8, ref start, finish), 0); FragmentDuration = BitConverter.ToUInt64(Mp4Utils.ReadReverseBytes(bytes, 8, ref start, finish), 0); } else { throw new Exception(); } }
/// <inheritdoc /> /// <summary> /// </summary> /// <param name="bytes"></param> /// <param name="start"></param> /// <param name="finish"></param> public SampleDependencyTypeBox(byte[] bytes, int start, int finish) : base(Mp4Identifier.Sdtp) { Array = new Element[finish - start]; Version = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(bytes, 4, ref start, finish), 0); for (var index = 0; index < finish - start; index++) { var value = Mp4Utils.ReadReverseBytes(bytes, 1, ref start, finish)[0]; var reserved = (byte)(value >> 6); value <<= 2; var sampleDependsOn = (byte)(value >> 6); value <<= 2; Array[index] = new Element(reserved, sampleDependsOn, (byte)(value >> 6), (byte)((value << 2) >> 6)); } }
/// <inheritdoc /> /// <summary> /// </summary> /// <param name="bytes"></param> /// <param name="start"></param> /// <param name="finish"></param> public TfxdBox(byte[] bytes, int start, int finish) : base(Mp4Identifier.Tfxd) { Version = Mp4Utils.ReadReverseBytes(bytes, 1, ref start, finish)[0]; Flags = Mp4Utils.ReadReverseBytes(bytes, 3, ref start, finish); if (Version == 0) { FragmentAbsoluteTime = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(bytes, 4, ref start, finish), 0); FragmentDuration = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(bytes, 4, ref start, finish), 0); } else if (Version == 1) { FragmentAbsoluteTime = BitConverter.ToUInt64(Mp4Utils.ReadReverseBytes(bytes, 8, ref start, finish), 0); FragmentDuration = BitConverter.ToUInt64(Mp4Utils.ReadReverseBytes(bytes, 8, ref start, finish), 0); } else { throw new Exception(); } }
/// <inheritdoc /> /// <summary> /// </summary> /// <param name="boxBytes"></param> /// <param name="start"></param> /// <param name="finish"></param> public TrackFragmentHeaderBox(byte[] boxBytes, int start, int finish) : base(Mp4Identifier.Tfhd) { TfFlags = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, finish), 0); BaseDataOffsetPresent = (1u & TfFlags) != 0u; SampleDescriptionIndexPresent = (2u & TfFlags) != 0u; DefaultSampleDurationPresent = (8u & TfFlags) != 0u; DefaultSampleSizePresent = (16u & TfFlags) != 0u; DefaultSampleFlagsPresent = (32u & TfFlags) != 0u; DurationIsEmpty = (65536u & TfFlags) != 0u; TrackId = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, finish), 0); if (BaseDataOffsetPresent) { BaseDataOffset = BitConverter.ToUInt64(Mp4Utils.ReadReverseBytes(boxBytes, 8, ref start, finish), 0); } if (SampleDescriptionIndexPresent) { SampleDescriptionIndex = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, finish), 0); } if (DefaultSampleDurationPresent) { DefaultSampleDuration = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, finish), 0); } if (DefaultSampleSizePresent) { DefaultSampleSize = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, finish), 0); } if (DefaultSampleFlagsPresent) { DefaultSampleFlags = BitConverter.ToUInt32(Mp4Utils.ReadReverseBytes(boxBytes, 4, ref start, finish), 0); } }