예제 #1
0
        public void Parse(IMpeg2SystemReader reader, IResultNodeState resultState)
        {
            resultState.Name       = Name;
            resultState.ParentName = PackHeader.Name;

            // This header should be preceeded by a pack header, but which may have been overwritten
            if ((reader.State.LastHeaderName != PackHeader.Name) && reader.State.SeenPackHeader /*|| SeenPesPacket)*/)
            {
                resultState.Invalidate();
                return;
            }

            reader.GetBits(16, Attribute.HeaderLength);
            reader.GetMarker();

            uint rateBound = reader.GetBits(22, Attribute.RateBound);

            if (reader.State.SeenPackHeader && (rateBound < reader.State.ProgramMuxRate))
            {
                resultState.Invalidate();
                return;
            }

            reader.GetMarker();
            reader.GetBits(6, Attribute.AudioBound, ab => ab <= 32);
            reader.GetFlag(Attribute.FixedFlag);
            reader.GetFlag(Attribute.CspsFlag);
            reader.GetFlag(Attribute.SystemAudioLockFlag);
            reader.GetFlag(Attribute.SystemVideoLockFlag);
            reader.GetMarker();
            reader.GetBits(5, Attribute.VideoBound, vb => vb <= 16);
            reader.GetFlag(Attribute.PacketRateRestrictionFlag);
            reader.GetReservedBits(7);                  // 0x7F

            // Stream information (MPEG-2 only)
            while (resultState.Valid && (reader.ShowBits(1) == 1))
            {
                resultState.Parse(_streamInfoAttributeParser, reader);
            }
        }