public List <MatroskaSubtitle> GetSubtitle(int trackNumber, LoadMatroskaCallback progressCallback) { _subtitleRip.Clear(); _subtitleRipTrackNumber = trackNumber; ReadSegmentCluster(progressCallback); return(_subtitleRip); }
private void ReadSegmentCluster(LoadMatroskaCallback progressCallback) { // go to segment _stream.Seek(_segmentElement.DataPosition, SeekOrigin.Begin); while (_stream.Position < _segmentElement.EndPosition) { var beforeReadElementIdPosition = _stream.Position; var id = (ElementId)ReadVariableLengthUInt(false); if (id == ElementId.None && beforeReadElementIdPosition + 1000 < _stream.Length) { // Error mode: search for start of next cluster, will be very slow const int maxErrors = 5_000_000; var errors = 0; var max = _stream.Length; while (id != ElementId.Cluster && beforeReadElementIdPosition + 1000 < max) { errors++; if (errors > maxErrors) { return; // we give up } beforeReadElementIdPosition++; _stream.Seek(beforeReadElementIdPosition, SeekOrigin.Begin); id = (ElementId)ReadVariableLengthUInt(false); } } var size = (long)ReadVariableLengthUInt(); var element = new Element(id, _stream.Position, size); if (element.Id == ElementId.Cluster) { ReadCluster(element); } else { _stream.Seek(element.DataSize, SeekOrigin.Current); } progressCallback?.Invoke(element.EndPosition, _stream.Length); } }
private void ReadSegmentCluster(LoadMatroskaCallback progressCallback) { // go to segment _stream.Seek(_segmentElement.DataPosition, SeekOrigin.Begin); Element element; while (_stream.Position < _segmentElement.EndPosition && (element = ReadElement()) != null) { if (element.Id == ElementId.Cluster) { ReadCluster(element); } else { _stream.Seek(element.DataSize, SeekOrigin.Current); } progressCallback?.Invoke(element.EndPosition, _stream.Length); } }
public List<SubtitleSequence> GetMatroskaSubtitle(string fileName, int trackNumber, out bool isValid, LoadMatroskaCallback callback) { byte b; bool done; UInt32 matroskaId; int sizeOfSize; long dataSize; long afterPosition; bool endOfFile; _subtitleRipTrackNumber = trackNumber; _f = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); matroskaId = GetMatroskaId(); if (matroskaId != 0x1A45DFA3) // matroska file must start with ebml header { isValid = false; } else { isValid = true; b = (byte)_f.ReadByte(); sizeOfSize = GetMatroskaVariableIntLength(b); dataSize = GetMatroskaDataSize(sizeOfSize, b); _f.Seek(dataSize, SeekOrigin.Current); done = false; endOfFile = false; while (endOfFile == false && done == false) { matroskaId = GetMatroskaId(); if (matroskaId == 0) { done = true; } else { b = (byte)_f.ReadByte(); sizeOfSize = GetMatroskaVariableIntLength(b); dataSize = GetMatroskaDataSize(sizeOfSize, b); if (matroskaId == 0x1549A966) // segment info { afterPosition = _f.Position + dataSize; AnalyzeMatroskaSegmentInformation(afterPosition); _f.Seek(afterPosition, SeekOrigin.Begin); } else if (matroskaId == 0x1654AE6B) // tracks { afterPosition = _f.Position + dataSize; AnalyzeMatroskaTracks(); _f.Seek(afterPosition, SeekOrigin.Begin); } else if (matroskaId == 0x1F43B675) // cluster { afterPosition = _f.Position + dataSize; AnalyzeMatroskaCluster(); _f.Seek(afterPosition, SeekOrigin.Begin); } else if (matroskaId != 0x18538067) // segment { _f.Seek(dataSize, SeekOrigin.Current); } } if (callback != null) callback.Invoke(_f.Position, _f.Length); endOfFile = _f.Position >= _f.Length; } } _f.Close(); _f.Dispose(); _f = null; return _subtitleRip; }
private void ReadSegmentCluster(LoadMatroskaCallback progressCallback) { // go to segment _stream.Seek(_segmentElement.DataPosition, SeekOrigin.Begin); Element element; while (_stream.Position < _segmentElement.EndPosition && (element = ReadElement()) != null) { if (element.Id == ElementId.Cluster) { ReadCluster(element); } else { _stream.Seek(element.DataSize, SeekOrigin.Current); } if (progressCallback != null) { progressCallback.Invoke(element.EndPosition, _stream.Length); } } }
public List<MatroskaSubtitle> GetSubtitle(int trackNumber, LoadMatroskaCallback progressCallback) { _subtitleRipTrackNumber = trackNumber; ReadSegmentCluster(progressCallback); return _subtitleRip; }