public TSStreamClip( TSStreamFile streamFile, TSStreamClipFile streamClipFile) { if (streamFile != null) { Name = streamFile.Name; StreamFile = streamFile; if (StreamFile.FileInfo != null) { FileSize = (ulong)StreamFile.FileInfo.Length; } else { FileSize = (ulong)StreamFile.DFileInfo.Length; } if (StreamFile.InterleavedFile != null) { if (StreamFile.InterleavedFile.FileInfo != null) { InterleavedFileSize = (ulong)StreamFile.InterleavedFile.FileInfo.Length; } else { InterleavedFileSize = (ulong)StreamFile.InterleavedFile.DFileInfo.Length; } } } StreamClipFile = streamClipFile; }
protected bool BDROM_StreamClipFileScanError(TSStreamClipFile streamClipFile, Exception ex) { System.Console.WriteLine(string.Format( "An error occurred while scanning the stream clip file {0}.\n\nThe disc may be copy-protected or damaged.\n\nDo you want to continue scanning the stream clip files?", streamClipFile.Name)); return(GetYorNdefaultY()); }
public TSStreamClip( //TSStreamFile streamFile, TSStreamClipFile streamClipFile) { Name = streamClipFile.Name; //streamFile.Name; //StreamFile = streamFile; StreamClipFile = streamClipFile; //FileSize = (ulong)StreamFile.FileInfo.Length; }
public TSStreamClip( TSStreamFile streamFile, TSStreamClipFile streamClipFile) { if (streamFile != null) { Name = streamFile.Name; StreamFile = streamFile; FileSize = (ulong)StreamFile.FileInfo.Length; if (StreamFile.InterleavedFile != null) { InterleavedFileSize = (ulong)StreamFile.InterleavedFile.FileInfo.Length; } } StreamClipFile = streamClipFile; }
public TSStreamClip( TSStreamFile streamFile, TSStreamClipFile streamClipFile) { if (streamFile != null) { _settings = ServiceRegistration.Get<ISettingsManager>().Load<BDInfoSettings>() ?? new BDInfoSettings(); Name = streamFile.Name; StreamFile = streamFile; FileSize = (ulong)StreamFile.FileInfo.Length; if (StreamFile.InterleavedFile != null) { InterleavedFileSize = (ulong)StreamFile.InterleavedFile.FileInfo.Length; } } StreamClipFile = streamClipFile; }
public TSStreamClip( TSStreamFile streamFile, TSStreamClipFile streamClipFile) { if (streamFile != null) { _settings = ServiceRegistration.Get <ISettingsManager>().Load <BDInfoSettings>() ?? new BDInfoSettings(); Name = streamFile.Name; StreamFile = streamFile; FileSize = (ulong)StreamFile.FileInfo.Length; if (StreamFile.InterleavedFile != null) { InterleavedFileSize = (ulong)StreamFile.InterleavedFile.FileInfo.Length; } } StreamClipFile = streamClipFile; }
public void Scan() //Dictionary<string, TSStreamFile> streamFiles, //Dictionary<string, TSStreamClipFile> streamClipFiles) { FileStream fileStream = null; BinaryReader fileReader = null; int streamFileCount = 0; Dictionary <string, TSStreamClipFile> streamClipFiles = new Dictionary <string, TSStreamClipFile>(); try { #if DEBUG Debug.WriteLine(string.Format( "Scanning {0}...", Name)); #endif Streams.Clear(); StreamClips.Clear(); fileStream = File.OpenRead(FileInfo.FullName); fileReader = new BinaryReader(fileStream); byte[] data = new byte[fileStream.Length]; int dataLength = fileReader.Read(data, 0, data.Length); byte[] fileType = new byte[8]; Array.Copy(data, 0, fileType, 0, fileType.Length); FileType = ASCIIEncoding.ASCII.GetString(fileType); if ((FileType != "MPLS0100" && FileType != "MPLS0200" && FileType != "MPLS0300") /*|| data[45] != 1*/) { throw new Exception(string.Format( "Playlist {0} has an unknown file type {1}.", FileInfo.Name, FileType)); } #if DEBUG Debug.WriteLine(string.Format( "\tFileType: {0}", FileType)); #endif int playlistIndex = ((int)data[8] << 24) + ((int)data[9] << 16) + ((int)data[10] << 8) + ((int)data[11]); // TODO: Hack for bad TSRemux output. int playlistLength = data.Length - playlistIndex - 4; int playlistLengthCorrect = ((int)data[playlistIndex] << 24) + ((int)data[playlistIndex + 1] << 16) + ((int)data[playlistIndex + 2] << 8) + ((int)data[playlistIndex + 3]); byte[] playlistData = new byte[playlistLength]; Array.Copy(data, playlistIndex + 4, playlistData, 0, playlistData.Length); streamFileCount = (((int)playlistData[2] << 8) + (int)playlistData[3]); #if DEBUG Debug.WriteLine(string.Format( "\tStreamFileCount: {0}", streamFileCount)); #endif List <TSStreamClip> chapterClips = new List <TSStreamClip>(); int streamFileOffset = 6; for (int streamFileIndex = 0; streamFileIndex < streamFileCount; streamFileIndex++) { byte[] streamFileNameData = new byte[5]; Array.Copy(playlistData, streamFileOffset + 2, streamFileNameData, 0, streamFileNameData.Length); //TSStreamFile streamFile = null; //string streamFileName = string.Format( // "{0}.M2TS", // ASCIIEncoding.ASCII.GetString(streamFileNameData)); //if (streamFiles.ContainsKey(streamFileName)) //{ // streamFile = streamFiles[streamFileName]; //} //if (streamFile == null) //{ // throw new Exception(string.Format( // "Playlist {0} referenced missing file {1}.", // FileInfo.Name, streamFileName)); //} TSStreamClipFile streamClipFile = null; string streamClipFileName = string.Format( "{0}.CLPI", ASCIIEncoding.ASCII.GetString(streamFileNameData)); string streamClipFilePath = Path.Combine(Path.Combine(FileInfo.Directory.Parent.FullName, "CLIPINF"), streamClipFileName); if (File.Exists(streamClipFilePath) && !streamClipFiles.ContainsKey(streamClipFileName)) { streamClipFiles.Add(streamClipFileName, new TSStreamClipFile(new FileInfo(streamClipFilePath))); } if (streamClipFiles.ContainsKey(streamClipFileName)) { streamClipFile = streamClipFiles[streamClipFileName]; } if (streamClipFile == null) { continue; //throw new Exception(string.Format( // "Playlist {0} referenced missing file {1}.", // FileInfo.Name, streamClipFileName)); } byte condition = (byte) (playlistData[streamFileOffset + 12] & 0xF); ulong timeIn = ((ulong)playlistData[streamFileOffset + 14] << 24) + ((ulong)playlistData[streamFileOffset + 15] << 16) + ((ulong)playlistData[streamFileOffset + 16] << 8) + ((ulong)playlistData[streamFileOffset + 17]); ulong timeOut = ((ulong)playlistData[streamFileOffset + 18] << 24) + ((ulong)playlistData[streamFileOffset + 19] << 16) + ((ulong)playlistData[streamFileOffset + 20] << 8) + ((ulong)playlistData[streamFileOffset + 21]); TSStreamClip streamClip = new TSStreamClip( //streamFile, streamClipFile); streamClip.TimeIn = (double)timeIn / 45000; streamClip.TimeOut = (double)timeOut / 45000; streamClip.Length = streamClip.TimeOut - streamClip.TimeIn; streamClip.RelativeTimeIn = TotalLength; streamClip.RelativeTimeOut = streamClip.RelativeTimeIn + streamClip.Length; StreamClips.Add(streamClip); chapterClips.Add(streamClip); #if DEBUG Debug.WriteLine(string.Format( "\t{0} {1} {2} {3}", streamClip.Name, streamClip.TimeIn.TotalSeconds, streamClip.TimeOut.TotalSeconds, streamClip.Length.TotalSeconds)); #endif if ((playlistData[streamFileOffset + 12] & 0x10) > 0) { int angleCount = playlistData[streamFileOffset + 34]; if (angleCount - 1 > AngleCount) { AngleCount = angleCount - 1; } for (int angle = 0; angle < (angleCount - 1); angle++) { byte[] angleFileNameData = new byte[5]; int angleOffset = streamFileOffset + 26 + ((angle + 1) * 10); Array.Copy(playlistData, angleOffset, angleFileNameData, 0, angleFileNameData.Length); //TSStreamFile angleFile = null; //string angleFileName = string.Format( // "{0}.M2TS", // ASCIIEncoding.ASCII.GetString(angleFileNameData)); //if (streamFiles.ContainsKey(angleFileName)) //{ // angleFile = streamFiles[angleFileName]; //} //if (angleFile == null) //{ // throw new Exception(string.Format( // "Playlist {0} referenced missing angle file {1}.", // FileInfo.Name, angleFileName)); //} TSStreamClipFile angleClipFile = null; string angleClipFileName = string.Format( "{0}.CLPI", ASCIIEncoding.ASCII.GetString(angleFileNameData)); if (streamClipFiles.ContainsKey(angleClipFileName)) { angleClipFile = streamClipFiles[angleClipFileName]; } if (angleClipFile == null) { continue; //throw new Exception(string.Format( // "Playlist {0} referenced missing angle file {1}.", // FileInfo.Name, angleClipFileName)); } TSStreamClip angleClip = new TSStreamClip(//angleFile, angleClipFile); angleClip.AngleIndex = angle + 1; angleClip.TimeIn = streamClip.TimeIn; angleClip.TimeOut = streamClip.TimeOut; angleClip.RelativeTimeIn = streamClip.RelativeTimeIn; angleClip.RelativeTimeOut = streamClip.RelativeTimeOut; angleClip.Length = streamClip.Length; StreamClips.Add(angleClip); #if DEBUG Debug.WriteLine(string.Format( "\t\t{0}", angleFileName)); #endif } } streamFileOffset += 2 + ((int)playlistData[streamFileOffset] << 8) + ((int)playlistData[streamFileOffset + 1]); } int chaptersIndex = ((int)data[12] << 24) + ((int)data[13] << 16) + ((int)data[14] << 8) + ((int)data[15]); int chaptersLength = ((int)data[chaptersIndex] << 24) + ((int)data[chaptersIndex + 1] << 16) + ((int)data[chaptersIndex + 2] << 8) + ((int)data[chaptersIndex + 3]); byte[] chapterData = new byte[chaptersLength]; Array.Copy(data, chaptersIndex + 4, chapterData, 0, chaptersLength); int chapterCount = ((int)chapterData[0] << 8) + chapterData[1]; int chapterOffset = 2; for (int chapterIndex = 0; chapterIndex < chapterCount; chapterIndex++) { if (chapterData[chapterOffset + 1] == 1) { int streamFileIndex = ((int)chapterData[chapterOffset + 2] << 8) + chapterData[chapterOffset + 3]; TSStreamClip streamClip = chapterClips[streamFileIndex]; long chapterTime = ((long)chapterData[chapterOffset + 4] << 24) + ((long)chapterData[chapterOffset + 5] << 16) + ((long)chapterData[chapterOffset + 6] << 8) + ((long)chapterData[chapterOffset + 7]); double chapterSeconds = (double)chapterTime / 45000; double relativeSeconds = chapterSeconds - streamClip.TimeIn + streamClip.RelativeTimeIn; // TODO: Ignore short last chapter? if (TotalLength - relativeSeconds > 1.0) { streamClip.Chapters.Add(chapterSeconds); this.Chapters.Add(relativeSeconds); } #if DEBUG Debug.WriteLine(string.Format( "\t{0} {1} {2}", chapterIndex, streamClip.Name, chapter.TotalSeconds)); #endif } chapterOffset += 14; } #if DEBUG Debug.WriteLine(string.Format( "\tLength: {0}", Length.TotalSeconds)); Debug.WriteLine(string.Format( "\tAngleLength: {0}", AngleLength.TotalSeconds)); #endif //LoadStreamClips(); IsInitialized = true; } finally { if (fileReader != null) { fileReader.Close(); } if (fileStream != null) { fileStream.Close(); } } }
protected bool BDROM_StreamClipFileScanError(TSStreamClipFile streamClipFile, Exception ex) { DialogResult result = MessageBox.Show(string.Format( "An error occurred while scanning the stream clip file {0}.\n\nThe disc may be copy-protected or damaged.\n\nDo you want to continue scanning the stream clip files?", streamClipFile.Name), "BDInfo Scan Error", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) return true; else return false; }
public void Scan( Dictionary <string, TSStreamFile> streamFiles, Dictionary <string, TSStreamClipFile> streamClipFiles) { Stream fileStream = null; BinaryReader fileReader = null; try { Streams.Clear(); StreamClips.Clear(); fileStream = File.OpenRead(FileInfo.FullName); fileReader = new BinaryReader(fileStream); byte[] data = new byte[fileStream.Length]; int dataLength = fileReader.Read(data, 0, data.Length); int pos = 0; FileType = ReadString(data, 8, ref pos); if (FileType != "MPLS0100" && FileType != "MPLS0200") { throw new Exception(string.Format( "Playlist {0} has an unknown file type {1}.", FileInfo.Name, FileType)); } int playlistOffset = ReadInt32(data, ref pos); int chaptersOffset = ReadInt32(data, ref pos); int extensionsOffset = ReadInt32(data, ref pos); pos = playlistOffset; int playlistLength = ReadInt32(data, ref pos); int playlistReserved = ReadInt16(data, ref pos); int itemCount = ReadInt16(data, ref pos); int subitemCount = ReadInt16(data, ref pos); var chapterClips = new List <TSStreamClip>(); for (int itemIndex = 0; itemIndex < itemCount; itemIndex++) { int itemStart = pos; int itemLength = ReadInt16(data, ref pos); string itemName = ReadString(data, 5, ref pos); string itemType = ReadString(data, 4, ref pos); TSStreamFile streamFile = null; string streamFileName = string.Format( "{0}.M2TS", itemName); if (streamFiles.ContainsKey(streamFileName)) { streamFile = streamFiles[streamFileName]; } if (streamFile == null) { // Error condition } TSStreamClipFile streamClipFile = null; string streamClipFileName = string.Format( "{0}.CLPI", itemName); if (streamClipFiles.ContainsKey(streamClipFileName)) { streamClipFile = streamClipFiles[streamClipFileName]; } if (streamClipFile == null) { throw new Exception(string.Format( "Playlist {0} referenced missing file {1}.", FileInfo.Name, streamFileName)); } pos += 1; int multiangle = (data[pos] >> 4) & 0x01; int condition = data[pos] & 0x0F; pos += 2; int inTime = ReadInt32(data, ref pos); if (inTime < 0) { inTime &= 0x7FFFFFFF; } double timeIn = (double)inTime / 45000; int outTime = ReadInt32(data, ref pos); if (outTime < 0) { outTime &= 0x7FFFFFFF; } double timeOut = (double)outTime / 45000; var streamClip = new TSStreamClip( streamFile, streamClipFile); streamClip.Name = streamFileName; //TODO streamClip.TimeIn = timeIn; streamClip.TimeOut = timeOut; streamClip.Length = streamClip.TimeOut - streamClip.TimeIn; streamClip.RelativeTimeIn = TotalLength; streamClip.RelativeTimeOut = streamClip.RelativeTimeIn + streamClip.Length; StreamClips.Add(streamClip); chapterClips.Add(streamClip); pos += 12; if (multiangle > 0) { int angles = data[pos]; pos += 2; for (int angle = 0; angle < angles - 1; angle++) { string angleName = ReadString(data, 5, ref pos); string angleType = ReadString(data, 4, ref pos); pos += 1; TSStreamFile angleFile = null; string angleFileName = string.Format( "{0}.M2TS", angleName); if (streamFiles.ContainsKey(angleFileName)) { angleFile = streamFiles[angleFileName]; } if (angleFile == null) { throw new Exception(string.Format( "Playlist {0} referenced missing angle file {1}.", FileInfo.Name, angleFileName)); } TSStreamClipFile angleClipFile = null; string angleClipFileName = string.Format( "{0}.CLPI", angleName); if (streamClipFiles.ContainsKey(angleClipFileName)) { angleClipFile = streamClipFiles[angleClipFileName]; } if (angleClipFile == null) { throw new Exception(string.Format( "Playlist {0} referenced missing angle file {1}.", FileInfo.Name, angleClipFileName)); } var angleClip = new TSStreamClip(angleFile, angleClipFile); angleClip.AngleIndex = angle + 1; angleClip.TimeIn = streamClip.TimeIn; angleClip.TimeOut = streamClip.TimeOut; angleClip.RelativeTimeIn = streamClip.RelativeTimeIn; angleClip.RelativeTimeOut = streamClip.RelativeTimeOut; angleClip.Length = streamClip.Length; StreamClips.Add(angleClip); } if (angles - 1 > AngleCount) { AngleCount = angles - 1; } } int streamInfoLength = ReadInt16(data, ref pos); pos += 2; int streamCountVideo = data[pos++]; int streamCountAudio = data[pos++]; int streamCountPG = data[pos++]; int streamCountIG = data[pos++]; int streamCountSecondaryAudio = data[pos++]; int streamCountSecondaryVideo = data[pos++]; int streamCountPIP = data[pos++]; pos += 5; #if DEBUG Debug.WriteLine(string.Format( "{0} : {1} -> V:{2} A:{3} PG:{4} IG:{5} 2A:{6} 2V:{7} PIP:{8}", Name, streamFileName, streamCountVideo, streamCountAudio, streamCountPG, streamCountIG, streamCountSecondaryAudio, streamCountSecondaryVideo, streamCountPIP)); #endif for (int i = 0; i < streamCountVideo; i++) { var stream = CreatePlaylistStream(data, ref pos); if (stream != null) { PlaylistStreams[stream.PID] = stream; } } for (int i = 0; i < streamCountAudio; i++) { var stream = CreatePlaylistStream(data, ref pos); if (stream != null) { PlaylistStreams[stream.PID] = stream; } } for (int i = 0; i < streamCountPG; i++) { var stream = CreatePlaylistStream(data, ref pos); if (stream != null) { PlaylistStreams[stream.PID] = stream; } } for (int i = 0; i < streamCountIG; i++) { var stream = CreatePlaylistStream(data, ref pos); if (stream != null) { PlaylistStreams[stream.PID] = stream; } } for (int i = 0; i < streamCountSecondaryAudio; i++) { var stream = CreatePlaylistStream(data, ref pos); if (stream != null) { PlaylistStreams[stream.PID] = stream; } pos += 2; } for (int i = 0; i < streamCountSecondaryVideo; i++) { var stream = CreatePlaylistStream(data, ref pos); if (stream != null) { PlaylistStreams[stream.PID] = stream; } pos += 6; } /* * TODO * * for (int i = 0; i < streamCountPIP; i++) * { * TSStream stream = CreatePlaylistStream(data, ref pos); * if (stream != null) PlaylistStreams[stream.PID] = stream; * } */ pos += itemLength - (pos - itemStart) + 2; } pos = chaptersOffset + 4; int chapterCount = ReadInt16(data, ref pos); for (int chapterIndex = 0; chapterIndex < chapterCount; chapterIndex++) { int chapterType = data[pos + 1]; if (chapterType == 1) { int streamFileIndex = ((int)data[pos + 2] << 8) + data[pos + 3]; long chapterTime = ((long)data[pos + 4] << 24) + ((long)data[pos + 5] << 16) + ((long)data[pos + 6] << 8) + ((long)data[pos + 7]); var streamClip = chapterClips[streamFileIndex]; double chapterSeconds = (double)chapterTime / 45000; double relativeSeconds = chapterSeconds - streamClip.TimeIn + streamClip.RelativeTimeIn; // TODO: Ignore short last chapter? if (TotalLength - relativeSeconds > 1.0) { streamClip.Chapters.Add(chapterSeconds); this.Chapters.Add(relativeSeconds); } } else { // TODO: Handle other chapter types? } pos += 14; } } finally { if (fileReader != null) { fileReader.Dispose(); } if (fileStream != null) { fileStream.Dispose(); } } }
public TSStreamClip(TSStreamClipFile streamClipFile) { Name = streamClipFile.Name; StreamClipFile = streamClipFile; }
// not used anymore, but still there ;) private void SetRefreshRateBDold() { if (!_changeRefreshRate) { return; } Log.Info("Blu-Ray Player Launcher: SetRefreshRate for BDs"); if (_driveLetter == null) { Log.Error("Blu-Ray Player Launcher: SetRefreshRate - drive letter not assigned!"); return; } FileInfo[] files = null; double fps = -1; try { DirectoryInfo dir = new DirectoryInfo(_driveLetter + "\\BDMV\\PLAYLIST"); PlaylistFiles.Clear(); StreamFiles.Clear(); StreamClipFiles.Clear(); files = dir.GetFiles("*.MPLS"); foreach (FileInfo file in files) { TSPlaylistFile playlistFile = new TSPlaylistFile(file); PlaylistFiles.Add(file.Name.ToUpper(), playlistFile); //Log.Info("Blu-Ray Player Launcher: MPLS - {0} {1}", file.Name, playlistFile.TotalSize); } dir = new DirectoryInfo(_driveLetter + "\\BDMV\\STREAM"); files = dir.GetFiles("*.M2TS"); foreach (FileInfo file in files) { TSStreamFile streamFile = new TSStreamFile(file); StreamFiles.Add(file.Name.ToUpper(), streamFile); } dir = new DirectoryInfo(_driveLetter + "\\BDMV\\CLIPINF"); files = dir.GetFiles("*.CLPI"); foreach (FileInfo file in files) { TSStreamClipFile streamClipFile = new TSStreamClipFile(file); StreamClipFiles.Add(file.Name.ToUpper(), streamClipFile); } foreach (TSStreamClipFile streamClipFile in StreamClipFiles.Values) { streamClipFile.Scan(); } foreach (TSStreamFile streamFile in StreamFiles.Values) { streamFile.Scan(null, false); } double maxLenght = 0; foreach (TSPlaylistFile playlistFile in PlaylistFiles.Values) { playlistFile.Scan(StreamFiles, StreamClipFiles); Log.Info("Blu-Ray Player Launcher: total size - {0} - {1}", playlistFile.TotalLength, playlistFile.VideoStreams[0].FrameRate.ToString()); if (maxLenght < playlistFile.TotalLength) { // find the largest movie clip, might not work with seamless branching movies... maxLenght = playlistFile.TotalLength; switch (playlistFile.VideoStreams[0].FrameRate) { case TSFrameRate.FRAMERATE_23_976: fps = 23.976; break; case TSFrameRate.FRAMERATE_24: fps = 24; break; case TSFrameRate.FRAMERATE_25: fps = 25; break; case TSFrameRate.FRAMERATE_29_97: fps = 29.97; break; case TSFrameRate.FRAMERATE_50: fps = 50; break; case TSFrameRate.FRAMERATE_59_94: fps = 59.94; break; } } playlistFile.ClearBitrates(); } } catch (Exception e) { Log.Error("Blu-Ray Player Launcher: SetRefreshRate - failed to get refresh rate from disk!"); Log.Error("Blu-Ray Player Launcher: SetRefreshRate - exception {0}", e); return; } try { Log.Info("Blu-Ray Player Launcher: calling SetRefreshRateBasedOnFPS() - {0}Hz", fps); RefreshRateChanger.SetRefreshRateBasedOnFPS(fps, "", RefreshRateChanger.MediaType.Video); _refreshRateChangeSuccessful = true; } catch (Exception e) { Log.Error("Blu-Ray Player Launcher:SetRefreshRate - exception {0}", e); } }
protected bool BDROM_StreamClipFileScanError(TSStreamClipFile streamClipFile, Exception ex) { logger.Debug("Stream Clip File Scan Error"); scanfailed = true; return false; }
protected bool BDROM_StreamClipFileScanError(TSStreamClipFile streamClipFile, Exception ex) { System.Console.WriteLine(string.Format( "An error occurred while scanning the stream clip file {0}.\n\nThe disc may be copy-protected or damaged.\n\nDo you want to continue scanning the stream clip files?", streamClipFile.Name)); return GetYorNdefaultY(); }