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;
        }
示例#3
0
 public ByteStreamParser(INalUnitParser nalUnitParser)
 {
     _nalUnitParser = nalUnitParser;
 }