Re[3]: проблемы с IVideoWindow
От: Аноним  
Дата: 20.07.07 03:09
Оценка:
Здравствуйте, squid, Вы писали:

S>спасибо но я не понял как вы хэндл окна получили...


S>
S>pVideoHWnd = pDSUtilFunc.GetHwndVideoWindow(piGraphBuilder); 
S>


S>это вообще что?


pDSUtilFunc — это указатель на вспомогательный класс, в котором есть метод GetHwndVideoWindow. Вот реализация:

HWND CDSUtilFunc::GetHwndVideoWindow(IGraphBuilder *pGB)
{
HWND hwndReturn = NULL;
HRESULT hr;

// подключаем интерфейс IOverlay
IBaseFilter *pRenderFilter = NULL;
IPin *pRenderPin = NULL;
IOverlay* pOverlay = NULL;
IOverlayNotify* pOverlayNotify = NULL;

if(FindRenderer(pGB, &MEDIATYPE_Video, &pRenderFilter) == S_OK)
{ // получаем входной пин
if(GetPin(pRenderFilter, PINDIR_INPUT, MEDIASUBTYPE_None, &pRenderPin) == S_OK)
{
if(pRenderPin->QueryInterface(IID_IOverlay, (void **)&pOverlay) == S_OK)
{
pOverlay->Release();
pRenderPin->Release();
pRenderPin = NULL;

// получаем хендл окна
hr = pOverlay->GetWindowHandle(&hwndReturn);
if(hr != S_OK)
ShowErrorMessage(hr);
}
}

if(pRenderFilter != NULL)
{
if(pRenderFilter)
pRenderFilter->Release();
}
}

return hwndReturn;
}

здесь используется еще один метод этого вспомогательного класса — GetPin. Даю сразу и его реализацию:

HRESULT CDSUtilFunc::GetPin(IBaseFilter *pFilter, PIN_DIRECTION dirRequired, GUID majortype, IPin **ppPin)
{
HRESULT hr = S_FALSE;

IEnumPins* pEnum;
*ppPin = NULL;

if(!pFilter)
return E_POINTER;

hr = pFilter->EnumPins(&pEnum);
if(hr != S_OK)
return hr;

ULONG ulFound;
IPin* pPin;
hr = E_FAIL;

while(pEnum->Next(1, &pPin, &ulFound) == S_OK)
{
PIN_DIRECTION pindir = (PIN_DIRECTION)3;

pPin->QueryDirection(&pindir);

if(pindir == dirRequired)
{ // если указан — проверяем тип данных пина
if(majortype != MEDIASUBTYPE_None)
{
// получаем медиа-тип исходного сигнала
AM_MEDIA_TYPE *pMediaType;
IEnumMediaTypes *pEnumType;

if(pPin->EnumMediaTypes(&pEnumType) == S_OK)
{
ULONG ulFoundTypes;
while(pEnumType->Next(1, &pMediaType, &ulFoundTypes) == S_OK)
{
if(pMediaType->majortype == majortype)//MEDIATYPE_Audio
{
*ppPin = pPin;
hr = S_OK;
break;
}
// очищаем структуру
DeleteMediaType(pMediaType);
}
}
pEnumType->Release();
}
else
{
*ppPin = pPin;
hr = S_OK;
break;
}
}
pPin->Release();
}
pEnum->Release();

return hr;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.