HRESULT CPlayer::CreateTopologyFromSource(IMFTopology **ppTopology) { TRACE((L"CPlayer::CreateTopologyFromSource\n")); assert(m_pSession != NULL); assert(m_pSource != NULL); HRESULT hr = S_OK; IMFTopology *pTopology = NULL; IMFPresentationDescriptor* pSourcePD = NULL; DWORD cSourceStreams = 0; // Create a new topology. CHECK_HR(hr = MFCreateTopology(&pTopology)); // Create the presentation descriptor for the media source. CHECK_HR(hr = m_pSource->CreatePresentationDescriptor(&pSourcePD)); // Get the number of streams in the media source. CHECK_HR(hr = pSourcePD->GetStreamDescriptorCount(&cSourceStreams)); TRACE((L"Stream count: %d\n", cSourceStreams)); // For each stream, create the topology nodes and add them to the topology. for (DWORD i = 0; i < cSourceStreams; i++) { CHECK_HR(hr = AddBranchToPartialTopology(pTopology, pSourcePD, i)); } // Return the IMFTopology pointer to the caller. if (SUCCEEDED(hr)) { *ppTopology = pTopology; (*ppTopology)->AddRef(); } done: SAFE_RELEASE(pTopology); SAFE_RELEASE(pSourcePD); return hr; }
// Create a playback topology from a media source. // Receives a pointer to the topology. IMFTopologyPtr CreatePlaybackTopology( IMFMediaSourcePtr pSource, // Media source. IMFPresentationDescriptorPtr pPD, // Presentation descriptor. HWND hVideoWnd // Video window. ) { IMFTopologyPtr pTopology; DWORD cSourceStreams = 0; // Create a new topology. THROW_IF_ERR(MFCreateTopology(&pTopology)); // Get the number of streams in the media source. THROW_IF_ERR(pPD->GetStreamDescriptorCount(&cSourceStreams)); // For each stream, create the topology nodes and add them to the topology. for (DWORD i = 0; i < cSourceStreams; i++) { AddBranchToPartialTopology(pTopology, pSource, pPD, i, hVideoWnd); } // Return the IMFTopology pointer to the caller. return pTopology; }
HRESULT tTVPMFPlayer::CreateVideoPlayer() { if( MediaSession.p ) { return S_OK; // 既に作成済み } HRESULT hr = CreateChildWindow(); if( hr != S_OK ) return hr; HWND hWnd = GetChildWindow(); if( hWnd == NULL || hWnd == INVALID_HANDLE_VALUE ) return E_FAIL; if( FAILED(hr = MFCreateMediaSession( NULL, &MediaSession )) ) { TVPThrowExceptionMessage(L"Faild to create Media session."); } if( FAILED(hr = MediaSession->BeginGetEvent( PlayerCallback, NULL )) ) { TVPThrowExceptionMessage(L"Faild to begin get event."); } CComPtr<IMFSourceResolver> pSourceResolver; if( FAILED(hr = MFCreateSourceResolver(&pSourceResolver)) ) { TVPThrowExceptionMessage(L"Faild to create source resolver."); } MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID; CComPtr<IUnknown> pSource; if( FAILED(hr = pSourceResolver->CreateObjectFromByteStream( ByteStream, StreamName.c_str(), MF_RESOLUTION_MEDIASOURCE, NULL, &ObjectType, (IUnknown**)&pSource )) ) { //if( FAILED(hr = pSourceResolver->CreateObjectFromURL( L"C:\\krkrz\\bin\\win32\\data\\test.mp4", // MF_RESOLUTION_MEDIASOURCE, NULL, &ObjectType, (IUnknown**)&pSource)) ) { TVPThrowExceptionMessage(L"Faild to open stream."); } if( ObjectType != MF_OBJECT_MEDIASOURCE ) { TVPThrowExceptionMessage(L"Invalid media source."); } //CComPtr<IMFMediaSource> pMediaSource; if( FAILED(hr = pSource.QueryInterface(&MediaSource)) ) { TVPThrowExceptionMessage(L"Faild to query Media source."); } if( FAILED(hr = MFCreateTopology(&Topology)) ) { TVPThrowExceptionMessage(L"Faild to create Topology."); } CComPtr<IMFPresentationDescriptor> pPresentationDescriptor; if( FAILED(hr = MediaSource->CreatePresentationDescriptor(&pPresentationDescriptor)) ) { TVPThrowExceptionMessage(L"Faild to create Presentation Descriptor."); } DWORD streamCount; if( FAILED(hr = pPresentationDescriptor->GetStreamDescriptorCount(&streamCount)) ) { TVPThrowExceptionMessage(L"Faild to get stream count."); } if( streamCount < 1 ) { TVPThrowExceptionMessage(L"Not found media stream."); } for( DWORD i = 0; i < streamCount; i++ ) { if( FAILED(hr = AddBranchToPartialTopology(Topology, MediaSource, pPresentationDescriptor, i, hWnd)) ) { TVPThrowExceptionMessage(L"Faild to add nodes."); } } pPresentationDescriptor->GetUINT64(MF_PD_DURATION, (UINT64*)&HnsDuration); if( FAILED(hr = MediaSession->SetTopology( 0, Topology )) ) { TVPThrowExceptionMessage(L"Faild to set topology."); } return hr; }