示例#1
0
        /// <summary>
        /// Constructs a <see cref="Track" /> parsing from provided
        /// file data.
        /// Parsing will be done reading from _file at position references by
        /// parent element's data section.
        /// </summary>
        /// <param name="_file"><see cref="File" /> instance to read from.</param>
        /// <param name="element">Parent <see cref="EBMLElement" />.</param>
        public Track(File _file, EBMLElement element)
        {
            ulong i = 0;

            while (i < element.DataSize)
            {
                EBMLElement child = new EBMLElement(_file, element.DataOffset + i);

                MatroskaID matroska_id = (MatroskaID)child.ID;

                switch (matroska_id)
                {
                case MatroskaID.MatroskaTrackNumber:
                    track_number = child.ReadUInt();
                    break;

                case MatroskaID.MatroskaTrackUID:
                    track_uid = child.ReadUInt();
                    break;

                case MatroskaID.MatroskaCodecID:
                    track_codec_id = child.ReadString();
                    break;

                case MatroskaID.MatroskaCodecName:
                    track_codec_name = child.ReadString();
                    break;

                case MatroskaID.MatroskaTrackName:
                    track_name = child.ReadString();
                    break;

                case MatroskaID.MatroskaTrackLanguage:
                    track_language = child.ReadString();
                    break;

                case MatroskaID.MatroskaTrackFlagEnabled:
                    track_enabled = child.ReadBool();
                    break;

                case MatroskaID.MatroskaTrackFlagDefault:
                    track_default = child.ReadBool();
                    break;

                case MatroskaID.MatroskaCodecPrivate:
                    codec_data = child.ReadBytes();
                    break;

                default:
                    unknown_elems.Add(child);
                    break;
                }

                i += child.Size;
            }
        }
示例#2
0
        /// <summary>
        /// Constructs a <see cref="VideoTrack" /> parsing from provided
        /// file data.
        /// Parsing will be done reading from _file at position references by
        /// parent element's data section.
        /// </summary>
        /// <param name="_file"><see cref="File" /> instance to read from.</param>
        /// <param name="element">Parent <see cref="EBMLElement" />.</param>
        public VideoTrack(File _file, EBMLElement element)
            : base(_file, element)
        {
            MatroskaID matroska_id;

            // Here we handle the unknown elements we know, and store the rest
            foreach (EBMLElement elem in base.UnknownElements)
            {
                matroska_id = (MatroskaID)elem.ID;

                if (matroska_id == MatroskaID.MatroskaTrackVideo)
                {
                    ulong i = 0;

                    while (i < elem.DataSize)
                    {
                        EBMLElement child = new EBMLElement(_file, elem.DataOffset + i);

                        matroska_id = (MatroskaID)child.ID;

                        switch (matroska_id)
                        {
                        case MatroskaID.MatroskaVideoDisplayWidth:
                            disp_width = child.ReadUInt();
                            break;

                        case MatroskaID.MatroskaVideoDisplayHeight:
                            disp_height = child.ReadUInt();
                            break;

                        case MatroskaID.MatroskaVideoPixelWidth:
                            width = child.ReadUInt();
                            break;

                        case MatroskaID.MatroskaVideoPixelHeight:
                            height = child.ReadUInt();
                            break;

                        case MatroskaID.MatroskaVideoFrameRate:
                            framerate = child.ReadDouble();
                            break;

                        case MatroskaID.MatroskaVideoFlagInterlaced:
                            interlaced = child.ReadBool();
                            break;

                        case MatroskaID.MatroskaVideoAspectRatioType:
                            ratio_type = (VideoAspectRatioType)child.ReadUInt();
                            break;

                        case MatroskaID.MatroskaVideoColourSpace:
                            fourcc = child.ReadBytes();
                            break;

                        default:
                            unknown_elems.Add(child);
                            break;
                        }

                        i += child.Size;
                    }
                }
                else if (matroska_id == MatroskaID.MatroskaTrackDefaultDuration)
                {
                    uint tmp = elem.ReadUInt();
                    framerate = 1000000000.0 / (double)tmp;
                }
                else
                {
                    unknown_elems.Add(elem);
                }
            }
        }