All pastes #393610 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-03-13 18:34 UTC
rendered paste body
#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