/// <summary> /// Read the adaption field for this packet /// <para><see cref="af"/> must start at the begingging of the Adaption Field</para> /// </summary> /// <param name="af"></param> /// <returns>True if parsing was a success</returns> public static AdaptationField Parse(ReadOnlySequence <byte> af) { var sr = new SequenceReader <byte>(af); if (sr.TryRead(out byte adaptionFieldLength)) { var ret = new AdaptationField() { Length = adaptionFieldLength }; if (ret.Length > 0 && sr.TryRead(out byte afFlags)) { ret.Flags = (AdaptationFieldFlags)afFlags; if (ret.Flags.HasFlag(AdaptationFieldFlags.PCR)) { var pcr = ReadPTS(af.Slice(sr.Position)); if (pcr != null) { ret.PCR = pcr.Value; sr.Advance(6); } else { return(default);
/// <summary> /// Read the header portion of a TSPacket /// </summary> /// <param name="header"></param> /// <returns></returns> public static Packet Parse(ReadOnlySequence <byte> header) { var sr = new SequenceReader <byte>(header); if (sr.TryReadBigEndian(out int hv)) { var pkt = new Packet() { TransportError = (hv & 0x800000) > 1, PayloadUnitStart = (hv & 0x400000) > 1, TransportPriority = (hv & 0x200000) > 1, Pid = (ushort)((hv & 0x001fff) >> 8), Scrambling = (TransportScramblingControl)((hv & 0xc0) >> 6), AdaptationFieldControl = (AdaptationFieldControl)((hv & 0x30) >> 4), Continuity = (byte)(hv & 0x0f) }; if (pkt.HasAdaptionField) { var af = AdaptationField.Parse(header.Slice(sr.Position)); if (!af.Equals(default))
public void Validate() { /*if (!((int)AdaptationFieldControl >= 1 && (int)AdaptationFieldControl <= 3)) * { * throw new Exception("Invalid AFC"); * }*/ if (Pid > 8191) { throw new Exception("Invalid PID"); } if (!((int)Scrambling >= 0 && (int)Scrambling <= 3)) { throw new Exception("Invalid TSC"); } if (HasAdaptionField) { AdaptationField.Validate(); } if (HasPayload && Payload == null) { throw new Exception("Payload was null"); } }