www.pudn.com > AVChat1.rar > UFilterUtils.cpp
// // UFilterUtils.cpp // /*-----------------------------------------------------*\ HQ Tech, Make Technology Easy! More information, please go to http://hqtech.nease.net. /*-----------------------------------------------------*/ #include "stdafx.h" #include#include "UFilterUtils.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //////////////////////////////////////////////////////////////////////////// IPin * UFilterUtils::GetPin(IBaseFilter * inFilter, BOOL inInput, const char * inPartialName) { PIN_DIRECTION direction = inInput ? PINDIR_INPUT : PINDIR_OUTPUT; IPin * foundPin = NULL; if (inFilter) { IEnumPins * pinEnum = NULL; if (SUCCEEDED(inFilter->EnumPins(&pinEnum))) { pinEnum->Reset(); IPin * pin = NULL; ULONG fetchCount = 0; while (!foundPin && SUCCEEDED(pinEnum->Next(1, &pin, &fetchCount)) && fetchCount) { if (pin) { PIN_INFO pinInfo; if (SUCCEEDED(pin->QueryPinInfo(&pinInfo))) { if (pinInfo.dir == direction) { // Ignore the pin name if (!inPartialName) { pin->AddRef(); foundPin = pin; } else { char pinName[128]; ::WideCharToMultiByte(CP_ACP, 0, pinInfo.achName, -1, pinName, 128, NULL, NULL); if (::strstr(pinName, inPartialName)) { pin->AddRef(); foundPin = pin; } } } pinInfo.pFilter->Release(); } pin->Release(); } } pinEnum->Release(); } } // We don't keep outstanding reference count if (foundPin) { foundPin->Release(); } return foundPin; } IPin * UFilterUtils::GetUnconnectedPin(IBaseFilter * inFilter, BOOL inInput) { PIN_DIRECTION direction = inInput ? PINDIR_INPUT : PINDIR_OUTPUT; IPin * foundPin = NULL; if (inFilter) { IEnumPins * pinEnum = NULL; if (SUCCEEDED(inFilter->EnumPins(&pinEnum))) { pinEnum->Reset(); IPin * pin = NULL; ULONG fetchCount = 0; while (!foundPin && SUCCEEDED(pinEnum->Next(1, &pin, &fetchCount)) && fetchCount) { if (pin) { PIN_INFO pinInfo; if (SUCCEEDED(pin->QueryPinInfo(&pinInfo))) { pinInfo.pFilter->Release(); if (pinInfo.dir == direction) { IPin * connected = NULL; pin->ConnectedTo(&connected); if (connected) { connected->Release(); } else { pin->AddRef(); foundPin = pin; } } } pin->Release(); } } pinEnum->Release(); } } // We don't keep outstanding reference count if (foundPin) { foundPin->Release(); } return foundPin; } BOOL UFilterUtils::GetPinCount(IBaseFilter * inFilter, int & outInputPin, int & outOutputPin) { outInputPin = 0; outOutputPin = 0; if (inFilter) { IEnumPins * pinEnum = NULL; if (SUCCEEDED(inFilter->EnumPins(&pinEnum))) { pinEnum->Reset(); IPin * pin = NULL; ULONG fetchCount = 0; while (SUCCEEDED(pinEnum->Next(1, &pin, &fetchCount)) && fetchCount) { if (pin) { PIN_INFO pinInfo; if (SUCCEEDED(pin->QueryPinInfo(&pinInfo))) { pinInfo.pFilter->Release(); if (pinInfo.dir == PINDIR_INPUT) { outInputPin++; } else { outOutputPin++; } } pin->Release(); } } pinEnum->Release(); } return TRUE; } return FALSE; } BOOL UFilterUtils::IsCompletelyConnected(IBaseFilter * inFilter) { if (!inFilter) { return FALSE; } BOOL allConnected = TRUE; IEnumPins * pinEnum = NULL; if (SUCCEEDED(inFilter->EnumPins(&pinEnum))) { pinEnum->Reset(); IPin * pin = NULL; ULONG fetchCount = 0; while (SUCCEEDED(pinEnum->Next(1, &pin, &fetchCount)) && fetchCount && allConnected) { if (pin) { pin->Release(); IPin * connected = NULL; pin->ConnectedTo(&connected); if (connected) { connected->Release(); } else { allConnected = FALSE; } } } pinEnum->Release(); } return allConnected; } // Pick up one of media types to determine pin type PIN_MEDIA UFilterUtils::GetPinMediaType(IPin * inPin) { PIN_MEDIA pinMedia = PIN_UNKNOWN; if (inPin) { IEnumMediaTypes * typeEnum = NULL; if (SUCCEEDED(inPin->EnumMediaTypes(&typeEnum))) { typeEnum->Reset(); AM_MEDIA_TYPE * type = 0; ULONG fetchCount = 0; if (SUCCEEDED(typeEnum->Next(1, &type, &fetchCount)) && fetchCount) { if (type) { if (type->majortype == MEDIATYPE_Video) { pinMedia = PIN_VIDEO; } else if (type->majortype == MEDIATYPE_Audio) { pinMedia = PIN_AUDIO; } else if (type->majortype == MEDIATYPE_Interleaved) { pinMedia = PIN_INTERLEAVED; } else if (type->majortype == MEDIATYPE_Stream) { pinMedia = PIN_STREAM; } DeleteMediaType(type); type = NULL; } } typeEnum->Release(); } } return pinMedia; } BOOL UFilterUtils::HasMediaType(IPin * inPin, GUID inMajorType, GUID inSubType) { return FALSE; }