void ReleaseGraph(void) { if (m_pMC) m_res = m_pMC->Stop(); else if (m_pFilter) m_res = m_pFilter->Stop(); if (m_pGraph) { if (m_pFilter) { ASSERT(m_pSFilter); ASSERT(m_pRFilter); m_res = m_pGraph->RemoveFilter(m_pFilter); m_res = m_pGraph->RemoveFilter(m_pSFilter); m_res = m_pGraph->RemoveFilter(m_pRFilter); } RemoveFromRot(m_dwRegister); } else { if (m_pInputPin) m_res = m_pInputPin->Disconnect(); if (m_pOutputPin) m_res = m_pOutputPin->Disconnect(); if (m_pFilter) m_res = m_pFilter->JoinFilterGraph(NULL, NULL); if (m_pOurInput) m_res = m_pOurOutput->Disconnect(); if (m_pOurOutput) m_res = m_pOurOutput->Disconnect(); } if (m_pImp) m_pImp->Release(); if (m_pFilter) m_res = m_pFilter->Release(); if (m_pSFilter) m_res = m_pSFilter->Release(); if (m_pRFilter) m_res = m_pRFilter->Release(); }
void PromptForGraph(IGraphBuilder* pGraph, _TCHAR* pszGraphType) { DWORD dwGraphRegister = 0; AddToRot(pGraph, &dwGraphRegister); _TCHAR szMsg[1024]; _tcscpy(szMsg, _T("You can connect to the ")); _tcscat(szMsg, pszGraphType); _tcscat(szMsg, _T(" Graph right now. This is NOT an error.")); MessageBox(::GetDesktopWindow(), szMsg, _T("Developer information"), MB_ICONINFORMATION|MB_OK| MB_SETFOREGROUND|MB_SYSTEMMODAL); RemoveFromRot(dwGraphRegister); }
// Function name : CVMR9Graph::BuildFilterGraph // Description : construct the filter graph // Return type : BOOL BOOL CVMR9Graph::BuildFilterGraph(bool withSound) { HRESULT hr; ReleaseAllInterfaces(); RemoveFromRot(); // BUILD the filter graph hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IUnknown, (void**) &m_pGraphUnknown); if (FAILED(hr)) { ReportError("Could not build the graph", hr); return FALSE; } // QUERY the filter graph interfaces hr = m_pGraphUnknown->QueryInterface(IID_IGraphBuilder, (void**) &m_pGraphBuilder); hr = m_pGraphUnknown->QueryInterface(IID_IFilterGraph, (void**) &m_pFilterGraph); hr = m_pGraphUnknown->QueryInterface(IID_IFilterGraph2, (void**) &m_pFilterGraph2); hr = m_pGraphUnknown->QueryInterface(IID_IMediaControl, (void**) & m_pMediaControl); hr = m_pGraphUnknown->QueryInterface(IID_IMediaSeeking, (void**) & m_pMediaSeeking); //hr = m_pGraphUnknown->QueryInterface(IID_IMediaEvent, (void**) &m_pMediaEvent); //hr = m_pGraphUnknown->QueryInterface(IID_IMediaEventEx, (void**) &m_pMediaEventEx); /* // SET the graph state window callback if (m_pMediaEventEx != NULL) { m_pMediaEventEx->SetNotifyWindow((OAHWND)m_hMediaWindow, WM_MEDIA_NOTIF, NULL); //m_pMediaEventEx->SetNotifyWindow(NULL, NULL, NULL); }*/ if (withSound) BuildSoundRenderer(); // Don't known what's wrong... but RenderEx crash when playing whith graphedit build 021204 ... //do we need this?? //AddToRot(m_pGraphUnknown); return BuildVMR(); }
void CMediaViewer::CloseViewer(void) { CTryBlockLock Lock(&m_DecoderLock); Lock.TryLock(LOCK_TIMEOUT); /* if (!m_bInit) return; */ if (m_pFilterGraph) { Trace(TEXT("フィルタグラフを停止しています...")); m_pFilterGraph->Abort(); Stop(); } Trace(TEXT("COMインスタンスを解放しています...")); // COMインスタンスを開放する if (m_pVideoRenderer!=NULL) { m_pVideoRenderer->Finalize(); } if (m_pImageMixer!=NULL) { delete m_pImageMixer; m_pImageMixer=NULL; } if (m_pszVideoDecoderName!=NULL) { delete [] m_pszVideoDecoderName; m_pszVideoDecoderName=NULL; } SAFE_RELEASE(m_pVideoDecoderFilter); SAFE_RELEASE(m_pAudioDecoder); SAFE_RELEASE(m_pAudioRenderer); #ifndef BONTSENGINE_H264_SUPPORT SAFE_RELEASE(m_pMpeg2Parser); #else SAFE_RELEASE(m_pH264Parser); #endif SAFE_RELEASE(m_pMp2DemuxAudioMap); SAFE_RELEASE(m_pMp2DemuxVideoMap); SAFE_RELEASE(m_pMp2DemuxFilter); SAFE_RELEASE(m_pSrcFilter); SAFE_RELEASE(m_pAudioFilter); SAFE_RELEASE(m_pMediaControl); #ifdef _DEBUG if(m_dwRegister!=0){ RemoveFromRot(m_dwRegister); m_dwRegister = 0; } #endif if (m_pFilterGraph) { Trace(TEXT("フィルタグラフを解放しています...")); #ifdef _DEBUG TRACE(TEXT("FilterGraph RefCount = %d\n"),DirectShowUtil::GetRefCount(m_pFilterGraph)); #endif SAFE_RELEASE(m_pFilterGraph); } if (m_pVideoRenderer!=NULL) { delete m_pVideoRenderer; m_pVideoRenderer=NULL; } if (m_pszAudioRendererName!=NULL) { delete [] m_pszAudioRendererName; m_pszAudioRendererName=NULL; } m_bInit=false; }