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]; }
public Mpeg2SystemReader(BitStreamDataReader dataReader, IMpeg2SystemState state, IReaderState readerState) { _dataReader = dataReader; _state = state; _readerState = readerState; _maxZeroByteStuffingLength = (uint)Mpeg2SystemDetector.Configurable[Mpeg2SystemDetector.ConfigurationKey.MaxZeroByteStuffingLength]; _stuffingBytesResultFormatter = new StuffingBytesResultFormatter(); }
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++; }
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)); }
private bool IsFragmentBreakPoint(IMpeg2SystemState state) { return(state.ParsedHeaderCount > _maxHeaderCount); }