void videoInputCamera::NukeDownstream(IBaseFilter *pBF){ IPin *pP, *pTo; ULONG u; IEnumPins *pins = NULL; PIN_INFO pininfo; HRESULT hr = pBF->EnumPins(&pins); pins->Reset(); while (hr == NOERROR) { hr = pins->Next(1, &pP, &u); if (hr == S_OK && pP) { pP->ConnectedTo(&pTo); if (pTo) { hr = pTo->QueryPinInfo(&pininfo); if (hr == NOERROR) { if (pininfo.dir == PINDIR_INPUT) { NukeDownstream(pininfo.pFilter); pGraphBuilder->Disconnect(pTo); pGraphBuilder->Disconnect(pP); pGraphBuilder->RemoveFilter(pininfo.pFilter); } pininfo.pFilter->Release(); pininfo.pFilter = NULL; } pTo->Release(); } pP->Release(); } } if (pins) pins->Release(); }
// Tear down everything downstream of a given filter void __fastcall NukeDownstream(IBaseFilter * pf, IGraphBuilder * pGB) { IPin *pP = 0; IPin *pTo = 0; ULONG u; IEnumPins *pins = NULL; PIN_INFO pininfo; if (!pf) return; // Enumerate all filter pins HRESULT hr = pf->EnumPins(&pins); // Go to beginning of enumeration pins->Reset(); while(hr == NOERROR) { hr = pins->Next(1, &pP, &u); if(hr == S_OK && pP) { pP->ConnectedTo(&pTo); if(pTo) { hr = pTo->QueryPinInfo(&pininfo); if(hr == NOERROR) { if(pininfo.dir == PINDIR_INPUT) { NukeDownstream(pininfo.pFilter, pGB); pGB->Disconnect(pTo); pGB->Disconnect(pP); pGB->RemoveFilter(pininfo.pFilter); } pininfo.pFilter->Release(); pininfo.pFilter = NULL; } pTo->Release(); pTo = NULL; } pP->Release(); pP = NULL; } } if(pins) { pins->Release(); pins = NULL; } }
//断掉Graph void CCaptureAudio::TearDownGraph() { //先释放掉没有使用的 if(m_pVideoWin) { m_pVideoWin->put_Owner(NULL); m_pVideoWin->put_Visible(OAFALSE); m_pVideoWin->Release(); m_pVideoWin = NULL; } if(m_pBaseFilter) NukeDownstream(m_pGraphBuilder,m_pBaseFilter); SAFE_RELEASE(m_pGraphBuilder); SAFE_RELEASE(m_pCaptureGraphBulid); SAFE_RELEASE(m_pSampleGrabberFilter); SAFE_RELEASE(m_pSampleGrabber); }
// Tear down everything downstream of a given filter void NukeDownstream(IGraphBuilder * inGraph, IBaseFilter * inFilter) { if (inGraph && inFilter) { IEnumPins * pinEnum = 0; if (SUCCEEDED(inFilter->EnumPins(&pinEnum))) { pinEnum->Reset(); IPin * pin = 0; ULONG cFetched = 0; bool pass = true; while (pass && SUCCEEDED(pinEnum->Next(1, &pin, &cFetched))) { if (pin && cFetched) { IPin * connectedPin = 0; pin->ConnectedTo(&connectedPin); if(connectedPin) { PIN_INFO pininfo; if (SUCCEEDED(connectedPin->QueryPinInfo(&pininfo))) { if(pininfo.dir == PINDIR_INPUT) { NukeDownstream(inGraph, pininfo.pFilter); inGraph->Disconnect(connectedPin); inGraph->Disconnect(pin); inGraph->RemoveFilter(pininfo.pFilter); } pininfo.pFilter->Release(); } connectedPin->Release(); } pin->Release(); } else { pass = false; } } pinEnum->Release(); } } }
HRESULT videoInputCamera::stopDevice() { HRESULT HR = NULL; //Stop the callback and free it if( (sgCallback) && (pSampleGrabber) ) { //printf("SETUP: freeing Grabber Callback\n"); pSampleGrabber->SetCallback(NULL, 1); sgCallback->Release(); delete sgCallback; sgCallback = NULL; } //Check to see if the graph is running, if so stop it. if( (pMediaControl) ) { HR = pMediaControl->Pause(); if (FAILED(HR)) printf("ERROR - Could not pause pControl\n"); HR = pMediaControl->Stop(); if (FAILED(HR)) printf("ERROR - Could not stop pControl\n"); } //Disconnect filters from capture device if( (pInputFilter) ) NukeDownstream(pInputFilter); //Release and zero pointers to our filters etc if (pDestFilter) { //printf("SETUP: freeing Renderer \n"); pDestFilter->Release(); pDestFilter = NULL; } if (pInputFilter) { //printf("SETUP: freeing Capture Source \n"); pInputFilter->Release(); pInputFilter = NULL; } if (pGrabberFilter) { //printf("SETUP: freeing Grabber Filter \n"); pGrabberFilter->Release(); pGrabberFilter = NULL; } if (pSampleGrabber) { //printf("SETUP: freeing Grabber \n"); pSampleGrabber->Release(); pSampleGrabber = NULL; } if (pMediaControl) { //printf("SETUP: freeing Control \n"); pMediaControl->Release(); pMediaControl = NULL; } if (pStreamConfig) { //printf("SETUP: freeing Stream \n"); pStreamConfig->Release(); pStreamConfig = NULL; } if (pAmMediaType) { //printf("SETUP: freeing Media Type \n"); deleteMediaType(pAmMediaType); } //Destroy the graph if (pGraphBuilder) destroyGraph(); //Release and zero our capture graph and our main graph if (pCaptureGraphBuilder) { //printf("SETUP: freeing Capture Graph \n"); pCaptureGraphBuilder->Release(); pCaptureGraphBuilder = NULL; } if (pGraphBuilder) { //printf("SETUP: freeing Main Graph \n"); pGraphBuilder->Release(); pGraphBuilder = NULL; } comUnInit(); return S_OK; }