示例#1
0
		// Thread entry point
		public void WorkerThread()
		{
			// grabber
			Grabber	grabber = new Grabber(this);

			// objects
			object	graphObj = null;
			object	sourceObj = null;
			object	grabberObj = null;

			// interfaces
			IGraphBuilder	graph = null;
			IBaseFilter		sourceBase = null;
			IBaseFilter		grabberBase = null;
			ISampleGrabber	sg = null;
			IMediaControl	mc = null;

			try
			{
				// Get type for filter graph
				Type srvType = Type.GetTypeFromCLSID(Clsid.FilterGraph);
				if (srvType == null)
					throw new ApplicationException("Failed creating filter graph");

				// create filter graph
				graphObj = Activator.CreateInstance(srvType);
				graph = (IGraphBuilder) graphObj;

				// ----
				UCOMIBindCtx bindCtx = null;
				UCOMIMoniker moniker = null;
				int n = 0;

				// create bind context
				if (Win32.CreateBindCtx(0, out bindCtx) == 0)
				{
					// convert moniker`s string to a moniker
					if (Win32.MkParseDisplayName(bindCtx, source, ref n, out moniker) == 0)
					{
						// get device base filter
						Guid filterId = typeof(IBaseFilter).GUID;
						moniker.BindToObject(null, null, ref filterId, out sourceObj);

						Marshal.ReleaseComObject(moniker);
						moniker = null;
					}
					Marshal.ReleaseComObject(bindCtx);
					bindCtx = null;
				}
				// ----

				if (sourceObj == null)
					throw new ApplicationException("Failed creating device object for moniker");

				sourceBase = (IBaseFilter) sourceObj ;

				// Get type for sample grabber
				srvType = Type.GetTypeFromCLSID(Clsid.SampleGrabber);
				if (srvType == null)
					throw new ApplicationException("Failed creating sample grabber");

				// create sample grabber
				grabberObj = Activator.CreateInstance(srvType);
				sg = (ISampleGrabber) grabberObj;
				grabberBase = (IBaseFilter) grabberObj;

				// add source filter to graph
				graph.AddFilter(sourceBase, "source");
				graph.AddFilter(grabberBase, "grabber");

				// set media type
				AMMediaType mt = new AMMediaType();
				mt.majorType = MediaType.Video;
				mt.subType = MediaSubType.RGB24;
				sg.SetMediaType(mt);

				// connect pins
				if (graph.Connect(DSTools.GetOutPin(sourceBase, 0), DSTools.GetInPin(grabberBase, 0)) < 0)
					throw new ApplicationException("Failed connecting filters");

				// get media type
				if (sg.GetConnectedMediaType(mt) == 0)
				{
					VideoInfoHeader vih = (VideoInfoHeader) Marshal.PtrToStructure(mt.formatPtr, typeof(VideoInfoHeader));

					grabber.Width = vih.BmiHeader.Width;
					grabber.Height = vih.BmiHeader.Height;
					mt.Dispose();
				}

				// render
				graph.Render(DSTools.GetOutPin(grabberBase, 0));

				//
				sg.SetBufferSamples(false);
				sg.SetOneShot(false);
				sg.SetCallback(grabber, 1);

				// window
				IVideoWindow win = (IVideoWindow) graphObj;
				win.put_AutoShow(false);
				win = null;


				// get media control
				mc = (IMediaControl) graphObj;

				// run
				mc.Run();

				while (!stopEvent.WaitOne(0, true))
				{
					Thread.Sleep(100);
				}
				mc.StopWhenReady();
			}
			// catch any exceptions
			catch (Exception e)
			{
				System.Diagnostics.Debug.WriteLine("----: " + e.Message);
			}
			// finalization block
			finally
			{
				// release all objects
				mc = null;
				graph = null;
				sourceBase = null;
				grabberBase = null;
				sg = null;

				if (graphObj != null)
				{
					Marshal.ReleaseComObject(graphObj);
					graphObj = null;
				}
				if (sourceObj != null)
				{
					Marshal.ReleaseComObject(sourceObj);
					sourceObj = null;
				}
				if (grabberObj != null)
				{
					Marshal.ReleaseComObject(grabberObj);
					grabberObj = null;
				}
			}
		}
