예제 #1
0
            /// <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);
예제 #2
0
            /// <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))
예제 #3
0
 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");
     }
 }