Example #1
0
 public List <MatroskaSubtitle> GetSubtitle(int trackNumber, LoadMatroskaCallback progressCallback)
 {
     _subtitleRip.Clear();
     _subtitleRipTrackNumber = trackNumber;
     ReadSegmentCluster(progressCallback);
     return(_subtitleRip);
 }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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;
        }
Example #5
0
        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);
                }
            }
        }
Example #6
0
 public List<MatroskaSubtitle> GetSubtitle(int trackNumber, LoadMatroskaCallback progressCallback)
 {
     _subtitleRipTrackNumber = trackNumber;
     ReadSegmentCluster(progressCallback);
     return _subtitleRip;
 }