private static void AddPesPacket(List <DvbSubPes> list, List <Packet> packetList) { int bufferSize = 0; foreach (var p in packetList) { bufferSize += p.Payload.Length; } var pesData = new byte[bufferSize]; int pesIndex = 0; foreach (var 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 IsVobSub(string fileName) { using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { var buffer = new byte[4]; fs.Read(buffer, 0, buffer.Length); return(VobSubParser.IsMpeg2PackHeader(buffer) || VobSubParser.IsPrivateStream1(buffer, 0)); } }
public VobSubPack(byte[] buffer, IdxParagraph idxLine) { _buffer = buffer; IdxLine = idxLine; if (VobSubParser.IsMpeg2PackHeader(buffer)) { Mpeg2Header = new Mpeg2Header(buffer); PacketizedElementaryStream = new PacketizedElementaryStream(buffer, Mpeg2Header.Length); } else if (VobSubParser.IsPrivateStream1(buffer, 0)) { PacketizedElementaryStream = new PacketizedElementaryStream(buffer, 0); } }
/// <summary> /// Can be used with e.g. MemoryStream or FileStream /// </summary> /// <param name="ms">Input stream</param> public void Parse(Stream ms) { var dataIndices = GetDataIndicesAndPesStart(ms, out var dvbPesStartIndex); if (dvbPesStartIndex <= 0) { return; } ms.Position = 0; foreach (var dataIndex in dataIndices) { ms.Seek(dvbPesStartIndex + dataIndex.Offset, SeekOrigin.Begin); var pesData = new byte[dataIndex.Length]; var bytesRead = ms.Read(pesData, 0, pesData.Length); if (bytesRead < pesData.Length) { break; // incomplete packet at end-of-file } 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(0, pesData); } pes.PresentationTimestamp = dataIndex.Pts; _dvbSubs.Add(pes); } }
private void RipSubtitles(string vobFileName, MemoryStream stream, int vobNumber) { long firstNavStartPts = 0; using (var fs = RetryOpenRead(vobFileName)) { var buffer = new byte[0x800]; long position = 0; progressBarRip.Maximum = 100; progressBarRip.Value = 0; int lba = 0; long length = fs.Length; while (position < length && !_abort) { int bytesRead = 0; // Reading and test for IO errors... and allow abort/retry/ignore var tryAgain = true; while (tryAgain && position < length) { tryAgain = false; try { fs.Seek(position, SeekOrigin.Begin); bytesRead = fs.Read(buffer, 0, 0x800); } catch (IOException exception) { var result = MessageBox.Show(string.Format("An error occured while reading file: {0}", exception.Message), "", MessageBoxButtons.AbortRetryIgnore); if (result == DialogResult.Abort) { return; } if (result == DialogResult.Retry) { tryAgain = true; } if (result == DialogResult.Ignore) { position += 0x800; tryAgain = true; } } } if (VobSubParser.IsMpeg2PackHeader(buffer)) { var vsp = new VobSubPack(buffer, null); if (IsSubtitlePack(buffer)) { if (vsp.PacketizedElementaryStream.PresentationTimestamp.HasValue && _accumulatedPresentationTimestamp != 0) { UpdatePresentationTimestamp(buffer, _accumulatedPresentationTimestamp, vsp); } stream.Write(buffer, 0, 0x800); if (bytesRead < 0x800) { stream.Write(Encoding.ASCII.GetBytes(new string(' ', 0x800 - bytesRead)), 0, 0x800 - bytesRead); } } else if (IsPrivateStream2(buffer, 0x26)) { if (Helper.GetEndian(buffer, 0x0026, 4) == 0x1bf && Helper.GetEndian(buffer, 0x0400, 4) == 0x1bf) { uint vobuSPtm = Helper.GetEndian(buffer, 0x0039, 4); uint vobuEPtm = Helper.GetEndian(buffer, 0x003d, 4); _lastPresentationTimestamp = vobuEPtm; if (firstNavStartPts == 0) { firstNavStartPts = vobuSPtm; if (vobNumber == 0) { _accumulatedPresentationTimestamp = -vobuSPtm; } } if (vobuSPtm + firstNavStartPts + _accumulatedPresentationTimestamp < _lastVobPresentationTimestamp) { _accumulatedPresentationTimestamp += _lastNavEndPts - vobuSPtm; } else if (_lastNavEndPts > vobuEPtm) { _accumulatedPresentationTimestamp += _lastNavEndPts - vobuSPtm; } _lastNavEndPts = vobuEPtm; } } } position += 0x800; var progress = (int)((position * 100) / length); if (progress != progressBarRip.Value) { progressBarRip.Value = progress; TaskbarList.SetProgressValue(_taskbarFormHandle, (vobNumber * 100) + progressBarRip.Value, progressBarRip.Maximum * listBoxVobFiles.Items.Count); Application.DoEvents(); } lba++; } } _lastVobPresentationTimestamp = _lastPresentationTimestamp; }
private void RipSubtitles(string vobFileName, MemoryStream stream, int vobNumber) { long firstNavStartPTS = 0; FileStream fs = null; bool tryAgain = true; while (tryAgain) { try { fs = new FileStream(vobFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); tryAgain = false; } catch (IOException exception) { var result = MessageBox.Show(string.Format("An error occured while opening file: {0}", exception.Message), "", MessageBoxButtons.RetryCancel); if (result == DialogResult.Cancel) { return; } if (result == DialogResult.Retry) { tryAgain = true; } } } byte[] buffer = new byte[0x800]; long position = 0; progressBarRip.Maximum = 100; progressBarRip.Value = 0; int lba = 0; long length = fs.Length; while (position < length && !_abort) { int bytesRead = 0; // Reading and test for IO errors... and allow abort/retry/ignore tryAgain = true; while (tryAgain && position < length) { tryAgain = false; try { fs.Seek(position, SeekOrigin.Begin); bytesRead = fs.Read(buffer, 0, 0x0800); } catch (IOException exception) { var result = MessageBox.Show(string.Format("An error occured while reading file: {0}", exception.Message), "", MessageBoxButtons.AbortRetryIgnore); if (result == DialogResult.Abort) { return; } if (result == DialogResult.Retry) { tryAgain = true; } if (result == DialogResult.Ignore) { position += 0x800; tryAgain = true; } } } if (VobSubParser.IsMpeg2PackHeader(buffer)) { VobSubPack vsp = new VobSubPack(buffer, null); if (IsSubtitlePack(buffer)) { if (vsp.PacketizedElementaryStream.PresentationTimeStamp.HasValue && _accumulatedPresentationTimeStamp != 0) { UpdatePresentationTimeStamp(buffer, _accumulatedPresentationTimeStamp, vsp); } stream.Write(buffer, 0, 0x800); if (bytesRead < 0x800) { stream.Write(Encoding.ASCII.GetBytes(new string(' ', 0x800 - bytesRead)), 0, 0x800 - bytesRead); } } else if (IsPrivateStream2(buffer, 0x26)) { if (Helper.GetEndian(buffer, 0x0026, 4) == 0x1bf && Helper.GetEndian(buffer, 0x400, 4) == 0x1bf) { uint vobu_s_ptm = Helper.GetEndian(buffer, 0x0039, 4); uint vobu_e_ptm = Helper.GetEndian(buffer, 0x003d, 4); _lastPresentationTimeStamp = vobu_e_ptm; if (firstNavStartPTS == 0) { firstNavStartPTS = vobu_s_ptm; if (vobNumber == 0) { _accumulatedPresentationTimeStamp = -vobu_s_ptm; } } if (vobu_s_ptm + firstNavStartPTS + _accumulatedPresentationTimeStamp < _lastVobPresentationTimeStamp) { _accumulatedPresentationTimeStamp += _lastNavEndPts - vobu_s_ptm; } else if (_lastNavEndPts > vobu_e_ptm) { _accumulatedPresentationTimeStamp += _lastNavEndPts - vobu_s_ptm; } _lastNavEndPts = vobu_e_ptm; } } } position += 0x800; progressBarRip.Value = (int)((position * 100) / length); Application.DoEvents(); lba++; } fs.Close(); _lastVobPresentationTimeStamp = _lastPresentationTimeStamp; }