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;
			}
}
Example #3
0
//断掉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);
}
Example #4
0
// 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;
}