HRESULT tTVPMFPlayer::AddBranchToPartialTopology( IMFTopology *pTopology, IMFMediaSource *pSource, IMFPresentationDescriptor *pPD, DWORD iStream, HWND hVideoWnd ) { CComPtr<IMFStreamDescriptor> pSD; HRESULT hr; BOOL selected = FALSE; if( FAILED(hr = pPD->GetStreamDescriptorByIndex(iStream, &selected, &pSD)) ) { TVPThrowExceptionMessage(L"Faild to get stream desc."); } if( selected ) { // Create the media sink activation object. CComPtr<IMFActivate> pSinkActivate; if( FAILED(hr = CreateMediaSinkActivate(pSD, hVideoWnd, &pSinkActivate)) ) { return S_OK; // video と audio 以外は無視 } // Add a source node for this stream. CComPtr<IMFTopologyNode> pSourceNode; if( FAILED(hr = AddSourceNode(pTopology, pSource, pPD, pSD, &pSourceNode) ) ) { TVPThrowExceptionMessage(L"Faild to add source node."); } // Create the output node for the renderer. CComPtr<IMFTopologyNode> pOutputNode; if( FAILED(hr = AddOutputNode(pTopology, pSinkActivate, 0, &pOutputNode)) ) { TVPThrowExceptionMessage(L"Faild to add output node."); } // Connect the source node to the output node. if( FAILED(hr = pSourceNode->ConnectOutput(0, pOutputNode, 0)) ) { TVPThrowExceptionMessage(L"Faild to connect node."); } } return hr; }
void AddBranchToPartialTopology( IMFTopologyPtr pTopology, // Topology. IMFMediaSourcePtr pSource, // Media source. IMFPresentationDescriptorPtr pPD, // Presentation descriptor. DWORD iStream, // Stream index. HWND hVideoWnd) // Window for video playback. { IMFStreamDescriptorPtr pSD; IMFActivatePtr pSinkActivate; IMFTopologyNodePtr pSourceNode; IMFTopologyNodePtr pOutputNode; BOOL fSelected = FALSE; THROW_IF_ERR(pPD->GetStreamDescriptorByIndex(iStream, &fSelected, &pSD)); if (fSelected) { // Create the media sink activation object. pSinkActivate = CreateMediaSinkActivate(pSD.Get(), hVideoWnd); // Add a source node for this stream. pSourceNode = AddSourceNode(pTopology, pSource, pPD, pSD); // Create the output node for the renderer. pOutputNode = AddOutputNode(pTopology, pSinkActivate, 0); // Connect the source node to the output node. THROW_IF_ERR(pSourceNode->ConnectOutput(0, pOutputNode.Get(), 0)); } // else: If not selected, don't add the branch. }