Example #1
0
        private void ReadSegment(EBMLElement element)
        {
            ulong i = 0;

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

                MatroskaID matroska_id = (MatroskaID)child.ID;

                switch (matroska_id)
                {
                case MatroskaID.MatroskaTracks:
                    ReadTracks(child);
                    break;

                case MatroskaID.MatroskaSegmentInfo:
                    ReadSegmentInfo(child);
                    break;

                case MatroskaID.MatroskaTags:
                    ReadTags(child);
                    break;

                case MatroskaID.MatroskaCluster:
                    // Get out of here when we reach the clusters for now.
                    return;

                default:
                    break;
                }

                i += child.Size;
            }
        }
Example #2
0
        private void ReadHeader(EBMLElement element)
        {
            string doctype = null;
            ulong  i       = 0;

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

                EBMLID ebml_id = (EBMLID)child.ID;

                switch (ebml_id)
                {
                case EBMLID.EBMLDocType:
                    doctype = child.ReadString();
                    break;

                default:
                    break;
                }

                i += child.Size;
            }

            // Check DocType
            if (String.IsNullOrEmpty(doctype) || (doctype != "matroska" && doctype != "webm"))
            {
                throw new UnsupportedFormatException("DocType is not matroska or webm");
            }
        }
Example #3
0
        /// <summary>
        ///    Reads the file with a specified read style.
        /// </summary>
        /// <param name="propertiesStyle">
        ///    A <see cref="ReadStyle" /> value specifying at what level
        ///    of accuracy to read the media properties, or <see
        ///    cref="ReadStyle.None" /> to ignore the properties.
        /// </param>
        private void Read(ReadStyle propertiesStyle)
        {
            ulong offset = 0;

            while (offset < (ulong)Length)
            {
                EBMLElement element = new EBMLElement(this, offset);

                EBMLID     ebml_id     = (EBMLID)element.ID;
                MatroskaID matroska_id = (MatroskaID)element.ID;

                switch (ebml_id)
                {
                case EBMLID.EBMLHeader:
                    ReadHeader(element);
                    break;

                default:
                    break;
                }
                switch (matroska_id)
                {
                case MatroskaID.MatroskaSegment:
                    ReadSegment(element);
                    break;

                default:
                    break;
                }

                offset += element.Size;
            }
        }
Example #4
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);
                }
            }
        }
Example #5
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;
            }
        }
Example #6
0
        private void ReadSimpleTag(EBMLElement element)
        {
            ulong i = 0;

#pragma warning disable 219 // Assigned, never read
            string tag_name = null, tag_language = null, tag_string = null;
#pragma warning restore 219

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

                MatroskaID matroska_id = (MatroskaID)child.ID;

                switch (matroska_id)
                {
                case MatroskaID.MatroskaTagName:
                    tag_name = child.ReadString();
                    break;

                case MatroskaID.MatroskaTagLanguage:
                    tag_language = child.ReadString();
                    break;

                case MatroskaID.MatroskaTagString:
                    tag_string = child.ReadString();
                    break;

                default:
                    break;
                }

                i += child.Size;
            }

            if (tag_name == "AUTHOR")
            {
                tag.Performers = new string [] { tag_string };
            }
            else if (tag_name == "TITLE")
            {
                tag.Title = tag_string;
            }
            else if (tag_name == "ALBUM")
            {
                tag.Album = tag_string;
            }
            else if (tag_name == "COMMENTS")
            {
                tag.Comment = tag_string;
            }
        }
Example #7
0
        private void ReadTrackEntry(EBMLElement element)
        {
            ulong i = 0;

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

                MatroskaID matroska_id = (MatroskaID)child.ID;

                switch (matroska_id)
                {
                case MatroskaID.MatroskaTrackType: {
                    TrackType track_type = (TrackType)child.ReadUInt();

                    switch (track_type)
                    {
                    case TrackType.Video: {
                        VideoTrack track = new VideoTrack(this, element);

                        tracks.Add(track);
                        break;
                    }

                    case TrackType.Audio: {
                        AudioTrack track = new AudioTrack(this, element);

                        tracks.Add(track);
                        break;
                    }

                    case TrackType.Subtitle: {
                        SubtitleTrack track = new SubtitleTrack(this, element);

                        tracks.Add(track);
                        break;
                    }

                    default:
                        break;
                    }
                    break;
                }

                default:
                    break;
                }

                i += child.Size;
            }
        }
        /// <summary>
        /// Constructs a <see cref="SubtitleTrack" /> 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 SubtitleTrack (File _file, EBMLElement element)
            : base (_file, element)
        {
            // Here we handle the unknown elements we know, and store the rest
            foreach (EBMLElement elem in base.UnknownElements) {
                MatroskaID matroska_id = (MatroskaID) elem.ID;

                switch (matroska_id) {
                    default:
                        unknown_elems.Add (elem);
                        break;
                }
            }
        }
