コード例 #1
0
 public Mpeg2SystemCarver(IMpeg2SystemReader reader, IResultParser <IMpeg2SystemReader> systemHeaderParser, IScanContext scanContext)
 {
     _reader             = reader;
     _systemHeaderParser = systemHeaderParser;
     _scanContext        = scanContext;
     _state          = reader.State;
     _minHeaderCount = (uint)Mpeg2SystemDetector.Configurable[Mpeg2SystemDetector.ConfigurationKey.MinSystemHeaderCount];
 }
コード例 #2
0
        public Mpeg2SystemReader(BitStreamDataReader dataReader, IMpeg2SystemState state, IReaderState readerState)
        {
            _dataReader  = dataReader;
            _state       = state;
            _readerState = readerState;

            _maxZeroByteStuffingLength    = (uint)Mpeg2SystemDetector.Configurable[Mpeg2SystemDetector.ConfigurationKey.MaxZeroByteStuffingLength];
            _stuffingBytesResultFormatter = new StuffingBytesResultFormatter();
        }
コード例 #3
0
        public void Parse(IMpeg2SystemReader reader, IResultNodeState resultState)
        {
            IMpeg2SystemState state = reader.State;

            // Check start code and determine header-specific parsing strategy
            state.StartCode = reader.GetBits(32, Attribute.StartCode, "{0:X8}");

            ISystemHeaderParser headerParser;

            if (!resultState.Valid || !_headerParsers.TryGetValue(state.StartCode, out headerParser))
            {
                resultState.Invalidate();
                return;
            }

            // Invoke the header-specific parsing strategy
            headerParser.Parse(reader, resultState);

            if (!reader.Valid)
            {
                return;
            }

            // Handle stuffing (leading 00's before the next start code)
            uint zeroByteStuffing = reader.GetZeroByteStuffing(Attribute.ZeroByteStuffing);

            if (IsFragmentBreakPoint(state))
            {
                reader.BreakFragment();
                return;
            }

            string headerName = resultState.Name as string;

            // Record the header and (possible) the extension
            if (state.LastHeaderName == null)
            {
                state.FirstHeaderName = headerName;
            }
            state.LastHeaderName             = headerName;
            state.LastHeaderZeroByteStuffing = zeroByteStuffing;
            state.ParsedHeaderCount++;
        }
コード例 #4
0
            private bool IsContinuousStream(IMpeg2SystemState state, ulong systemClockReference)
            {
                ulong lastSystemClockReference = state.LastSystemClockReference;

                if (lastSystemClockReference == FirstSystemClockReference)
                {
                    return(true);
                }

                // Compare system clock reference to last system clock reference.
                // It should be higher and have a limited time gap.

                if (systemClockReference < lastSystemClockReference)
                {
                    return(false);                    // Indicates a discontinuity because of a backwards jump in time
                }

                ulong timeGap = (systemClockReference - lastSystemClockReference);

                return(timeGap < ((state.IsMpeg2() ? 27E6 : 90E3) * _maxTimeGapSeconds));
            }
コード例 #5
0
 private bool IsFragmentBreakPoint(IMpeg2SystemState state)
 {
     return(state.ParsedHeaderCount > _maxHeaderCount);
 }