public NalUnitStreamParser(INalUnitParser nalUnitParser, IH264State state) { _nalUnitParser = nalUnitParser; _state = state; _nalUnitStartByteLongLengthPrefix = new bool[256]; _nalUnitStartByteShortLengthPrefix = new bool[256]; for (int nalRefIdc = 0; nalRefIdc <= 3; nalRefIdc++) { int nonIdrPictureSliceIndex = (nalRefIdc << 5) | (int)NalUnitType.CodedSliceOfANonIdrPicture; _nalUnitStartByteLongLengthPrefix[nonIdrPictureSliceIndex] = true; } for (int nalRefIdc = 1; nalRefIdc <= 3; nalRefIdc++) { int nalRefIdcBits = (nalRefIdc << 5); _nalUnitStartByteLongLengthPrefix[nalRefIdcBits | (int)NalUnitType.CodedSliceOfAnIdrPicture] = true; _nalUnitStartByteShortLengthPrefix[nalRefIdcBits | (int)NalUnitType.SequenceParameterSet] = true; _nalUnitStartByteShortLengthPrefix[nalRefIdcBits | (int)NalUnitType.PictureParameterSet] = true; } Configurable <H264Detector.ConfigurationKey> configurable = H264Detector.Configurable; _minSliceNalUnitLength = (uint)configurable[H264Detector.ConfigurationKey.MinSliceNalUnitLength]; _maxSliceNalUnitLength = (uint)configurable[H264Detector.ConfigurationKey.MaxSliceNalUnitLength]; }
public void ParseOneNalUnit(INalUnitParser parser, IResultNodeState resultState, long nalUnitEndPosition) { long startPosition = Position; IList <uint> sanitizedPositions = new List <uint>(); var unitReader = NalUnitReader(nalUnitEndPosition, sanitizedPositions); unitReader.Result = resultState; parser.Parse(unitReader, resultState); // Synchronize real data reader with end of NAL unit Position = startPosition + GetRawOffset(sanitizedPositions, (uint)unitReader.Position); //Console.WriteLine("(Non-)Validated NAL unit of {0} bytes", (Position - startPosition)); ReadTrailingZeroBytes((uint)Math.Min(16, (nalUnitEndPosition - Position))); if (Position != nalUnitEndPosition) { // TODO: er zit 'troep' (bv. audio data) tussen het einde van de huidige en volgende NAL unit //Console.WriteLine("Still {0} junk bytes after NAL unit, starting at offset {1:x8}", (nalUnitEndPosition - Position), Position); } //Position = nalUnitEndPosition; }
public ByteStreamParser(INalUnitParser nalUnitParser) { _nalUnitParser = nalUnitParser; }