2024年5月1日发(作者:)

{

params = nullptr;

IBaseFilter* pFilter;

HRESULT hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);

if (FAILED(hr))

return hr;

IEnumPins* pinEnum;

hr = pFilter->EnumPins(&pinEnum);

if (FAILED(hr)) {

pFilter->Release();

return hr;

}

List^ list = gcnew List();

IPin* pPins;

while (pinEnum->Next(1, &pPins, NULL) == S_OK)

{

PIN_INFO pinInfo;

hr = pPins->QueryPinInfo(&pinInfo);

if (FAILED(hr) || != PINDIR_OUTPUT)

{

pPins->Release();

continue;

}

IEnumMediaTypes* mtEnum;

hr = pPins->EnumMediaTypes(&mtEnum);

if (FAILED(hr))

{

pPins->Release();

continue;

}

AM_MEDIA_TYPE* mt;

while (mtEnum->Next(1, &mt, NULL) == S_OK)

{

VideoParams^ param = nullptr;

if (mt->formattype == FORMAT_VideoInfo)

{

VIDEOINFOHEADER* pVih = reinterpret_cast(mt->pbFormat);

param = gcnew VideoParams();

param->FrameWidth = pVih->h;

param->FrameHeight = pVih->ht;

param->AverageFrameRate = pVih->AvgTimePerFrame == 0 ? 0 : 10000000 / pVih->AvgTimePerFrame;

}

else if (mt->formattype == FORMAT_VideoInfo2) {

VIDEOINFOHEADER2* pVih = reinterpret_cast(mt->pbFormat);

param = gcnew VideoParams();

param->FrameWidth = pVih->h;

param->FrameHeight = pVih->ht;

param->AverageFrameRate = pVih->AvgTimePerFrame == 0 ? 0 : 10000000 / pVih->AvgTimePerFrame;

}

if (param && param->AverageFrameRate > 1)

{

Boolean isExit = false;

for each (VideoParams ^ item in list)

{

if (item->FrameWidth == param->FrameWidth && item->FrameHeight == param->FrameHeight && item->AverageFrameRate == param->AverageFrameRate)

{

isExit = true;

break;

}

}

if (!isExit)

list->Add(param);

}

}

pPins->Release();

}

pFilter->Release();

params = list->ToArray();

return S_OK;

}