我正在开发自定义变换滤镜,它将RAW Bayer帧从相机转换为RGB24帧。我已经在GetMediaType()函数中正确修改了输出引脚(RGB24)的MediaType属性。我仍然修改输出引脚,例如biBitCount,biCompression,biSizeImage未反映在PIN的属性窗口中。当我渲染输出PIN并运行图表时,它显示参数不正确的错误。 我的流程有什么问题,或者任何人都可以解释一下我需要为我的过滤器实现的步骤。
这是我的GetMediaType()函数,我在其中修改输出引脚的属性。
HRESULT CYuvGray::GetMediaType(int iPosition, CMediaType *pMediaType)
{
ASSERT(m_pInput->IsConnected());
if (iPosition < 0)
{
return E_INVALIDARG;
}
else if (iPosition == 0)
{
HRESULT hr = m_pInput->ConnectionMediaType(pMediaType);
const GUID* rgb = &MEDIASUBTYPE_YUY2;
//pMediaType->SetTemporalCompression(FALSE);
//pMediaType->SetType();
/*VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER*>(pMediaType->pbFormat);*/
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER *)pMediaType->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
pVih->bmiHeader.biBitCount = 16;
pVih->bmiHeader.biCompression = mmioFOURCC('Y', 'U', 'Y', '2');//BI_RGB;//mmioFOURCC('Y', 'U', 'Y', '2');
//pVih->bmiHeader.biSizeImage = pVih->bmiHeader.biHeight * pVih->bmiHeader.biWidth * 2;
pVih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pVih->bmiHeader.biPlanes = 1;
pVih->bmiHeader.biSizeImage = GetBitmapSize(&pVih->bmiHeader);
pVih->bmiHeader.biClrImportant = 0;
SetRectEmpty(&(pVih->rcSource)); // we want the whole image area rendered.
SetRectEmpty(&(pVih->rcTarget)); // no particular destination rectangle
pMediaType->SetType(&MEDIATYPE_Video);
pMediaType->SetFormatType(&FORMAT_VideoInfo);
pMediaType->SetTemporalCompression(FALSE);
pMediaType->SetSampleSize(pVih->bmiHeader.biSizeImage);
pMediaType->SetSubtype(rgb); //Set output type to RGB24
//pMediaType->SetSampleSize(pMediaType->GetSampleSize() * 2);
//pMediaType->SetFormat(PBYTE(pVih), sizeof(VIDEOINFOHEADER));
//pVih->dwBitRate = pVih->dwBitRate * 3 ;
//m_pOutput->SetMediaType(pMediaType);
return S_OK;
}
return VFW_S_NO_MORE_ITEMS;
}