public void BuildGraph() { int hr = 0; graphBuilder = (IFilterGraph2) new FilterGraph(); rot = new DsROTEntry(graphBuilder); vmr9 = (IBaseFilter) new VideoMixingRenderer9(); IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)vmr9; hr = filterConfig.SetNumberOfStreams(2); DsError.ThrowExceptionForHR(hr); // Put the VMR9 in Renderless mode hr = filterConfig.SetRenderingMode(VMR9Mode.Renderless); DsError.ThrowExceptionForHR(hr); surfaceAllocatorNotify = (IVMRSurfaceAllocatorNotify9)vmr9; // Advise to VMR9 of our custom Allocator / Presenter hr = surfaceAllocatorNotify.AdviseSurfaceAllocator(cookie, this); DsError.ThrowExceptionForHR(hr); // Advise our custom Allocator / Presenter of the VMR9 hr = this.AdviseNotify(surfaceAllocatorNotify); DsError.ThrowExceptionForHR(hr); hr = graphBuilder.AddFilter(vmr9, "VMR9"); DsError.ThrowExceptionForHR(hr); hr = graphBuilder.RenderFile(@"..\..\..\Resources\foo.avi", null); 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(); }
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); }
public void InitVMR9(string filename) { int hr = 0; // Create a DirectShow FilterGraph graphBuilder = (IFilterGraph2) new FilterGraph(); // Add it in ROT for debug purpose rot = new DsROTEntry(graphBuilder); // Add a notification handler (see WndProc) hr = (graphBuilder as IMediaEventEx).SetNotifyWindow(this.Handle, WM_GRAPHNOTIFY, IntPtr.Zero); DsError.ThrowExceptionForHR(hr); // Create a VMR9 object vmr9 = (IBaseFilter) new VideoMixingRenderer9(); IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)vmr9; // We want the Renderless mode! hr = filterConfig.SetRenderingMode(VMR9Mode.Renderless); DsError.ThrowExceptionForHR(hr); // One stream is enough for this sample hr = filterConfig.SetNumberOfStreams(1); DsError.ThrowExceptionForHR(hr); // Create the Allocator / Presenter object allocator = new Allocator(device); IVMRSurfaceAllocatorNotify9 vmrSurfAllocNotify = (IVMRSurfaceAllocatorNotify9)vmr9; // Notify the VMR9 filter about our allocator hr = vmrSurfAllocNotify.AdviseSurfaceAllocator(IntPtr.Zero, allocator); DsError.ThrowExceptionForHR(hr); // Notify our allocator about the VMR9 filter hr = allocator.AdviseNotify(vmrSurfAllocNotify); DsError.ThrowExceptionForHR(hr); IVMRMixerControl9 mixerControl = (IVMRMixerControl9)vmr9; // Select the mixer mode : YUV or RGB hr = mixerControl.SetMixingPrefs(VMR9MixerPrefs.RenderTargetYUV | VMR9MixerPrefs.NoDecimation | VMR9MixerPrefs.ARAdjustXorY | VMR9MixerPrefs.BiLinearFiltering); //hr = mixerControl.SetMixingPrefs(VMR9MixerPrefs.RenderTargetRGB | VMR9MixerPrefs.NoDecimation | VMR9MixerPrefs.ARAdjustXorY | VMR9MixerPrefs.BiLinearFiltering); DsError.ThrowExceptionForHR(hr); // Add the filter to the graph hr = graphBuilder.AddFilter(vmr9, "Video Mixing Renderer 9"); DsError.ThrowExceptionForHR(hr); // Render the file hr = graphBuilder.RenderFile(filename, null); DsError.ThrowExceptionForHR(hr); // Run the graph hr = (graphBuilder as IMediaControl).Run(); DsError.ThrowExceptionForHR(hr); }
void PreviewInit() { m_dvdNav = (IBaseFilter) new DVDNavigator(); m_dvdCtrl = m_dvdNav as IDvdControl2; int hr = m_dvdCtrl.SetDVDDirectory(Disk.VIDEO_TS); DsError.ThrowExceptionForHR(hr); m_dvdInfo = m_dvdCtrl as IDvdInfo2; m_filterGraph = (IGraphBuilder) new FilterGraph(); hr = m_filterGraph.AddFilter(m_dvdNav, "DVD Navigator"); DsError.ThrowExceptionForHR(hr); m_renderer = (IBaseFilter) new VideoMixingRenderer9(); IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)m_renderer; hr = filterConfig.SetRenderingMode(VMR9Mode.Renderless); DsError.ThrowExceptionForHR(hr); hr = filterConfig.SetNumberOfStreams(1); DsError.ThrowExceptionForHR(hr); hr = m_filterGraph.AddFilter(m_renderer, "Video Mix 9"); DsError.ThrowExceptionForHR(hr); IPin videoPin; hr = m_dvdNav.FindPin("Video", out videoPin); DsError.ThrowExceptionForHR(hr); IPin audioPin; hr = m_dvdNav.FindPin("AC3", out audioPin); DsError.ThrowExceptionForHR(hr); //hr = m_filterGraph.Render(videoPin); //DsError.ThrowExceptionForHR(hr); //hr = m_filterGraph.Render(audioPin); //DsError.ThrowExceptionForHR(hr); //IMediaControl mediaCtrl = (IMediaControl)m_filterGraph; //hr = mediaCtrl.Run(); //DsError.ThrowExceptionForHR(hr); //hr = m_dvdCtrl.SetOption(DvdOptionFlag.EnableNonblockingAPIs, true); //DsError.ThrowExceptionForHR(hr); //m_dvdCtrl.SetOption(DvdOptionFlag.ResetOnStop, true); }
private void ConfigureVMRInWindowlessMode() { IVMRFilterConfig9 vMRenderer = (IVMRFilterConfig9)this.DX.VMRenderer; DsError.ThrowExceptionForHR(vMRenderer.SetNumberOfStreams(1)); DsError.ThrowExceptionForHR(vMRenderer.SetRenderingMode(VMR9Mode.Windowless)); this.DX.WindowlessCtrl = (IVMRWindowlessControl9)this.DX.VMRenderer; if (this._HostingControl != null) { DsError.ThrowExceptionForHR(this.DX.WindowlessCtrl.SetVideoClippingWindow(this._HostingControl.Handle)); } DsError.ThrowExceptionForHR(this.DX.WindowlessCtrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox)); this.AddHandlers(); this.HostingControl_ResizeMove(null, null); }
protected override void Initialize(IGraphBuilder pGraphBuilder, IntPtr hMediaWindow) { if (_initialized) { base.Initialize(pGraphBuilder, hMediaWindow); } else { IVMRFilterConfig9 pVMRFilterConfig9 = (IVMRFilterConfig9)BaseFilter; // will be released when pBaseFilter is released pVMRFilterConfig9.SetNumberOfStreams(NUMBER_OF_STREAMS); IVMRAspectRatioControl9 pVMRAspectRatioControl9 = (IVMRAspectRatioControl9)BaseFilter; pVMRAspectRatioControl9.SetAspectRatioMode(VMR9AspectRatioMode.VMR9ARMode_None); _initialized = true; } }
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); } }
private void StartGraph() { int hr = 0; CloseGraph(); string path = GetMoviePath(); if (path == string.Empty) { return; } try { graph = (IGraphBuilder) new FilterGraph(); filter = (IBaseFilter) new VideoMixingRenderer9(); IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)filter; hr = filterConfig.SetRenderingMode(VMR9Mode.Renderless); DsError.ThrowExceptionForHR(hr); hr = filterConfig.SetNumberOfStreams(2); DsError.ThrowExceptionForHR(hr); SetAllocatorPresenter(); hr = graph.AddFilter(filter, "Video Mixing Renderer 9"); DsError.ThrowExceptionForHR(hr); hr = graph.RenderFile(path, null); DsError.ThrowExceptionForHR(hr); mediaControl = (IMediaControl)graph; hr = mediaControl.Run(); DsError.ThrowExceptionForHR(hr); } catch { } }
/// <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); }
public void BuildGraph() { int hr = 0; graphBuilder = (IFilterGraph2) new FilterGraph(); rot = new DsROTEntry(graphBuilder); vmr9 = (IBaseFilter) new VideoMixingRenderer9(); IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)vmr9; hr = filterConfig.SetNumberOfStreams(2); DsError.ThrowExceptionForHR(hr); // Set the custom compositor hr = filterConfig.SetImageCompositor(this); DsError.ThrowExceptionForHR(hr); IVMRMixerControl9 mixerControl = (IVMRMixerControl9)vmr9; // In COLORREF, colors are coded in ABGR format hr = mixerControl.SetBackgroundClr(backgroundColorABGR); DsError.ThrowExceptionForHR(hr); hr = graphBuilder.AddFilter(vmr9, "VMR9"); DsError.ThrowExceptionForHR(hr); // The 2 VMR pins must be connected... hr = graphBuilder.RenderFile(@"..\..\..\Resources\foo.avi", null); DsError.ThrowExceptionForHR(hr); hr = graphBuilder.RenderFile(@"..\..\..\Resources\foo.avi", null); DsError.ThrowExceptionForHR(hr); hr = (graphBuilder as IMediaControl).Run(); DsError.ThrowExceptionForHR(hr); }
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); }
/// <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; } }
protected override HRESULT OnInitInterfaces() { m_Renderer = new VMR9Renderer(); m_Renderer.FilterGraph = m_GraphBuilder; IVMRFilterConfig9 _config = (IVMRFilterConfig9)m_Renderer.QueryInterface(typeof(IVMRFilterConfig9).GUID); HRESULT hr; if (_config != null) { hr = (HRESULT)_config.SetRenderingMode(VMR9Mode.Renderless); hr.Assert(); hr = (HRESULT)_config.SetNumberOfStreams(2); hr.Assert(); } m_mixerControl = (IVMRMixerControl9)m_Renderer.QueryInterface(typeof(IVMRMixerControl9).GUID); m_mixerControl.SetBackgroundClr((int)0xbf7f2f); VMR9MixerPrefs mixerPrefs; m_mixerControl.GetMixingPrefs(out mixerPrefs); m_mixerControl.SetMixingPrefs(mixerPrefs); IVMRSurfaceAllocatorNotify9 _notify = (IVMRSurfaceAllocatorNotify9)m_Renderer.QueryInterface(typeof(IVMRSurfaceAllocatorNotify9).GUID); if (_notify != null) { hr = (HRESULT)_notify.AdviseSurfaceAllocator(new IntPtr(g_ciUsedID), this); hr.Assert(); hr = (HRESULT)this.AdviseNotify(_notify); hr.Assert(); } DSVideoCaptureCategory captureCategory = new DSVideoCaptureCategory(); List <DSFilter> capFilters = new List <DSFilter>(); foreach (var captureDevice in captureCategory.Objects) { if (captureDevice.DevicePath == m_leftEyeDevicePath) { capFilters.Add(captureDevice.Filter); break; } } foreach (var captureDevice in captureCategory.Objects) { if (captureDevice.DevicePath == m_rightEyeDevicePath) { capFilters.Add(captureDevice.Filter); break; } } if (capFilters.Count < 2) { MessageBox.Show("Not enough capture devices found (" + capFilters.Count.ToString() + " device(s))"); throw new Exception(); } for (int i = 0; i < 2; i++) { if (capFilters[i] == null) { return(E_FAIL); } DSPin capturePin = null; foreach (var outputPin in capFilters[i].Output) { if (outputPin.Name == "Capture") { capturePin = outputPin; break; } } AMMediaType mjpgMediaType = null; int maxPixels = -1; foreach (var mediaType in capturePin.MediaTypes) { VideoInfoHeader videoInfo = new VideoInfoHeader(); videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader)); // pick the highest res mode... if ((videoInfo.BmiHeader.Width * videoInfo.BmiHeader.Height) > maxPixels) { maxPixels = videoInfo.BmiHeader.Width * videoInfo.BmiHeader.Height; mjpgMediaType = mediaType; //break; } } capFilters[i].OutputPin.Format = mjpgMediaType; capFilters[i].FilterGraph = m_GraphBuilder; capFilters[i].Connect(m_Renderer); } VMR9NormalizedRect r1 = new VMR9NormalizedRect(0, 0, 0.5f, 1f); VMR9NormalizedRect r2 = new VMR9NormalizedRect(0.5f, 0f, 1f, 1f); int rt0 = m_mixerControl.SetOutputRect(0, ref r1); int rt1 = m_mixerControl.SetOutputRect(1, ref r2); hr = base.OnInitInterfaces(); return(hr); }