/// <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); }
public TitleInfo(IBDReader reader, int index) { _reader = reader; _nativeTitle = new BDTitleInfo(); try { _nativePtr = reader.GetTitleInfo(index); _nativeTitle = (BDTitleInfo) Marshal.PtrToStructure(_nativePtr, typeof (BDTitleInfo)); } catch { Log.Error("BDPlayer: TitleInfo({0}) construction failed.", index); } }
/// <summary> do cleanup and release DirectShow. </summary> protected void CloseInterfaces() { if (_graphBuilder == null) { return; } int hr; Log.Debug("BDPlayer: Cleanup DShow graph {0}", GUIGraphicsContext.InVmr9Render); try { BDOSDRenderer.Release(); if (_mediaCtrl != null) { int counter = 0; FilterState state; hr = _mediaCtrl.Stop(); hr = _mediaCtrl.GetState(10, out state); while (state != FilterState.Stopped || GUIGraphicsContext.InVmr9Render) { Thread.Sleep(100); hr = _mediaCtrl.GetState(10, out state); counter++; if (counter >= 30) { if (state != FilterState.Stopped) Log.Error("BDPlayer: graph still running"); if (GUIGraphicsContext.InVmr9Render) Log.Error("BDPlayer: in renderer"); break; } } _mediaCtrl = null; } if (_vmr9 != null) { _vmr9.Enable(false); } if (_mediaEvt != null) { hr = _mediaEvt.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero); _mediaEvt = null; } _videoWin = _graphBuilder as IVideoWindow; if (_videoWin != null) { hr = _videoWin.put_Visible(OABool.False); hr = _videoWin.put_Owner(IntPtr.Zero); _videoWin = null; } _mediaSeeking = null; _basicAudio = null; _basicVideo = null; _ireader = null; #region Cleanup Sebastiii if (VideoCodec != null) { DirectShowUtil.ReleaseComObject(VideoCodec, 5000); VideoCodec = null; Log.Info("BDPlayer: Cleanup VideoCodec"); } if (AudioCodec != null) { DirectShowUtil.ReleaseComObject(AudioCodec, 5000); AudioCodec = null; Log.Info("BDPlayer: Cleanup AudioCodec"); } if (_audioRendererFilter != null) { while (DirectShowUtil.ReleaseComObject(_audioRendererFilter) > 0) ; _audioRendererFilter = null; Log.Info("BDPlayer: Cleanup AudioRenderer"); } //Test to ReleaseComObject from PostProcessFilter list objects. if (PostProcessFilterVideo.Count > 0) { foreach (var ppFilter in PostProcessFilterVideo) { if (ppFilter.Value != null) DirectShowUtil.ReleaseComObject(ppFilter.Value, 5000); } PostProcessFilterVideo.Clear(); Log.Info("BDPlayer: Cleanup PostProcessVideo"); } //Test to ReleaseComObject from PostProcessFilter list objects. if (PostProcessFilterAudio.Count > 0) { foreach (var ppFilter in PostProcessFilterAudio) { if (ppFilter.Value != null) DirectShowUtil.ReleaseComObject(ppFilter.Value, 5000); } PostProcessFilterAudio.Clear(); Log.Info("BDPlayer: Cleanup PostProcessAudio"); } #endregion if (_interfaceBDReader != null) { DirectShowUtil.ReleaseComObject(_interfaceBDReader, 5000); _interfaceBDReader = null; } if (_graphBuilder != null) { DirectShowUtil.RemoveFilters(_graphBuilder); if (_rotEntry != null) { _rotEntry.SafeDispose(); _rotEntry = null; } while ((hr = DirectShowUtil.ReleaseComObject(_graphBuilder)) > 0) ; _graphBuilder = null; } if (_dvbSubRenderer != null) { _dvbSubRenderer.SetPlayer(null); _dvbSubRenderer = null; } if (_vmr9 != null) { _vmr9.SafeDispose(); _vmr9 = null; } GUIGraphicsContext.form.Invalidate(true); _state = PlayState.Init; } catch (Exception ex) { Log.Error("BDPlayer: Exception while cleaning DShow graph - {0} {1}", ex.Message, ex.StackTrace); } //switch back to directx windowed mode ExclusiveMode(false); }
protected bool GetInterfaces(string filename, int titleBD) { try { Log.Debug("BDPlayer: GetInterfaces()"); _graphBuilder = (IGraphBuilder)new FilterGraph(); _rotEntry = new DsROTEntry(_graphBuilder as IFilterGraph); filterConfig = GetFilterConfiguration(); if (filterConfig.AudioRenderer.Length > 0) { _audioRendererFilter = DirectShowUtil.AddAudioRendererToGraph(_graphBuilder, filterConfig.AudioRenderer, true); } BDReader reader = new BDReader(); _interfaceBDReader = reader as IBaseFilter; _ireader = reader as IBDReader; if (_interfaceBDReader == null || _ireader == null) { // todo: add exception return false; } // add the BD reader int hr = _graphBuilder.AddFilter(_interfaceBDReader, BD_READER_GRAPH_NAME); DsError.ThrowExceptionForHR(hr); Log.Debug("BDPlayer: Add BDReader to graph"); IFileSourceFilter interfaceFile = (IFileSourceFilter)_interfaceBDReader; LoadSettings(_ireader); _ireader.SetD3DDevice(DirectShowUtil.GetUnmanagedDevice(GUIGraphicsContext.DX9Device)); _ireader.SetBDReaderCallback(this); hr = interfaceFile.Load(filename, null); DsError.ThrowExceptionForHR(hr); Log.Debug("BDPlayer: BDReader loaded: {0}", filename); List<TitleInfo> titles = GetTitleInfoCollection(_ireader); while (true) { if (g_Player.ForcePlay && g_Player.SetResumeBDTitleState < g_Player.BdDefaultTitle) { if (titles.Count == 1) { _titleToPlay = 0; g_Player.SetResumeBDTitleState = g_Player.BdRemuxTitle; } else { _titleToPlay = g_Player.SetResumeBDTitleState; } _forceTitle = true; g_Player.ForcePlay = false; } else { if (titles.Count == 1) { // BD has only one title (remux one) _forceTitle = true; _titleToPlay = 0; g_Player.SetResumeBDTitleState = g_Player.BdRemuxTitle; if (g_Player.SetResumeBDTitleState == -1) { // user cancelled dialog titles.Dispose(); g_Player.Stop(); return false; } } else { _titleToPlay = SelectTitle(titles); g_Player.SetResumeBDTitleState = _titleToPlay; Log.Info("BDPlayer: BDReader _titleToPlay : {0}", _titleToPlay); if (_titleToPlay > -1) { // a specific title was selected _forceTitle = true; if (g_Player.SetResumeBDTitleState == -1) { // user cancelled dialog titles.Dispose(); g_Player.Stop(); return false; } } else { if (_titleToPlay == -1) { // user cancelled dialog g_Player.Stop(); titles.Dispose(); return false; } // user choose to display menu _forceTitle = false; } } } _ireader.ForceTitleBasedPlayback(_forceTitle, (uint)_titleToPlay); Log.Debug("BDPlayer: Starting BDReader"); eventBuffer.Clear(); hr = _ireader.Start(); if (hr != 0) { if (!_forceTitle) { Log.Error("BDPlayer: Failed to start file:{0} :0x{1:x}", filename, hr); continue; } Log.Error("BDPlayer: Failed to start in title based mode file:{0} :0x{1:x}", filename, hr); titles.Dispose(); return false; } else { Log.Info("BDPlayer: BDReader started"); } break; } titles.Dispose(); #region Filters Log.Info("BDPlayer: Adding filters"); _vmr9 = new VMR9Util(); _vmr9.AddVMR9(_graphBuilder); _vmr9.Enable(false); // Set VideoDecoder and VC1Override before adding filter in graph SetVideoDecoder(); SetVC1Override(); // Add preferred video filters UpdateFilters("Video"); // Add preferred audio filters UpdateFilters("Audio"); // Let the subtitle engine handle the proper filters try { SubtitleRenderer.GetInstance().AddSubtitleFilter(_graphBuilder); } catch (Exception e) { Log.Error(e); } #endregion #region PostProcessingEngine Detection IPostProcessingEngine postengine = PostProcessingEngine.GetInstance(true); if (!postengine.LoadPostProcessing(_graphBuilder)) { PostProcessingEngine.engine = new PostProcessingEngine.DummyEngine(); } #endregion #region render BDReader output pins Log.Info("BDPlayer: Render BDReader outputs"); if (_interfaceBDReader != null) { DirectShowUtil.RenderGraphBuilderOutputPins(_graphBuilder, _interfaceBDReader); } //remove InternalScriptRenderer as it takes subtitle pin disableISR(); //disable Closed Captions! disableCC(); //RemoveAudioR(); DirectShowUtil.RemoveUnusedFiltersFromGraph(_graphBuilder); #endregion _mediaCtrl = (IMediaControl)_graphBuilder; _mediaEvt = (IMediaEventEx)_graphBuilder; _mediaSeeking = (IMediaSeeking)_graphBuilder; try { SubtitleRenderer.GetInstance().SetPlayer(this); _dvbSubRenderer = SubtitleRenderer.GetInstance(); } catch (Exception e) { Log.Error(e); } _subtitleStream = (Player.TSReaderPlayer.ISubtitleStream)_interfaceBDReader; if (_subtitleStream == null) { Log.Error("BDPlayer: Unable to get ISubtitleStream interface"); } // if only dvb subs are enabled, pass null for ttxtDecoder _subSelector = new SubtitleSelector(_subtitleStream, _dvbSubRenderer, null); EnableSubtitle = _subtitlesEnabled; //Sync Audio Renderer SyncAudioRenderer(); if (!_vmr9.IsVMR9Connected) { Log.Error("BDPlayer: Failed vmr9 not connected"); return false; } _vmr9.SetDeinterlaceMode(); return true; } catch (Exception ex) { Log.Error("BDPlayer: Exception while creating DShow graph {0}", ex.Message); return false; } }
/// <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 TitleInfo GetTitleInfo(IBDReader reader, int index) { TitleInfo titleInfo = new TitleInfo(reader, index); return titleInfo; }
/// <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<TitleInfo> GetTitleInfoCollection(IBDReader reader) { List<TitleInfo> titles = new List<TitleInfo>(); uint titleCount = 0; reader.GetTitleCount(ref titleCount); Log.Debug("BDPlayer: Title count - {0}", titleCount); for (int i = 0; i < titleCount; i++) { TitleInfo titleInfo = GetTitleInfo(reader, i); titles.Add(titleInfo); } return titles; }
/// <summary> /// Loads the setting from the user configuration into the IBDReader object. /// </summary> /// <param name="reader">IBDReader object</param> protected virtual void LoadSettings(IBDReader reader) { settings = new BDPlayerSettings(); using (Settings xmlreader = new MPSettings()) { settings.audioLang = xmlreader.GetValueAsString("bdplayer", "audiolanguage", "English"); settings.audioType = StreamTypetoInt(xmlreader.GetValueAsString("bdplayer", "audiotype", "AC3")); settings.subtitleLang = xmlreader.GetValueAsString("bdplayer", "subtitlelanguage", "English"); settings.parentalControl = xmlreader.GetValueAsInt("bdplayer", "parentalcontrol", 99); _subtitlesEnabled = xmlreader.GetValueAsBool("bdplayer", "subtitlesenabled", true); string regionCode = xmlreader.GetValueAsString("bdplayer", "regioncode", "B"); switch (regionCode) { case "A": settings.regionCode = 1; break; case "B": settings.regionCode = 2; break; case "C": settings.regionCode = 4; break; } } foreach (CultureInfo cultureInformation in CultureInfo.GetCultures(CultureTypes.NeutralCultures)) { if (String.Compare(cultureInformation.EnglishName, settings.audioLang, true) == 0) { settings.countryCode = cultureInformation.TwoLetterISOLanguageName; settings.audioLang = cultureInformation.ThreeLetterISOLanguageName; } if (String.Compare(cultureInformation.EnglishName, settings.subtitleLang, true) == 0) { settings.subtitleLang = cultureInformation.ThreeLetterISOLanguageName; } } settings.menuLang = settings.audioLang; reader.SetBDPlayerSettings(settings); }
/// <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> /// Adds the file source filter to the graph. /// </summary> protected override void AddSourceFilter() { if (!IsLocalFilesystemResource) { throw new IllegalCallException("The BluRayPlayer can only play local file system resources"); } // Load source filter, assembly location must be determined here, otherwise LoadFilterFromDll would try to lookup the file relative to VideoPlayer! string filterPath = FilterLoader.BuildAssemblyRelativePath("BDReader.ax"); _fileSource = FilterLoader.LoadFilterFromDll(filterPath, typeof(BDReader).GUID); var baseFilter = _fileSource.GetFilter(); // Init BD Reader _bdReader = (IBDReader)baseFilter; LoadSettings(); _bdReader.SetD3DDevice(_device.NativePointer); _bdReader.SetBDReaderCallback(this); _graphBuilder.AddFilter(baseFilter, BluRayAPI.BDREADER_FILTER_NAME); // TODO: add the correct subtitle filter /* _subtitleRenderer = new SubtitleRenderer(OnTextureInvalidated); * _subtitleFilter = _subtitleRenderer.AddSubtitleFilter(_graphBuilder); * if (_subtitleFilter != null) * { * _subtitleRenderer.RenderSubtitles = true; * _subtitleRenderer.SetPlayer(this); * } */ // Prepare event handling _eventThread = new Thread(HandleBDEvent); _eventThread.Start(); // Render the file IFileSourceFilter f = (IFileSourceFilter)_fileSource; using (((ILocalFsResourceAccessor)_resourceAccessor).EnsureLocalFileSystemAccess()) { string strFile = Path.Combine(((ILocalFsResourceAccessor)_resourceAccessor).LocalFileSystemPath, @"BDMV\index.bdmv"); f.Load(strFile, null); // Init GraphRebuilder _graphRebuilder = new GraphRebuilder(_graphBuilder, baseFilter, OnAfterGraphRebuild) { PlayerName = PlayerTitle }; // Get the complete BD title information (including all streams, chapters...) _titleInfos = GetTitleInfoCollection(_bdReader); ulong duration = 0; uint maxIdx = 0; foreach (BluRayAPI.BDTitleInfo bdTitleInfo in _titleInfos) { if (bdTitleInfo.Duration > duration) { duration = bdTitleInfo.Duration; maxIdx = bdTitleInfo.Index; } } // TEST: play the longest title _forceTitle = false; if (_forceTitle) { _bdReader.ForceTitleBasedPlayback(true, maxIdx); _currentTitle = (int)maxIdx; } else { _bdReader.ForceTitleBasedPlayback(false, 0); } _bdReader.Start(); SetVideoDecoder(); } }
/// <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 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> /// Adds the file source filter to the graph. /// </summary> protected override void AddSourceFilter() { if (!IsLocalFilesystemResource) throw new IllegalCallException("The BluRayPlayer can only play local file system resources"); // Load source filter, assembly location must be determined here, otherwise LoadFilterFromDll would try to lookup the file relative to VideoPlayer! string filterPath = FilterLoader.BuildAssemblyRelativePath("BDReader.ax"); _fileSource = FilterLoader.LoadFilterFromDll(filterPath, typeof(BDReader).GUID); // Init BD Reader _bdReader = (IBDReader)_fileSource; _bdReader.SetD3DDevice(_device.NativePointer); _bdReader.SetBDReaderCallback(this); _graphBuilder.AddFilter(_fileSource, BluRayAPI.BDREADER_FILTER_NAME); _subtitleRenderer = new SubtitleRenderer(OnTextureInvalidated); _subtitleFilter = _subtitleRenderer.AddSubtitleFilter(_graphBuilder); if (_subtitleFilter != null) { _subtitleRenderer.RenderSubtitles = true; _subtitleRenderer.SetPlayer(this); } // Render the file IFileSourceFilter f = (IFileSourceFilter)_fileSource; using (((ILocalFsResourceAccessor)_resourceAccessor).EnsureLocalFileSystemAccess()) { string strFile = Path.Combine(((ILocalFsResourceAccessor)_resourceAccessor).LocalFileSystemPath, @"BDMV\index.bdmv"); f.Load(strFile, null); // Init GraphRebuilder _graphRebuilder = new GraphRebuilder(_graphBuilder, _fileSource, OnAfterGraphRebuild) { PlayerName = PlayerTitle }; // Get the complete BD title information (including all streams, chapters...) _titleInfos = GetTitleInfoCollection(_bdReader); ulong duration = 0; uint maxIdx = 0; foreach (BluRayAPI.BDTitleInfo bdTitleInfo in _titleInfos) { if (bdTitleInfo.Duration > duration) { duration = bdTitleInfo.Duration; maxIdx = bdTitleInfo.Index; } } // TEST: play the longest title _forceTitle = false; if (_forceTitle) { _bdReader.ForceTitleBasedPlayback(true, maxIdx); _currentTitle = (int)maxIdx; } else { _bdReader.ForceTitleBasedPlayback(false, 0); } _bdReader.Start(); } }
/// <summary> do cleanup and release DirectShow. </summary> protected void CloseInterfaces() { if (_graphBuilder == null) { return; } Log.Debug("BDPlayer: Cleanup DShow graph {0}", GUIGraphicsContext.InVmr9Render); try { BDOSDRenderer.StopRendering(); if (VMR9Util.g_vmr9 != null) { VMR9Util.g_vmr9.Vmr9MediaCtrl(_mediaCtrl); VMR9Util.g_vmr9.Enable(false); } #region Cleanup if (VideoCodec != null) { DirectShowUtil.FinalReleaseComObject(VideoCodec); VideoCodec = null; Log.Info("BDPlayer: Cleanup VideoCodec"); } if (AudioCodec != null) { DirectShowUtil.FinalReleaseComObject(AudioCodec); AudioCodec = null; Log.Info("BDPlayer: Cleanup AudioCodec"); } if (_audioRendererFilter != null) { DirectShowUtil.FinalReleaseComObject(_audioRendererFilter); _audioRendererFilter = null; Log.Info("BDPlayer: Cleanup AudioRenderer"); } //Test to ReleaseComObject from PostProcessFilter list objects. if (PostProcessFilterVideo.Count > 0) { foreach (var ppFilter in PostProcessFilterVideo) { if (ppFilter.Value != null) { DirectShowUtil.RemoveFilter(_graphBuilder, ppFilter.Value as IBaseFilter); DirectShowUtil.FinalReleaseComObject(ppFilter.Value); } } PostProcessFilterVideo.Clear(); Log.Info("BDPlayer: Cleanup PostProcessVideo"); } //Test to ReleaseComObject from PostProcessFilter list objects. if (PostProcessFilterAudio.Count > 0) { foreach (var ppFilter in PostProcessFilterAudio) { if (ppFilter.Value != null) { DirectShowUtil.RemoveFilter(_graphBuilder, ppFilter.Value as IBaseFilter); DirectShowUtil.FinalReleaseComObject(ppFilter.Value); } } PostProcessFilterAudio.Clear(); Log.Info("BDPlayer: Cleanup PostProcessAudio"); } if (_interfaceBDReader != null) { DirectShowUtil.FinalReleaseComObject(_interfaceBDReader); _interfaceBDReader = null; } if (VMR9Util.g_vmr9 != null && VMR9Util.g_vmr9._vmr9Filter != null) { //MadvrInterface.EnableExclusiveMode(false, VMR9Util.g_vmr9._vmr9Filter); //DirectShowUtil.DisconnectAllPins(_graphBuilder, VMR9Util.g_vmr9._vmr9Filter); Log.Info("BDPlayer: Cleanup VMR9"); } #endregion _videoWin = _graphBuilder as IVideoWindow; if (_videoWin != null && GUIGraphicsContext.VideoRenderer != GUIGraphicsContext.VideoRendererType.madVR) { _videoWin.put_Owner(IntPtr.Zero); _videoWin.put_Visible(OABool.False); } if (_mediaEvt != null) { _mediaEvt.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero); _mediaEvt = null; } if (_graphBuilder != null) { DirectShowUtil.RemoveFilters(_graphBuilder); if (_rotEntry != null) { _rotEntry.SafeDispose(); _rotEntry = null; } DirectShowUtil.FinalReleaseComObject(_graphBuilder); _graphBuilder = null; } if (_videoWin != null) { DirectShowUtil.FinalReleaseComObject(_videoWin); } if (_basicVideo != null) { DirectShowUtil.FinalReleaseComObject(_basicVideo); } _mediaCtrl = null; _mediaSeeking = null; _videoWin = null; _basicAudio = null; _basicVideo = null; _ireader = null; if (VMR9Util.g_vmr9 != null) { VMR9Util.g_vmr9.SafeDispose(); VMR9Util.g_vmr9 = null; } _state = PlayState.Init; } catch (Exception ex) { if (VMR9Util.g_vmr9 != null) { VMR9Util.g_vmr9.RestoreGuiForMadVr(); } Log.Error("BDPlayer: Exception while cleaning DShow graph - {0} {1}", ex.Message, ex.StackTrace); } //switch back to directx windowed mode ExclusiveMode(false); }
/// <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 BDTitleInfo GetTitleInfo(IBDReader reader, int index) { BDTitleInfo titleInfo = new BDTitleInfo(); IntPtr ptr = IntPtr.Zero; try { ptr = reader.GetTitleInfo(index); titleInfo = (BDTitleInfo)Marshal.PtrToStructure(ptr, typeof(BDTitleInfo)); } catch { Log.Error("BDPlayer: GetTitleInfo({0}) failed.", index); } finally { if (ptr != IntPtr.Zero) { reader.FreeTitleInfo(ptr); } } return titleInfo; }