// フィルタから指定メディアのピンを検索する IPin* DirectShowUtil::GetFilterPin(IBaseFilter *pFilter, const PIN_DIRECTION dir, const AM_MEDIA_TYPE *pMediaType) { IEnumPins *pEnumPins=NULL; IPin *pPin; IPin *pRetPin=NULL; if(pFilter->EnumPins(&pEnumPins)==S_OK ){ ULONG cFetched; while(!pRetPin&&pEnumPins->Next(1,&pPin,&cFetched)==S_OK){ PIN_INFO stPin; if(pPin->QueryPinInfo(&stPin)==S_OK){ if(stPin.dir==dir){ if(!pMediaType){ // 方向さえあっていればOK pRetPin=pPin; pRetPin->AddRef(); } else { // DirectShowにまかせてピンを検索 if(pPin->QueryAccept(pMediaType)==S_OK){ pRetPin=pPin; pRetPin->AddRef(); } } } if(stPin.pFilter) stPin.pFilter->Release(); } pPin->Release(); } pEnumPins->Release(); } return pRetPin; }