PinPtr CaptureDShow::findUnconnectedPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir) const { IEnumPins *pEnum = NULL; if (FAILED(pFilter->EnumPins(&pEnum))) return PinPtr(); PinPtr matchedPin; IPin *pPin = NULL; while (pEnum->Next(1, &pPin, NULL) == S_OK) { PIN_DIRECTION pinDir; if (FAILED(pPin->QueryDirection(&pinDir)) || pinDir != PinDir) continue; bool ok; bool connected = this->isPinConnected(pPin, &ok); if (!ok || connected) continue; matchedPin = PinPtr(pPin, this->deletePin); pPin->AddRef(); break; } pEnum->Release(); return matchedPin; }
IBaseFilter *DirectShowPlayerService::getConnected( IBaseFilter *filter, PIN_DIRECTION direction) const { IBaseFilter *connected = 0; IEnumPins *pins = 0; if (SUCCEEDED(filter->EnumPins(&pins))) { for (IPin *pin = 0; pins->Next(1, &pin, 0) == S_OK; pin->Release()) { PIN_DIRECTION dir; if (SUCCEEDED(pin->QueryDirection(&dir)) && dir == direction) { IPin *peer = 0; if (SUCCEEDED(pin->ConnectedTo(&peer))) { PIN_INFO info; if (SUCCEEDED(peer->QueryPinInfo(&info))) { if (connected) { qWarning("DirectShowPlayerService::getConnected: " "Multiple connected filters"); connected->Release(); } connected = info.pFilter; } peer->Release(); } } } pins->Release(); } return connected; }
HRESULT GetPinCountForOneType(IUnknown* pUnk, PIN_DIRECTION direction, LPDWORD pPinCount) { (*pPinCount) = 0; IBaseFilter* pBaseFilter = NULL; HRESULT hr = pUnk->QueryInterface(IID_IBaseFilter, (VOID**)&pBaseFilter); if (SUCCEEDED(hr)) { IEnumPins* pEnumPins = NULL; hr = pBaseFilter->EnumPins(&pEnumPins); if (SUCCEEDED(hr)) { pEnumPins->Reset(); if (SUCCEEDED(hr)) { IPin* pPin = NULL; BOOL bFound = FALSE; DWORD dwFetched = 0; while (((pEnumPins->Next(1, &pPin, &dwFetched)) == S_OK) && !bFound) { PIN_DIRECTION fetchedDir; hr = pPin->QueryDirection(&fetchedDir); if (SUCCEEDED(hr) && (fetchedDir == direction)) { (*pPinCount)++; } pPin->Release(); } } pEnumPins->Release(); } pBaseFilter->Release(); } return hr; }
PinList CaptureDShow::enumPins(IBaseFilter *filter, PIN_DIRECTION direction) const { if (!filter) return PinList(); PinList pinList; IEnumPins *enumPins = NULL; if (SUCCEEDED(filter->EnumPins(&enumPins))) { IPin *pin = NULL; while (S_OK == enumPins->Next(1, &pin, NULL)) { PIN_DIRECTION pinDir; if (SUCCEEDED(pin->QueryDirection(&pinDir)) && pinDir == direction) { pinList << PinPtr(pin, this->deleteUnknown); continue; } pin->Release(); pin = NULL; } } enumPins->Release(); return pinList; }
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(); }
// helper functions HRESULT GetUnconnectedPin(IBaseFilter *pFilter,PIN_DIRECTION PinDir, IPin **ppPin) { *ppPin = 0; IEnumPins *pEnum = 0; IPin *pPin = 0; HRESULT hr = pFilter->EnumPins(&pEnum); if (FAILED(hr)) { return hr; } while (pEnum->Next(1, &pPin, NULL) == S_OK) { PIN_DIRECTION ThisPinDir; pPin->QueryDirection(&ThisPinDir); if (ThisPinDir == PinDir) { IPin *pTmp = 0; hr = pPin->ConnectedTo(&pTmp); if (SUCCEEDED(hr)) // Already connected, not the pin we want. { pTmp->Release(); } else // Unconnected, this is the pin we want. { pEnum->Release(); *ppPin = pPin; return S_OK; } } pPin->Release(); } pEnum->Release(); // Did not find a matching pin. return E_FAIL; }
IPin* GetFirstPin (IBaseFilter *inFilter) { BOOL found=FALSE; IEnumPins * pEnum = NULL; IPin * pPin = NULL; if (SUCCEEDED(inFilter->EnumPins(&pEnum))) { //ASSERT(pEnum); printf("while(pSnowFilter)\n"); while (pEnum->Next(1, &pPin, 0) == S_OK) { //_LOG_VAL(pinInfo.achName); printf("Next(pSnowFilter)\n"); found=TRUE; pPin->Release(); } pEnum->Release(); } if(found){ return pPin; }else{ return NULL; } }
IPin * GetOutPin( IBaseFilter * pFilter, int PinNum ) { IEnumPins * pEnum = 0; HRESULT hr = pFilter->EnumPins( &pEnum ); pEnum->Reset( ); ULONG Fetched; do { Fetched = 0; IPin * pPin = 0; pEnum->Next( 1, &pPin, &Fetched ); if( Fetched ) { PIN_DIRECTION pd; pPin->QueryDirection( &pd); pPin->Release( ); if( pd == PINDIR_OUTPUT ) { if( PinNum == 0 ) { pEnum->Release( ); return pPin; } PinNum--; } } } while( Fetched ); pEnum->Release( ); return NULL; }
HRESULT MiniPlayer::findPin(IBaseFilter *pFilter, int dir, IPin **pOutPin) { IEnumPins *pEnumPins = NULL; IPin *pPin = NULL; PIN_INFO pinInfo; //FILTER_INFO filterInfo; //HRESULT hr = pFilter->QueryFilterInfo(&filterInfo); //if(hr == S_OK) //{ // ctrace(L"%s Pins:\n", filterInfo.achName); //} HRESULT hr = pFilter->EnumPins(&pEnumPins); if(FAILED(hr)) return hr; while(pEnumPins->Next(1, &pPin, NULL) == S_OK) { hr = pPin->QueryPinInfo(&pinInfo); if(FAILED(hr)) continue; if(pinInfo.dir == dir) { *pOutPin = pPin; //ctrace(L"[%s] %s\n", (dir == PINDIR_INPUT)? L"INPUT": L"OUTPUT", pinInfo.achName); return S_OK; } } pEnumPins->Release(); return -1; }
// // CFilePlayer::IsOvMConnected(): Private method to detect if the video stream // is passing through the Overlay Mixer (i.e, is it connected?). // BOOL CFilePlayer::IsOvMConnected(IBaseFilter *pOvM) { DbgLog((LOG_TRACE, 5, TEXT("CFilePlayer::IsOvMConnected() entered"))) ; IEnumPins *pEnumPins ; IPin *pPin ; IPin *pPin2 ; ULONG ul ; HRESULT hr ; BOOL bConnected = FALSE ; pOvM->EnumPins(&pEnumPins) ; while (S_OK == pEnumPins->Next(1, &pPin, &ul) && 1 == ul) { hr = pPin->ConnectedTo(&pPin2) ; if (SUCCEEDED(hr) && pPin2) { DbgLog((LOG_TRACE, 3, TEXT("Found pin %s connected to pin %s"), (LPCTSTR)CDisp(pPin), (LPCTSTR)CDisp(pPin2))) ; bConnected = TRUE ; pPin2->Release() ; } pPin->Release() ; } pEnumPins->Release() ; return bConnected ; }
gboolean gst_dshow_get_pin_from_filter (IBaseFilter * filter, PIN_DIRECTION pindir, IPin ** pin) { gboolean ret = FALSE; IEnumPins *enumpins = NULL; IPin *pintmp = NULL; HRESULT hres; *pin = NULL; hres = filter->EnumPins (&enumpins); if (FAILED (hres)) { return ret; } while (enumpins->Next (1, &pintmp, NULL) == S_OK) { PIN_DIRECTION pindirtmp; hres = pintmp->QueryDirection (&pindirtmp); if (hres == S_OK && pindir == pindirtmp) { *pin = pintmp; ret = TRUE; break; } pintmp->Release (); } enumpins->Release (); return ret; }
//查找Pin上某一个接口,只要找到Filter上某一个Pin又该接口即返回 BOOL FindPinInterface(IBaseFilter* pFilter, REFGUID iid, void** ppUnk) { if(!pFilter || !ppUnk) return FALSE; HRESULT hr = E_FAIL; IEnumPins* pEnumPin = NULL; if(FAILED(pFilter->EnumPins(&pEnumPin))) { return FALSE; } IPin* pPin = NULL; while(pEnumPin->Next(1,&pPin,NULL) == S_OK) { hr = pPin->QueryInterface(iid,ppUnk); pPin->Release(); if(SUCCEEDED(hr)) { pEnumPin->Release(); return TRUE; } } pEnumPin->Release(); return FALSE; }
// Function name : CVMR9Graph::GetPin // Description : return the desired pin // Return type : IPin* // Argument : IBaseFilter *pFilter // Argument : PIN_DIRECTION PinDir IPin* CVMR9Graph::GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir) { BOOL bFound = FALSE; IEnumPins *pEnum; IPin *pPin; pFilter->EnumPins(&pEnum); while(pEnum->Next(1, &pPin, 0) == S_OK) { PIN_DIRECTION PinDirThis; pPin->QueryDirection(&PinDirThis); if (PinDir == PinDirThis) { IPin *pTmp = 0; if (SUCCEEDED(pPin->ConnectedTo(&pTmp))) // Already connected, not the pin we want. { pTmp->Release(); } else // Unconnected, this is the pin we want. { bFound = true; break; } } pPin->Release(); } pEnum->Release(); return (bFound ? pPin : 0); }
IPin* EMTestVideoOut::GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir) { BOOL bFound = FALSE; IEnumPins *pEnum; IPin *pPin; bool FoundIt = false; pFilter->EnumPins(&pEnum); while(pEnum->Next(1, &pPin, 0) == S_OK) { PIN_DIRECTION PinDirThis; pPin->QueryDirection(&PinDirThis); if (bFound = (PinDir == PinDirThis)) { // MessageBox(NULL, "Found Matching PIN_DIRECTION", "Looking for a PIN", MB_OK); FoundIt = true; break; } pPin->Release(); // MessageBox(NULL, "Found A Non Matching PIN_DIRECTION", "Looking for a PIN", MB_OK); } // if(!FoundIt) // MessageBox(NULL, "DIDN'T FIND A MATCHING PIN", "WARNING WARNING!!!", MB_OK); pEnum->Release(); return (bFound ? pPin : 0); }
HRESULT FindPinInterface( IBaseFilter *pFilter, // Pointer to the filter to search. REFGUID iid, // IID of the interface. void **ppUnk) // Receives the interface pointer. { if (!pFilter || !ppUnk) return E_POINTER; HRESULT hr = E_FAIL; IEnumPins *pEnum = 0; if (FAILED(pFilter->EnumPins(&pEnum))) { return E_FAIL; } // Query every pin for the interface. IPin *pPin = 0; while (S_OK == pEnum->Next(1, &pPin, 0)) { hr = pPin->QueryInterface(iid, ppUnk); pPin->Release(); if (SUCCEEDED(hr)) { break; } } pEnum->Release(); return hr; }
void FindPin(IBaseFilter* baseFilter, PIN_DIRECTION direction, int pinNumber, IPin** destPin) { IEnumPins *enumPins = 0; *destPin = NULL; if (SUCCEEDED(baseFilter->EnumPins(&enumPins))) { ULONG numFound; IPin* tmpPin; while (SUCCEEDED(enumPins->Next(1, &tmpPin, &numFound))) { PIN_DIRECTION pinDirection; tmpPin->QueryDirection(&pinDirection); if (pinDirection == direction) { if (pinNumber == 0) { // Return the pin's interface *destPin = tmpPin; break; } pinNumber--; } tmpPin->Release(); } } if (enumPins) { enumPins->Release(); } }
HRESULT GetAMConfigForSinglePin(IUnknown* pUnk, PIN_DIRECTION direction, IAMStreamConfig** ppConfig) { IBaseFilter* pBaseFilter = NULL; HRESULT hr = pUnk->QueryInterface(IID_IBaseFilter, (void**)&pBaseFilter); if (SUCCEEDED(hr)) { IEnumPins* pEnumPins = NULL; hr = pBaseFilter->EnumPins(&pEnumPins); if (SUCCEEDED(hr)) { pEnumPins->Reset(); if (SUCCEEDED(hr)) { IPin* pPin = NULL; BOOL bFound = FALSE; while (((pEnumPins->Next(1, &pPin, NULL)) == S_OK) && !bFound) { PIN_DIRECTION fetchedDir; hr = pPin->QueryDirection(&fetchedDir); if (SUCCEEDED(hr) && (fetchedDir == direction)) { hr = pPin->QueryInterface(IID_IAMStreamConfig, (void**)ppConfig); bFound = SUCCEEDED(hr); } pPin->Release(); } } pEnumPins->Release(); } pBaseFilter->Release(); } return hr; }
bool isRenderer(IBaseFilter* filt) { if (!filt) return false; IEnumPins* pinList; int nrOutput = 0; int nrInput = 0; IPin* pin = NULL; if (FAILED(filt->EnumPins(&pinList))) return false; pinList->Reset(); while (pinList->Next(1, &pin, NULL) == S_OK) { if (getPinInfo(pin).dir == PINDIR_OUTPUT) nrOutput++; else nrInput++; pin->Release(); } pinList->Release(); #ifdef _DEBUG FILTER_INFO info; filt->QueryFilterInfo(&info); char str[100]; WideCharToMultiByte( CP_ACP, 0, info.achName, -1, str, 100, NULL, NULL ); _RPT0(_CRT_WARN,str); _RPT2(_CRT_WARN," %d %d\n", nrOutput, nrInput); #endif return nrOutput == 0 && nrInput == 1; // the only filters that have no outputs are renderers }
HRESULT GetUnconnectedPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin) { *ppPin = 0; IEnumPins *pEnum = 0; IPin *pPin = 0; HRESULT hr = pFilter->EnumPins(&pEnum); if (FAILED(hr)) { return hr; } while (pEnum->Next(1, &pPin, NULL) == S_OK) { PIN_DIRECTION ThisPinDir; pPin->QueryDirection(&ThisPinDir); if (ThisPinDir == PinDir) { IPin *pTmp = 0; hr = pPin->ConnectedTo(&pTmp); if (SUCCEEDED(hr)) { pTmp->Release(); } else { pEnum->Release(); *ppPin = pPin; return S_OK; } } pPin->Release(); } pEnum->Release(); return E_FAIL; }
IPin* FindPinByDirection(IBaseFilter* pFilter, PIN_DIRECTION Criteria) { IPin* pPin = 0; IEnumPins* pEnum = 0; ULONG ul = 0; PIN_DIRECTION TempDir; pFilter->EnumPins(&pEnum); if(!pEnum) return 0; while(1) { pEnum->Next(1, &pPin, &ul); if(ul != 1) { pPin = 0; break; } // Examine this pin. pPin->QueryDirection(&TempDir); if(TempDir == Criteria) { break; } pPin->Release(); } SAFE_RELEASE(pEnum); return pPin; }
HRESULT CDShowUtility::GetNextFilter(IBaseFilter *pFilter, PIN_DIRECTION Dir, IBaseFilter **ppNext) { if (!pFilter || !ppNext) { return E_POINTER; } IEnumPins *pEnum = NULL; IPin *pPin = 0; HRESULT hr = pFilter->EnumPins(&pEnum); if (FAILED(hr)) { return hr; } while (S_OK == pEnum->Next(1, &pPin, 0)) { // see if this pin matches the specified direction PIN_DIRECTION ThisPinDir; hr = pPin->QueryDirection(&ThisPinDir); if (FAILED(hr)) { // something strange happened hr = E_UNEXPECTED; pPin->Release(); break; } if (ThisPinDir == Dir) { // check if the pin is connected to another pin IPin *pPinNext = NULL; if (SUCCEEDED(hr)) { // get the filter that owns that pin PIN_INFO PinInfo; hr = pPinNext->QueryPinInfo(&PinInfo); pPinNext->Release(); pEnum->Release(); if (FAILED(hr) || PinInfo.pFilter == NULL) { // Something strange happened return E_UNEXPECTED; } // This is the filter we're looking for *ppNext = PinInfo.pFilter; return S_OK; } } pPin->Release(); } pEnum->Release(); return hr; }
GstCaps * gst_dshowvideosrc_getcaps_from_capture_filter (IBaseFilter * filter, GList ** pins_mediatypes) { IPin *capture_pin = NULL; IEnumPins *enumpins = NULL; HRESULT hres; GstCaps *caps; g_assert (filter); caps = gst_caps_new_empty (); /* get the capture pins supported types */ hres = filter->EnumPins (&enumpins); if (SUCCEEDED (hres)) { while (enumpins->Next (1, &capture_pin, NULL) == S_OK) { IKsPropertySet *pKs = NULL; hres = capture_pin->QueryInterface (IID_IKsPropertySet, (LPVOID *) & pKs); if (SUCCEEDED (hres) && pKs) { DWORD cbReturned; GUID pin_category; RPC_STATUS rpcstatus; hres = pKs->Get (AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, &pin_category, sizeof (GUID), &cbReturned); /* we only want capture pins */ if (UuidCompare (&pin_category, (UUID *) & PIN_CATEGORY_CAPTURE, &rpcstatus) == 0) { GstCaps *caps2; caps2 = gst_dshowvideosrc_getcaps_from_streamcaps (capture_pin, pins_mediatypes); if (caps2) { gst_caps_append (caps, caps2); } else { caps2 = gst_dshowvideosrc_getcaps_from_enum_mediatypes ( capture_pin, pins_mediatypes); if (caps2) { gst_caps_append (caps, caps2); } } } pKs->Release (); } capture_pin->Release (); } enumpins->Release (); } GST_DEBUG ("Device supports these caps: %" GST_PTR_FORMAT, caps); return caps; }
/* 构建滤波器链表,添加各个滤波器,链接并运行链表*/ HRESULT CVMR_Capture::Init(int iDeviceID,HWND hWnd, int iWidth, int iHeight) { HRESULT hr; //再次调用函数,释放已经建立的链表 CloseInterfaces(); // 创建IGraphBuilder hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGB); if (SUCCEEDED(hr)) { // 创建VMR并添加到Graph中 InitializeWindowlessVMR(hWnd); // 把指定的设备捆绑到一个滤波器 if(!BindFilter(iDeviceID, &m_pDF)) return S_FALSE; // 添加采集设备滤波器到Graph中 hr = m_pGB->AddFilter(m_pDF, L"Video Capture"); if (FAILED(hr)) return hr; // 获取捕获滤波器的引脚 IEnumPins *pEnum; m_pDF->EnumPins(&pEnum); hr |= pEnum->Reset(); hr |= pEnum->Next(1, &m_pCamOutPin, NULL); // 获取媒体控制和事件接口 hr |= m_pGB->QueryInterface(IID_IMediaControl, (void **)&m_pMC); hr |= m_pGB->QueryInterface(IID_IMediaEventEx, (void **)&m_pME); // 设置窗口通知消息处理 //hr = pME->SetNotifyWindow((OAHWND)hWnd, WM_GRAPHNOTIFY, 0); // 匹配视频分辨率,对视频显示窗口设置 hr |= InitVideoWindow(hWnd,iWidth, iHeight); // 为捕获图像帧申请内存 m_nFramelen=iWidth*iHeight*3; m_pFrame=(BYTE*) new BYTE[m_nFramelen]; // 运行Graph,捕获视频 m_psCurrent = STOPPED; hr |= m_pGB->Render(m_pCamOutPin); hr |= m_pMC->Run(); if (FAILED(hr)) return hr; m_psCurrent = RUNNING; } return hr; }
HRESULT FindSourceFilter(IFilterGraph* filterGraph,IBaseFilter*& result) { HRESULT hr; IEnumFilters *enumFilters; hr = filterGraph->EnumFilters(&enumFilters); if (FAILED(hr)) { ErrorPrint("Get enum filters error",hr); return hr; } ComReleaser enumFilterReleaser(enumFilters); IBaseFilter* filter; while (S_OK == enumFilters->Next(1, &filter, NULL)) { ComReleaser filterReleaser(filter); IEnumPins *enumPins; hr = filter->EnumPins(&enumPins); if (FAILED(hr)) { ErrorPrint("Get enum pins error",hr); return hr; } ComReleaser enumPinsReleaser(enumPins); IPin* pin; bool isSourceFilter = true; while (S_OK == enumPins->Next(1, &pin, NULL)) { ComReleaser pinReleaser(pin); PIN_INFO pinInfo; hr = pin->QueryPinInfo(&pinInfo); if (FAILED(hr)) { ErrorPrint("Get pin info error",hr); continue; } if (pinInfo.dir == PINDIR_INPUT) //认为没有输入pin的就是source filter,这其实是有些问题的,特别是当捕获(如声卡的音频)的filter有时候有很多输入PIN { isSourceFilter = false; break; } } if (isSourceFilter) { filter->AddRef(); //存在一个资源管理的释放类,必须增加一个引用,否则会被释放掉 result = filter; return S_OK; } } return E_FAIL; }
IPin* FindDecoderSubpictureOutputPin(IBaseFilter* pFilter) { IEnumPins* pEnum = NULL; HRESULT hr = pFilter->EnumPins(&pEnum); if (hr != NOERROR) return NULL; ULONG ulFound; IPin *pPin = NULL; hr = E_FAIL; while(S_OK == pEnum->Next(1, &pPin, &ulFound)) { PIN_INFO PinInfo; // // grab this, so we can examine its name field // hr = pPin->QueryPinInfo(&PinInfo); if(SUCCEEDED(hr)) { PinInfo.pFilter->Release(); // // check direction // if (PinInfo.dir == PINDIR_OUTPUT) { // Make sure its not connected yet and its a video type. IPin* dummyPin = NULL; hr = pPin->ConnectedTo(&dummyPin); SAFE_RELEASE(dummyPin); if (hr == VFW_E_NOT_CONNECTED) { IEnumMediaTypes *mtEnum = NULL; pPin->EnumMediaTypes(&mtEnum); AM_MEDIA_TYPE *pMT = NULL; while (S_OK == mtEnum->Next(1, &pMT, NULL)) { if (pMT->majortype == MEDIATYPE_Video) { DeleteMediaType(pMT); SAFE_RELEASE(mtEnum); SAFE_RELEASE(pEnum); return pPin; } DeleteMediaType(pMT); } SAFE_RELEASE(mtEnum); } } } pPin->Release(); } SAFE_RELEASE(pEnum); return NULL; }
HRESULT CDShowUtility::GetFirstUnConnectedPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin) { *ppPin = NULL; IEnumPins *pEnum = NULL; IPin *pPin = NULL; HRESULT hr = pFilter->EnumPins(&pEnum); if (FAILED(hr)) { return hr; } pEnum->Reset(); while (pEnum->Next(1, &pPin, NULL) == S_OK) { PIN_DIRECTION ThisPinDir; pPin->QueryDirection(&ThisPinDir); if (PinDir == ThisPinDir) { IPin *pTmp = 0; hr = pPin->ConnectedTo(&pTmp); if (NULL != pTmp) { pTmp->Release(); } if (SUCCEEDED(hr)) { //已经连接了 pPin->Release(); continue; } else { pEnum->Release(); *ppPin = pPin; return S_OK; } } pPin->Release(); } pEnum->Release(); return E_FAIL; }
HRESULT CKTVDlg::EnumPinsOnFilter( IBaseFilter *pFilter, PIN_DIRECTION PinDir , int index) { HRESULT r; IEnumPins *pEnum = NULL; IPin *pPin = NULL; // Verify filter interface if (!pFilter) return E_NOINTERFACE; // Get pin enumerator r = pFilter->EnumPins(&pEnum); if (FAILED(r)) return r; pEnum->Reset(); // Enumerate all pins on this filter while((r = pEnum->Next(1, &pPin, 0)) == S_OK) { PIN_DIRECTION PinDirThis; r = pPin->QueryDirection(&PinDirThis); if (FAILED(r)) { pPin->Release(); continue; } // Does the pin's direction match the requested direction? if (PinDir == PinDirThis) { PIN_INFO pininfo={0}; // Direction matches, so add pin name to listbox r = pPin->QueryPinInfo(&pininfo); if (SUCCEEDED(r)) { wstring str = pininfo.achName; m_captureFilterVec[index].PinVec.push_back(str); } // The pininfo structure contains a reference to an IBaseFilter, // so you must release its reference to prevent resource a leak. pininfo.pFilter->Release(); } pPin->Release(); } pEnum->Release(); return r; }
HRESULT Captura::Iniciar(int iDeviceID,HWND hWnd, int iWidth, int iHeight) { HRESULT hr; // Coger la interfaz de DirectShow hr=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGB); if(SUCCEEDED(hr)) { // Crear la superficie de mezcla y meterla en el Graph IniciarWindowlessVMR(hWnd); // Enlazar el filtro if(!EnlazarFiltro(iDeviceID, &m_pDF)) return S_FALSE; hr=m_pGB->AddFilter(m_pDF, L"Video Capture"); if (FAILED(hr)) return hr; /*CComPtr<IEnumPins>*/IEnumPins* pEnum; m_pDF->EnumPins(&pEnum); hr = pEnum->Reset(); hr = pEnum->Next(1, &m_pCamOutPin, NULL); // Preguntar a los interfaces hr = m_pGB->QueryInterface(IID_IMediaControl, (void **)&m_pMC); hr = m_pGB->QueryInterface(IID_IMediaEventEx, (void **)&m_pME); hr = IniciarVentanaVideo(hWnd,iWidth, iHeight); m_nTamFrame=iWidth*iHeight*3; m_pFrame=(BYTE*) new BYTE[m_nTamFrame]; // Ejecutar el Graph m_psEstado=PARADO; hr = m_pGB->Render(m_pCamOutPin); hr = m_pMC->Run(); m_psEstado=EJECUTANDO; } return hr; }
// Get the first upstream or downstream filter HRESULT GetNextFilter( IBaseFilter *pFilter, // Pointer to the starting filter PIN_DIRECTION Dir, // Direction to search (upstream or downstream) IBaseFilter **ppNext) // Receives a pointer to the next filter. { if (!pFilter || !ppNext) return E_POINTER; IEnumPins *pEnum = 0; IPin *pPin = 0; HRESULT hr = pFilter->EnumPins(&pEnum); if (FAILED(hr)) return hr; while (S_OK == pEnum->Next(1, &pPin, 0)) { // See if this pin matches the specified direction. PIN_DIRECTION ThisPinDir; hr = pPin->QueryDirection(&ThisPinDir); if (FAILED(hr)) { // Something strange happened. hr = E_UNEXPECTED; pPin->Release(); break; } if (ThisPinDir == Dir) { // Check if the pin is connected to another pin. IPin *pPinNext = 0; hr = pPin->ConnectedTo(&pPinNext); if (SUCCEEDED(hr)) { // Get the filter that owns that pin. PIN_INFO PinInfo; hr = pPinNext->QueryPinInfo(&PinInfo); pPinNext->Release(); pPin->Release(); pEnum->Release(); if (FAILED(hr) || (PinInfo.pFilter == NULL)) { // Something strange happened. return E_UNEXPECTED; } // This is the filter we're looking for. *ppNext = PinInfo.pFilter; // Client must release. return S_OK; } } pPin->Release(); } pEnum->Release(); // Did not find a matching filter. return E_FAIL; }
// Find all the immediate upstream or downstream peers of a filter. HRESULT GetPeerFilters( IBaseFilter *pFilter, // Pointer to the starting filter PIN_DIRECTION Dir, // Direction to search (upstream or downstream) CFilterList &FilterList) // Collect the results in this list. { if (!pFilter) return E_POINTER; IEnumPins *pEnum = 0; IPin *pPin = 0; HRESULT hr = pFilter->EnumPins(&pEnum); if (FAILED(hr)) return hr; while (S_OK == pEnum->Next(1, &pPin, 0)) { // See if this pin matches the specified direction. PIN_DIRECTION ThisPinDir; hr = pPin->QueryDirection(&ThisPinDir); if (FAILED(hr)) { // Something strange happened. hr = E_UNEXPECTED; pPin->Release(); break; } if (ThisPinDir == Dir) { // Check if the pin is connected to another pin. IPin *pPinNext = 0; hr = pPin->ConnectedTo(&pPinNext); if (SUCCEEDED(hr)) { // Get the filter that owns that pin. PIN_INFO PinInfo; hr = pPinNext->QueryPinInfo(&PinInfo); pPinNext->Release(); if (FAILED(hr) || (PinInfo.pFilter == NULL)) { // Something strange happened. pPin->Release(); pEnum->Release(); return E_UNEXPECTED; } // Insert the filter into the list. AddFilterUnique(FilterList, PinInfo.pFilter); PinInfo.pFilter->Release(); } } pPin->Release(); } pEnum->Release(); return S_OK; }