private bool ParseLongLengthPrefixedNalUnit(IH264Reader reader, IResultNodeState resultState)
        {
            uint nalUnitLength      = reader.GetUInt(NalUnitParser.Attribute.NalUnitLength);
            long nalUnitEndPosition = (reader.Position + nalUnitLength);

            if (nalUnitEndPosition > reader.Length)
            {
                return(false);
            }

            //Parse remainder with specific nalunitparser (NOTE: Is not a sub-object)
            reader.ParseOneNalUnit(_nalUnitParser, resultState, nalUnitEndPosition);

            return(reader.Position == nalUnitEndPosition);
        }
Exemplo n.º 2
0
        public void Parse(IH264Reader reader, IResultNodeState resultState)
        {
            if (reader.Position == reader.Length)
            {
                resultState.Invalidate();
                return;
            }

            long nalUnitEndPosition;

            // Remove 'zero byte' and 'start code prefix' for the 'byte stream' format
            if (reader.PeekUInt() == 0x00000001)
            {
                // TODO: hoort eigenlijk bij de StartCodePrefix - zie pg. 305 van ITU-T H.264 (03/2010)
                reader.GetFixedByte(0x00, NalUnitParser.Attribute.ZeroByte);
            }

            reader.GetFixedThreeBytes(0x000001, NalUnitParser.Attribute.StartCodePrefix);
            var windowStart = reader.Position;

            if (reader.NextNalUnit())                 //Forward till after next nalunit startcode
            {
                nalUnitEndPosition = reader.Position; //Position of next nalunit start
            }
            else
            {
                nalUnitEndPosition = reader.Length;
            }

            reader.Position = windowStart;            //rewind

            if (!resultState.Valid)
            {
                return;
            }

            //Parse remainder with specific nalunitparser (NOTE: Is not a sub-object)
            reader.ParseOneNalUnit(_nalUnitParser, resultState, nalUnitEndPosition);
        }