int DoEnumFilter() { HRESULT hr; IFilterMapper *pMapper = NULL; IEnumRegFilters *pEnum = NULL; IBaseFilter * pFilter = NULL; hr = CoCreateInstance(CLSID_FilterMapper, NULL, CLSCTX_INPROC, IID_IFilterMapper, (void **)&pMapper); if(FAILED(hr)){ return 0; } hr = pMapper->EnumMatchingFilters(&pEnum,0,FALSE,GUID_NULL,GUID_NULL,FALSE,FALSE,GUID_NULL,GUID_NULL); REGFILTER *pRF = NULL; ULONG cFetched; while (pEnum->Next(1, &pRF, &cFetched) == S_OK) { SendMessage(g_hList,LB_ADDSTRING,0,(LPARAM)pRF->Name); CoTaskMemFree(pRF); hr = CoCreateInstance(pRF->Clsid, NULL, CLSCTX_INPROC , IID_IBaseFilter, (void **)&pFilter); SendMessage(g_hList,LB_ADDSTRING,0,(LPARAM)TEXT(" [IN]")); EnumPins(pFilter,PINDIR_INPUT); SendMessage(g_hList,LB_ADDSTRING,0,(LPARAM)TEXT(" [OUT]")); EnumPins(pFilter,PINDIR_OUTPUT); SAFE_RELEASE(pFilter); } // capture device HANDLE handle = NULL; DEVMGR_DEVICE_INFORMATION di={sizeof(di)}; GUID guidCamera = { 0xCB998A05, 0x122C, 0x4166, 0x84, 0x6A,0x93, 0x3E, 0x4D, 0x7E, 0x3C, 0x86 }; handle = FindFirstDevice( DeviceSearchByGuid, &guidCamera, &di ); if(( handle == NULL ) || ( di.hDevice == NULL )) { }else{ SendMessage(g_hList,LB_ADDSTRING,0,(LPARAM)di.szLegacyName ); } FindClose( handle ); return 1; }
dsnerror_t CreateGraph(bool buildgraph=false) { if (!EnumPins()) return DSN_FAIL_ENUM; if (!SetInputType()) return DSN_INPUT_NOTACCEPTED; m_pSFilter = new CSenderFilter(); m_pOurInput = (CSenderPin *) m_pSFilter->GetPin(0); /* setup Source filename if someone wants to known it (i.e. ffdshow) */ m_pSFilter->Load(m_sfname, NULL); m_pSFilter->AddRef(); m_pRFilter = new CRenderFilter(); m_pOurOutput = (CRenderPin *) m_pRFilter->GetPin(0); m_pRFilter->AddRef(); if (buildgraph) { DSN_CHECK(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **) &m_pGraph), DSN_FAIL_GRAPH); DSN_CHECK(DSVideoCodec::AddToRot(m_pGraph, &m_dwRegister), DSN_FAIL_GRAPH); DSN_CHECK(m_pGraph->QueryInterface(IID_IMediaControl, (void **) &m_pMC), DSN_FAIL_GRAPH); m_pGraph->SetLogFile((DWORD_PTR) GetStdHandle(STD_OUTPUT_HANDLE)); DSN_CHECK(m_pGraph->AddFilter(m_pFilter, L"Binary Codec"), (m_pInputPin = m_pOutputPin = NULL, DSN_FAIL_GRAPH)); DSN_CHECK(m_pGraph->AddFilter(m_pSFilter, L"DS Sender"), DSN_FAIL_GRAPH); DSN_CHECK(m_pGraph->AddFilter(m_pRFilter, L"DS Render"), DSN_FAIL_GRAPH); // Connect our output pin to codec input pin otherwise QueryAccept on the codec output pin will fail DSN_CHECK(m_pGraph->ConnectDirect(m_pOurInput, m_pInputPin, &m_pOurType), DSN_INPUT_CONNFAILED); } else { m_res = m_pFilter->JoinFilterGraph((IFilterGraph *) m_pSFilter, L"DSNative Graph"); /* same of above */ DSN_CHECK(m_pInputPin->ReceiveConnection(m_pOurInput, &m_pOurType), DSN_INPUT_CONNFAILED); } SetOutputType(); if (buildgraph) DSN_CHECK(m_pGraph->ConnectDirect(m_pOurOutput, m_pOutputPin, &m_pDestType), DSN_OUTPUT_CONNFAILED); else DSN_CHECK(m_pOutputPin->ReceiveConnection(m_pOurOutput, &m_pDestType), DSN_OUTPUT_CONNFAILED); m_pOurOutput->SetFrameSize(m_vi.bmiHeader.biBitCount * m_vi.bmiHeader.biWidth * (m_vi.bmiHeader.biHeight + 2) / 8); return DSN_OK; }