/// <summary> build the capture graph for grabber. </summary> bool SetupGraph() { int hr; try { hr = capGraph.SetFiltergraph(graphBuilder); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } hr = graphBuilder.AddFilter(capFilter, " Video Capture Device"); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } DsUtils.ShowCapPinDialog(capGraph, capFilter, this.Handle); AMMediaType media = new AMMediaType(); media.majorType = MediaType.Video; media.subType = MediaSubType.RGB24; media.formatType = FormatType.VideoInfo; // ??? hr = sampGrabber.SetMediaType(media); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } hr = graphBuilder.AddFilter(baseGrabFlt, " Grabber"); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } Guid cat = PinCategory.Preview; Guid med = MediaType.Video; hr = capGraph.RenderStream(ref cat, ref med, capFilter, null, null); // baseGrabFlt if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } cat = PinCategory.Capture; med = MediaType.Video; hr = capGraph.RenderStream(ref cat, ref med, capFilter, null, baseGrabFlt); // baseGrabFlt if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } media = new AMMediaType(); hr = sampGrabber.GetConnectedMediaType(media); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } if ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero)) { throw new NotSupportedException("Unknown Grabber Media Format"); } videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader)); Marshal.FreeCoTaskMem(media.formatPtr); media.formatPtr = IntPtr.Zero; hr = sampGrabber.SetBufferSamples(false); if (hr == 0) { hr = sampGrabber.SetOneShot(false); } if (hr == 0) { hr = sampGrabber.SetCallback(null, 0); } if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } return(true); } catch (Exception ee) { MessageBox.Show(this, "Could not setup graph\r\n" + ee.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); return(false); } }
/// <summary> build the capture graph. </summary> bool SetupGraph() { int hr; IBaseFilter mux = null; IFileSinkFilter sink = null; try { hr = capGraph.SetFiltergraph(graphBuilder); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } hr = graphBuilder.AddFilter(capFilter, "Ds.NET Video Capture Device"); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } DsUtils.ShowCapPinDialog(capGraph, capFilter, this.Handle); Guid sub = MediaSubType.Avi; hr = capGraph.SetOutputFileName(ref sub, fileName, out mux, out sink); if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } Guid cat = PinCategory.Capture; Guid med = MediaType.Video; hr = capGraph.RenderStream(ref cat, ref med, capFilter, null, mux); // stream to file if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } cat = PinCategory.Preview; med = MediaType.Video; hr = capGraph.RenderStream(ref cat, ref med, capFilter, null, null); // preview window if (hr < 0) { Marshal.ThrowExceptionForHR(hr); } return(true); } catch (Exception ee) { MessageBox.Show(this, "Could not setup graph\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop); return(false); } finally { if (mux != null) { Marshal.ReleaseComObject(mux); } mux = null; if (sink != null) { Marshal.ReleaseComObject(sink); } sink = null; } }