Example #1
0
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;
	}