/// <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); } } }
/// <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; } } }
/// <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; } }
/// <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); } } }
/// <summary> /// Constructs and initializes a new instance of <see /// cref="File" /> for a specified file abstraction with an /// average read style. /// </summary> /// <param name="abstraction"> /// A <see cref="IFileAbstraction" /> object to use when /// reading from and writing to the file. /// </param> /// <exception cref="ArgumentNullException"> /// <paramref name="abstraction" /> is <see langword="null" /// />. /// </exception> public File (File.IFileAbstraction abstraction) : this (abstraction, ReadStyle.Average) { }
/// <summary> /// Constructs and initializes a new instance of <see /// cref="File" /> for a specified file abstraction and /// specified read style. /// </summary> /// <param name="abstraction"> /// A <see cref="IFileAbstraction" /> object to use when /// reading from and writing to the file. /// </param> /// <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> /// <exception cref="ArgumentNullException"> /// <paramref name="abstraction" /> is <see langword="null" /// />. /// </exception> public File (File.IFileAbstraction abstraction, ReadStyle propertiesStyle) : base (abstraction) { Mode = AccessMode.Read; try { Read (propertiesStyle); TagTypesOnDisk = TagTypes; } finally { Mode = AccessMode.Closed; } List<ICodec> codecs = new List<ICodec> (); foreach (Track track in tracks) { codecs.Add (track); } properties = new Properties (duration, codecs); }