private Func <Bitmap> GetBitmapFromSampleGrabberCallback(DirectShow.ISampleGrabber i_grabber, int width, int height, int stride) { var sampler = new SampleGrabberCallback(); i_grabber.SetCallback(sampler, 1); // WhichMethodToCallback = BufferCB return(() => sampler.GetBitmap(width, height, stride)); }
public void createSampleGrabber(ref string strPreviewIn, ref string strPreviewOut, ref string strDevice, ref string strPinOut, ref IBaseFilter pRen) { Guid CLSID_SampleGrabber = new Guid("{C1F400A0-3F08-11D3-9F0B-006008039E37}"); //qedit.dll int hr = 0; _class.Debug.Log(""); _class.Debug.Log("Creating SampleGrabber"); //add SampleGrabber IBaseFilter pSampleGrabber = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_SampleGrabber)); hr = _class.Graph.CaptureGraph.AddFilter(pSampleGrabber, "SampleGrabber"); _class.Debug.Log("-> " + DsError.GetErrorText(hr)); _class.GraphPin.ListPin(pSampleGrabber); string strSampleIn = _class.GraphPin.AssumePinIn("Input"); string strSampleOut = _class.GraphPin.AssumePinOut("Output"); _class.Debug.Log("Set samplegrabber resolution feed"); if (_class.Resolution.List.Count > 0) { hr = ((ISampleGrabber)pSampleGrabber).SetMediaType(_class.Resolution.Type[_class.Var.VideoResolutionIndex]); _class.Debug.Log("-> " + DsError.GetErrorText(hr)); } else { _class.Debug.Log("[ERR] failure in video resolution list"); } _class.Debug.Log(""); _class.Debug.Log("*** Connect " + strDevice + " (" + strPinOut + ") to SampleGrabber (" + strSampleIn + ")"); //hr = CaptureGraph.ConnectDirect(_class.GraphPin.GetPin(pRen, strPinOut), _class.GraphPin.GetPin(pSampleGrabber, strPreviewIn), null); hr = _class.Graph.CaptureGraph.ConnectDirect(_class.GraphPin.GetPin(pRen, "Capture"), _class.GraphPin.GetPin(pSampleGrabber, "Input"), null); if (hr == 0) { var cb = new SampleGrabberCallback(); cb.GetForm1Handle(_class.FrmMain); var sampleGrabber = (ISampleGrabber)pSampleGrabber; sampleGrabber.SetCallback(cb, 1); _class.Debug.Log("[OK] Connected " + strDevice + " to SampleGrabber"); strDevice = "Sample Grabber"; pRen = pSampleGrabber; strPinOut = strSampleOut; } else { _class.Debug.Log("[NG] Cant connect SampleGrabber to video Capture feed. Attempting to continue."); _class.Debug.Log("-> " + DsError.GetErrorText(hr)); } }
private SampleGrabber BuildGrabber(string filterNamePrefix, IPin srcOutputPin, Guid majorType, Guid subType, Guid formatType, SampleGrabberCallback.BufferCBEventHandler callback) { // Create Filter SampleGrabber sampleGrabber = CreateSampleGrabber(majorType, subType, formatType, callback); NullRenderer nullRenderer = CreateNullRenderer(); // Add Filter GraphBuilder.AddFilter(sampleGrabber as IBaseFilter, filterNamePrefix + " Sample Grabber"); GraphBuilder.AddFilter(nullRenderer as IBaseFilter, filterNamePrefix + " Null Renderer"); // Connect srcOutput -> grabberInput, grabberOutput -> rendererInput IPin grabberIn = Util.FindInputPin(sampleGrabber as IBaseFilter); IPin grabberOut = Util.FindOutputPin(sampleGrabber as IBaseFilter); IPin rendererIn = Util.FindInputPin(nullRenderer as IBaseFilter); GraphBuilder.Connect(srcOutputPin, grabberIn); GraphBuilder.Connect(grabberOut, rendererIn); Util.FreePin(rendererIn); Util.FreePin(grabberOut); Util.FreePin(grabberIn); Marshal.ReleaseComObject(nullRenderer); return sampleGrabber; }
private void CaptureVideo() { int retVal; graph = (IGraphBuilder) new FilterGraph(); capture = (ICaptureGraphBuilder2) new CaptureGraphBuilder(); IMediaControl control = (IMediaControl)graph; IMediaEventEx eventEx = (IMediaEventEx)graph; retVal = capture.SetFiltergraph(graph); Dictionary <string, IMoniker> devices = EnumDevices(Clsid.VideoInputDeviceCategory); if (devices.Count == 0) { return; } IMoniker moniker = devices.First().Value; object obj = null; moniker.BindToObject(null, null, typeof(IBaseFilter).GUID, out obj); IBaseFilter baseFilter = (IBaseFilter)obj; retVal = graph.AddFilter(baseFilter, devices.First().Key); Guid CLSID_SampleGrabber = new Guid("{C1F400A0-3F08-11D3-9F0B-006008039E37}"); IBaseFilter grabber = Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_SampleGrabber)) as IBaseFilter; var media = new AMMediaType(); media.MajorType = MediaType.Video; media.SubType = MediaSubType.RGB24; media.FormatType = FormatType.VideoInfo; retVal = ((ISampleGrabber)grabber).SetMediaType(media); object configObj; retVal = capture.FindInterface(PinCategory.Capture, MediaType.Video, baseFilter, typeof(IAMStreamConfig).GUID, out configObj); IAMStreamConfig config = (IAMStreamConfig)configObj; AMMediaType pmt; retVal = config.GetFormat(out pmt); var header = (VideoInfoHeader)Marshal.PtrToStructure(pmt.FormatPtr, typeof(VideoInfoHeader)); var width = header.BmiHeader.Width; var height = header.BmiHeader.Height; var stride = 4 * ((24 * width + 31) / 32); //width * (header.BmiHeader.BitCount / 8); callback = new SampleGrabberCallback() { Width = width, Height = height, Stride = stride }; callback.callback = Image_OnPreview; retVal = ((ISampleGrabber)grabber).SetCallback(callback, 0); retVal = graph.AddFilter(grabber, "SampleGrabber"); IPin output = GetPin(baseFilter, p => p.Name == "Capture"); IPin input = GetPin(grabber, p => p.Name == "Input"); IPin preview = GetPin(grabber, p => p.Name == "Output"); //retVal = graph.ConnectDirect(output, input, pmt); //retVal = graph.Connect(output, input); retVal = capture.RenderStream(PinCategory.Preview, MediaType.Video, baseFilter, grabber, null); //var wih = new WindowInteropHelper(this); var panel = FindName("PART_VideoPanel") as System.Windows.Forms.Panel; IVideoWindow window = (IVideoWindow)graph; retVal = window.put_Owner(panel.Handle); retVal = window.put_WindowStyle(WindowStyles.WS_CHILD | WindowStyles.WS_CLIPCHILDREN); retVal = window.SetWindowPosition(0, 0, (int)panel.ClientSize.Width, (int)panel.ClientSize.Height); retVal = window.put_MessageDrain(panel.Handle); retVal = window.put_Visible(-1); //OATRUE retVal = control.Run(); }
public IpRuder(String preferedCaptureDevice) { SampleGrabberCount = 0; PreferedCaptureDevice = preferedCaptureDevice; WakeProcessing = new ManualResetEvent(false); ProccessingEvents = new Thread(() => { try { EventCode ev; IntPtr p1, p2; while (true) { WakeProcessing.WaitOne( ); while (VideoEvent.GetEvent(out ev, out p1, out p2, 0) == 0) { try { if (ev == EventCode.Complete || ev == EventCode.UserAbort) { StopVideo( ); break; } else if (ev == EventCode.ErrorAbort) { Console.WriteLine("An error occured: HRESULT={0:X}", p1); StopVideo( ); break; } } finally { VideoEvent.FreeEventParams(ev, p1, p2); } } while (PhotoEvent.GetEvent(out ev, out p1, out p2, 0) == 0) { try { if (ev == EventCode.Complete || ev == EventCode.UserAbort) { StopPhoto( ); break; } else if (ev == EventCode.ErrorAbort) { Console.WriteLine("An error occured: HRESULT={0:X}", p1); StopPhoto( ); break; } PhotoEvent.FreeEventParams(ev, p1, p2); } finally { PhotoEvent.FreeEventParams(ev, p1, p2); } } Thread.Sleep(500); } } catch (COMException ex) { Console.WriteLine("COM error: " + ex.ToString( )); } catch (Exception ex) { Console.WriteLine("Error: " + ex.ToString( )); } }); ProccessingEvents.IsBackground = true; ProccessingEvents.Start( ); PhotoCallBack = new SampleGrabberCallback( ); }