예제 #1
0
// 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;
}