// Create a renderer for the media type on the given stream descriptor HRESULT CTedMediaFileRenderer::CreateRendererForStream(IMFStreamDescriptor* pSD, IMFTopologyNode** ppRendererNode) { HRESULT hr; CComPtr<IMFMediaTypeHandler> spMediaTypeHandler; CComPtr<IMFActivate> spRendererActivate; CComPtr<IMFMediaSink> spRendererSink; CComPtr<IMFStreamSink> spRendererStreamSink; IMFTopologyNode* pRendererNode; GUID gidMajorType; IFC( MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &pRendererNode) ); IFC( pSD->GetMediaTypeHandler( &spMediaTypeHandler ) ); IFC( spMediaTypeHandler->GetMajorType( &gidMajorType ) ); if(MFMediaType_Audio == gidMajorType) { IFC( MFCreateAudioRendererActivate(&spRendererActivate) ); IFC( spRendererActivate->ActivateObject(IID_IMFMediaSink, (void**) &spRendererSink) ); IFC( spRendererSink->GetStreamSinkById(0, &spRendererStreamSink) ); IFC( pRendererNode->SetObject(spRendererStreamSink) ); } else if(MFMediaType_Video == gidMajorType) { HWND hVideoWindow; IFC( m_spVideoWindowHandler->GetVideoWindow((LONG_PTR*) &hVideoWindow) ); IFC( MFCreateVideoRendererActivate(hVideoWindow, &spRendererActivate) ); IFC( spRendererActivate->ActivateObject(IID_IMFMediaSink, (void**) &spRendererSink) ); IFC( spRendererSink->GetStreamSinkById(0, &spRendererStreamSink) ); IFC( pRendererNode->SetObject(spRendererStreamSink) ); } else { // Do not have renderers for any other major types } *ppRendererNode = pRendererNode; Cleanup: return hr; }