⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufilterutils.cpp

📁 陆其明的实务精选中附带光盘中的视频聊天源代码
💻 CPP
字号:
//
// UFilterUtils.cpp
//

/*-----------------------------------------------------*\
			HQ Tech, Make Technology Easy!       
 More information, please go to http://hqtech.nease.net.
/*-----------------------------------------------------*/

#include "stdafx.h"
#include <streams.h>
#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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -