/// <summary> /// Gets the title info collection from the given BDReader object. /// </summary> /// <param name="reader">IBDReader object</param> /// <returns>a collection of titles</returns> protected virtual List <BluRayAPI.BDTitleInfo> GetTitleInfoCollection(IBDReader reader) { uint titleCount = 0; reader.GetTitleCount(ref titleCount); List <BluRayAPI.BDTitleInfo> titles = new List <BluRayAPI.BDTitleInfo>((int)titleCount); BluRayPlayerBuilder.LogDebug("Title count - {0}", titleCount); for (int i = 0; i < titleCount; i++) { BluRayAPI.BDTitleInfo titleInfo = GetTitleInfo(reader, i); titles.Add(titleInfo); } return(titles); }
/// <summary> /// Enumerates available chapters. Needs to be executed after title changes. /// </summary> protected override void EnumerateChapters(bool forceRefresh) { if (_titleInfos == null || _currentTitle >= _titleInfos.Count || !forceRefresh && _chapterNames != null) { return; } _chapterNames = null; List <string> chapters = new List <string>(); BluRayAPI.BDTitleInfo currentTitle = _titleInfos[_currentTitle]; _bdReader.GetChapter(ref _currentChapter); for (int i = 1; i <= currentTitle.Chapters.Length; ++i) { chapters.Add(GetChapterName(i)); } _chapterNames = chapters.ToArray(); }
/// <summary> /// Gets the title info for the specified index /// </summary> /// <param name="reader">IBDReader object</param> /// <param name="index">index of the title</param> /// <returns></returns> protected virtual BluRayAPI.BDTitleInfo GetTitleInfo(IBDReader reader, int index) { BluRayAPI.BDTitleInfo titleInfo = new BluRayAPI.BDTitleInfo(); IntPtr ptr = IntPtr.Zero; try { ptr = reader.GetTitleInfo(index); BluRayAPI.UnmanagedBDTitleInfo umTitleInfo = (BluRayAPI.UnmanagedBDTitleInfo) Marshal.PtrToStructure(ptr, typeof(BluRayAPI.UnmanagedBDTitleInfo)); titleInfo = new BluRayAPI.BDTitleInfo { AngleCount = umTitleInfo.AngleCount, Duration = umTitleInfo.Duration, Index = umTitleInfo.Index, Playlist = umTitleInfo.Playlist, Clips = new BluRayAPI.BDClipInfo[umTitleInfo.ClipCount], Chapters = new BluRayAPI.BDChapter[umTitleInfo.ChapterCount] }; for (int i = 0; i < umTitleInfo.ClipCount; i++) { BluRayAPI.UnmanagedBDClipInfo umClipInfo = (BluRayAPI.UnmanagedBDClipInfo) Marshal.PtrToStructure(new IntPtr((int)umTitleInfo.Clips + i * Marshal.SizeOf(typeof(BluRayAPI.UnmanagedBDClipInfo))), typeof(BluRayAPI.UnmanagedBDClipInfo)); BluRayAPI.BDClipInfo clipInfo = new BluRayAPI.BDClipInfo { AudioStreams = new BluRayAPI.BDStreamInfo[umClipInfo.AudioStreamCount], IgStreams = new BluRayAPI.BDStreamInfo[umClipInfo.IgStreamCount], PgStreams = new BluRayAPI.BDStreamInfo[umClipInfo.PgStreamCount], RawStreams = new BluRayAPI.BDStreamInfo[umClipInfo.RawStreamCount], VideoStreams = new BluRayAPI.BDStreamInfo[umClipInfo.VideoStreamCount], SecAudioStreams = new BluRayAPI.BDStreamInfo[umClipInfo.SecAudioStreamCount], SecVideoStreams = new BluRayAPI.BDStreamInfo[umClipInfo.SecVideoStreamCount], PktCount = umClipInfo.PktCount, StillMode = umClipInfo.StillMode, StillTime = umClipInfo.StillTime }; GetStreamInfo(clipInfo.VideoStreams, umClipInfo.VideoStreams); GetStreamInfo(clipInfo.AudioStreams, umClipInfo.AudioStreams); GetStreamInfo(clipInfo.IgStreams, umClipInfo.IgStreams); GetStreamInfo(clipInfo.PgStreams, umClipInfo.PgStreams); GetStreamInfo(clipInfo.RawStreams, umClipInfo.RawStreams); GetStreamInfo(clipInfo.SecAudioStreams, umClipInfo.SecAudioStreams); GetStreamInfo(clipInfo.SecVideoStreams, umClipInfo.SecVideoStreams); titleInfo.Clips[i] = clipInfo; } for (int i = 0; i < titleInfo.Chapters.Length; i++) { BluRayAPI.BDChapter chapter = (BluRayAPI.BDChapter) Marshal.PtrToStructure(new IntPtr((int)umTitleInfo.Chapters + i * Marshal.SizeOf(typeof(BluRayAPI.BDChapter))), typeof(BluRayAPI.BDChapter)); titleInfo.Chapters[i] = chapter; } } catch { BluRayPlayerBuilder.LogError("GetTitleInfo({0}) failed.", index); } finally { if (ptr != IntPtr.Zero) { reader.FreeTitleInfo(ptr); } } return(titleInfo); }
/// <summary> /// Gets the title info for the specified index /// </summary> /// <param name="reader">IBDReader object</param> /// <param name="index">index of the title</param> /// <returns></returns> protected virtual BluRayAPI.BDTitleInfo GetTitleInfo(IBDReader reader, int index) { BluRayAPI.BDTitleInfo titleInfo = new BluRayAPI.BDTitleInfo(); IntPtr ptr = IntPtr.Zero; try { ptr = reader.GetTitleInfo(index); BluRayAPI.UnmanagedBDTitleInfo umTitleInfo = (BluRayAPI.UnmanagedBDTitleInfo) Marshal.PtrToStructure(ptr, typeof(BluRayAPI.UnmanagedBDTitleInfo)); titleInfo = new BluRayAPI.BDTitleInfo { AngleCount = umTitleInfo.AngleCount, Duration = umTitleInfo.Duration, Index = umTitleInfo.Index, Playlist = umTitleInfo.Playlist, Clips = new BluRayAPI.BDClipInfo[umTitleInfo.ClipCount], Chapters = new BluRayAPI.BDChapter[umTitleInfo.ChapterCount] }; for (int i = 0; i < umTitleInfo.ClipCount; i++) { BluRayAPI.UnmanagedBDClipInfo umClipInfo = (BluRayAPI.UnmanagedBDClipInfo) Marshal.PtrToStructure(new IntPtr((int)umTitleInfo.Clips + i * Marshal.SizeOf(typeof(BluRayAPI.UnmanagedBDClipInfo))), typeof(BluRayAPI.UnmanagedBDClipInfo)); BluRayAPI.BDClipInfo clipInfo = new BluRayAPI.BDClipInfo { AudioStreams = new BluRayAPI.BDStreamInfo[umClipInfo.AudioStreamCount], IgStreams = new BluRayAPI.BDStreamInfo[umClipInfo.IgStreamCount], PgStreams = new BluRayAPI.BDStreamInfo[umClipInfo.PgStreamCount], RawStreams = new BluRayAPI.BDStreamInfo[umClipInfo.RawStreamCount], VideoStreams = new BluRayAPI.BDStreamInfo[umClipInfo.VideoStreamCount], SecAudioStreams = new BluRayAPI.BDStreamInfo[umClipInfo.SecAudioStreamCount], SecVideoStreams = new BluRayAPI.BDStreamInfo[umClipInfo.SecVideoStreamCount], PktCount = umClipInfo.PktCount, StillMode = umClipInfo.StillMode, StillTime = umClipInfo.StillTime }; GetStreamInfo(clipInfo.VideoStreams, umClipInfo.VideoStreams); GetStreamInfo(clipInfo.AudioStreams, umClipInfo.AudioStreams); GetStreamInfo(clipInfo.IgStreams, umClipInfo.IgStreams); GetStreamInfo(clipInfo.PgStreams, umClipInfo.PgStreams); GetStreamInfo(clipInfo.RawStreams, umClipInfo.RawStreams); GetStreamInfo(clipInfo.SecAudioStreams, umClipInfo.SecAudioStreams); GetStreamInfo(clipInfo.SecVideoStreams, umClipInfo.SecVideoStreams); titleInfo.Clips[i] = clipInfo; } for (int i = 0; i < titleInfo.Chapters.Length; i++) { BluRayAPI.BDChapter chapter = (BluRayAPI.BDChapter) Marshal.PtrToStructure(new IntPtr((int)umTitleInfo.Chapters + i * Marshal.SizeOf(typeof(BluRayAPI.BDChapter))), typeof(BluRayAPI.BDChapter)); titleInfo.Chapters[i] = chapter; } } catch { BluRayPlayerBuilder.LogError("GetTitleInfo({0}) failed.", index); } finally { if (ptr != IntPtr.Zero) reader.FreeTitleInfo(ptr); } return titleInfo; }