private bool LoadVobSubFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska) { if (matroskaSubtitleInfo.ContentEncodingType == 1) { MessageBox.Show(this._language.NoSupportEncryptedVobSub); } this.ShowStatus(this._language.ParsingMatroskaFile); this.Refresh(); Cursor.Current = Cursors.WaitCursor; var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, this.MatroskaProgress); TaskbarList.SetProgressState(this.Handle, TaskbarButtonProgressFlags.NoProgress); Cursor.Current = Cursors.Default; this.MakeHistoryForUndo(this._language.BeforeImportFromMatroskaFile); this._subtitleListViewIndex = -1; this._subtitle.Paragraphs.Clear(); List<VobSubMergedPack> mergedVobSubPacks = new List<VobSubMergedPack>(); Idx idx = new Idx(matroskaSubtitleInfo.CodecPrivate.SplitToLines()); foreach (var p in sub) { if (matroskaSubtitleInfo.ContentEncodingType == 0) { // compressed with zlib bool error = false; MemoryStream outStream = new MemoryStream(); var outZStream = new ZOutputStream(outStream); MemoryStream inStream = new MemoryStream(p.Data); byte[] buffer = null; try { CopyStream(inStream, outZStream); buffer = new byte[outZStream.TotalOut]; outStream.Position = 0; outStream.Read(buffer, 0, buffer.Length); } catch (Exception exception) { MessageBox.Show(exception.Message + Environment.NewLine + Environment.NewLine + exception.StackTrace); error = true; } finally { outZStream.Close(); inStream.Close(); } if (!error && buffer.Length > 2) { mergedVobSubPacks.Add(new VobSubMergedPack(buffer, TimeSpan.FromMilliseconds(p.Start), 32, null)); } } else { mergedVobSubPacks.Add(new VobSubMergedPack(p.Data, TimeSpan.FromMilliseconds(p.Start), 32, null)); } if (mergedVobSubPacks.Count > 0) { mergedVobSubPacks[mergedVobSubPacks.Count - 1].EndTime = TimeSpan.FromMilliseconds(p.End); } // fix overlapping (some versions of Handbrake makes overlapping time codes - thx Hawke) if (mergedVobSubPacks.Count > 1 && mergedVobSubPacks[mergedVobSubPacks.Count - 2].EndTime > mergedVobSubPacks[mergedVobSubPacks.Count - 1].StartTime) { mergedVobSubPacks[mergedVobSubPacks.Count - 2].EndTime = TimeSpan.FromMilliseconds(mergedVobSubPacks[mergedVobSubPacks.Count - 1].StartTime.TotalMilliseconds - 1); } } using (var formSubOcr = new VobSubOcr()) { formSubOcr.Initialize(mergedVobSubPacks, idx.Palette, Configuration.Settings.VobSubOcr, null); // TODO: language??? if (this._loading) { formSubOcr.Icon = (Icon)this.Icon.Clone(); formSubOcr.ShowInTaskbar = true; formSubOcr.ShowIcon = true; } if (formSubOcr.ShowDialog(this) == DialogResult.OK) { this.ResetSubtitle(); this._subtitle.Paragraphs.Clear(); this._subtitle.WasLoadedWithFrameNumbers = false; foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) { this._subtitle.Paragraphs.Add(p); } this.ShowSource(); this.SubtitleListview1.Fill(this._subtitle, this._subtitleAlternate); this._subtitleListViewIndex = -1; this.SubtitleListview1.FirstVisibleIndex = -1; this.SubtitleListview1.SelectIndexAndEnsureVisible(0); this._fileName = Path.GetFileNameWithoutExtension(matroska.Path); this._converted = true; this.Text = this.Title; Configuration.Settings.Save(); return true; } } return false; }
internal void OpenSubIdx(string vobSubFileName, string idxFileName) { VobSubPacks = new List <VobSubPack>(); if (!string.IsNullOrEmpty(idxFileName) && File.Exists(idxFileName)) { var idx = new Idx(idxFileName); IdxPalette = idx.Palette; IdxLanguages = idx.Languages; if (idx.IdxParagraphs.Count > 0) { var buffer = new byte[0x800]; // 2048 using (var fs = new FileStream(vobSubFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { foreach (var p in idx.IdxParagraphs) { if (p.FilePosition + 100 < fs.Length) { long position = p.FilePosition; fs.Seek(position, SeekOrigin.Begin); fs.Read(buffer, 0, 0x0800); if (IsSubtitlePack(buffer) || IsPrivateStream1(buffer, 0)) { var vsp = new VobSubPack(buffer, p); VobSubPacks.Add(vsp); if (IsPrivateStream1(buffer, 0)) { position += vsp.PacketizedElementaryStream.Length + 6; } else { position += 0x800; } int currentSubPictureStreamId = vsp.PacketizedElementaryStream.SubPictureStreamId.Value; while (vsp.PacketizedElementaryStream != null && vsp.PacketizedElementaryStream.SubPictureStreamId.HasValue && (vsp.PacketizedElementaryStream.Length == PacketizedElementaryStreamMaximumLength || currentSubPictureStreamId != vsp.PacketizedElementaryStream.SubPictureStreamId.Value) && position < fs.Length) { fs.Seek(position, SeekOrigin.Begin); fs.Read(buffer, 0, 0x800); vsp = new VobSubPack(buffer, p); // idx position? if (vsp.PacketizedElementaryStream != null && vsp.PacketizedElementaryStream.SubPictureStreamId.HasValue && currentSubPictureStreamId == vsp.PacketizedElementaryStream.SubPictureStreamId.Value) { VobSubPacks.Add(vsp); if (IsPrivateStream1(buffer, 0)) { position += vsp.PacketizedElementaryStream.Length + 6; } else { position += 0x800; } } else { position += 0x800; fs.Seek(position, SeekOrigin.Begin); } } } } } } return; } } // No valid idx file found - just open like vob file Open(vobSubFileName); }
internal void OpenSubIdx(string vobSubFileName, string idxFileName) { VobSubPacks = new List<VobSubPack>(); if (!string.IsNullOrEmpty(idxFileName) && File.Exists(idxFileName)) { var idx = new Idx(idxFileName); IdxPalette = idx.Palette; IdxLanguages = idx.Languages; if (idx.IdxParagraphs.Count > 0) { var buffer = new byte[0x800]; // 2048 using (var fs = new FileStream(vobSubFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { foreach (var p in idx.IdxParagraphs) { if (p.FilePosition + 100 < fs.Length) { long position = p.FilePosition; fs.Seek(position, SeekOrigin.Begin); fs.Read(buffer, 0, 0x0800); if (IsSubtitlePack(buffer) || IsPrivateStream1(buffer, 0)) { var vsp = new VobSubPack(buffer, p); VobSubPacks.Add(vsp); if (IsPrivateStream1(buffer, 0)) position += vsp.PacketizedElementaryStream.Length + 6; else position += 0x800; int currentSubPictureStreamId = vsp.PacketizedElementaryStream.SubPictureStreamId.Value; while (vsp.PacketizedElementaryStream != null && vsp.PacketizedElementaryStream.SubPictureStreamId.HasValue && (vsp.PacketizedElementaryStream.Length == PacketizedElementaryStreamMaximumLength || currentSubPictureStreamId != vsp.PacketizedElementaryStream.SubPictureStreamId.Value) && position < fs.Length) { fs.Seek(position, SeekOrigin.Begin); fs.Read(buffer, 0, 0x800); vsp = new VobSubPack(buffer, p); // idx position? if (vsp.PacketizedElementaryStream != null && vsp.PacketizedElementaryStream.SubPictureStreamId.HasValue && currentSubPictureStreamId == vsp.PacketizedElementaryStream.SubPictureStreamId.Value) { VobSubPacks.Add(vsp); if (IsPrivateStream1(buffer, 0)) position += vsp.PacketizedElementaryStream.Length + 6; else position += 0x800; } else { position += 0x800; fs.Seek(position, SeekOrigin.Begin); } } } } } } return; } } // No valid idx file found - just open like vob file Open(vobSubFileName); }