Example #9
0
 public SubtitleTrack(File _file, EBMLElement element) :
     base(_file, element)
 {
     foreach (EBMLElement elem in base.UnknownElements)
     {
         MatroskaID matroska_id = (MatroskaID)elem.ID;
         switch (matroska_id)
         {
         default:
             unknown_elems.Add(elem);
             break;
         }
     }
 }
Example #10
0
        /// <summary>
        ///  Construct a <see cref="AudioTrack" /> reading information 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 AudioTrack(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.MatroskaTrackAudio)
                {
                    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.MatroskaAudioChannels:
                            channels = child.ReadUInt();
                            break;

                        case MatroskaID.MatroskaAudioBitDepth:
                            depth = child.ReadUInt();
                            break;

                        case MatroskaID.MatroskaAudioSamplingFreq:
                            rate = child.ReadDouble();
                            break;

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

                        i += child.Size;
                    }
                }
                else
                {
                    unknown_elems.Add(elem);
                }
            }
        }
Example #11
0
        /// <summary>
        /// Constructs a <see cref="SubtitleTrack" /> 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 SubtitleTrack(File _file, EBMLElement element)
            : base(_file, element)
        {
            // Here we handle the unknown elements we know, and store the rest
            foreach (EBMLElement elem in base.UnknownElements)
            {
                MatroskaID matroska_id = (MatroskaID)elem.ID;

                switch (matroska_id)
                {
                default:
                    unknown_elems.Add(elem);
                    break;
                }
            }
        }
Example #12
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;
            }
        }
Example #13
0
        private void ReadTracks(EBMLElement element)
        {
            ulong i = 0;

            while (i < element.DataSize)
            {
                EBMLElement child       = new EBMLElement(this, element.DataOffset + i);
                MatroskaID  matroska_id = (MatroskaID)child.ID;
                switch (matroska_id)
                {
                case MatroskaID.MatroskaTrackEntry:
                    ReadTrackEntry(child);
                    break;

                default:
                    break;
                }
                i += child.Size;
            }
        }
Example #14
0
        /// <summary>
        ///  Construct a <see cref="AudioTrack" /> reading information 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 AudioTrack (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.MatroskaTrackAudio) {
                    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.MatroskaAudioChannels:
                                channels = child.ReadUInt ();
                                break;
                            case MatroskaID.MatroskaAudioBitDepth:
                                depth = child.ReadUInt ();
                                break;
                            case MatroskaID.MatroskaAudioSamplingFreq:
                                rate = child.ReadDouble ();
                                break;
                            default:
                                unknown_elems.Add (child);
                                break;
                        }

                        i += child.Size;
                    }
                }
                else {
                    unknown_elems.Add (elem);
                }
            }
        }
Example #15
0
        private void ReadSegmentInfo(EBMLElement element)
        {
            ulong i = 0;

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

                MatroskaID matroska_id = (MatroskaID)child.ID;

                switch (matroska_id)
                {
                case MatroskaID.MatroskaDuration:
                    duration_unscaled = (UInt64)child.ReadDouble();
                    if (time_scale > 0)
                    {
                        duration = TimeSpan.FromSeconds(duration_unscaled * time_scale / 1000000000);
                    }
                    break;

                case MatroskaID.MatroskaTimeCodeScale:
                    time_scale = child.ReadUInt();
                    if (duration_unscaled > 0)
                    {
                        duration = TimeSpan.FromSeconds(duration_unscaled * time_scale / 1000000000);
                    }
                    break;

                case MatroskaID.MatroskaTitle:
                    title = child.ReadString();
                    break;

                default:
                    break;
                }

                i += child.Size;
            }
        }
Example #16
0
        /// <summary>
        ///    Reads the file with a specified read style.
        /// </summary>
        /// <param name="propertiesStyle">
        ///    A <see cref="ReadStyle" /> value specifying at what level
        ///    of accuracy to read the media properties, or <see
        ///    cref="ReadStyle.None" /> to ignore the properties.
        /// </param>
        private void Read (ReadStyle propertiesStyle)
        {
            ulong offset = 0;

            while (offset < (ulong) Length) {
                EBMLElement element = new EBMLElement (this, offset);

                EBMLID ebml_id = (EBMLID) element.ID;
                MatroskaID matroska_id = (MatroskaID) element.ID;

                switch (ebml_id) {
                    case EBMLID.EBMLHeader:
                        ReadHeader (element);
                        break;
                    default:
                        break;
                }
                switch (matroska_id) {
                    case MatroskaID.MatroskaSegment:
                        ReadSegment (element);
                        break;
                    default:
                        break;
                }

                offset += element.Size;
            }
        }
