HRESULT ConnectFilters(CComPtr<IGraphBuilder> pGraph, CComPtr<IBaseFilter> pSrc, CComPtr<IBaseFilter> pDest) { CComPtr<IPin> pOut = 0; CComPtr<IPin> pIn = 0; HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut); if(FAILED(hr)) return hr; hr = FindUnconnectedPin(pDest, PINDIR_INPUT, &pIn); if(FAILED(hr)) return hr; hr = pGraph->Connect(pOut, pIn); return hr; }
HRESULT RenderSubPicture() { if (!m_pDeMux) return E_POINTER; // Render from the output of the DVD Nav & then from the output of the decoder filter IPin* subpicSource = FindPinByName(m_pDeMux, "SubPicture", PINDIR_OUTPUT); if (!subpicSource) return E_FAIL; HRESULT hr; // Check if the video rendering filter has an extra input pin. If it doesn't then // this'll end up adding another renderer to the graph which causes an ActiveMovieWindow // to display. We abort rendering of the subpicture in this case. /* if (!m_pVideoRenderer) { IBaseFilter* pCurrVRend = FindVideoRendererFilter(m_pGraph); if (!pCurrVRend) return E_FAIL; IPin* testPin = FindUnconnectedPin(m_pVideoRenderer, PINDIR_INPUT); if (!testPin) { slog(("Aborting subpicture rendering because there's no more input pins on video renderer.\r\n")); return E_FAIL; } testPin->Release(); } else { IPin* testPin = FindUnconnectedPin(m_pVideoRenderer, PINDIR_INPUT); if (!testPin) { slog(("Aborting subpicture rendering because there's no more input pins on video renderer.\r\n")); return E_FAIL; } testPin->Release(); } */ // Get the decoder filter, since it may not be specified IBaseFilter* pVideoDecoder = NULL; IBaseFilter* pVideoRenderer = NULL; if (m_pVideoDecoder) { pVideoDecoder = m_pVideoDecoder; pVideoDecoder->AddRef(); } else { IPin* vSrc = GetSourceVideoPin(); IPin* vNext = NULL; vSrc->ConnectedTo(&vNext); vSrc->Release(); PIN_INFO pInfo; hr = vNext->QueryPinInfo(&pInfo); pVideoDecoder = pInfo.pFilter; vNext->Release(); } // We added this back for Vista to get DVD subpictures to show up. But this won't end up doing anything // if we can't find another input pin on the renderer. BOOL renderDVDSubpic = TRUE; if (renderDVDSubpic) { if (m_pVideoRenderer) { pVideoRenderer = m_pVideoRenderer; pVideoRenderer->AddRef(); } else { IPin* vSrc = FindUnconnectedPin(pVideoDecoder, PINDIR_OUTPUT, TRUE); IPin* vNext = NULL; vSrc->ConnectedTo(&vNext); vSrc->Release(); PIN_INFO pInfo; hr = vNext->QueryPinInfo(&pInfo); pVideoRenderer = pInfo.pFilter; vNext->Release(); } } IPin* subpicDestPin = FindUnconnectedPin(pVideoDecoder, PINDIR_INPUT); if (!subpicDestPin) { pVideoDecoder->Release(); return E_FAIL; } hr = m_pGraph->Connect(subpicSource, subpicDestPin); SAFE_RELEASE(subpicDestPin); SAFE_RELEASE(subpicSource); /* * NOTE: 7/27/04 - On my system, the video wouldn't play at all on DVDs if I connected * up the subpicture stream. But the subpicture worked fine when I didn't connect it. * For now I'm going to leave it that way and then just connect up the CC instead. */ if (renderDVDSubpic && SUCCEEDED(hr)) { IPin* decoderSubpicOut = FindDecoderSubpictureOutputPin(pVideoDecoder); if (decoderSubpicOut) { IPin* renderSubpicIn = FindUnconnectedPin(pVideoRenderer, PINDIR_INPUT); if (renderSubpicIn) { hr = m_pGraph->Connect(decoderSubpicOut, renderSubpicIn); SAFE_RELEASE(renderSubpicIn); } // hr = m_pGraph->Render(decoderSubpicOut); SAFE_RELEASE(decoderSubpicOut); } } if (pVideoRenderer) pVideoRenderer->Release(); pVideoDecoder->Release(); return hr; }