public override bool Parse(QtParser parser)
        {
            if (!base.Parse(parser))
            {
                return(false);
            }

            parser.GetUShort(Attribute.SubSequenceIdentifer);
            parser.GetByte(Attribute.LayerNumber);
            byte flags        = parser.GetByte();
            bool durationFlag = (flags & 0x80) == 0x80;
            bool avgRateFlag  = (flags & 0x40) == 0x40;
            byte reserved     = (byte)(flags & 0x3F);

            parser.AddAttribute(new FormattedAttribute <Attribute, bool>(Attribute.DurationFlag, durationFlag));
            parser.AddAttribute(new FormattedAttribute <Attribute, bool>(Attribute.AvgRateFlag, avgRateFlag));
            parser.AddAttribute(new FormattedAttribute <Attribute, byte>(Attribute.Reserved, reserved));
            parser.CheckAttribute(Attribute.Reserved, reserved == 0, false);

            if (durationFlag)
            {
                parser.GetUInt(Attribute.Duration);
            }

            if (avgRateFlag)
            {
                parser.GetByte(Attribute.AccurateStatisticsFlag);
                parser.GetUShort(Attribute.AvgBitRate);
                parser.GetUShort(Attribute.AvgFrameRate);
            }

            parser.GetTable(Attribute.DependencyInfo, Attribute.NumReferences, NumberOfEntriesType.Byte, 32, () => new DependencyInfo(), parser.BytesRemaining);

            return(Valid);
        }
Пример #2
0
        public override bool Parse(QtParser parser)
        {
            if (!base.Parse(parser))
            {
                return(false);
            }

            parser.GetUInt(Attribute.Version, "{0:X8}");

            // TODO: the sequence of descriptors is taken (mostly) from ffmpeg
            // TODO: verify that this is the actual sequence seen in (all) 3GPP files
            BaseDescriptor descriptor = ReadDescriptor(parser);

            if (descriptor.Tag == DescriptorClassTag.ES_DescrTag)
            {
                parser.GetUShort();                             // ID
                parser.GetByte();                               // priority
            }
            else
            {
                parser.GetUShort();                             // ID
            }

            descriptor = ReadDescriptor(parser);
            if (descriptor.Tag == DescriptorClassTag.DecoderConfigDescrTag)
            {
                parser.GetByte(Attribute.ObjectTypeIndication);                         // 0x20 Visual ISO/IEC 14496-2
                parser.GetByte(Attribute.StreamType);
                parser.GetThreeBytes(Attribute.BufferSizeDB);                           // 3 bytes
                parser.GetUInt(Attribute.MaxBitrate);
                parser.GetUInt(Attribute.AvgBitrate);

                descriptor = ReadDescriptor(parser);
                if ((parser.Position + descriptor.Length) > parser.Length)
                {
                    return(false);
                }
                if (descriptor.Tag == DescriptorClassTag.DecSpecificInfoTag)
                {
                    // Extra data can be empty (0 bytes)
                    if (descriptor.Length > 0)
                    {
                        ExtraData = parser.GetDataPacket(parser.Position, descriptor.Length);
                    }

                    Attributes.Add(new FormattedAttribute <Attribute, long>(Attribute.DecSpecificInfoSize, descriptor.Length));
                }
                parser.Position += Math.Min(descriptor.Length, parser.Length - parser.Position);
            }
            return(this.Valid);
        }
Пример #3
0
        public override bool Parse(QtParser parser)
        {
            if (!base.Parse(parser))
            {
                return(false);
            }

            parser.GetByte(Attribute.LayerNumber);
            parser.GetByte(Attribute.AccurateStatisticsFlag);
            parser.GetUShort(Attribute.AvgBitRate);
            parser.GetUShort(Attribute.AvgFrameRate);

            return(Valid);
        }
Пример #4
0
        public override bool Parse(QtParser parser)
        {
            if (!base.Parse(parser))
            {
                return(false);
            }

            uint colorParameterType = parser.GetFourCC(Attribute.ColorParameterType);

            parser.CheckAttribute(Attribute.ColorParameterType, colorParameterType == "nclc".To4CC(), false);

            parser.GetUShort(Attribute.PrimariesIndex);
            parser.GetUShort(Attribute.TransferFunctionIndex);
            parser.GetUShort(Attribute.MatrixIndex);

            return(Valid);
        }
        public override bool Parse(QtParser parser)
        {
            if (!base.Parse(parser))
            {
                return(false);
            }

            // Reserved (6x byte)
            for (int i = 0; i < 6; i++)
            {
                parser.GetByte();
            }
            parser.GetUShort(Attribute.ReferenceIndex);
            parser.GetUShort(Attribute.PreDefined1);
            parser.GetUShort(Attribute.Reserved1);

            return(Valid);
        }
