Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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));
            }
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
 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( );
 }