Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }