基本信息
源码名称:directx驱动摄像头
源码大小:0.02M
文件格式:.cpp
开发语言:C/C++
更新时间:2015-09-09
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
一个摄像头驱动的类,使用方便。兼容所有支持dshow的摄像头。
long CCaptureVideo::initCapture(int deviceID, CAPTURECALLBACK captureCallBack, long pixelwith, long pixelhigh, long framerate, HWND hwnd) { m_captureCallBack = captureCallBack; m_24BitData = 0; m_24BitLength = 0L; HRESULT hr = initCaptureGraphBuilder();//initialize data if (FAILED(hr)) { return CAPTURE_ERR_OTHER; } //bind the object video device if(!bindFilter(deviceID, &m_BaseFilter)) { return CAPTURE_ERR_OTHER; } hr = m_GraphBuilder->AddFilter(m_BaseFilter, L"Capture Filter"); //create ISampleGrabber module hr = CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_ISampleGrabber, (void**)&m_SampleGrabber ); if (FAILED(hr)) { return CAPTURE_ERR_OTHER; } //add Grabber Filer CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase(m_SampleGrabber); hr = m_GraphBuilder->AddFilter( pGrabBase, L"Grabber" ); if(FAILED(hr)) { return CAPTURE_ERR_OTHER; } //set media type _AMMediaType AMediaType; _AMMediaType * aMediaType = &AMediaType; ZeroMemory(aMediaType, sizeof(_AMMediaType)); aMediaType->majortype = MEDIATYPE_Video; aMediaType->subtype = MEDIASUBTYPE_RGB24; hr = m_SampleGrabber->SetMediaType(aMediaType); if (FAILED(hr)) { return CAPTURE_ERR_OTHER; } //capture the instant image hr = m_CaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_BaseFilter,pGrabBase,NULL); if( FAILED(hr)) { return CAPTURE_ERR_OTHER; } //add IAMStreamConfig interface hr = m_CaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_BaseFilter, IID_IAMStreamConfig, (void **)&m_Config); if ( FAILED(hr) ) { return CAPTURE_ERR_OTHER; } if( pixelwith == 0 && pixelhigh == 0 ) { m_Config->GetFormat(&aMediaType);//get the media type VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) aMediaType->pbFormat; m_SampleGrabberCB->SetWidth(vih->bmiHeader.biWidth); m_SampleGrabberCB->SetHeight(vih->bmiHeader.biHeight); m_SampleGrabberCB->SetbGrabVideo(TRUE); pixelwith = vih->bmiHeader.biWidth; pixelhigh = vih->bmiHeader.biHeight; freeMediaType(aMediaType); } else { m_Config->GetFormat(&aMediaType);//get the media type VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) aMediaType->pbFormat; vih->bmiHeader.biWidth = pixelwith;//set with pixel vih->bmiHeader.biHeight = pixelhigh;//set high pixel m_Config->SetFormat(aMediaType);//设置 m_SampleGrabberCB->SetWidth(vih->bmiHeader.biWidth); m_SampleGrabberCB->SetHeight(vih->bmiHeader.biHeight); m_SampleGrabberCB->SetbGrabVideo(TRUE); pixelwith = vih->bmiHeader.biWidth; pixelhigh = vih->bmiHeader.biHeight; freeMediaType(aMediaType); } hr = m_SampleGrabber->SetBufferSamples(FALSE);//call back module hr = m_SampleGrabber->SetOneShot(FALSE); hr = m_SampleGrabber->SetCallback(m_SampleGrabberCB,1); //set capture window m_hWnd = hwnd ; if (m_hWnd == NULL) { m_VideoWindow->put_AutoShow(OAFALSE); } else { setupVideoWindow(); } //begin to capture hr = m_MediaControl->Run(); if(FAILED(hr)) { return CAPTURE_ERR_OTHER; } m_avaiable = true; if (m_SampleGrabberCB != 0) { m_SampleGrabberCB->registerCaptureCallBack(captureCallBack); } return CAPTURE_SUCCESSED; } /************************************************************************ function:release resource return type:HRESULT /************************************************************************/ void CCaptureVideo::unInitCapture() { if(m_MediaControl)m_MediaControl->StopWhenReady(); if(m_VideoWindow) { m_VideoWindow->put_Visible(OAFALSE); m_VideoWindow->put_Owner(NULL); } SAFE_RELEASE(m_MediaControl); SAFE_RELEASE(m_VideoWindow); SAFE_RELEASE(m_GraphBuilder); SAFE_RELEASE(m_BaseFilter); SAFE_RELEASE(m_SampleGrabber); SAFE_RELEASE(m_CaptureGraphBuilder2); if (m_24BitData !=NULL) { delete []m_24BitData; m_24BitData = NULL; } m_avaiable = false; } /************************************************************************ function:get data @param:with @param:high return type:BYTE * ************************************************************************/ BYTE * CCaptureVideo::get24BitData( long& with,long& high) { if (m_avaiable == false) { return 0; } with=m_SampleGrabberCB->GetWidth(); high=m_SampleGrabberCB->GetHeight(); if (m_SampleGrabberCB->GetDataBuffer()==NULL || m_SampleGrabberCB->GetDataLength()==0) return 0; long len = m_SampleGrabberCB->GetDataLength(); if (len > m_24BitLength) { delete []m_24BitData; m_24BitData = new BYTE[len]; m_24BitLength = len; } memcpy(m_24BitData,m_SampleGrabberCB->GetDataBuffer(),len); return m_24BitData; } /************************************************************************ function:enum video device @param:list return type:int /************************************************************************/ int CCaptureVideo::enumDevices(HCombleBox list) { if (!list) return -1; int id = 0; ICreateDevEnum *pCreateDevEnum; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum); if (hr != NOERROR) return -1; CComPtr<IEnumMoniker> pEm; hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0); if (hr != NOERROR) return -1; pEm->Reset(); ULONG cFetched; IMoniker *pM; while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK) { IPropertyBag *pBag; hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); if(SUCCEEDED(hr)) { VARIANT var; var.vt = VT_BSTR; hr = pBag->Read(L"FriendlyName", &var, NULL); if (hr == NOERROR) { TCHAR str[2048]; id ; WideCharToMultiByte(CP_ACP,0,var.bstrVal, -1,(LPSTR)str, 2048, NULL, NULL); ::SendMessageA(list, CB_ADDSTRING, 0,(LPARAM)str); SysFreeString(var.bstrVal); } pBag->Release(); } pM->Release(); } return id; } /*********************************************** function:bind object device @param:deviceId @param:pFilter Filter return type:BOOL ***********************************************/ bool CCaptureVideo::bindFilter(int deviceId, IBaseFilter **pFilter) { if (deviceId < 0) return false; CComPtr<ICreateDevEnum> pCreateDevEnum; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum); if (hr != NOERROR) return false; CComPtr<IEnumMoniker> pEm; hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0); if (hr != NOERROR) return false; pEm->Reset(); ULONG cFetched; IMoniker *pM; int index = 0; while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK, index <= deviceId) { IPropertyBag *pBag; hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); if(SUCCEEDED(hr)) { VARIANT var; var.vt = VT_BSTR; hr = pBag->Read(L"FriendlyName", &var, NULL); if (hr == NOERROR) { if (index == deviceId) pM->BindToObject(0,0, IID_IBaseFilter, (void**)pFilter); SysFreeString(var.bstrVal); } pBag->Release(); } pM->Release(); index ; } return true; } /************************************************************************ function:initialize module return type:HRESULT ************************************************************************/ HRESULT CCaptureVideo::initCaptureGraphBuilder() { HRESULT hr; // create IGraphBuilder module hr=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_GraphBuilder); //control interface hr = m_GraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_MediaControl); if (FAILED(hr)) return hr; //window interface hr = m_GraphBuilder->QueryInterface(IID_IVideoWindow, (LPVOID *) &m_VideoWindow); if (FAILED(hr)) return hr; // create ICaptureGraphBuilder2 module hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (void **) &m_CaptureGraphBuilder2); if (FAILED(hr)) return hr; m_CaptureGraphBuilder2->SetFiltergraph(m_GraphBuilder); return hr; } /************************************* function:make the window fixed return type:HRESULT *************************************/ HRESULT CCaptureVideo::setupVideoWindow() { HRESULT hr; hr = m_VideoWindow->put_Owner((OAHWND)m_hWnd); if (FAILED(hr)) return hr; hr = m_VideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN); if (FAILED(hr)) return hr; //resizeVideoWindow,make it full if (m_VideoWindow) { CRect rc; ::GetClientRect(m_hWnd,&rc); m_VideoWindow->SetWindowPosition(0, 0, rc.right, rc.bottom); } //hr = m_VideoWindow->put_Visible(OATRUE); return hr; } /************************************* function:release the media type return type:void *************************************/ void CCaptureVideo::freeMediaType( _AMMediaType * aMediaType ) { if (aMediaType->cbFormat != 0) { CoTaskMemFree((PVOID)aMediaType->pbFormat); aMediaType->cbFormat = 0; aMediaType->pbFormat = NULL; if (aMediaType->pUnk != NULL) { aMediaType->pUnk->Release(); aMediaType->pUnk = NULL; } } } void CCaptureVideo::GetWidthAndHeight(long &outWid, long &outHei) { HRESULT hr = initCaptureGraphBuilder();//initialize data if(!bindFilter(0, &m_BaseFilter)) { return; } hr = m_CaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_BaseFilter, IID_IAMStreamConfig, (void **)&m_Config); if ( FAILED(hr) ) { return; } _AMMediaType AMediaType; _AMMediaType * aMediaType = &AMediaType; m_Config->GetFormat(&aMediaType);//get the media type VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) aMediaType->pbFormat; outWid = vih->bmiHeader.biWidth; outHei = vih->bmiHeader.biHeight; unInitCapture(); } void CCaptureVideo::OpenSpecifyPropertyPages() { ISpecifyPropertyPages *pSpec; CAUUID cauuid; HRESULT hr = m_BaseFilter->QueryInterface(IID_ISpecifyPropertyPages, (void**)&pSpec); if(hr == S_OK) { hr = pSpec->GetPages(&cauuid); hr = OleCreatePropertyFrame(m_hWnd, 30, 30, NULL, 1, (IUnknown **)&m_BaseFilter, cauuid.cElems, (GUID *)cauuid.pElems, 0, 0, NULL); CoTaskMemFree(cauuid.pElems); pSpec->Release(); } // _AMMediaType AMediaType; // _AMMediaType * aMediaType = &AMediaType; // ZeroMemory(aMediaType, sizeof(_AMMediaType)); // m_Config->GetFormat(&aMediaType);//get the media type // VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) aMediaType->pbFormat; } // Tear down everything downstream of a given filter void CCaptureVideo::NukeDownstream(IBaseFilter *pf) { IPin *pP=0, *pTo=0; ULONG u; IEnumPins *pins = NULL; PIN_INFO pininfo; if (!pf) return; HRESULT hr = pf->EnumPins(&pins); pins->Reset(); while(hr == NOERROR) { hr = pins->Next(1, &pP, &u); if(hr == S_OK && pP) { pP->ConnectedTo(&pTo); if(pTo) { hr = pTo->QueryPinInfo(&pininfo); if(hr == NOERROR) { if(pininfo.dir == PINDIR_INPUT) { NukeDownstream(pininfo.pFilter); m_GraphBuilder->Disconnect(pTo); m_GraphBuilder->Disconnect(pP); m_GraphBuilder->RemoveFilter(pininfo.pFilter); } pininfo.pFilter->Release(); } pTo->Release(); } pP->Release(); } } if(pins) pins->Release(); } void CCaptureVideo::OpenPinPropertyPages() { HRESULT hr; if(m_MediaControl)m_MediaControl->Stop(); InvalidateRect(m_hWnd, NULL, TRUE); if(m_VideoWindow) { m_VideoWindow->put_Visible(OAFALSE); m_VideoWindow->put_Owner(NULL); } NukeDownstream(m_BaseFilter); IAMStreamConfig *pSC = m_Config; ISpecifyPropertyPages *pSpec; CAUUID cauuid; hr = pSC->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pSpec); if(hr == S_OK) { hr = pSpec->GetPages(&cauuid); hr = OleCreatePropertyFrame(m_hWnd, 30, 30, NULL, 1, (IUnknown **)&pSC, cauuid.cElems, (GUID *)cauuid.pElems, 0, 0, NULL); // !!! What if changing output formats couldn't reconnect // and the graph is broken? Shouldn't be possible... if(pSC) { AM_MEDIA_TYPE *pmt; // get format being used NOW hr = pSC->GetFormat(&pmt); } CoTaskMemFree(cauuid.pElems); pSpec->Release(); } #if 0 _AMMediaType AMediaType; _AMMediaType * aMediaType = &AMediaType; ZeroMemory(aMediaType, sizeof(_AMMediaType)); m_Config->GetFormat(&aMediaType);//get the media type VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) aMediaType->pbFormat; long wid = vih->bmiHeader.biWidth; long hei = vih->bmiHeader.biHeight; unInitCapture(); initCapture(0, m_captureCallBack, wid, hei, -1, m_hWnd); #else SAFE_RELEASE(m_SampleGrabber); hr = m_GraphBuilder->AddFilter(m_BaseFilter, L"Capture Filter"); hr = CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_ISampleGrabber, (void**)&m_SampleGrabber ); CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase(m_SampleGrabber); hr = m_GraphBuilder->AddFilter( pGrabBase, L"Grabber" ); _AMMediaType AMediaType; _AMMediaType * aMediaType = &AMediaType; ZeroMemory(aMediaType, sizeof(_AMMediaType)); aMediaType->majortype = MEDIATYPE_Video; aMediaType->subtype = MEDIASUBTYPE_RGB24; hr = m_SampleGrabber->SetMediaType(aMediaType); hr = m_CaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_BaseFilter,pGrabBase,NULL); hr = m_CaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_BaseFilter, IID_IAMStreamConfig, (void **)&m_Config); m_Config->GetFormat(&aMediaType);//get the media type VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) aMediaType->pbFormat; m_SampleGrabberCB->SetWidth(vih->bmiHeader.biWidth); m_SampleGrabberCB->SetHeight(vih->bmiHeader.biHeight); m_SampleGrabberCB->SetbGrabVideo(TRUE); freeMediaType(aMediaType); hr = m_SampleGrabber->SetBufferSamples(FALSE);//call back module hr = m_SampleGrabber->SetOneShot(FALSE); hr = m_SampleGrabber->SetCallback(m_SampleGrabberCB,1); setupVideoWindow(); hr = m_MediaControl->Run(); #endif } void CCaptureVideo::TakePhoto() { HRESULT hr; hr = m_MediaControl->Pause(); IBasicVideo *pBasicVideo; hr = m_GraphBuilder->QueryInterface(IID_IBasicVideo,(LPVOID *)&pBasicVideo); long height, width, bufSize; pBasicVideo->get_VideoHeight(&height); pBasicVideo->get_VideoWidth(&width); hr = pBasicVideo->GetCurrentImage(&bufSize, NULL); if( FAILED(hr) ) { return; } long *imgData = new long[bufSize]; memset(imgData, 0, bufSize); hr = pBasicVideo->GetCurrentImage(&bufSize, imgData); if( FAILED(hr) ) { return; } FILE *fp; fp = fopen("c:\\111.bmp", "w"); if( !fp ) { return; } else { BITMAPFILEHEADER bmphdr; BITMAPINFOHEADER bmpinfo; DWORD nWritten; memset(&bmphdr, 0, sizeof(bmphdr)); memset(&bmpinfo, 0, sizeof(bmpinfo)); bmphdr.bfType = ('M' << 8) | 'B'; bmphdr.bfSize = sizeof(bmphdr) sizeof(bmpinfo) bufSize; bmphdr.bfOffBits = sizeof(bmphdr) sizeof(bmpinfo); bmpinfo.biSize = sizeof(bmpinfo); bmpinfo.biWidth = width; bmpinfo.biHeight = height; bmpinfo.biPlanes = 1; bmpinfo.biBitCount = 24; fwrite(&bmphdr, 1, sizeof(bmphdr), fp); //fwrite(&bmpinfo, 1, sizeof(bmphdr), fp); fwrite(imgData, 1, bufSize, fp); fclose(fp); } delete[] imgData; m_MediaControl->Run(); } void CCaptureVideo::TakePhoto(CString path) { int width = m_SampleGrabberCB->GetWidth(), height=m_SampleGrabberCB->GetHeight(); //int width = 640, height = 480; BYTE* buff = m_SampleGrabberCB->GetDataBuffer(); BITMAPINFOHEADER bih; memset( &bih, 0, sizeof( bih )); bih.biSize = sizeof( bih ); bih.biWidth = width; bih.biHeight = height; bih.biPlanes = 1; bih.biBitCount = 24; CFile File(path,CFile::modeReadWrite|CFile::modeCreate); BYTE *pDib=new BYTE[sizeof(BITMAPINFOHEADER) width*height*3]; memcpy(pDib,&bih ,sizeof(BITMAPINFOHEADER)); memcpy(pDib sizeof(BITMAPINFOHEADER),buff,width*height*3); SaveDIB(pDib,File); File.Close(); delete[] pDib; } #if 1 bool CCaptureVideo::CheckCameraExist() { bool res = false; HRESULT hr = initCaptureGraphBuilder();//initialize data if (FAILED(hr)) { res = false; } else { //bind the object video device if(!bindFilter(0, &m_BaseFilter)) { res = false; } else { res = true; } } if(m_MediaControl) m_MediaControl->StopWhenReady(); if(m_VideoWindow) { m_VideoWindow->put_Visible(OAFALSE); m_VideoWindow->put_Owner(NULL); } SAFE_RELEASE(m_MediaControl); SAFE_RELEASE(m_VideoWindow); SAFE_RELEASE(m_GraphBuilder); SAFE_RELEASE(m_BaseFilter); SAFE_RELEASE(m_SampleGrabber); SAFE_RELEASE(m_CaptureGraphBuilder2); return res; } #endif void CCaptureVideo::SetBrightness(int bval) { IAMVideoProcAmp *pProcAmp = 0; HRESULT hr = m_BaseFilter->QueryInterface(IID_IAMVideoProcAmp, (void**)&pProcAmp); if(SUCCEEDED(hr)) { long Min, Max, Step, Default, Flags, Val; // 亮度. if( bval > 0 ) { hr = pProcAmp->GetRange(VideoProcAmp_Brightness, &Min, &Max, &Step, &Default, &Flags); if(SUCCEEDED(hr)) { hr = pProcAmp->Get(VideoProcAmp_Brightness, &Val, &Flags); Val = Min (Max-Min)*bval/100; //pProcAmp->Set(VideoProcAmp_Brightness, Val, Flags); pProcAmp->Set(VideoProcAmp_Brightness, bval, Flags); } } } } int CCaptureVideo::GetBrightness(int &tmin, int &tmax) { IAMVideoProcAmp *pProcAmp = 0; HRESULT hr = m_BaseFilter->QueryInterface(IID_IAMVideoProcAmp, (void**)&pProcAmp); if(SUCCEEDED(hr)) { long Min, Max, Step, Default, Flags, Val; // 亮度. hr = pProcAmp->GetRange(VideoProcAmp_Brightness, &Min, &Max, &Step, &Default, &Flags); tmin = Min; tmax = Max; if(SUCCEEDED(hr)) { hr = pProcAmp->Get(VideoProcAmp_Brightness, &Val, &Flags); return Val; } } } int CCaptureVideo::enumDevices(CString vid, CString pid) { int id = 0; ICreateDevEnum *pCreateDevEnum; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum); if (hr != NOERROR) return -1; CComPtr<IEnumMoniker> pEm; hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0); if (hr != NOERROR) return -1; pEm->Reset(); ULONG cFetched; IMoniker *pM; while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK) { CString str = ""; CString strVid, strPid; int Count = 0; IPropertyBag *pBag; hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); if(SUCCEEDED(hr)) { VARIANT var; var.vt = VT_BSTR; hr = pBag->Read(L"DevicePath", &var, NULL); if( hr == 0 ) { while( var.bstrVal[Count] != 0x00 ) { str = var.bstrVal[Count]; Count ; } strVid = str.Mid(str.Find("vid_") 4, 4); strPid = str.Mid(str.Find("pid_") 4, 4); if( 0 == strcmp(strVid, vid) && 0 == strcmp(strPid, pid) ) { return id; break; } } id ; pBag->Release(); } pM->Release(); } return -1; } void CCaptureVideo::SwitchAvSvideo(int mode) { IAMCrossbar *pXBar1 = NULL; HRESULT hr = m_CaptureGraphBuilder2->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, m_BaseFilter,IID_IAMCrossbar, (void**)&pXBar1); if (SUCCEEDED(hr)) { long OutputPinCount; long InputPinCount; long PinIndexRelated; long PhysicalType; long inPort = 0; long outPort = 0; pXBar1->get_PinCounts(&OutputPinCount,&InputPinCount); for(int i =0;i<InputPinCount;i ) { pXBar1->get_CrossbarPinInfo(TRUE,i,&PinIndexRelated,&PhysicalType); if(mode==PhysicalType) { inPort = i; break; } } for( i =0;i<OutputPinCount;i ) { pXBar1->get_CrossbarPinInfo(FALSE,i,&PinIndexRelated,&PhysicalType); if(PhysConn_Video_VideoDecoder==PhysicalType) { outPort = i; break; } } if(S_OK==pXBar1->CanRoute(outPort,inPort)) { pXBar1->Route(outPort,inPort); } pXBar1->Release(); } }