Example #17
0
        private void ReadHeader (EBMLElement element)
        {
            string doctype = null;
            ulong i = 0;

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

                EBMLID ebml_id = (EBMLID) child.ID;

                switch (ebml_id) {
                    case EBMLID.EBMLDocType:
                        doctype = child.ReadString ();
                        break;
                    default:
                        break;
                }

                i += child.Size;
            }

            // Check DocType
            if (String.IsNullOrEmpty (doctype) || (doctype != "matroska" && doctype != "webm")) {
                throw new UnsupportedFormatException ("DocType is not matroska or webm");
            }
        }
Example #18
0
        private void ReadSegment (EBMLElement element)
        {
            ulong i = 0;

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

                MatroskaID matroska_id = (MatroskaID) child.ID;

                switch (matroska_id) {
                    case MatroskaID.MatroskaTracks:
                        ReadTracks (child);
                        break;
                    case MatroskaID.MatroskaSegmentInfo:
                        ReadSegmentInfo (child);
                        break;
                    case MatroskaID.MatroskaTags:
                        ReadTags (child);
                        break;
                    case MatroskaID.MatroskaCluster:
                        // Get out of here when we reach the clusters for now.
                        return;
                    default:
                        break;
                }

                i += child.Size;
            }
        }
Example #19
0
        private void ReadSimpleTag (EBMLElement element)
        {
            ulong i = 0;
#pragma warning disable 219 // Assigned, never read
            string tag_name = null, tag_language = null, tag_string = null;
#pragma warning restore 219

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

                MatroskaID matroska_id = (MatroskaID) child.ID;

                switch (matroska_id) {
                    case MatroskaID.MatroskaTagName:
                        tag_name = child.ReadString ();
                        break;
                    case MatroskaID.MatroskaTagLanguage:
                        tag_language = child.ReadString ();
                        break;
                    case MatroskaID.MatroskaTagString:
                        tag_string = child.ReadString ();
                        break;
                    default:
                        break;
                }

                i += child.Size;
            }

            if (tag_name == "AUTHOR") {
                tag.Performers = new string [] { tag_string };
            }
            else if (tag_name == "TITLE") {
                tag.Title = tag_string;
            }
            else if (tag_name == "ALBUM") {
                tag.Album = tag_string;
            }
            else if (tag_name == "COMMENTS") {
                tag.Comment = tag_string;
            }
        }
Example #20
0
        private void ReadSegmentInfo (EBMLElement element)
        {
            ulong i = 0;

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

                MatroskaID matroska_id = (MatroskaID) child.ID;

                switch (matroska_id) {
                    case MatroskaID.MatroskaDuration:
                        duration_unscaled = (UInt64) child.ReadDouble ();
                        if (time_scale > 0) {
                            duration = TimeSpan.FromSeconds (duration_unscaled * time_scale / 1000000000);
                        }
                        break;
                    case MatroskaID.MatroskaTimeCodeScale:
                        time_scale = child.ReadUInt ();
                        if (duration_unscaled > 0) {
                            duration = TimeSpan.FromSeconds (duration_unscaled * time_scale / 1000000000);
                        }
                        break;
                    case MatroskaID.MatroskaTitle:
                        title = child.ReadString ();
                        break;
                    default:
                        break;
                }

                i += child.Size;
            }
        }
Example #21
0
        private void ReadTracks (EBMLElement element)
        {
            ulong i = 0;

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

                MatroskaID matroska_id = (MatroskaID) child.ID;

                switch (matroska_id) {
                    case MatroskaID.MatroskaTrackEntry:
                        ReadTrackEntry (child);
                        break;
                    default:
                        break;
                }

                i += child.Size;
            }
        }
Example #22
0
        public VideoTrack(File _file, EBMLElement element) :
            base(_file, element)
        {
            MatroskaID matroska_id;

            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);
                }
            }
        }
Example #23
0
        private void ReadTrackEntry (EBMLElement element)
        {
            ulong i = 0;

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

                MatroskaID matroska_id = (MatroskaID) child.ID;

                switch (matroska_id) {
                    case MatroskaID.MatroskaTrackType: {
                            TrackType track_type = (TrackType) child.ReadUInt ();

                            switch (track_type) {
                                case TrackType.Video: {
                                        VideoTrack track = new VideoTrack (this, element);

                                        tracks.Add (track);
                                        break;
                                    }
                                case TrackType.Audio: {
                                        AudioTrack track = new AudioTrack (this, element);

                                        tracks.Add (track);
                                        break;
                                    }
                                case TrackType.Subtitle: {
                                        SubtitleTrack track = new SubtitleTrack (this, element);

                                        tracks.Add (track);
                                        break;
                                    }
                                default:
                                    break;
                            }
                            break;
                        }
                    default:
                        break;
                }

                i += child.Size;
            }
        }