/* 非同期イベントハンドラ
         * CaptureDeviceからのイベントをハンドリングして、バッファとテクスチャを更新する。
         */
        public void OnBuffer(CaptureDevice i_sender, double i_sample_time, IntPtr i_buffer, int i_buffer_len)
        {
            try {
                lock (this)
                {
                    this._reality_source.setDShowImage(i_buffer, i_buffer_len, i_sender.video_vertical_flip);
                    this._reality.progress(this._reality_source);
                    //テクスチャ内容を更新
                    this._surface.setRaster(this._reality_source.refRgbSource());

                    //UnknownTargetを1個取得して、遷移を試す。
                    NyARRealityTarget t = this._reality.selectSingleUnknownTarget();
                    if (t == null)
                    {
                        return;
                    }
                    //ターゲットに一致するデータを検索
                    RawbitSerialIdTable.IdentifyIdResult r = new RawbitSerialIdTable.IdentifyIdResult();
                    if (this._mklib.identifyId(t, this._reality_source, r))
                    {
                        //テーブルにターゲットが見つかったので遷移する。
                        if (!this._reality.changeTargetToKnown(t, r.artk_direction, r.marker_width))
                        {
                            //遷移の成功チェック
                            return;                        //失敗
                        }
                        //遷移に成功したので、tagにユーザ定義情報を書きこむ。
                        long l = new long();
                        l     = r.id;
                        t.tag = l;
                    }
                    else
                    {
                        //一致しないので、このターゲットは捨てる。(15フレーム無視)
                        this._reality.changeTargetToDead(t, 15);
                    }
                }
            } catch (Exception e) {
                System.Console.WriteLine(e.StackTrace);
            }
            return;
        }
		    public void run()
		    {
	          try {
	              Thread.Sleep(3000);
        	      RawbitSerialIdTable.IdentifyIdResult ret=new RawbitSerialIdTable.IdentifyIdResult();
                  bool res;
	              lock(this._parent._mklib){
	        	      NyARDoublePoint2d[] vx=NyARDoublePoint2d.createArray(4);
	        	      //反時計まわり
	        	      vx[0].x=0; vx[0].y=0;
	        	      vx[1].x=99;vx[1].y=0;
	        	      vx[2].x=99;vx[2].y=99;
	        	      vx[3].x=0; vx[3].y=99;
	        	      res=this._parent._mklib.identifyId(vx,this._source,ret);
	              }
	              this._parent.callListener(res,this._serial,ret.artk_direction,ret.marker_width,ret.id);
	            } catch (Exception e){
				    Console.Error.WriteLine(e.StackTrace);
			    }
    			
		    }
         /* 非同期イベントハンドラ
          * CaptureDeviceからのイベントをハンドリングして、バッファとテクスチャを更新する。
          */
        public void OnBuffer(CaptureDevice i_sender, double i_sample_time, IntPtr i_buffer, int i_buffer_len)
        {
		    try {
			    lock (this)
			    {
                    this._reality_source.setDShowImage(i_buffer, i_buffer_len,i_sender.video_vertical_flip);
                    this._reality.progress(this._reality_source);
                    //テクスチャ内容を更新
                    this._surface.setRaster(this._reality_source.refRgbSource());

				    //UnknownTargetを1個取得して、遷移を試す。
				    NyARRealityTarget t=this._reality.selectSingleUnknownTarget();
				    if(t==null){
					    return;
				    }
				    //ターゲットに一致するデータを検索
				    RawbitSerialIdTable.IdentifyIdResult r=new RawbitSerialIdTable.IdentifyIdResult();
                    if (this._mklib.identifyId(t, this._reality_source, r))
                    {
					    //テーブルにターゲットが見つかったので遷移する。
					    if(!this._reality.changeTargetToKnown(t,r.artk_direction,r.marker_width)){
					    //遷移の成功チェック
						    return;//失敗
					    }
					    //遷移に成功したので、tagにユーザ定義情報を書きこむ。
                        long l = new long();
                        l = r.id;
                        t.tag = l;
				    }else{
					    //一致しないので、このターゲットは捨てる。(15フレーム無視)
					    this._reality.changeTargetToDead(t,15);
				    }
			    }
		    } catch (Exception e) {
                System.Console.WriteLine(e.StackTrace);
            }
            return;
        }