#if 1 /* for VIVO cards we should check if preview pin is available on video capture device. If it is not, we have to connect Video Port Manager filter to VP pin of capture device filter. Otherwise we will get 0x8007001f (Device is not functioning properly) when attempting to start graph */ HRESULT connect_vp_pin(priv_t* priv){ HRESULT hr; IBaseFilter* pVPM=NULL; IBaseFilter* pNullRenderer=NULL; IPin* pNullOutPin=NULL; IPin* pNullInPin=NULL; IPin* pPreviewPin=NULL; for(;;){ /* connecting VP pin is required only for VIVO cards with VP and without Preview pins. */ hr=priv->pBuilder->vt->FindPin(priv->pBuilder,(IUnknown*)priv->pVideoFilter,PINDIR_OUTPUT,&PIN_CATEGORY_PREVIEW,NULL,FALSE,0,(IPin**)&pPreviewPin); if (hr==S_OK) { pPreviewPin->vt->Release((IUnknown*)pPreviewPin); break; // Video capture device has preview pin. No action is required } hr=priv->pBuilder->vt->FindPin(priv->pBuilder,(IUnknown*)priv->pVideoFilter,PINDIR_OUTPUT,&PIN_CATEGORY_VIDEOPORT,NULL,FALSE,0,(IPin**)&pVPOutPin); if (FAILED(hr)) { hr=S_OK; // Video capture device has no VideoPort pin. No action is required in this case break; } mp_msg(MSGT_TV,MSGL_V,"Video capture device has VidePort pin and no Preview pin. Conecting VideoPort pin to Video Port Manager filter.\n"); hr = CoCreateInstance((GUID*)&CLSID_VideoPortManager, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void**)&pVPM); if (FAILED(hr)){ showError("CoCreateInstance(CLSID_VideoPortManager) failed","connect_vp_pin",hr); break; } hr=priv->pGraph->vt->AddFilter(priv->pGraph,pVPM, NULL); if (FAILED(hr)) { showError("AddFilter(VideoPortManager ) failed","connect_vp_pin",hr); break; } hr = CoCreateInstance((GUID*)&CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void**)&pNullRenderer); if (FAILED(hr)){ showError("CoCreateInstance(CLSID_NullRenderer) failed","connect_vp_pin",hr); break; } hr=priv->pGraph->vt->AddFilter(priv->pGraph,pNullRenderer, NULL); if (FAILED(hr)) { showError("AddFilter(NullRenderer) failed","connect_vp_pin",hr); break; } hr=priv->pBuilder->vt->RenderStream(priv->pBuilder,&PIN_CATEGORY_VIDEOPORT, NULL,priv->pVideoFilter, NULL, pVPM); if (FAILED(hr)){ showError("RenderStream(Capture,NULL,VideoPortManager) failed","connect_vp_pin",hr); break; } hr=priv->pBuilder->vt->FindPin(priv->pBuilder,(IUnknown*)pVPM,PINDIR_OUTPUT,NULL,NULL,FALSE,0,(IPin**)&pNullOutPin); if (FAILED(hr)) { showError("FindPin(pNullOutPin) connect failed","connect_vp_pin",hr); break; } hr=priv->pBuilder->vt->FindPin(priv->pBuilder,(IUnknown*)pNullRenderer,PINDIR_INPUT,NULL,NULL,FALSE,0,(IPin**)&pNullInPin); if (FAILED(hr)) { showError("FindPin(pNullInPin) connect failed","connect_vp_pin",hr); break; } hr=priv->pGraph->vt->Connect(priv->pGraph,pNullOutPin,pNullInPin); if (hr!=S_OK) { showError("pNullOutPin->pNullInPin connect failed","connect_vp_pin",hr); break; } } if (pVPM) show_filter_info(pVPM); if (pNullRenderer) show_filter_info(pNullRenderer); if (pVPOutPin) pVPOutPin->vt->Release((IUnknown*)pVPOutPin); if (pVPInPin) pVPInPin->vt->Release((IUnknown*)pVPInPin); if (pNullOutPin) pNullOutPin->vt->Release((IUnknown*)pNullOutPin); if (pNullInPin) pNullInPin->vt->Release((IUnknown*)pNullInPin); if (pPreviewPin) pPreviewPin->vt->Release((IUnknown*)pPreviewPin); if (pVPM) pVPM->vt->Release((IUnknown*)pVPM); if (pNullRenderer) pNullRenderer->vt->Release((IUnknown*)pNullRenderer); return hr; } #endif