internal static IRenderer AddRenderer(IDvdGraphBuilder pDVDGraphBuilder, IGraphBuilder pGraphBuilder, RendererBase renderer, IntPtr hMediaWindow) { // this methods will instruct DVDGraphBuilder to instantiate and use the specified renderer; it will return a wrapper if it was successful // it will return null if there were errors instantiating the preferred renderer; // in this case the program should fall back on the default renderer by calling GetExistingRenderer after the graph is built // it will throw an exception (originating from renderers' Initialize method) if initialization fails (similar behavior when adding renderers to non-DVD graphs) try { if (renderer.Instantiate(pDVDGraphBuilder, pGraphBuilder)) { if (!renderer.IsDelayedInitialize) { renderer.Initialize(pGraphBuilder, hMediaWindow); } renderer.GraphBuilder = pGraphBuilder; renderer.MediaWindowHandle = hMediaWindow; renderer._ready = true; return(renderer); } return(null); } finally { if (renderer != null && !renderer._ready) { renderer.Close(); } } }
internal static IRenderer AddRenderer(IDvdGraphBuilder pDVDGraphBuilder, IGraphBuilder pGraphBuilder, Renderer preferredVideoRenderer, IntPtr hMediaWindow) { // this methods will instruct DVDGraphBuilder to instantiate and use the preferred renderer; it will return a wrapper if it was successful // it will return null if: // a) preferredVideoRenderer is VR -> we can't instruct DVDGraphBuilder to create one so the program will have a possibility to fall back on the default one // b) there were errors instantiating the preferred renderer; in this case the program should fall back on the default renderer by calling GetExistingRenderer // after the graph is built // it will throw an exception (originating from renderers' Initialize method) if initialization fails (similar behavior when adding renderers to non-DVD graphs) RendererBase renderer = null; try { if (preferredVideoRenderer != Renderer.VR) { renderer = GetRenderer(preferredVideoRenderer); return(AddRenderer(pDVDGraphBuilder, pGraphBuilder, renderer, hMediaWindow)); } return(null); } finally { if (renderer != null && !renderer._ready) { renderer.Close(); } } }
public void DoTests() { IDvdGraphBuilder idgb = GetDvdGraph(); try { PopulateMembers(idgb); StartGraph(); TestState(); } finally { if (m_ROT != null) { m_ROT.Dispose(); } if (idgb != null) { Marshal.ReleaseComObject(idgb); idgb = null; } if (m_idi2 != null) { Marshal.ReleaseComObject(m_idi2); m_idi2 = null; } if (m_idc2 != null) { Marshal.ReleaseComObject(m_idc2); m_idc2 = null; } } }
IDvdGraphBuilder GetDvdGraph() { int hr; DvdGraphBuilder dgb = null; IGraphBuilder gb = null; AMDvdRenderStatus drs; IDvdGraphBuilder idgb = null; // Get a dvd graph object dgb = new DvdGraphBuilder(); Debug.Assert(dgb != null, "new DvdGraphBuilder"); // Get the IDvdGraphBuilder interface idgb = dgb as IDvdGraphBuilder; hr = idgb.RenderDvdVideoVolume(MyDisk, AMDvdGraphFlags.HWDecPrefer, out drs); DsError.ThrowExceptionForHR(hr); // If there is no dvd in the player, you get hr == S_FALSE (1) Debug.Assert(hr == 0, "Can't find dvd"); // Get an IFilterGraph interface hr = idgb.GetFiltergraph(out gb); DsError.ThrowExceptionForHR(hr); Debug.Assert(gb != null, "GetFiltergraph"); m_ROT = new DsROTEntry(gb); m_imc = gb as IMediaControl; m_mediaEvent = gb as IMediaEventEx; return(idgb); }
public void DoTests() { IDvdGraphBuilder idgb = GetDvdGraph(); try { PopulateMembers(idgb); StartGraph(); // These routines can be tested with testme.iso. If you've got // nero, you can use NeroDrive to mount the iso file as a dvd drive. Otherwise // burn the file to a dvd for testing. TestGetCurrentDomain(); TestGetTotalTitleTime(); TestGetCurrent(); TestDiskInfo(); TestTitle(); TestButton(); TestMisc(); /// These routines need a fancier dvd than I can make with my dvd software. I've tested /// using "The Thomas Crown Affair". Note that TestDirectory changes the drive from MyDisk /// to OtherDisk. // Map to a different drive. One that has multiple streams, angles, etc int hr; hr = m_imc.Stop(); DsError.ThrowExceptionForHR(hr); hr = m_idc2.SetDVDDirectory(OtherDisk); DsError.ThrowExceptionForHR(hr); StartGraph(); TestStrings(); TestMenuLang(); TestAudio(); TestSubPic(); } finally { if (m_ROT != null) { m_ROT.Dispose(); } if (idgb != null) { Marshal.ReleaseComObject(idgb); idgb = null; } if (m_idi2 != null) { Marshal.ReleaseComObject(m_idi2); m_idi2 = null; } if (m_idc2 != null) { Marshal.ReleaseComObject(m_idc2); m_idc2 = null; } } }
private void Configure() { int hr; IGraphBuilder gb = null; AMDvdRenderStatus drs; IDvdGraphBuilder idgb = null; ICaptureGraphBuilder2 icgb = (ICaptureGraphBuilder2) new CaptureGraphBuilder2(); object o; IBaseFilter pFilter; // Get the IDvdGraphBuilder interface idgb = (IDvdGraphBuilder) new DvdGraphBuilder(); hr = idgb.RenderDvdVideoVolume(MyDisk, AMDvdGraphFlags.HWDecPrefer, out drs); DsError.ThrowExceptionForHR(hr); // If there is no dvd in the player, you get hr == S_FALSE (1) Debug.Assert(hr == 0, "Can't find dvd"); // Get an IFilterGraph interface hr = idgb.GetFiltergraph(out gb); DsError.ThrowExceptionForHR(hr); hr = icgb.SetFiltergraph(gb); DsError.ThrowExceptionForHR(hr); hr = gb.FindFilterByName("DVD Navigator", out pFilter); DsError.ThrowExceptionForHR(hr); hr = icgb.FindInterface(null, null, pFilter, typeof(IAMDecoderCaps).GUID, out o); DsError.ThrowExceptionForHR(hr); m_idc = (IAMDecoderCaps)o; }
protected override void CreateGraphBuilder() { _dvdGraph = (IDvdGraphBuilder) new DvdGraphBuilder(); new HRESULT(_dvdGraph.GetFiltergraph(out _graphBuilder)).Throw(); _mc = (IMediaControl)_graphBuilder; _me = (IMediaEventEx)_graphBuilder; _ms = (IMediaSeeking)_graphBuilder; _streamCount = 3; // Allow Video, CC, and Subtitle }
protected virtual bool Instantiate(IDvdGraphBuilder pDvdGraphBuilder, IGraphBuilder pGraphBuilder) { Guid IID = IID_4DVDGraphInstantiation; bool bRet = false; object o; int hr = pDvdGraphBuilder.GetDvdInterface(ref IID, out o); if (hr == DsHlp.S_OK) { Marshal.FinalReleaseComObject(o); // pDvdGraphBuilder has some connection to the renderer already so it will be used when rendering the graph GetBaseFilter(pGraphBuilder); bRet = BaseFilter != null; } return(bRet); }
// Grab off a couple of interface pointers void PopulateMembers(IDvdGraphBuilder idgb) { int hr; object obj; hr = idgb.GetDvdInterface(typeof(IDvdInfo2).GUID, out obj); DsError.ThrowExceptionForHR(hr); // Get the IDvdGraphBuilder interface m_idi2 = obj as IDvdInfo2; hr = idgb.GetDvdInterface(typeof(IDvdControl2).GUID, out obj); DsError.ThrowExceptionForHR(hr); // Get the IDvdGraphBuilder interface m_idc2 = obj as IDvdControl2; }
public static void TryRenderDVD(this IDvdGraphBuilder dvdGraphBuilder, string volumePath, out AMDvdRenderStatus latestStatus) { // Is the OS supported for this operation ? if (IsOSSupported == false) { var ver = AppConfig.OSVersion; throw new COMException(string.Format(VideoDvdInformation.UnsupportedWindows, string.Format("{0}.{1}", ver / 10, ver % 10)), -1); } // First we try with the default flags per current OS AMDvdGraphFlags defaultFlags = DvdRenderingFlags; dvdGraphBuilder.RenderDvdVideoVolume(volumePath, defaultFlags, out latestStatus); if (latestStatus.bDvdVolInvalid) { throw new COMException(VideoDvdInformation.ErrDvdVolume, -1); } if (latestStatus.iNumStreamsFailed == 0) { Logger.LogTrace("VideoDVDHelpers::TryRenderDVD: Using default flags {0} => SUCCESS !", defaultFlags); return; } Logger.LogTrace("VideoDVDHelpers::TryRenderDVD: Using default flags {0} => failed to open DVD streams: {1}.", defaultFlags, latestStatus.dwFailedStreamsFlag); // If no success, we iterate through all possible rendering flags foreach (AMDvdGraphFlags flags in Enum.GetValues(typeof(AMDvdGraphFlags))) { if (latestStatus.iNumStreamsFailed == 0) { Logger.LogTrace("VideoDVDHelpers::TryRenderDVD: Using flags {0} => SUCCESS !", flags); return; } Logger.LogTrace("VideoDVDHelpers::TryRenderDVD: Using flags {0} => failed to open DVD streams: {1}", flags, latestStatus.dwFailedStreamsFlag); } }
public void DoTests() { IDvdGraphBuilder idgb = GetDvdGraph(); try { PopulateMembers(idgb); StartGraph(); // These routines can be tested with testme.iso. If you've got // nero, you can use NeroDrive to mount the iso file as a dvd drive. Otherwise // burn the file to a dvd for testing. TestWaitForStart(); TestWaitForEnd(); } finally { if (m_ROT != null) { m_ROT.Dispose(); } if (idgb != null) { Marshal.ReleaseComObject(idgb); idgb = null; } if (m_idi2 != null) { Marshal.ReleaseComObject(m_idi2); m_idi2 = null; } if (m_idc2 != null) { Marshal.ReleaseComObject(m_idc2); m_idc2 = null; } } }
/// <summary> /// Test all IDvdControl2Test methods /// </summary> public void DoTests() { IDvdGraphBuilder idgb = GetDvdGraph(); try { PopulateMembers(idgb); StartGraph(); AllowPlay(); TestGetClassID(); TestIsDirty(); TestGetSizeMax(); TestSaveLoad(); } finally { if (m_ROT != null) { m_ROT.Dispose(); } if (idgb != null) { Marshal.ReleaseComObject(idgb); idgb = null; } if (m_idi2 != null) { Marshal.ReleaseComObject(m_idi2); m_idi2 = null; } if (m_idc2 != null) { Marshal.ReleaseComObject(m_idc2); m_idc2 = null; } } }
/// <summary> create the used COM components and get the interfaces. </summary> protected virtual bool GetInterfaces(string path) { int hr; //Type comtype = null; object comobj = null; _freeNavigator = true; _dvdInfo = null; _dvdCtrl = null; string dvdNavigator = ""; string aspectRatioMode = ""; string displayMode = ""; bool useAC3Filter = false; using (Settings xmlreader = new MPSettings()) { dvdNavigator = xmlreader.GetValueAsString("dvdplayer", "navigator", "DVD Navigator"); aspectRatioMode = xmlreader.GetValueAsString("dvdplayer", "armode", "").ToLower(); if (aspectRatioMode == "crop") { arMode = AspectRatioMode.Crop; } if (aspectRatioMode == "letterbox") { arMode = AspectRatioMode.LetterBox; } if (aspectRatioMode == "stretch") { arMode = AspectRatioMode.Stretched; } //if ( aspectRatioMode == "stretch" ) arMode = AspectRatioMode.zoom14to9; if (aspectRatioMode == "follow stream") { arMode = AspectRatioMode.StretchedAsPrimary; } useAC3Filter = xmlreader.GetValueAsBool("dvdplayer", "ac3", false); displayMode = xmlreader.GetValueAsString("dvdplayer", "displaymode", "").ToLower(); if (displayMode == "default") { _videoPref = DvdPreferredDisplayMode.DisplayContentDefault; } if (displayMode == "16:9") { _videoPref = DvdPreferredDisplayMode.Display16x9; } if (displayMode == "4:3 pan scan") { _videoPref = DvdPreferredDisplayMode.Display4x3PanScanPreferred; } if (displayMode == "4:3 letterbox") { _videoPref = DvdPreferredDisplayMode.Display4x3LetterBoxPreferred; } } try { _dvdGraph = (IDvdGraphBuilder)new DvdGraphBuilder(); hr = _dvdGraph.GetFiltergraph(out _graphBuilder); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } _rotEntry = new DsROTEntry((IFilterGraph)_graphBuilder); try { _dvdbasefilter = DirectShowUtil.AddFilterToGraph(_graphBuilder, dvdNavigator); if (_dvdbasefilter != null) { IDvdControl2 cntl = (IDvdControl2)_dvdbasefilter; if (cntl != null) { _dvdInfo = (IDvdInfo2)cntl; _dvdCtrl = (IDvdControl2)cntl; if (path != null) { if (path.Length != 0) { cntl.SetDVDDirectory(path); } } _dvdCtrl.SetOption(DvdOptionFlag.HMSFTimeCodeEvents, true); // use new HMSF timecode format _dvdCtrl.SetOption(DvdOptionFlag.ResetOnStop, false); AddPreferedCodecs(_graphBuilder); DirectShowUtil.RenderOutputPins(_graphBuilder, _dvdbasefilter); _videoWin = _graphBuilder as IVideoWindow; _freeNavigator = false; } //DirectShowUtil.ReleaseComObject( _dvdbasefilter); _dvdbasefilter = null; } } catch (Exception ex) { string strEx = ex.Message; } Guid riid; if (useAC3Filter) { string ac3filterMonikerString = @"@device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\{A753A1EC-973E-4718-AF8E-A3F554D45C44}"; Log.Info("DVDPlayer:Adding AC3 filter to graph"); IBaseFilter filter = Marshal.BindToMoniker(ac3filterMonikerString) as IBaseFilter; if (filter != null) { hr = _graphBuilder.AddFilter(filter, "AC3 Filter"); if (hr < 0) { Log.Info("DVDPlayer:FAILED:could not add AC3 filter to graph"); } } else { Log.Info("DVDPlayer:FAILED:AC3 filter not installed"); } } if (_dvdInfo == null) { riid = typeof (IDvdInfo2).GUID; hr = _dvdGraph.GetDvdInterface(riid, out comobj); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } _dvdInfo = (IDvdInfo2)comobj; comobj = null; } if (_dvdCtrl == null) { riid = typeof (IDvdControl2).GUID; hr = _dvdGraph.GetDvdInterface(riid, out comobj); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } _dvdCtrl = (IDvdControl2)comobj; comobj = null; } _mediaCtrl = (IMediaControl)_graphBuilder; _mediaEvt = (IMediaEventEx)_graphBuilder; _basicAudio = _graphBuilder as IBasicAudio; _mediaPos = (IMediaPosition)_graphBuilder; _basicVideo = _graphBuilder as IBasicVideo2; _videoWin = _graphBuilder as IVideoWindow; // disable Closed Captions! IBaseFilter baseFilter; _graphBuilder.FindFilterByName("Line 21 Decoder", out baseFilter); if (baseFilter == null) { _graphBuilder.FindFilterByName("Line21 Decoder", out baseFilter); } if (baseFilter != null) { _line21Decoder = (IAMLine21Decoder)baseFilter; if (_line21Decoder != null) { AMLine21CCState state = AMLine21CCState.Off; hr = _line21Decoder.SetServiceState(state); if (hr == 0) { Log.Info("DVDPlayer:Closed Captions disabled"); } else { Log.Info("DVDPlayer:failed 2 disable Closed Captions"); } } } /* // get video window if (_videoWin==null) { riid = typeof( IVideoWindow ).GUID; hr = _dvdGraph.GetDvdInterface( ref riid, out comobj ); if( hr < 0 ) Marshal.ThrowExceptionForHR( hr ); _videoWin = (IVideoWindow) comobj; comobj = null; } */ // GetFrameStepInterface(); DirectShowUtil.SetARMode(_graphBuilder, arMode); DirectShowUtil.EnableDeInterlace(_graphBuilder); //m_ovMgr = new OVTOOLLib.OvMgrClass(); //m_ovMgr.SetGraph(_graphBuilder); return true; } catch (Exception) { //MessageBox.Show( this, "Could not get interfaces\r\n" + ee.Message, "DVDPlayer.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop ); CloseInterfaces(); return false; } finally { if (comobj != null) { DirectShowUtil.ReleaseComObject(comobj); } comobj = null; } }
/// <summary> do cleanup and release DirectShow. </summary> protected virtual void CloseInterfaces() { if (_graphBuilder == null) { return; } int hr; try { Log.Info("DVDPlayer:cleanup DShow graph"); if (_mediaCtrl != null) { hr = _mediaCtrl.Stop(); _mediaCtrl = null; } _state = PlayState.Stopped; VMR9Util.g_vmr9.EVRSetDVDMenuState(false); _mediaEvt = null; _visible = false; _videoWin = null; // videoStep = null; _dvdCtrl = null; _dvdInfo = null; _basicVideo = null; _basicAudio = null; _mediaPos = null; if (_dvdbasefilter != null) { while ((hr = DirectShowUtil.ReleaseComObject(_dvdbasefilter)) > 0) { ; } _dvdbasefilter = null; } if (_cmdOption != null) { DirectShowUtil.ReleaseComObject(_cmdOption); } _cmdOption = null; _pendingCmd = false; if (_line21Decoder != null) { while ((hr = DirectShowUtil.ReleaseComObject(_line21Decoder)) > 0) { ; } _line21Decoder = null; } if (_graphBuilder != null) { DirectShowUtil.RemoveFilters(_graphBuilder); if (_rotEntry != null) { _rotEntry.SafeDispose(); _rotEntry = null; } while ((hr = DirectShowUtil.ReleaseComObject(_graphBuilder)) > 0) { ; } _graphBuilder = null; } if (_dvdGraph != null) { while ((hr = DirectShowUtil.ReleaseComObject(_dvdGraph)) > 0) { ; } _dvdGraph = null; } _state = PlayState.Init; GUIGraphicsContext.form.Invalidate(true); GUIGraphicsContext.form.Activate(); } catch (Exception ex) { Log.Error("DVDPlayer:exception while cleanuping DShow graph {0} {1}", ex.Message, ex.StackTrace); } }
private void CloseInterfaces() { int hr = 0; try { lock (this) { // Relinquish ownership (IMPORTANT!) after hiding video window //if (!this.isAudioOnly) //{ // hr = this.videoWindow.put_Visible(OABool.False); // DsError.ThrowExceptionForHR(hr); // hr = this.videoWindow.put_Owner(IntPtr.Zero); // DsError.ThrowExceptionForHR(hr); //} //#if DEBUG try { if (rot != null) { rot.Dispose(); rot = null; } } catch { } //#endif if (dvdSubtitle != null) Marshal.ReleaseComObject(dvdSubtitle); dvdSubtitle = null; if (dvdCtrl != null) { hr = dvdCtrl.SetOption(DvdOptionFlag.ResetOnStop, true); } if (cmdOption != null) { Marshal.ReleaseComObject(cmdOption); cmdOption = null; } pendingCmd = false; dvdCtrl = null; if (dvdInfo != null) { Marshal.ReleaseComObject(dvdInfo); dvdInfo = null; } if (this.mediaEventEx != null) { if (dvdGraph != null) hr = this.mediaEventEx.SetNotifyWindow(IntPtr.Zero, WM.DVD_EVENT, IntPtr.Zero); else hr = this.mediaEventEx.SetNotifyWindow(IntPtr.Zero, WM.NULL, IntPtr.Zero); //DsError.ThrowExceptionForHR(hr); } if (evrDisplay != null) { //evrDisplay.SetVideoWindow(IntPtr.Zero); Marshal.ReleaseComObject(evrDisplay); } evrDisplay = null; if (this.evrRenderer != null) Marshal.ReleaseComObject(evrRenderer); evrRenderer = null; // Release and zero DirectShow interfaces if (this.mediaEventEx != null) this.mediaEventEx = null; if (this.mediaSeeking != null) this.mediaSeeking = null; if (this.mediaPosition != null) this.mediaPosition = null; if (this.mediaControl != null) this.mediaControl = null; if (this.basicAudio != null) this.basicAudio = null; if (this.basicVideo != null) this.basicVideo = null; //if (this.videoWindow != null) // this.videoWindow = null; if (this.frameStep != null) this.frameStep = null; if (this.graphBuilder != null) Marshal.ReleaseComObject(this.graphBuilder); this.graphBuilder = null; if (this.dvdGraph != null) Marshal.ReleaseComObject(dvdGraph); dvdGraph = null; GC.Collect(); } } catch { } }
/// <summary> do cleanup and release DirectShow. </summary> protected virtual void CloseDVDInterfaces() { if (_graphBuilder == null) { return; } int hr; try { logger.Info("DVDPlayer:cleanup DShow graph"); if (_mediaCtrl != null) { hr = _mediaCtrl.Stop(); _mediaCtrl = null; } _state = PlayState.Stopped; _mediaEvt = null; _visible = false; _videoWin = null; // videoStep = null; _dvdCtrl = null; _dvdInfo = null; _basicVideo = null; _basicAudio = null; _mediaPos = null; _mediaSeek = null; _mediaStep = null; //if (_vmr7 != null) //{ // _vmr7.RemoveVMR7(); //} //_vmr7 = null; if (_vmr9Filter != null) { while ((hr = DirectShowUtil.ReleaseComObject(_vmr9Filter)) > 0) { ; } _vmr9Filter = null; } if (_dvdbasefilter != null) { while ((hr = DirectShowUtil.ReleaseComObject(_dvdbasefilter)) > 0) { ; } _dvdbasefilter = null; } if (_cmdOption != null) { DirectShowUtil.ReleaseComObject(_cmdOption); } _cmdOption = null; _pendingCmd = false; if (_line21Decoder != null) { while ((hr = DirectShowUtil.ReleaseComObject(_line21Decoder)) > 0) { ; } _line21Decoder = null; } if (_graphBuilder != null) { DirectShowUtil.RemoveFilters(_graphBuilder); if (_rotEntry != null) { _rotEntry.Dispose(); _rotEntry = null; } while ((hr = DirectShowUtil.ReleaseComObject(_graphBuilder)) > 0) { ; } _graphBuilder = null; } if (_dvdGraph != null) { while ((hr = DirectShowUtil.ReleaseComObject(_dvdGraph)) > 0) { ; } _dvdGraph = null; } _state = PlayState.Init; } catch (Exception ex) { logger.Error("DVDPlayer:exception while cleanuping DShow graph {0} {1}", ex.Message, ex.StackTrace); } }
/// <summary> create the used COM components and get the interfaces. </summary> bool GetInterfaces() { int hr; AMDvdRenderStatus status; object comobj = null; try { dvdGraph = (IDvdGraphBuilder)new DvdGraphBuilder(); hr = dvdGraph.RenderDvdVideoVolume( null, AMDvdGraphFlags.None, out status ); DsError.ThrowExceptionForHR( hr ); hr = dvdGraph.GetDvdInterface( typeof( IDvdInfo2 ).GUID, out comobj ); DsError.ThrowExceptionForHR( hr ); dvdInfo = (IDvdInfo2) comobj; comobj = null; hr = dvdGraph.GetDvdInterface( typeof( IDvdControl2 ).GUID, out comobj ); DsError.ThrowExceptionForHR( hr ); dvdCtrl = (IDvdControl2) comobj; comobj = null; hr = dvdGraph.GetFiltergraph( out graphBuilder ); DsError.ThrowExceptionForHR( hr ); mediaCtrl = (IMediaControl) graphBuilder; mediaEvt = (IMediaEventEx) graphBuilder; hr = dvdGraph.GetDvdInterface( typeof( IVideoWindow ).GUID, out comobj ); DsError.ThrowExceptionForHR( hr ); videoWin = (IVideoWindow) comobj; comobj = null; GetFrameStepInterface(); return true; } catch( Exception ee ) { MessageBox.Show( this, "Could not get interfaces\r\n" + ee.Message, "DVDPlayer.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop ); CloseInterfaces(); return false; } finally { if( comobj != null ) { Marshal.ReleaseComObject( comobj ); comobj = null; } } }
private void InitMedia() { GC.Collect(); string volumePath = string.Empty; if (renderMediaName.ToUpperInvariant().EndsWith("VIDEO_TS")) { volumePath = renderMediaName; } else { volumePath = System.IO.Path.Combine(renderMediaName, "VIDEO_TS"); } dvdGraphBuilder = Activator.CreateInstance(Type.GetTypeFromCLSID(Filters.DvdGraphBuilder, true)) as IDvdGraphBuilder; AMDvdRenderStatus status; dvdGraphBuilder.RenderDvdVideoVolume(volumePath, AMDvdGraphFlags.VMR9Only, out status); if (status.bDvdVolInvalid) throw new COMException(VideoDvdInformation.ErrDvdVolume, -1); dvdInfo = GetInterface(typeof(IDvdInfo2)) as IDvdInfo2; dvdControl2 = GetInterface(typeof(IDvdControl2)) as IDvdControl2; int hr = dvdControl2.SetOption(DvdOptionFlag.HMSFTimeCodeEvents, true); // use new HMSF timecode format DsError.ThrowExceptionForHR(hr); hr = dvdControl2.SetOption(DvdOptionFlag.ResetOnStop, false); DsError.ThrowExceptionForHR(hr); hr = dvdControl2.SetOption(DvdOptionFlag.AudioDuringFFwdRew, false); DsError.ThrowExceptionForHR(hr); //dvdControl.SelectVideoModePreference(DvdPreferredDisplayMode.DisplayContentDefault); dvdGraphBuilder.GetFiltergraph(out mediaControl); if (mediaControl == null) throw new RenderingException("Unable to render the file: " + renderMediaName); #if HAVE_SAMPLES InitAudioSampleGrabber_v2(); CompleteAudioSampleGrabberIntialization(); #endif mediaEvent = mediaControl as IMediaEventEx; mediaPosition = mediaControl as IMediaPosition; videoWindow = mediaControl as IVideoWindow; basicVideo = mediaControl as IBasicVideo; basicAudio = mediaControl as IBasicAudio; renderRegion.MouseMove -= new MouseEventHandler(renderRegion_MouseMove); renderRegion.MouseMove += new MouseEventHandler(renderRegion_MouseMove); renderRegion.MouseDown -= new MouseEventHandler(renderRegion_MouseDown); renderRegion.MouseDown += new MouseEventHandler(renderRegion_MouseDown); }
private void CloseInterfaces() { int hr; if (m_adecOut != null) { CleanUpInterface(m_adecOut); m_adecOut = null; } if (_defaultAudioRenderer != null) { _graph.RemoveFilter(_defaultAudioRenderer as DirectShowLib.IBaseFilter); CleanUpInterface(_defaultAudioRenderer); _defaultAudioRenderer = null; } if (_reclockAudioRenderer != null) { _graph.RemoveFilter(_reclockAudioRenderer as DirectShowLib.IBaseFilter); CleanUpInterface(_reclockAudioRenderer); _reclockAudioRenderer = null; } if (_wasapiAR != null) { _graph.RemoveFilter(_wasapiAR as DirectShowLib.IBaseFilter); CleanUpInterface(_wasapiAR); _wasapiAR = null; } if (_lavaudio != null) { _graph.RemoveFilter(_lavaudio as DirectShowLib.IBaseFilter); CleanUpInterface(_lavaudio); _lavaudio = null; } if (_xyVsFilter != null) { _graph.RemoveFilter(_xyVsFilter as DirectShowLib.IBaseFilter); CleanUpInterface(_xyVsFilter); _xyVsFilter = null; } if (_xySubFilter != null) { _graph.RemoveFilter(_xySubFilter as DirectShowLib.IBaseFilter); CleanUpInterface(_xySubFilter); _xySubFilter = null; } if (_lavvideo != null) { _graph.RemoveFilter(_lavvideo as DirectShowLib.IBaseFilter); CleanUpInterface(_lavvideo); _lavvideo = null; } if (_madvr != null) { _graph.RemoveFilter(_madvr as DirectShowLib.IBaseFilter); CleanUpInterface(_madvr); _madvr = null; } if (_videoWindow != null) { // Relinquish ownership (IMPORTANT!) after hiding video window hr = _videoWindow.put_Visible(OABool.False); hr = _videoWindow.put_Owner(IntPtr.Zero); } if (_mediaEventEx != null) { hr = _mediaEventEx.SetNotifyWindow(IntPtr.Zero, 0, IntPtr.Zero); //Marshal.ReleaseComObject(_mediaEventEx); //_mediaEventEx = null; } //if (_dvdNav != null) //{ // Marshal.ReleaseComObject(_dvdNav); // _dvdNav = null; //} /* //this will double release the source filter if (dvdInfo != null) { Marshal.ReleaseComObject(dvdInfo); dvdInfo = null; } if (_mDvdControl != null) { Marshal.ReleaseComObject(_mDvdControl); } */ m_DvdControl = null; CleanUpInterface(_mPDisplay); _mPDisplay = null; CleanUpInterface(_sourceFilter); _sourceFilter = null; CleanUpInterface(_mPEvr); _mPEvr = null; CleanUpInterface(_filterGraphNT); _filterGraphNT = null; CleanUpInterface(_dvdGraphBuilder); _dvdGraphBuilder = null; _filterGraphNT = null; _mediaEventEx = null; _mediaSeeking = null; _mediaPosition = null; _mediaControl = null; _basicAudio = null; _basicVideo = null; _graph = null; _videoWindow = null; _filterGraph = null; if (m_dsRot != null) m_dsRot.Dispose(); m_dsRot = null; _mSeekCaps = 0; _streams = null; GC.Collect(); }
private void InitializeGraph(bool isDvd) { int hr = 0; _isDvd = isDvd; if (isDvd) { _dvdGraphBuilder = new DvdGraphBuilder() as IDvdGraphBuilder; hr = _dvdGraphBuilder.GetFiltergraph(out _graph); DsError.ThrowExceptionForHR(hr); _filterGraph = _graph as IFilterGraph2; } else { _filterGraphNT = new FilterGraphNoThread(); _graph = (_filterGraphNT as DirectShowLib.IGraphBuilder); } // QueryInterface for DirectShow interfaces _mediaControl = (DirectShowLib.IMediaControl)_graph; _mediaEventEx = (DirectShowLib.IMediaEventEx)_graph; _mediaSeeking = (DirectShowLib.IMediaSeeking)_graph; _mediaPosition = (DirectShowLib.IMediaPosition)_graph; // Query for video interfaces, which may not be relevant for audio files _videoWindow = _graph as DirectShowLib.IVideoWindow; _basicVideo = _graph as DirectShowLib.IBasicVideo; // Query for audio interfaces, which may not be relevant for video-only files _basicAudio = _graph as DirectShowLib.IBasicAudio; // Set up event notification. if (isDvd) hr = _mediaEventEx.SetNotifyWindow(VideoWindowHandle, WM_DVD_EVENT, IntPtr.Zero); else hr = _mediaEventEx.SetNotifyWindow(VideoWindowHandle, WM_GRAPHNOTIFY, IntPtr.Zero); DsError.ThrowExceptionForHR(hr); if (_mbtConfig.Configuration.InternalPlayerConfiguration.PublishGraph) m_dsRot = new DsROTEntry(_graph as IFilterGraph); }
protected override void CreateGraphBuilder() { _dvdGraph = (IDvdGraphBuilder) new DvdGraphBuilder(); new HRESULT(_dvdGraph.GetFiltergraph(out _graphBuilder)).Throw(); _streamCount = 3; // Allow Video, CC, and Subtitle }
private void InitMedia() { GC.Collect(); string volumePath = string.Empty; if (renderMediaName.ToUpperInvariant().EndsWith("VIDEO_TS")) { volumePath = renderMediaName; } else { volumePath = System.IO.Path.Combine(renderMediaName, "VIDEO_TS"); } dvdGraphBuilder = Activator.CreateInstance(Type.GetTypeFromCLSID(Filters.DvdGraphBuilder, true)) as IDvdGraphBuilder; AMDvdRenderStatus status; dvdGraphBuilder.TryRenderDVD(volumePath, out status); if (status.bDvdVolInvalid) { throw new COMException(VideoDvdInformation.ErrDvdVolume, -1); } Logger.LogTrace("Failed to open DVD streams: {0}", status.dwFailedStreamsFlag); dvdInfo = GetInterface(typeof(IDvdInfo2)) as IDvdInfo2; dvdControl2 = GetInterface(typeof(IDvdControl2)) as IDvdControl2; int hr = dvdControl2.SetOption(DvdOptionFlag.HMSFTimeCodeEvents, true); // use new HMSF timecode format DsError.ThrowExceptionForHR(hr); hr = dvdControl2.SetOption(DvdOptionFlag.ResetOnStop, false); DsError.ThrowExceptionForHR(hr); hr = dvdControl2.SetOption(DvdOptionFlag.AudioDuringFFwdRew, false); DsError.ThrowExceptionForHR(hr); //dvdControl.SelectVideoModePreference(DvdPreferredDisplayMode.DisplayContentDefault); dvdGraphBuilder.GetFiltergraph(out mediaControl); if (mediaControl == null) { throw new RenderingException("Unable to render the file: " + renderMediaName); } #if HAVE_SAMPLES InitAudioSampleGrabber_v2(); CompleteAudioSampleGrabberIntialization(); #else rotEntry = new DsROTEntry(graphBuilder as IFilterGraph); #endif mediaEvent = mediaControl as IMediaEventEx; mediaPosition = mediaControl as IMediaPosition; videoWindow = mediaControl as IVideoWindow; basicVideo = mediaControl as IBasicVideo; basicAudio = mediaControl as IBasicAudio; renderRegion.MouseMove -= new MouseEventHandler(renderRegion_MouseMove); renderRegion.MouseMove += new MouseEventHandler(renderRegion_MouseMove); renderRegion.MouseDown -= new MouseEventHandler(renderRegion_MouseDown); renderRegion.MouseDown += new MouseEventHandler(renderRegion_MouseDown); }
public void DoTests() { IDvdGraphBuilder idgb = GetDvdGraph(); try { PopulateMembers(idgb); StartGraph(); // These routines can be tested with testme.iso. If you've got // nero, you can use NeroDrive to mount the iso file as a dvd drive. Otherwise // burn the file to a dvd for testing. TestPlayTitle(); TestPlayChapterInTitle(); TestPlayAtTimeInTitle(); TestPlayAtTime(); TestPlayChapter(); TestPlayPrevChapter(); TestPlayNextChapter(); TestReplayChapter(); TestPlayForwards(); TestPlayBackwards(); TestPlayPeriodInTitleAutoStop(); TestPlayChaptersAutoStop(); TestMenusAndButtons(); TestSetGPRM(); TestPauseResume(); TestParentalLevel(); TestLanguage(); TestVideoModePref(); /// These routines need a fancier dvd than I can make with my dvd software. I've tested /// using "The Thomas Crown Affair". Note that TestDirectory changes the drive from MyDisk /// to OtherDisk. TestDirectory(); TestSelectAudioStream(); TestSelectSubpictureStream(); TestSelectAngle(); TestDefaultSubpictureLanguage(); TestDefaultAudioLanguage(); TestKaraokeAudioPresentationMode(); TestState(); } finally { if (m_ROT != null) { m_ROT.Dispose(); } if (idgb != null) { Marshal.ReleaseComObject(idgb); idgb = null; } if (m_idi2 != null) { Marshal.ReleaseComObject(m_idi2); m_idi2 = null; } if (m_idc2 != null) { Marshal.ReleaseComObject(m_idc2); m_idc2 = null; } } }
private void FetchDVDInformation_DS(string volumePath) { IDvdGraphBuilder dvdGraphBuilder = Activator.CreateInstance(Type.GetTypeFromCLSID(Filters.DvdGraphBuilder, true)) as IDvdGraphBuilder; AMDvdRenderStatus status; dvdGraphBuilder.TryRenderDVD(volumePath, out status); if (status.bDvdVolInvalid) { throw new COMException(ErrDvdVolume, -1); } object comobj = null; dvdGraphBuilder.GetDvdInterface(typeof(IDvdInfo2).GUID, out comobj); IDvdInfo2 dvdInfo = comobj as IDvdInfo2; IDvdControl2 dvdControl = comobj as IDvdControl2; dvdControl.SetOption(DvdOptionFlag.HMSFTimeCodeEvents, true); // use new HMSF timecode format dvdControl.SetOption(DvdOptionFlag.ResetOnStop, false); // Try getting the frame rate and the video size dvdInfo.GetVMGAttributes(out _dma); this.FrameRate = new FrameRate(_dma.VideoAttributes.frameRate); this.VideoSize = new VSize(_dma.VideoAttributes.sourceResolutionX, _dma.VideoAttributes.sourceResolutionY); // Try getting the DVD volume name. // Stage 1: Get the number of available languages. int numLangs = 0; dvdInfo.GetDVDTextNumberOfLanguages(out numLangs); if (numLangs > 0) { // Stage 2: Get string count for the first language. int numStrings = 0; int langId = 0; DvdTextCharSet charSet = DvdTextCharSet.CharSet_Unicode; dvdInfo.GetDVDTextLanguageInfo(0, out numStrings, out langId, out charSet); // Stage 3: Iterate through the string collection and identify the volume name for (int i = 0; i < numStrings; i++) { int maxSize = 4096; StringBuilder sb = new StringBuilder(maxSize); int txtSize = 0; DvdTextStringType textType; dvdInfo.GetDVDTextStringAsUnicode(0, i, sb, maxSize, out txtSize, out textType); // Is this the volume name ? if (textType == DvdTextStringType.DVD_General_Name) { // Volume name was found, so exit iteration. _label = sb.ToString(); break; } } } // Try getting the titles, chapters and overall duration info int numVolumes = 0, volumeNumber = 0, numTitles = 0; DvdDiscSide sideInfo; dvdInfo.GetDVDVolumeInfo(out numVolumes, out volumeNumber, out sideInfo, out numTitles); for (int i = 1; i <= numTitles; i++) { int numChapters = 0; try { DvdMenuAttributes menuAttr; DvdTitleAttributes titleAttr = new DvdTitleAttributes(); if (i == 1) { dvdInfo.GetTitleAttributes(i, out menuAttr, titleAttr); for (int j = 0; j < titleAttr.ulNumberOfSubpictureStreams; j++) { _subtitles.Add(titleAttr.SubpictureAttributes[j]); } } dvdInfo.GetNumberOfChapters(i, out numChapters); _chaptersPerTitle.Add(numChapters); } catch { } } }
/// <summary> do cleanup and release DirectShow. </summary> void CloseInterfaces() { int hr; try { if( dvdCtrl != null ) { hr = dvdCtrl.SetOption( DvdOptionFlag.ResetOnStop, true ); } if( mediaCtrl != null ) { hr = mediaCtrl.Stop(); mediaCtrl = null; } playState = PlayState.Stopped; if( mediaEvt != null ) { hr = mediaEvt.SetNotifyWindow( IntPtr.Zero, WM_DVD_EVENT, IntPtr.Zero ); mediaEvt = null; } if( videoWin != null ) { hr = videoWin.put_Visible( OABool.False ); hr = videoWin.put_MessageDrain( IntPtr.Zero ); hr = videoWin.put_Owner( IntPtr.Zero ); videoWin = null; } videoStep = null; if( cmdOption != null ) { Marshal.ReleaseComObject( cmdOption ); cmdOption = null; } pendingCmd = false; if( graphBuilder != null ) { Marshal.ReleaseComObject( graphBuilder ); graphBuilder = null; } dvdCtrl = null; if( dvdInfo != null ) { Marshal.ReleaseComObject( dvdInfo ); dvdInfo = null; } if( dvdGraph != null ) { Marshal.ReleaseComObject( dvdGraph ); dvdGraph = null; } playState = PlayState.Init; } catch( Exception ) {} }
public void CloseInterfaces() { //mediaEvent = null; if (mediaControl != null) mediaControl.Stop(); if (baseFilter != null) { Marshal.ReleaseComObject(baseFilter); baseFilter = null; } EVRCtrl = null; VMRCtrl = null; if (dvdGraphBuilder != null) { Marshal.ReleaseComObject(dvdGraphBuilder); dvdGraphBuilder = null; } if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); graphBuilder = null; } mediaControl = null; }
private void PlayDVDInWindow(string filepath) { FileLogger.Log("PlayDVDInWindow: {0}", filepath); int hr = 0; dvdGraph = new DvdGraphBuilder() as IDvdGraphBuilder; if (dvdGraph != null) { hr = dvdGraph.GetFiltergraph(out this.graphBuilder); DsError.ThrowExceptionForHR(hr); if (ps.PublishGraph) rot = new DsROTEntry(this.graphBuilder); AMDvdGraphFlags buildFlags = AMDvdGraphFlags.EvrOnly; if (ps.PreferredDecoders != null) { foreach (string pa in ps.PreferredDecoders) { string[] pvA = pa.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); if (pvA[0].ToLower() == ".ifo") { for (int i = 1; i < pvA.Length; i++) { string strFilter = pvA[i].Trim(); IBaseFilter filter = null; try { if (Regex.IsMatch(strFilter, @"{?\w{8}-\w{4}-\w{4}-\w{4}-\w{12}}?")) filter = FilterGraphTools.AddFilterFromClsid(graphBuilder, new Guid(strFilter), strFilter); else filter = FilterGraphTools.AddFilterByName(graphBuilder, FilterCategory.LegacyAmFilterCategory, strFilter); if (filter != null) { FileLogger.Log("Added {0} to the graph", strFilter); buildFlags = AMDvdGraphFlags.EvrOnly | AMDvdGraphFlags.DoNotClear; } else FileLogger.Log("{0} not added to the graph", strFilter); } finally { if (filter != null) Marshal.ReleaseComObject(filter); filter = null; } } } } } object objEvr; hr = dvdGraph.GetDvdInterface(typeof(IMFVideoRenderer).GUID, out objEvr); DsError.ThrowExceptionForHR(hr); evrRenderer = objEvr as IBaseFilter; SetupEvrDisplay(); AMDvdRenderStatus buildStatus; hr = dvdGraph.RenderDvdVideoVolume(filepath, buildFlags, out buildStatus); DsError.ThrowExceptionForHR(hr); if (buildStatus.iNumStreamsFailed > 1) { // throw new ApplicationException("Could not render video_ts, try forcing a dvd decoder"); IBaseFilter lavVideo = FilterGraphTools.FindFilterByClsid(graphBuilder, new Guid("{EE30215D-164F-4A92-A4EB-9D4C13390F9F}")); IPin lavOut = null; IPin evrIn = null; try { lavOut = DsFindPin.ByDirection(lavVideo, PinDirection.Output, 0); if (lavOut != null) { hr = lavOut.ConnectedTo(out evrIn); //DsError.ThrowExceptionForHR(hr); if (evrIn == null) { evrIn = DsFindPin.ByDirection(evrRenderer, PinDirection.Input, 0); hr = graphBuilder.ConnectDirect(lavOut, evrIn, null); DsError.ThrowExceptionForHR(hr); } } } finally { if (lavOut != null) Marshal.ReleaseComObject(lavOut); if (evrIn != null) Marshal.ReleaseComObject(evrIn); if (lavVideo != null) Marshal.ReleaseComObject(lavVideo); } } SetEvrVideoMode(); object comobj = null; hr = dvdGraph.GetDvdInterface(typeof(IDvdInfo2).GUID, out comobj); //DsError.ThrowExceptionForHR(hr); if (comobj != null) { dvdInfo = (IDvdInfo2)comobj; comobj = null; } hr = dvdGraph.GetDvdInterface(typeof(IDvdControl2).GUID, out comobj); //DsError.ThrowExceptionForHR(hr); if (comobj != null) { dvdCtrl = (IDvdControl2)comobj; comobj = null; } hr = dvdGraph.GetDvdInterface(typeof(IAMLine21Decoder).GUID, out comobj); //DsError.ThrowExceptionForHR(hr); if (comobj != null) { dvdSubtitle = (IAMLine21Decoder)comobj; comobj = null; } //IBaseFilter yo = dvdSubtitle as IBaseFilter; //IPin mama = dvdSubtitle as IPin; menuItemSubtitles.Checked = ToogleSubtitles(); hr = dvdCtrl.SetOption(DvdOptionFlag.HMSFTimeCodeEvents, true); // use new HMSF timecode format DsError.ThrowExceptionForHR(hr); hr = dvdCtrl.SetOption(DvdOptionFlag.ResetOnStop, false); DsError.ThrowExceptionForHR(hr); // QueryInterface for DirectShow interfaces this.mediaControl = (IMediaControl)this.graphBuilder; this.mediaEventEx = (IMediaEventEx)this.graphBuilder; this.mediaSeeking = (IMediaSeeking)this.graphBuilder; this.mediaPosition = (IMediaPosition)this.graphBuilder; // Query for audio interfaces, which may not be relevant for video-only files this.basicAudio = this.graphBuilder as IBasicAudio; // Is this an audio-only file (no video component)? CheckVisibility(); // Have the graph signal event via window callbacks for performance //hr = this.mediaEventEx.SetNotifyWindow(this.Handle, WMGraphNotify, IntPtr.Zero); //DsError.ThrowExceptionForHR(hr); hr = mediaEventEx.SetNotifyWindow(this.Handle, WM.DVD_EVENT, IntPtr.Zero); DsError.ThrowExceptionForHR(hr); if (!this.isAudioOnly) { // Setup the video window //hr = this.videoWindow.put_Owner(this.Handle); //DsError.ThrowExceptionForHR(hr); //this.evrDisplay.SetVideoWindow(this.Handle); //hr = this.videoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipSiblings | WindowStyle.ClipChildren); //DsError.ThrowExceptionForHR(hr); hr = InitVideoWindow();//1, 1); DsError.ThrowExceptionForHR(hr); GetFrameStepInterface(); } else { // Initialize the default player size and enable playback menu items hr = InitPlayerWindow(); DsError.ThrowExceptionForHR(hr); EnablePlaybackMenu(true, MediaType.Audio); } // Complete window initialization //CheckSizeMenu(menuFileSizeNormal); //this.isFullScreen = false; this.currentPlaybackRate = 1.0; UpdateMainTitle(); this.Activate(); //pre-roll the graph hr = this.mediaControl.Pause(); DsError.ThrowExceptionForHR(hr); // Run the graph to play the media file hr = this.mediaControl.Run(); DsError.ThrowExceptionForHR(hr); MoveToBookmark(); this.currentState = PlayState.Running; if (isFullScreen) tmMouseMove.Enabled = true; } }
protected override void CreateGraphBuilder() { _dvdGraph = (IDvdGraphBuilder) new DvdGraphBuilder(); DsError.ThrowExceptionForHR(_dvdGraph.GetFiltergraph(out _graphBuilder)); _streamCount = 3; // Allow Video, CC, and Subtitle }
/// <summary> create the used COM components and get the interfaces. </summary> protected virtual bool GetDVDInterfaces(string path) { int hr; //Type comtype = null; object comobj = null; _freeNavigator = true; _dvdInfo = null; _dvdCtrl = null; bool useAC3Filter = false; string dvdNavigator = ""; string aspectRatioMode = ""; string displayMode = ""; _videoPref = DvdPreferredDisplayMode.DisplayContentDefault; using (MediaPortal.Profile.Settings xmlreader = new MPSettings()) { dvdNavigator = xmlreader.GetValueAsString("dvdplayer", "navigator", "DVD Navigator"); aspectRatioMode = xmlreader.GetValueAsString("dvdplayer", "armode", "").ToLower(); dvdNavigator = "dslibdvdnav"; if (aspectRatioMode == "crop") { arMode = AspectRatioMode.Crop; } if (aspectRatioMode == "letterbox") { arMode = AspectRatioMode.LetterBox; } if (aspectRatioMode == "stretch") { arMode = AspectRatioMode.Stretched; } //if ( aspectRatioMode == "stretch" ) arMode = AspectRatioMode.zoom14to9; if (aspectRatioMode == "follow stream") { arMode = AspectRatioMode.StretchedAsPrimary; } useAC3Filter = xmlreader.GetValueAsBool("dvdplayer", "ac3", false); displayMode = xmlreader.GetValueAsString("dvdplayer", "displaymode", "").ToLower(); if (displayMode == "default") { _videoPref = DvdPreferredDisplayMode.DisplayContentDefault; } if (displayMode == "16:9") { _videoPref = DvdPreferredDisplayMode.Display16x9; } if (displayMode == "4:3 pan scan") { _videoPref = DvdPreferredDisplayMode.Display4x3PanScanPreferred; } if (displayMode == "4:3 letterbox") { _videoPref = DvdPreferredDisplayMode.Display4x3LetterBoxPreferred; } } try { _dvdGraph = (IDvdGraphBuilder) new DvdGraphBuilder(); hr = _dvdGraph.GetFiltergraph(out _graphBuilder); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } _rotEntry = new DsROTEntry((IFilterGraph)_graphBuilder); _vmr9Filter = (IBaseFilter) new VideoMixingRenderer9(); IVMRFilterConfig9 config = _vmr9Filter as IVMRFilterConfig9; hr = config.SetNumberOfStreams(1); hr = config.SetRenderingMode(VMR9Mode.Windowless); windowlessCtrl = (IVMRWindowlessControl9)_vmr9Filter; windowlessCtrl.SetVideoClippingWindow(this.panVideoWin.Handle); // config.SetRenderingPrefs(VMR9RenderPrefs. _graphBuilder.AddFilter(_vmr9Filter, "Video Mixing Renderer 9"); // _vmr7 = new VMR7Util(); // _vmr7.AddVMR7(_graphBuilder); try { _dvdbasefilter = DirectShowUtil.AddFilterToGraph(_graphBuilder, dvdNavigator); if (_dvdbasefilter != null) { IDvdControl2 cntl = (IDvdControl2)_dvdbasefilter; if (cntl != null) { _dvdInfo = (IDvdInfo2)cntl; _dvdCtrl = (IDvdControl2)cntl; if (path != null) { if (path.Length != 0) { cntl.SetDVDDirectory(path); } } _dvdCtrl.SetOption(DvdOptionFlag.HMSFTimeCodeEvents, true); // use new HMSF timecode format _dvdCtrl.SetOption(DvdOptionFlag.ResetOnStop, false); AddPreferedCodecs(_graphBuilder); DirectShowUtil.RenderOutputPins(_graphBuilder, _dvdbasefilter); // _videoWin = _graphBuilder as IVideoWindow; _freeNavigator = false; } //DirectShowUtil.ReleaseComObject( _dvdbasefilter); _dvdbasefilter = null; } } catch (Exception ex) { string strEx = ex.Message; } Guid riid; if (_dvdInfo == null) { riid = typeof(IDvdInfo2).GUID; hr = _dvdGraph.GetDvdInterface(riid, out comobj); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } _dvdInfo = (IDvdInfo2)comobj; comobj = null; } if (_dvdCtrl == null) { riid = typeof(IDvdControl2).GUID; hr = _dvdGraph.GetDvdInterface(riid, out comobj); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } _dvdCtrl = (IDvdControl2)comobj; comobj = null; } _mediaCtrl = (IMediaControl)_graphBuilder; _mediaEvt = (IMediaEventEx)_graphBuilder; _basicAudio = _graphBuilder as IBasicAudio; _mediaPos = (IMediaPosition)_graphBuilder; _mediaSeek = (IMediaSeeking)_graphBuilder; _mediaStep = (IVideoFrameStep)_graphBuilder; _basicVideo = _graphBuilder as IBasicVideo2; _videoWin = _graphBuilder as IVideoWindow; // disable Closed Captions! IBaseFilter baseFilter; _graphBuilder.FindFilterByName("Line 21 Decoder", out baseFilter); if (baseFilter == null) { _graphBuilder.FindFilterByName("Line21 Decoder", out baseFilter); } if (baseFilter != null) { _line21Decoder = (IAMLine21Decoder)baseFilter; if (_line21Decoder != null) { AMLine21CCState state = AMLine21CCState.Off; hr = _line21Decoder.SetServiceState(state); if (hr == 0) { logger.Info("DVDPlayer:Closed Captions disabled"); } else { logger.Info("DVDPlayer:failed 2 disable Closed Captions"); } } } /* * // get video window * if (_videoWin==null) * { * riid = typeof( IVideoWindow ).GUID; * hr = _dvdGraph.GetDvdInterface( ref riid, out comobj ); * if( hr < 0 ) * Marshal.ThrowExceptionForHR( hr ); * _videoWin = (IVideoWindow) comobj; comobj = null; * } */ // GetFrameStepInterface(); DirectShowUtil.SetARMode(_graphBuilder, arMode); DirectShowUtil.EnableDeInterlace(_graphBuilder); //m_ovMgr = new OVTOOLLib.OvMgrClass(); //m_ovMgr.SetGraph(_graphBuilder); return(true); } catch (Exception) { //MessageBox.Show( this, "Could not get interfaces\r\n" + ee.Message, "DVDPlayer.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop ); CloseDVDInterfaces(); return(false); } finally { if (comobj != null) { DirectShowUtil.ReleaseComObject(comobj); } comobj = null; } }
/// <summary> create the used COM components and get the interfaces. </summary> protected virtual bool GetDVDInterfaces(string path) { int hr; //Type comtype = null; object comobj = null; _freeNavigator = true; _dvdInfo = null; _dvdCtrl = null; bool useAC3Filter = false; string dvdNavigator = ""; string aspectRatioMode = ""; string displayMode = ""; _videoPref = DvdPreferredDisplayMode.DisplayContentDefault; using (MediaPortal.Profile.Settings xmlreader = new MPSettings()) { dvdNavigator = xmlreader.GetValueAsString("dvdplayer", "navigator", "DVD Navigator"); aspectRatioMode = xmlreader.GetValueAsString("dvdplayer", "armode", "").ToLower(); dvdNavigator = "dslibdvdnav"; if (aspectRatioMode == "crop") { arMode = AspectRatioMode.Crop; } if (aspectRatioMode == "letterbox") { arMode = AspectRatioMode.LetterBox; } if (aspectRatioMode == "stretch") { arMode = AspectRatioMode.Stretched; } //if ( aspectRatioMode == "stretch" ) arMode = AspectRatioMode.zoom14to9; if (aspectRatioMode == "follow stream") { arMode = AspectRatioMode.StretchedAsPrimary; } useAC3Filter = xmlreader.GetValueAsBool("dvdplayer", "ac3", false); displayMode = xmlreader.GetValueAsString("dvdplayer", "displaymode", "").ToLower(); if (displayMode == "default") { _videoPref = DvdPreferredDisplayMode.DisplayContentDefault; } if (displayMode == "16:9") { _videoPref = DvdPreferredDisplayMode.Display16x9; } if (displayMode == "4:3 pan scan") { _videoPref = DvdPreferredDisplayMode.Display4x3PanScanPreferred; } if (displayMode == "4:3 letterbox") { _videoPref = DvdPreferredDisplayMode.Display4x3LetterBoxPreferred; } } try { _dvdGraph = (IDvdGraphBuilder)new DvdGraphBuilder(); hr = _dvdGraph.GetFiltergraph(out _graphBuilder); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } _rotEntry = new DsROTEntry((IFilterGraph)_graphBuilder); _vmr9Filter = (IBaseFilter)new VideoMixingRenderer9(); IVMRFilterConfig9 config = _vmr9Filter as IVMRFilterConfig9; hr = config.SetNumberOfStreams(1); hr = config.SetRenderingMode(VMR9Mode.Windowless); windowlessCtrl = (IVMRWindowlessControl9)_vmr9Filter; windowlessCtrl.SetVideoClippingWindow(this.panVideoWin.Handle); // config.SetRenderingPrefs(VMR9RenderPrefs. _graphBuilder.AddFilter(_vmr9Filter, "Video Mixing Renderer 9"); // _vmr7 = new VMR7Util(); // _vmr7.AddVMR7(_graphBuilder); try { _dvdbasefilter = DirectShowUtil.AddFilterToGraph(_graphBuilder, dvdNavigator); if (_dvdbasefilter != null) { IDvdControl2 cntl = (IDvdControl2)_dvdbasefilter; if (cntl != null) { _dvdInfo = (IDvdInfo2)cntl; _dvdCtrl = (IDvdControl2)cntl; if (path != null) { if (path.Length != 0) { cntl.SetDVDDirectory(path); } } _dvdCtrl.SetOption(DvdOptionFlag.HMSFTimeCodeEvents, true); // use new HMSF timecode format _dvdCtrl.SetOption(DvdOptionFlag.ResetOnStop, false); AddPreferedCodecs(_graphBuilder); DirectShowUtil.RenderOutputPins(_graphBuilder, _dvdbasefilter); // _videoWin = _graphBuilder as IVideoWindow; _freeNavigator = false; } //DirectShowUtil.ReleaseComObject( _dvdbasefilter); _dvdbasefilter = null; } } catch (Exception ex) { string strEx = ex.Message; } Guid riid; if (_dvdInfo == null) { riid = typeof(IDvdInfo2).GUID; hr = _dvdGraph.GetDvdInterface(riid, out comobj); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } _dvdInfo = (IDvdInfo2)comobj; comobj = null; } if (_dvdCtrl == null) { riid = typeof(IDvdControl2).GUID; hr = _dvdGraph.GetDvdInterface(riid, out comobj); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } _dvdCtrl = (IDvdControl2)comobj; comobj = null; } _mediaCtrl = (IMediaControl)_graphBuilder; _mediaEvt = (IMediaEventEx)_graphBuilder; _basicAudio = _graphBuilder as IBasicAudio; _mediaPos = (IMediaPosition)_graphBuilder; _mediaSeek = (IMediaSeeking)_graphBuilder; _mediaStep = (IVideoFrameStep)_graphBuilder; _basicVideo = _graphBuilder as IBasicVideo2; _videoWin = _graphBuilder as IVideoWindow; // disable Closed Captions! IBaseFilter baseFilter; _graphBuilder.FindFilterByName("Line 21 Decoder", out baseFilter); if (baseFilter == null) { _graphBuilder.FindFilterByName("Line21 Decoder", out baseFilter); } if (baseFilter != null) { _line21Decoder = (IAMLine21Decoder)baseFilter; if (_line21Decoder != null) { AMLine21CCState state = AMLine21CCState.Off; hr = _line21Decoder.SetServiceState(state); if (hr == 0) { logger.Info("DVDPlayer:Closed Captions disabled"); } else { logger.Info("DVDPlayer:failed 2 disable Closed Captions"); } } } /* // get video window if (_videoWin==null) { riid = typeof( IVideoWindow ).GUID; hr = _dvdGraph.GetDvdInterface( ref riid, out comobj ); if( hr < 0 ) Marshal.ThrowExceptionForHR( hr ); _videoWin = (IVideoWindow) comobj; comobj = null; } */ // GetFrameStepInterface(); DirectShowUtil.SetARMode(_graphBuilder, arMode); DirectShowUtil.EnableDeInterlace(_graphBuilder); //m_ovMgr = new OVTOOLLib.OvMgrClass(); //m_ovMgr.SetGraph(_graphBuilder); return true; } catch (Exception) { //MessageBox.Show( this, "Could not get interfaces\r\n" + ee.Message, "DVDPlayer.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop ); CloseDVDInterfaces(); return false; } finally { if (comobj != null) { DirectShowUtil.ReleaseComObject(comobj); } comobj = null; } }
public void DoTests() { int hr; DvdGraphBuilder dgb = null; IDvdGraphBuilder idgb = null; IGraphBuilder gb = null; IBasicAudio iba = null; AMDvdRenderStatus drs; object obj; // Get a dvd graph object dgb = new DvdGraphBuilder(); Debug.Assert(dgb != null, "new DvdGraphBuilder"); try { // Get the IDvdGraphBuilder interface idgb = dgb as IDvdGraphBuilder; // Test RenderDvdVideoVolume hr = idgb.RenderDvdVideoVolume(null, AMDvdGraphFlags.HWDecPrefer, out drs); Marshal.ThrowExceptionForHR(hr); // If there is no dvd in the player, you get hr == S_FALSE (1) Debug.Assert(hr == 0 || (hr == 1 && drs.bDvdVolUnknown), "RenderDvdVideoVolume"); // Get an IFilterGraph interface hr = idgb.GetFiltergraph(out gb); Marshal.ThrowExceptionForHR(hr); Debug.Assert(gb != null, "GetFiltergraph"); // GetDvdInterface allows for retrieving one of a variety // of interfaces. Try getting an IBasicAudio. hr = idgb.GetDvdInterface(typeof(IBasicAudio).GUID, out obj); Marshal.ThrowExceptionForHR(hr); // See if it is an IBasicAudio iba = obj as IBasicAudio; obj = null; Debug.Assert(iba != null); } finally { // Release everything if (dgb != null) { Marshal.ReleaseComObject(dgb); dgb = null; } if (gb != null) { Marshal.ReleaseComObject(gb); gb = null; } if (iba != null) { Marshal.ReleaseComObject(iba); iba = null; } } }
public bool BuildDvdGraph(string fileName) { dvdGraphBuilder = (IDvdGraphBuilder)new DvdGraphBuilder(); currentSpeed = NormalSpeed; int hr = 0; try { IGraphBuilder g; dvdGraphBuilder.GetFiltergraph(out g); graphBuilder = (IFilterGraph2)g; mediaControl = (IMediaControl)graphBuilder; mediaEvent = (IMediaEventEx)graphBuilder; mediaEvent.SetNotifyWindow(winHandle, VideoForm.WM_DSEvent, winHandle); ConfigureVMR(); AMDvdRenderStatus status; hr = dvdGraphBuilder.RenderDvdVideoVolume(fileName, AMDvdGraphFlags.HWDecPrefer, out status); if (hr < 0) { CloseInterfaces(); return false; } } catch { CloseInterfaces(); return false; } return true; }