/// <summary> /// カメラの接続 /// </summary> /// <param name="filterInfo"></param> /// <param name="pinno"></param> /// <param name="frameSize"></param> private void Camera_Connect(CxFilterInfo filterInfo, int pinno, Size frameSize) { #region グラフビルダーの生成: { Graph = (IGraphBuilder)Axi.CoCreateInstance(GUID.CLSID_FilterGraph); if (Graph == null) throw new System.IO.IOException("Failed to create a GraphBuilder."); Builder = (ICaptureGraphBuilder2)Axi.CoCreateInstance(GUID.CLSID_CaptureGraphBuilder2); if (Builder == null) throw new System.IO.IOException("Failed to create a GraphBuilder."); Builder.SetFiltergraph(Graph); } #endregion #region 映像入力用: ソースフィルタを生成します. { VideoSource = Axi.CreateFilter(GUID.CLSID_VideoInputDeviceCategory, filterInfo.CLSID, filterInfo.Index); if (VideoSource == null) throw new System.IO.IOException("Failed to create a VideoSource."); Graph.AddFilter(VideoSource, "VideoSource"); // フレームサイズを設定します. // ※注) この操作は、ピンを接続する前に行う必要があります. IPin pin = Axi.FindPin(VideoSource, pinno, PIN_DIRECTION.PINDIR_OUTPUT); Axi.SetFormatSize(pin, frameSize.Width, frameSize.Height); } #endregion #region 映像捕獲用: サンプルグラバーを生成します. { VideoGrabber = (IBaseFilter)Axi.CoCreateInstance(GUID.CLSID_SampleGrabber); if (VideoGrabber == null) throw new System.IO.IOException("Failed to create a VideoGrabber."); Graph.AddFilter(VideoGrabber, "VideoGrabber"); // サンプルグラバフィルタの入力形式設定. // SetMediaType で必要なメディア タイプを指定します。 // http://msdn.microsoft.com/ja-jp/library/cc369546.aspx // ※AM_MEDIA_TYPE 構造体のメンバをすべて設定する必要はない。 // ※デフォルトでは、サンプル グラバに優先メディア タイプはない。 // ※サンプル グラバを正しいフィルタに確実に接続するには、フィルタ グラフを作成する前にこのメソッドを呼び出す。 // majortype: http://msdn.microsoft.com/ja-jp/library/cc370108.aspx // subtype : http://msdn.microsoft.com/ja-jp/library/cc371040.aspx { var grabber = (ISampleGrabber)VideoGrabber; var mt = new AM_MEDIA_TYPE(); mt.majortype = new Guid(GUID.MEDIATYPE_Video); mt.subtype = new Guid(GUID.MEDIASUBTYPE_RGB24); mt.formattype = new Guid(GUID.FORMAT_VideoInfo); grabber.SetMediaType(mt); grabber.SetBufferSamples(false); // サンプルコピー 無効. grabber.SetOneShot(false); // One Shot 無効. //grabber.SetCallback(VideoGrabberCB, 0); // 0:SampleCB メソッドを呼び出すよう指示する. grabber.SetCallback(VideoGrabberCB, 1); // 1:BufferCB メソッドを呼び出すよう指示する. } } #endregion #region 映像出力用: レンダラーを生成します. { VideoRenderer = (IBaseFilter)Axi.CoCreateInstance(GUID.CLSID_NullRenderer); if (VideoRenderer == null) throw new System.IO.IOException("Failed to create a VideoRenderer."); Graph.AddFilter(VideoRenderer, "VideoRenderer"); } #endregion #region フィルタの接続: unsafe { var mediatype = new Guid(GUID.MEDIATYPE_Video); var hr = (HRESULT)Builder.RenderStream(IntPtr.Zero, new IntPtr(&mediatype), VideoSource, VideoGrabber, VideoRenderer); if (hr < HRESULT.S_OK) throw new CxDSException(hr); } #endregion // 同期用: サンプルグラバーのイベント登録: VideoGrabberCB.Enable = true; VideoGrabberCB.Notify += VideoGrabberCB_Notify; VideoInfoHeader = Axi.GetVideoInfo((ISampleGrabber)VideoGrabber); // カメラ制御インターフェースの抽出. CameraControl = Axi.GetInterface<IAMCameraControl>(this.Graph); }
/// <summary> /// フィルタ一覧の取得 /// </summary> /// <param name="category">デバイスのカテゴリ</param> /// <returns> /// 取得したフィルタ情報のコレクションを返します。 /// </returns> public static List <CxFilterInfo> GetFilterList(Guid category) { var result = new List <CxFilterInfo>(); System.Runtime.InteropServices.ComTypes.IEnumMoniker enumerator = null; ICreateDevEnum device = null; try { // ICreateDevEnum インターフェース取得. device = (ICreateDevEnum)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid(GUID.CLSID_SystemDeviceEnum))); // EnumMonikerの作成. device.CreateClassEnumerator(ref category, ref enumerator, 0); if (enumerator == null) { return(result); } // 列挙. var monikers = new System.Runtime.InteropServices.ComTypes.IMoniker[1]; var fetched = IntPtr.Zero; while (enumerator.Next(monikers.Length, monikers, fetched) == 0) { // プロパティバッグへのバインド. IPropertyBag propbag = null; { object tmp = null; Guid guid = new Guid(GUID.IID_IPropertyBag); monikers[0].BindToStorage(null, null, ref guid, out tmp); propbag = (IPropertyBag)tmp; } try { var info = new CxFilterInfo(); // 名前取得. try { object friendly_name = null; propbag.Read("FriendlyName", ref friendly_name, 0); info.Name = (string)friendly_name; } catch (Exception) { } // CLSID取得. try { object clsid = null; propbag.Read("CLSID", ref clsid, 0); info.CLSID = (string)clsid; } catch (Exception) { } // コレクションに追加. result.Add(info); } finally { // プロパティバッグの解放. Marshal.ReleaseComObject(propbag); // 列挙したモニカの解放. for (int mmm = 0; mmm < monikers.Length; mmm++) { if (monikers[mmm] != null) { Marshal.ReleaseComObject(monikers[mmm]); } monikers[mmm] = null; } } } // 同名フィルタの順番付け. for (int i = 0; i < result.Count - 1; i++) { for (int j = i + 1; j < result.Count; j++) { if (result[j].Name == result[i].Name) { result[j].Index = result[i].Index + 1; break; } } } } finally { if (enumerator != null) { Marshal.ReleaseComObject(enumerator); } if (device != null) { Marshal.ReleaseComObject(device); } } return(result); }