示例#2
0
		// Thread entry point
		public void WorkerThread()
		{
			bool	failed = false;

			// grabber
			Grabber	grabber = new Grabber(this);

			// objects
			object	graphObj = null;
			object	sourceObj = null;
			object	grabberObj = null;

			// interfaces
			IGraphBuilder	graph = null;
			IBaseFilter		sourceBase = null;
			IBaseFilter		grabberBase = null;
			ISampleGrabber	sg = null;
			IFileSourceFilter	fileSource = null;
			IMediaControl	mc = null;
			IMediaEventEx	mediaEvent = null;

			int	code, param1, param2;

			while ((!failed) && (!stopEvent.WaitOne(0, true)))
			{
				try
				{
					// Get type for filter graph
					Type srvType = Type.GetTypeFromCLSID(Clsid.FilterGraph);
					if (srvType == null)
						throw new ApplicationException("Failed creating filter graph");

					// create filter graph
					graphObj = Activator.CreateInstance(srvType);
					graph = (IGraphBuilder) graphObj;

					// Get type for windows media source filter
					srvType = Type.GetTypeFromCLSID(Clsid.WindowsMediaSource);
					if (srvType == null)
						throw new ApplicationException("Failed creating WM source");

					// create windows media source filter
					sourceObj = Activator.CreateInstance(srvType);
					sourceBase = (IBaseFilter) sourceObj;

					// Get type for sample grabber
					srvType = Type.GetTypeFromCLSID(Clsid.SampleGrabber);
					if (srvType == null)
						throw new ApplicationException("Failed creating sample grabber");

					// create sample grabber
					grabberObj = Activator.CreateInstance(srvType);
					sg = (ISampleGrabber) grabberObj;
					grabberBase = (IBaseFilter) grabberObj;

					// add source filter to graph
					graph.AddFilter(sourceBase, "source");
					graph.AddFilter(grabberBase, "grabber");

					// set media type
					AMMediaType mt = new AMMediaType();
					mt.majorType = MediaType.Video;
					mt.subType = MediaSubType.RGB24;
					sg.SetMediaType(mt);

					// load file
					fileSource = (IFileSourceFilter) sourceObj;
					fileSource.Load(this.source, null);

					// connect pins
					if (graph.Connect(DSTools.GetOutPin(sourceBase, 0), DSTools.GetInPin(grabberBase, 0)) < 0)
						throw new ApplicationException("Failed connecting filters");

					// get media type
					if (sg.GetConnectedMediaType(mt) == 0)
					{
						VideoInfoHeader vih = (VideoInfoHeader) Marshal.PtrToStructure(mt.formatPtr, typeof(VideoInfoHeader));

						grabber.Width = vih.BmiHeader.Width;
						grabber.Height = vih.BmiHeader.Height;
						mt.Dispose();
					}

					// render
					graph.Render(DSTools.GetOutPin(grabberBase, 0));

					//
					sg.SetBufferSamples(false);
					sg.SetOneShot(false);
					sg.SetCallback(grabber, 1);

					// window
					IVideoWindow win = (IVideoWindow) graphObj;
					win.put_AutoShow(false);
					win = null;

					// get events interface
					mediaEvent = (IMediaEventEx) graphObj;

					// get media control
					mc = (IMediaControl) graphObj;

					// run
					mc.Run();

					while (!stopEvent.WaitOne(0, true))
					{
						Thread.Sleep(100);

						// get an event
						if (mediaEvent.GetEvent(out code, out param1, out param2, 0) == 0)
						{
							// release params
							mediaEvent.FreeEventParams(code, param1, param2);

							//
							if (code == (int) EventCode.Complete)
							{
								break;
							}
						}
					}

					mc.StopWhenReady();
				}
					// catch any exceptions
				catch (Exception e)
				{
					System.Diagnostics.Debug.WriteLine("----: " + e.Message);
					failed = true;
				}
					// finalization block
				finally
				{
					// release all objects
					mediaEvent = null;
					mc = null;
					fileSource = null;
					graph = null;
					sourceBase = null;
					grabberBase = null;
					sg = null;

					if (graphObj != null)
					{
						Marshal.ReleaseComObject(graphObj);
						graphObj = null;
					}
					if (sourceObj != null)
					{
						Marshal.ReleaseComObject(sourceObj);
						sourceObj = null;
					}
					if (grabberObj != null)
					{
						Marshal.ReleaseComObject(grabberObj);
						grabberObj = null;
					}
				}
			}
		}