private static void AddPesPacket(List <DvbSubPes> list, List <Packet> packetList) { int bufferSize = 0; foreach (Packet p in packetList) { bufferSize += p.Payload.Length; } var pesData = new byte[bufferSize]; int pesIndex = 0; foreach (Packet p in packetList) { Buffer.BlockCopy(p.Payload, 0, pesData, pesIndex, p.Payload.Length); pesIndex += p.Payload.Length; } DvbSubPes pes; if (VobSubParser.IsMpeg2PackHeader(pesData)) { pes = new DvbSubPes(pesData, Mpeg2Header.Length); } else if (VobSubParser.IsPrivateStream1(pesData, 0)) { pes = new DvbSubPes(pesData, 0); } else { pes = new DvbSubPes(pesData, 0); } list.Add(pes); }
public static bool IsDvbSup(string fileName) { try { byte[] pesData = File.ReadAllBytes(fileName); if (pesData[0] != 0x20 || pesData[1] != 0 || pesData[2] != 0x0F) { return(false); } var pes = new DvbSubPes(0, pesData); return(pes.SubtitleSegments.Count > 0); } catch { return(false); } }
public static List <TransportStreamSubtitle> GetDvbSup(string fileName) { byte[] pesData = File.ReadAllBytes(fileName); var list = new List <DvbSubPes>(); int index = 0; while (index < pesData.Length - 10) { var pes = new DvbSubPes(index, pesData); index = pes.Length + 1; list.Add(pes); } var subtitles = new List <TransportStreamSubtitle>(); int seconds = 0; for (int i = 0; i < list.Count; i++) { var pes = list[i]; pes.ParseSegments(); if (pes.ObjectDataList.Count > 0) { var sub = new TransportStreamSubtitle(); sub.StartMilliseconds = (ulong)seconds * 1000UL; seconds += pes.PageCompositions[0].PageTimeOut; if (pes.PageCompositions.Count > 0) { sub.EndMilliseconds = sub.StartMilliseconds + (ulong)pes.PageCompositions[0].PageTimeOut * 1000UL; } else { sub.EndMilliseconds = sub.StartMilliseconds + 2500; } sub.Pes = pes; subtitles.Add(sub); } if (pes.PageCompositions.Count > 0) { seconds += pes.PageCompositions[0].PageTimeOut; } } return(subtitles); }
public static List<TransportStreamSubtitle> GetDvbSup(string fileName) { byte[] pesData = File.ReadAllBytes(fileName); var list = new List<DvbSubPes>(); int index = 0; while (index < pesData.Length - 10) { var pes = new DvbSubPes(index, pesData); index = pes.Length + 1; list.Add(pes); } var subtitles = new List<TransportStreamSubtitle>(); int seconds = 0; for (int i = 0; i < list.Count; i++) { var pes = list[i]; pes.ParseSegments(); if (pes.ObjectDataList.Count > 0) { var sub = new TransportStreamSubtitle(); sub.StartMilliseconds = (ulong)seconds * 1000UL; seconds += pes.PageCompositions[0].PageTimeOut; if (pes.PageCompositions.Count > 0) sub.EndMilliseconds = sub.StartMilliseconds + (ulong)pes.PageCompositions[0].PageTimeOut * 1000UL; else sub.EndMilliseconds = sub.StartMilliseconds + 2500; sub.Pes = pes; subtitles.Add(sub); } if (pes.PageCompositions.Count > 0) { seconds += pes.PageCompositions[0].PageTimeOut; } } return subtitles; }
public static bool IsDvbSup(string fileName) { try { byte[] pesData = File.ReadAllBytes(fileName); if (pesData[0] != 0x20 || pesData[1] != 0 || pesData[2] != 0x0F) return false; var pes = new DvbSubPes(0, pesData); return pes.SubtitleSegments.Count > 0; } catch { return false; } }
private static void AddPesPacket(List<DvbSubPes> list, List<Packet> packetList) { int bufferSize = 0; foreach (Packet p in packetList) bufferSize += p.Payload.Length; var pesData = new byte[bufferSize]; int pesIndex = 0; foreach (Packet p in packetList) { Buffer.BlockCopy(p.Payload, 0, pesData, pesIndex, p.Payload.Length); pesIndex += p.Payload.Length; } DvbSubPes pes; if (VobSubParser.IsMpeg2PackHeader(pesData)) { pes = new DvbSubPes(pesData, Mpeg2Header.Length); } else if (VobSubParser.IsPrivateStream1(pesData, 0)) { pes = new DvbSubPes(pesData, 0); } else { pes = new DvbSubPes(pesData, 0); } list.Add(pes); }
private bool LoadDvbFromMatroska(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska, bool batchMode) { ShowStatus(_language.ParsingMatroskaFile); Refresh(); Cursor.Current = Cursors.WaitCursor; var sub = matroska.GetSubtitle(matroskaSubtitleInfo.TrackNumber, MatroskaProgress); TaskbarList.SetProgressState(Handle, TaskbarButtonProgressFlags.NoProgress); Cursor.Current = Cursors.Default; MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile); _subtitleListViewIndex = -1; if (!batchMode) ResetSubtitle(); _subtitle.Paragraphs.Clear(); var subtitleImages = new List<DvbSubPes>(); var subtitle = new Subtitle(); Utilities.LoadMatroskaTextSubtitle(matroskaSubtitleInfo, matroska, sub, _subtitle); for (int index = 0; index < sub.Count; index++) { try { var msub = sub[index]; DvbSubPes pes = null; if (msub.Data.Length > 9 && msub.Data[0] == 15 && msub.Data[1] >= SubtitleSegment.PageCompositionSegment && msub.Data[1] <= SubtitleSegment.DisplayDefinitionSegment) // sync byte + segment id { var buffer = new byte[msub.Data.Length + 3]; Buffer.BlockCopy(msub.Data, 0, buffer, 2, msub.Data.Length); buffer[0] = 32; buffer[1] = 0; buffer[buffer.Length - 1] = 255; pes = new DvbSubPes(0, buffer); } else if (VobSubParser.IsMpeg2PackHeader(msub.Data)) { pes = new DvbSubPes(msub.Data, Mpeg2Header.Length); } else if (VobSubParser.IsPrivateStream1(msub.Data, 0)) { pes = new DvbSubPes(msub.Data, 0); } else if (msub.Data.Length > 9 && msub.Data[0] == 32 && msub.Data[1] == 0 && msub.Data[2] == 14 && msub.Data[3] == 16) { pes = new DvbSubPes(0, msub.Data); } if (pes == null && subtitle.Paragraphs.Count > 0) { var last = subtitle.Paragraphs[subtitle.Paragraphs.Count - 1]; if (last.Duration.TotalMilliseconds < 100) { last.EndTime.TotalMilliseconds = msub.Start; if (last.Duration.TotalMilliseconds > Configuration.Settings.General.SubtitleMaximumDisplayMilliseconds) { last.EndTime.TotalMilliseconds = last.StartTime.TotalMilliseconds + 3000; } } } if (pes != null && pes.PageCompositions != null && pes.PageCompositions.Any(p => p.Regions.Count > 0)) { subtitleImages.Add(pes); subtitle.Paragraphs.Add(new Paragraph(string.Empty, msub.Start, msub.End)); } } catch { // continue } } if (subtitleImages.Count == 0) { return false; } for (int index = 0; index < subtitle.Paragraphs.Count; index++) { var p = subtitle.Paragraphs[index]; if (p.Duration.TotalMilliseconds < 200) { p.EndTime.TotalMilliseconds = p.StartTime.TotalMilliseconds + 3000; } var next = subtitle.GetParagraphOrDefault(index + 1); if (next != null && next.StartTime.TotalMilliseconds < p.EndTime.TotalMilliseconds) { p.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - Configuration.Settings.General.MinimumMillisecondsBetweenLines; } } using (var formSubOcr = new VobSubOcr()) { formSubOcr.Initialize(subtitle, subtitleImages, Configuration.Settings.VobSubOcr, null); // TODO: language??? if (_loading) { formSubOcr.Icon = (Icon)Icon.Clone(); formSubOcr.ShowInTaskbar = true; formSubOcr.ShowIcon = true; } if (formSubOcr.ShowDialog(this) == DialogResult.OK) { ResetSubtitle(); _subtitle.Paragraphs.Clear(); _subtitle.WasLoadedWithFrameNumbers = false; foreach (var p in formSubOcr.SubtitleFromOcr.Paragraphs) _subtitle.Paragraphs.Add(p); ShowSource(); SubtitleListview1.Fill(_subtitle, _subtitleAlternate); _subtitleListViewIndex = -1; SubtitleListview1.FirstVisibleIndex = -1; SubtitleListview1.SelectIndexAndEnsureVisible(0); _fileName = Path.GetFileNameWithoutExtension(matroska.Path); _converted = true; Text = Title; Configuration.Settings.Save(); return true; } } return false; }