Пример #6
0
        // See QuickTime File Format Specification, 2010-08-03, pg.1
        private static void ParseTcmiAtom(QtParser parser, uint size)
        {
            long tcmiPosition = (parser.Position - 4);

            parser.AddAttribute(new FormattedAttribute <QtAtom.Attribute, uint>(QtAtom.Attribute.Size, size));
            uint type = parser.GetFourCC(QtAtom.Attribute.Type);

            parser.CheckAttribute(QtAtom.Attribute.Type, type == Tcmi, false);
            parser.GetByte(QtAtom.Attribute.Version);
            parser.GetThreeBytes(QtAtom.Attribute.Flags);
            parser.GetUShort(Attribute.TextFont);
            parser.GetUShort(Attribute.TextFace);
            parser.GetUShort(Attribute.TextSize);
            parser.GetUShort(Attribute.TcmiReserved);
            parser.Parse(new Color(Attribute.TextColor));
            parser.Parse(new Color(Attribute.BackgroundColor));
            parser.GetPascalString(Attribute.FontName, 0);
            parser.CheckAttribute(QtAtom.Attribute.Size, size == (parser.Position - tcmiPosition), false);
        }
Пример #7
0
        public override bool Parse(QtParser parser)
        {
            if (!base.Parse(parser))
            {
                return(false);
            }

            int colorTableSeed = parser.GetInt(Attribute.ColorTableSeed);

            parser.CheckAttribute(Attribute.ColorTableSeed, colorTableSeed == 0);
            ushort colorTableFlags = parser.GetUShort(Attribute.ColorTableFlags);

            parser.CheckAttribute(Attribute.ColorTableFlags, colorTableFlags == 0x8000);

            uint colorTableSize = parser.GetUShort(Attribute.ColorTableSize);

            colorTableSize++;                   // The color table size is zero-relative; 0 means there is one color in the array
            parser.GetTable(Attribute.ColorArray, Attribute.ColorTableSize, colorTableSize, 8, () => new Color(), parser.BytesRemaining);

            return(Valid);
        }
Пример #8
0
        public override bool Parse(QtParser parser)
        {
            if (!base.Parse(parser))
            {
                return(false);
            }

            ushort regionSize = parser.GetUShort(Attribute.RegionSize);

            parser.Parse(new RegionBounderyBox());
            parser.CheckAttribute(Attribute.RegionSize, regionSize == parser.BytesRemaining);
            if (Valid)
            {
                parser.GetHexDump(Attribute.ClippingRegionData, regionSize);
            }
            return(Valid);
        }
Пример #9
0
        // for (i=0; i< numOfSequenceParameterSets; i++) {
        //   unsigned int(16) sequenceParameterSetLength ;
        //   bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;
        // }
        //
        // for (i=0; i< numOfPictureParameterSets; i++) {
        //   unsigned int(16) pictureParameterSetLength;
        //   bit(8*pictureParameterSetLength) pictureParameterSetNALUnit;
        // }
        private static IDataPacket CreateNalUnit(QtParser parser, byte setCount, Attribute attribute)
        {
            long beginOffset    = parser.Position;
            int  totalSetLength = 0;

            for (int i = 0; i < setCount; i++)
            {
                ushort setLength = parser.GetUShort();
                parser.Position += setLength;
                totalSetLength  += setLength + sizeof(ushort);
            }
            if (totalSetLength > 0)
            {
                parser.Position = beginOffset;
                parser.GetHexDump <Attribute>(attribute, totalSetLength);

                return(parser.GetDataPacket(beginOffset, totalSetLength));
            }
            return(null);
        }
        public override bool Parse(QtParser parser)
        {
            if (!base.Parse(parser))
            {
                return(false);
            }

            parser.GetDateTime(Attribute.CreationTime, "{0:F}");
            parser.GetDateTime(Attribute.ModificationTime, "{0:F}");
            TrackID = parser.GetUInt(Attribute.TrackID);
            parser.GetUInt(Attribute.Reserved1);
            parser.GetUInt(Attribute.Duration);
            parser.GetULong(Attribute.Reserved2);
            parser.GetShort(Attribute.Layer);
            parser.GetShort(Attribute.AlternateGroup);
            parser.GetFixed8_8(Attribute.Volume);
            parser.GetUShort(Attribute.Reserved3);
            parser.GetMatrix(Attribute.MatrixStructure);
            parser.GetFixed16_16(Attribute.TrackWidth);
            parser.GetFixed16_16(Attribute.TrackHeight);

            return(this.Valid);
        }