private void ConfigureVMR9InWindowlessMode() { int hr = 0; IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)vmr9; // Not really needed for VMR9 but don't forget calling it with VMR7 hr = filterConfig.SetNumberOfStreams(1); DsError.ThrowExceptionForHR(hr); // Change VMR9 mode to Windowless hr = filterConfig.SetRenderingMode(VMR9Mode.Windowless); DsError.ThrowExceptionForHR(hr); windowlessCtrl = (IVMRWindowlessControl9)vmr9; // Set "Parent" window hr = windowlessCtrl.SetVideoClippingWindow(this.Handle); DsError.ThrowExceptionForHR(hr); // Set Aspect-Ratio hr = windowlessCtrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); DsError.ThrowExceptionForHR(hr); // Add delegates for Windowless operations AddHandlers(); // Call the resize handler to configure the output size MainForm_ResizeMove(null, null); }
private void CloseInterfaces() { if (mediaControl != null) { mediaControl.Stop(); } if (rot != null) { rot.Dispose(); rot = null; } RemoveHandlers(); if (compositor != null) { compositor.Dispose(); compositor = null; } if (vmr9 != null) { Marshal.ReleaseComObject(vmr9); vmr9 = null; windowlessCtrl = null; } if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); graphBuilder = null; mediaControl = null; } }
private void CloseInterfaces() { if (mediaControl != null) { mediaControl.Stop(); } if (handlersAdded) { RemoveHandlers(); } if (vmr9 != null) { Marshal.ReleaseComObject(vmr9); vmr9 = null; windowlessCtrl = null; mixerBitmap = null; } if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); graphBuilder = null; mediaControl = null; } menuMixer.Enabled = false; }
/// <summary> /// Creates a Snapshot from a windowless control /// </summary> /// <param name="control">control that is being drawn to by the VMR9</param> public Snapshot(IVMRWindowlessControl9 control) { int hr; hr = control.GetCurrentImage(out _dib); DsError.ThrowExceptionForHR(hr); }
private void ConfigureVMR9InWindowlessMode() { int hr = 0; IVMRFilterConfig9 filterConfig = this.videoRenderer as IVMRFilterConfig9; // Configure VMR-9 in Windowsless mode hr = filterConfig.SetRenderingMode(VMR9Mode.Windowless); DsError.ThrowExceptionForHR(hr); // With 1 input stream hr = filterConfig.SetNumberOfStreams(1); DsError.ThrowExceptionForHR(hr); IVMRWindowlessControl9 windowlessControl = this.videoRenderer as IVMRWindowlessControl9; // The main form is hosting the VMR-9 hr = windowlessControl.SetVideoClippingWindow(this.hostingControl.Handle); DsError.ThrowExceptionForHR(hr); // Keep the aspect-ratio OK hr = windowlessControl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); DsError.ThrowExceptionForHR(hr); // Init the VMR-9 with default size values ResizeMoveHandler(null, null); // Add Windows Messages handlers AddHandlers(); }
protected override void CloseInterfaces() { _pVMRFilterConfig9 = null; _pVMRWindowlessControl9 = null; // they will be released when pBaseFilter is released base.CloseInterfaces(); // release bBaseFilter }
private void CloseInterfaces() { while (!m_WaitUntilDoneIsDone) { Thread.Sleep(1); } if (!m_WaitUntilDoneIsDone) { MessageBox.Show("wait not done"); } try { if (mediaControl != null) { mediaControl.Stop(); Marshal.ReleaseComObject(mediaControl); mediaControl = null; } if (mediaPosition != null) { Marshal.ReleaseComObject(mediaPosition); mediaPosition = null; } if (windowlessCtrl != null) { Marshal.ReleaseComObject(windowlessCtrl); windowlessCtrl = null; } if (handlersAdded) { RemoveHandlers(); } if (m_MediaEvent != null) { Marshal.ReleaseComObject(m_MediaEvent); m_MediaEvent = null; } if (vmr9 != null) { Marshal.ReleaseComObject(vmr9); vmr9 = null; windowlessCtrl = null; } if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); graphBuilder = null; mediaControl = null; } } catch { } }
public void SetRendererInterfaces(IVMRWindowlessControl VMRWindowlessControl, IVMRWindowlessControl9 VMRWindowlessControl9, IMFVideoDisplayControl MFVideoDisplayControl) { _VMRWindowlessControl = VMRWindowlessControl; _VMRWindowlessControl9 = VMRWindowlessControl9; _MFVideoDisplayControl = MFVideoDisplayControl; }
public void VideoWindowSnapshot(IVMRFilterConfig9 renderer) { if (null == VmrRenderer) { return; } IVMRWindowlessControl9 ctrl = (IVMRWindowlessControl9)renderer; IntPtr imgptr = IntPtr.Zero; Bitmap bmp = null; try { ctrl.GetCurrentImage(out imgptr); if (IntPtr.Zero != imgptr) { BitmapInfoHeader header = new BitmapInfoHeader(); Marshal.PtrToStructure(imgptr, header); //stride formula comes from MSDN //https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapinfoheader var stride = ((((header.Width * header.BitCount) + 31) & ~31) >> 3); //暫時假定輸出圖像是純DIB沒有Color Mask等額外資訊 bmp = new Bitmap(header.Width, header.Height, stride, PixelFormat.Format32bppArgb, imgptr + header.Size); //注意這邊撈出的CurrentImage,是上下顛倒狀態(沿著X軸鏡射) //要把它再鏡射回來才能存檔 bmp.RotateFlip(RotateFlipType.RotateNoneFlipY); SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Bitmap File (*.bmp)|*.bmp"; dlg.InitialDirectory = BinPath; if (dlg.ShowDialog() == DialogResult.OK) { bmp.Save(dlg.FileName, ImageFormat.Jpeg); } } } catch (Exception ex) { MessageBox.Show("Failed to save snapshot bmp file : " + ex.Message); } finally { if (bmp != null) { bmp.Dispose(); } if (IntPtr.Zero != imgptr) { Marshal.FreeCoTaskMem(imgptr); } } }
public void DoTests() { int hr = 0; IVMRFilterConfig9 vmrConfig = null; try { // Just build the graph with unconnected source filter and VMR9 BuildGraph(testFile, out this.graphBuilder, out this.sourceFilter, out this.vmr9Filter); // VMR9 need to be placed in Windowless mode before connecting it to the rest of the graph vmrConfig = this.vmr9Filter as IVMRFilterConfig9; hr = vmrConfig.SetRenderingMode(VMR9Mode.Windowless); Marshal.ThrowExceptionForHR(hr); this.vmrWndConfig = this.vmr9Filter as IVMRWindowlessControl9; TestSetVideoClippingWindow(); TestAspectRatioMode(); TestBorderColor(); TestGetMaxIdealVideoSize(); TestGetMinIdealVideoSize(); // Connect source filter with the VMR9 ConnectGraph(ref this.graphBuilder, ref this.sourceFilter, ref this.vmr9Filter); // Run the graph to test other methods this.mediaControl = this.graphBuilder as IMediaControl; hr = this.mediaControl.Run(); Marshal.ThrowExceptionForHR(hr); this.isPlaying = true; TestVideoPosition(); Thread.Sleep(2000); TestGetCurrentImage(); Thread.Sleep(2000); TestDisplayModeChanged(); TestGetNativeVideoSize(); TestRepaintVideo(); } finally { if (this.mediaControl != null) { this.mediaControl.Stop(); } Marshal.ReleaseComObject(this.vmr9Filter); Marshal.ReleaseComObject(this.sourceFilter); Marshal.ReleaseComObject(this.graphBuilder); } }
/// <summary> /// Closes and releases all used interfaces. /// </summary> public void CloseInterfaces() { if (VMRenderer != null) { Marshal.ReleaseComObject(VMRenderer); VMRenderer = null; WindowlessCtrl = null; IMFVideoDisplayControl = null; MixerBitmap = null; } if (Processer != null) { Marshal.ReleaseComObject(Processer); AudioRender = null; } if (AudioRender != null) { Marshal.ReleaseComObject(AudioRender); AudioRender = null; } if (FilterGraph != null) { Marshal.ReleaseComObject(FilterGraph); FilterGraph = null; MediaControl = null; } if (SmartTee != null) { Marshal.ReleaseComObject(SmartTee); SmartTee = null; } if (SampleGrabber != null) { Marshal.ReleaseComObject(SampleGrabber); SampleGrabber = null; SampleGrabberFilter = null; } if (CaptureFilter != null) { Marshal.ReleaseComObject(CaptureFilter); CaptureFilter = null; } if (Crossbar != null) { Marshal.ReleaseComObject(Crossbar); Crossbar = null; } }
private void SetupRenderWindow(IVMRFilterConfig9 renderer, Control target) { IVMRFilterConfig9 config = renderer; // Not really needed for VMR9 but don't forget calling it with VMR7 config.SetNumberOfStreams(1); // Change VMR9 mode to Windowless config.SetRenderingMode(VMR9Mode.Windowless); IVMRWindowlessControl9 winless_ctrl = (IVMRWindowlessControl9)renderer; // Set "Parent" window winless_ctrl.SetVideoClippingWindow(target.Handle); // Set Aspect-Ratio winless_ctrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); winless_ctrl.SetVideoPosition(null, DsRect.FromRectangle(target.ClientRectangle)); winless_ctrl = null; }
protected override void Initialize(IGraphBuilder pGraphBuilder, IntPtr hMediaWindow) { // QUERY the VMR9 interfaces try { _pVMRFilterConfig9 = (IVMRFilterConfig9)BaseFilter; _pVMRFilterConfig9.SetRenderingMode(VMR9Mode.VMR9Mode_Windowless); _pVMRFilterConfig9.SetNumberOfStreams(NUMBER_OF_STREAMS); _pVMRWindowlessControl9 = (IVMRWindowlessControl9)BaseFilter; _pVMRWindowlessControl9.SetVideoClippingWindow(hMediaWindow); _pVMRWindowlessControl9.SetAspectRatioMode(VMR9AspectRatioMode.VMR9ARMode_None); } catch (Exception e) { throw new FilterGraphBuilderException(GraphBuilderError.ConfigureVMR9, e); } }
/// <summary> /// Adds VMR9 (renderer) filter to the filter graph. /// </summary> private void AddFilter_Renderer() { VMRenderer = (IBaseFilter) new VideoMixingRenderer9(); IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)VMRenderer; // Not really needed for vmr but don't forget calling it with VMR7 int hr = filterConfig.SetNumberOfStreams(1); DsError.ThrowExceptionForHR(hr); // Change vmr mode to Windowless hr = filterConfig.SetRenderingMode(VMR9Mode.Windowless); DsError.ThrowExceptionForHR(hr); // video renderer WindowlessCtrl = (IVMRWindowlessControl9)VMRenderer; // set clipping window hr = WindowlessCtrl.SetVideoClippingWindow(_DisplayPanel.Handle); DsError.ThrowExceptionForHR(hr); // Set Aspect-Ratio hr = WindowlessCtrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); DsError.ThrowExceptionForHR(hr); // Add delegates for Windowless operations _DisplayPanel.Paint += new PaintEventHandler(HostingControl_Paint); // for WM_PAINT _DisplayPanel.Resize += new EventHandler(HostingControl_ResizeMove); // for WM_SIZE _DisplayPanel.Move += new EventHandler(HostingControl_ResizeMove); // for WM_MOVE SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged); // for WM_DISPLAYCHANGE _bHandlersAdded = true; // Call the resize handler to configure the output size HostingControl_ResizeMove(null, null); hr = FilterGraph.AddFilter(VMRenderer, "Video Mixing Renderer 9"); DsError.ThrowExceptionForHR(hr); }
private void CloseInterfaces() { if (mediaControl != null) { mediaControl.Stop(); } if (vmr9 != null) { Marshal.ReleaseComObject(vmr9); vmr9 = null; windowlessCtrl = null; } if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); graphBuilder = null; mediaControl = null; mediaSeeking = null; mediaPosition = null; } }
public void CloseInterfaces() { if (this.VMRenderer != null) { Marshal.ReleaseComObject(this.VMRenderer); this.VMRenderer = null; this.WindowlessCtrl = null; this.MixerBitmap = null; } if (this.FilterGraph != null) { Marshal.ReleaseComObject(this.FilterGraph); this.FilterGraph = null; this.MediaControl = null; } if (this.SmartTee != null) { Marshal.ReleaseComObject(this.SmartTee); this.SmartTee = null; } if (this.SampleGrabber != null) { Marshal.ReleaseComObject(this.SampleGrabber); this.SampleGrabber = null; this.SampleGrabberFilter = null; } if (this.CaptureFilter != null) { Marshal.ReleaseComObject(this.CaptureFilter); this.CaptureFilter = null; } if (this.Crossbar != null) { Marshal.ReleaseComObject(this.Crossbar); this.Crossbar = null; } }
private void ConfigureVMR9InWindowlessMode() { int hr = 0; IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)vmr9; // Must be called before calling SetImageCompositor hr = filterConfig.SetNumberOfStreams(1); DsError.ThrowExceptionForHR(hr); // Create an instance of the Compositor compositor = new Compositor(); // Configure the filter with the Compositor hr = filterConfig.SetImageCompositor(compositor); DsError.ThrowExceptionForHR(hr); // Change VMR9 mode to Windowless hr = filterConfig.SetRenderingMode(VMR9Mode.Windowless); DsError.ThrowExceptionForHR(hr); windowlessCtrl = (IVMRWindowlessControl9)vmr9; // Set rendering window hr = windowlessCtrl.SetVideoClippingWindow(renderingPanel.Handle); DsError.ThrowExceptionForHR(hr); // Set Aspect-Ratio hr = windowlessCtrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); DsError.ThrowExceptionForHR(hr); // Add delegates for Windowless operations AddHandlers(); // Call the resize handler to configure the output size MainForm_ResizeMove(null, null); }
private void ConfigureVMR9InWindowlessMode() { int hr = 0; IVMRFilterConfig9 _filterConfig = (IVMRFilterConfig9)_vmr9Filter; // Not really needed for VMR9 but don't forget calling it with VMR7 hr = _filterConfig.SetNumberOfStreams(1); DsError.ThrowExceptionForHR(hr); // Change VMR9 mode to Windowless hr = _filterConfig.SetRenderingMode(VMR9Mode.Windowless); DsError.ThrowExceptionForHR(hr); windowlessCtrl = (IVMRWindowlessControl9)_vmr9Filter; // Set "Parent" window hr = windowlessCtrl.SetVideoClippingWindow(this.panVideoWin.Handle); DsError.ThrowExceptionForHR(hr); // Set Aspect-Ratio hr = windowlessCtrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); DsError.ThrowExceptionForHR(hr); }
private void LoadMovieInWindow(string filename) { int hr = 0; if (filename == string.Empty) return; this.graphBuilder = (IGraphBuilder)new FilterGraph(); this.captureGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2(); this.vmr9 = new VideoMixingRenderer9(); this.vmrConfig = this.vmr9 as IVMRFilterConfig9; // Attach the filter graph to the capture graph hr = this.captureGraphBuilder.SetFiltergraph(this.graphBuilder); DsError.ThrowExceptionForHR(hr); hr = this.graphBuilder.AddFilter(vmr9 as IBaseFilter, "VideoMixingRenderer9"); DsError.ThrowExceptionForHR(hr); hr = this.vmrConfig.SetRenderingMode(VMR9Mode.Windowless); DsError.ThrowExceptionForHR(hr); this.windowLessControl = this.vmr9 as IVMRWindowlessControl9; this.windowLessControl.SetVideoClippingWindow(this.Handle); this.windowLessControl.SetVideoPosition(null, new DsRect(0, 0, this.ClientSize.Width, this.ClientSize.Height)); IBaseFilter fileSourceFilter; hr = this.graphBuilder.AddSourceFilter(filename, "WebCamSource", out fileSourceFilter); DsError.ThrowExceptionForHR(hr); hr = this.captureGraphBuilder.RenderStream(null, null, fileSourceFilter, null, vmr9 as IBaseFilter); DsError.ThrowExceptionForHR(hr); //// Have the graph builder construct its the appropriate graph automatically //hr = this.graphBuilder.RenderFile(filename, null); //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 video interfaces, which may not be relevant for audio files ////this.videoWindow = this.graphBuilder as IVideoWindow; this.basicVideo = this.graphBuilder as IBasicVideo; // 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); if (!this.isAudioOnly) { this.windowLessControl = this.vmr9 as IVMRWindowlessControl9; this.windowLessControl.SetVideoClippingWindow(this.Handle); this.windowLessControl.SetVideoPosition(null, new DsRect(0, 0, this.ClientSize.Width, this.ClientSize.Height)); //hr = InitVideoWindow(); //DsError.ThrowExceptionForHR(hr); GetFrameStepInterface(); } // Complete window initialization //this.isFullScreen = false; this.currentPlaybackRate = 1.0; //UpdateToolTip(); #if DEBUG rot = new DsROTEntry(this.graphBuilder); #endif }
/// <summary> /// Closes and releases all used interfaces. /// </summary> public void CloseInterfaces() { if (VMRenderer != null) { Marshal.ReleaseComObject(VMRenderer); VMRenderer = null; WindowlessCtrl = null; MixerBitmap = null; } if (FilterGraph != null) { Marshal.ReleaseComObject(FilterGraph); FilterGraph = null; MediaControl = null; } if (SmartTee != null) { Marshal.ReleaseComObject(SmartTee); SmartTee = null; } if (SampleGrabber != null) { Marshal.ReleaseComObject(SampleGrabber); SampleGrabber = null; SampleGrabberFilter = null; } if (CaptureFilter != null) { Marshal.ReleaseComObject(CaptureFilter); CaptureFilter = null; } if (Crossbar != null) { Marshal.ReleaseComObject(Crossbar); Crossbar = null; } }
public void SetRendererInterfaces(IVMRWindowlessControl VMRWindowlessControl, IVMRWindowlessControl9 VMRWindowlessControl9, IMFVideoDisplayControl MFVideoDisplayControl) { _manager.SetRunning(true, VMRWindowlessControl, VMRWindowlessControl9, MFVideoDisplayControl); }
private void CloseInterfaces() { if (mediaControl != null) mediaControl.Stop(); if (handlersAdded) RemoveHandlers(); if (vmr9 != null) { Marshal.ReleaseComObject(vmr9); vmr9 = null; windowlessCtrl = null; mixerBitmap = null; } if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); graphBuilder = null; mediaControl = null; } menuMixer.Enabled = false; }
private void ConfigureVMR9InWindowlessMode() { int hr = 0; IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9) vmr9; // Not really needed for VMR9 but don't forget calling it with VMR7 hr = filterConfig.SetNumberOfStreams(1); DsError.ThrowExceptionForHR(hr); // Change VMR9 mode to Windowless hr = filterConfig.SetRenderingMode(VMR9Mode.Windowless); DsError.ThrowExceptionForHR(hr); windowlessCtrl = (IVMRWindowlessControl9) vmr9; // Set "Parent" window hr = windowlessCtrl.SetVideoClippingWindow(this.Handle); DsError.ThrowExceptionForHR(hr); // Set Aspect-Ratio hr = windowlessCtrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); DsError.ThrowExceptionForHR(hr); // Add delegates for Windowless operations AddHandlers(); // Call the resize handler to configure the output size MainForm_ResizeMove(null, 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; } }
private void ConfigureVMR9InWindowlessMode() { int hr = 0; IVMRFilterConfig9 _filterConfig = (IVMRFilterConfig9)_vmr9Filter ; // Not really needed for VMR9 but don't forget calling it with VMR7 hr = _filterConfig.SetNumberOfStreams(1); DsError.ThrowExceptionForHR(hr); // Change VMR9 mode to Windowless hr = _filterConfig.SetRenderingMode(VMR9Mode.Windowless); DsError.ThrowExceptionForHR(hr); windowlessCtrl = (IVMRWindowlessControl9)_vmr9Filter; // Set "Parent" window hr = windowlessCtrl.SetVideoClippingWindow(this.panVideoWin.Handle); DsError.ThrowExceptionForHR(hr); // Set Aspect-Ratio hr = windowlessCtrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); DsError.ThrowExceptionForHR(hr); }
void initGraph(Rectangle rect, IntPtr hwnd) { log.writeLog("Init Graph"); pGB = (IGraphBuilder) new FilterGraph(); pVmr = (IBaseFilter) new VideoMixingRenderer9(); compressVideo = CreateFilter(FilterCategory.VideoCompressorCategory, lstCompressor[3]); pGB.AddFilter(pVmr, "Video"); pGB.AddFilter(captureVideo, "VideoCapture"); //pGB.AddFilter(compressVideo, "Encoder"); pConfig = (IVMRFilterConfig9)pVmr; pConfig.SetRenderingMode(VMR9Mode.Windowless); pWC = (IVMRWindowlessControl9)pVmr; pWC.SetVideoPosition(null, DsRect.FromRectangle(rect)); pWC.SetVideoClippingWindow(hwnd); pMix = (IVMRMixerControl9)pVmr; pMs = (IMediaSeeking)pGB; pMC = (IMediaControl)pGB; ICaptureGraphBuilder2 cc = (ICaptureGraphBuilder2) new CaptureGraphBuilder2(); cc.SetFiltergraph(pGB); pGB.AddFilter(devices[0], "Camera-1"); if (devices[1] != null) { pGB.AddFilter(devices[1], "Camera-2"); } pGB.AddFilter(audioCapture, "Audio Capture"); Rectangle win = rect; float _w = win.Width; float _H = win.Height; NormalizedRect _0rect = new NormalizedRect(); _0rect.top = win.Top; _0rect.left = win.Left; _0rect.right = (win.Left + win.Width / 2) / _w; _0rect.bottom = (win.Bottom / _H); NormalizedRect _1rect = new NormalizedRect(); _1rect.top = win.Top; _1rect.left = (win.Left + win.Width / 2) / _w;; _1rect.right = win.Right / _w; _1rect.bottom = win.Bottom / _H; pMix.SetOutputRect(0, _0rect); pMix.SetOutputRect(1, _1rect); int hr = 0; IFileSinkFilter sink = null; log.writeLog("SetOutputFileName create"); hr = cc.SetOutputFileName(MediaSubType.Avi, "VideoCaptured.avi", out captureVideo, out sink); DsError.ThrowExceptionForHR(hr); log.writeLog("SetOutputFileName success"); log.writeLog("Start create cam-1 to preview"); hr = cc.RenderStream(PinCategory.Preview, MediaType.Video, devices[0], null, pVmr); DsError.ThrowExceptionForHR(hr); log.writeLog("Start cam-1 to preview success"); if (devices[1] != null) { log.writeLog("Start create cam-2 to preview"); hr = cc.RenderStream(PinCategory.Preview, MediaType.Video, devices[1], null, pVmr); DsError.ThrowExceptionForHR(hr); log.writeLog("Create cam-2 to preview success"); } log.writeLog("Start capture video from cam-1"); hr = cc.RenderStream(PinCategory.Capture, MediaType.Video, devices[0], null, captureVideo); DsError.ThrowExceptionForHR(hr); log.writeLog("success create capture from cam-1"); log.writeLog("Start capture audio"); hr = cc.RenderStream(PinCategory.Capture, MediaType.Audio, audioCapture, null, captureVideo); DsError.ThrowExceptionForHR(hr); log.writeLog("Success to capture audio"); Marshal.ReleaseComObject(cc); }
/// <summary> /// Close and dispose all camera and DirectX stuff. /// </summary> public void Dispose() { _bGraphIsBuilt = false; // stop rendering if (MediaControl != null) { try { MediaControl.StopWhenReady(); MediaControl.Stop(); } catch (Exception ex) { Debug.WriteLine(ex); } } if (_bHandlersAdded) { // remove handlers when they are no more needed _bHandlersAdded = false; _DisplayPanel.Paint -= new PaintEventHandler(HostingControl_Paint); _DisplayPanel.Resize -= new EventHandler(HostingControl_ResizeMove); _DisplayPanel.Move -= new EventHandler(HostingControl_ResizeMove); SystemEvents.DisplaySettingsChanged -= new EventHandler(SystemEvents_DisplaySettingsChanged); } // Dispose Managed Direct3D objects if (_pSampleGrabberHelper != null) { _pSampleGrabberHelper.Dispose(); _pSampleGrabberHelper = null; } if (VMRenderer != null) { Marshal.ReleaseComObject(VMRenderer); VMRenderer = null; WindowlessCtrl = null; } if (FilterGraph != null) { Marshal.ReleaseComObject(FilterGraph); FilterGraph = null; MediaControl = null; } if (SmartTee != null) { Marshal.ReleaseComObject(SmartTee); SmartTee = null; } if (SampleGrabber != null) { Marshal.ReleaseComObject(SampleGrabber); SampleGrabber = null; SampleGrabberFilter = null; } if (CaptureFilter != null) { Marshal.ReleaseComObject(CaptureFilter); CaptureFilter = null; } return; }
private void CloseInterfaces() { if (mediaControl != null) mediaControl.Stop(); if (rot != null) { rot.Dispose(); rot = null; } RemoveHandlers(); if (compositor != null) { compositor.Dispose(); compositor = null; } if (vmr9 != null) { Marshal.ReleaseComObject(vmr9); vmr9 = null; windowlessCtrl = null; } if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); graphBuilder = null; mediaControl = null; } }
private void LoadMovieInWindow(string filename) { int hr = 0; if (filename == string.Empty) { return; } this.graphBuilder = (IGraphBuilder) new FilterGraph(); this.captureGraphBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2(); this.vmr9 = new VideoMixingRenderer9(); this.vmrConfig = this.vmr9 as IVMRFilterConfig9; // Attach the filter graph to the capture graph hr = this.captureGraphBuilder.SetFiltergraph(this.graphBuilder); DsError.ThrowExceptionForHR(hr); hr = this.graphBuilder.AddFilter(vmr9 as IBaseFilter, "VideoMixingRenderer9"); DsError.ThrowExceptionForHR(hr); hr = this.vmrConfig.SetRenderingMode(VMR9Mode.Windowless); DsError.ThrowExceptionForHR(hr); this.windowLessControl = this.vmr9 as IVMRWindowlessControl9; this.windowLessControl.SetVideoClippingWindow(this.Handle); this.windowLessControl.SetVideoPosition(null, new DsRect(0, 0, this.ClientSize.Width, this.ClientSize.Height)); IBaseFilter fileSourceFilter; hr = this.graphBuilder.AddSourceFilter(filename, "WebCamSource", out fileSourceFilter); DsError.ThrowExceptionForHR(hr); hr = this.captureGraphBuilder.RenderStream(null, null, fileSourceFilter, null, vmr9 as IBaseFilter); DsError.ThrowExceptionForHR(hr); //// Have the graph builder construct its the appropriate graph automatically //hr = this.graphBuilder.RenderFile(filename, null); //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 video interfaces, which may not be relevant for audio files ////this.videoWindow = this.graphBuilder as IVideoWindow; this.basicVideo = this.graphBuilder as IBasicVideo; // 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); if (!this.isAudioOnly) { this.windowLessControl = this.vmr9 as IVMRWindowlessControl9; this.windowLessControl.SetVideoClippingWindow(this.Handle); this.windowLessControl.SetVideoPosition(null, new DsRect(0, 0, this.ClientSize.Width, this.ClientSize.Height)); //hr = InitVideoWindow(); //DsError.ThrowExceptionForHR(hr); GetFrameStepInterface(); } // Complete window initialization //this.isFullScreen = false; this.currentPlaybackRate = 1.0; //UpdateToolTip(); #if DEBUG rot = new DsROTEntry(this.graphBuilder); #endif }
/// <summary> /// Closes and releases all used interfaces. /// </summary> public void CloseInterfaces() { try { if (VMRenderer != null) { try { Marshal.ReleaseComObject(VMRenderer); } catch { } VMRenderer = null; WindowlessCtrl = null; MixerBitmap = null; } if (FilterGraph != null) { try { Marshal.ReleaseComObject(FilterGraph); } catch { } FilterGraph = null; MediaControl = null; } if (SmartTee != null) { try { Marshal.ReleaseComObject(SmartTee); } catch { } SmartTee = null; } if (SampleGrabber != null) { try { Marshal.ReleaseComObject(SampleGrabber); } catch { } SampleGrabber = null; SampleGrabberFilter = null; } if (CaptureFilter != null) { try { Marshal.ReleaseComObject(CaptureFilter); } catch { } CaptureFilter = null; } if (Crossbar != null) { try { Marshal.ReleaseComObject(Crossbar); } catch { } Crossbar = null; } } catch { } }
private void CloseInterfaces() { if (mediaControl != null) mediaControl.Stop(); if (vmr9 != null) { Marshal.ReleaseComObject(vmr9); vmr9 = null; windowlessCtrl = null; } if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); graphBuilder = null; mediaControl = null; mediaSeeking = null; mediaPosition = 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; } }
private void CloseInterfaces() { while (!m_WaitUntilDoneIsDone) Thread.Sleep(1); if (!m_WaitUntilDoneIsDone) { MessageBox.Show("wait not done"); } try { if (mediaControl != null) { mediaControl.Stop(); Marshal.ReleaseComObject(mediaControl); mediaControl = null; } if (mediaPosition != null) { Marshal.ReleaseComObject(mediaPosition); mediaPosition = null; } if (windowlessCtrl != null) { Marshal.ReleaseComObject(windowlessCtrl); windowlessCtrl = null; } if (handlersAdded) RemoveHandlers(); if (m_MediaEvent != null) { Marshal.ReleaseComObject(m_MediaEvent); m_MediaEvent = null; } if (vmr9 != null) { Marshal.ReleaseComObject(vmr9); vmr9 = null; windowlessCtrl = null; } if (graphBuilder != null) { Marshal.ReleaseComObject(graphBuilder); graphBuilder = null; mediaControl = null; } } catch { } }