GetMediaType设置Filter输出类型的设置方法

//设置输出的类型及尺寸,只支持输出rgb24 32 565 三种,只显示当前的
HRESULT CFilter
::GetMediaType(int iPosition, CMediaType *pMediaType)
{
 if(m_pInput->IsConnected() == FALSE)
 {
  return E_UNEXPECTED;
 }
 if(iPosition < 0)
 {
  return E_INVALIDARG;
 }
 if(iPosition > 0)
 {
  return VFW_S_NO_MORE_ITEMS;
 }

 ASSERT (pMediaType) ;
 pMediaType->InitMediaType() ;

 pMediaType->SetType(&MEDIATYPE_Video) ;
 switch(mbmDes.bmBitsPixel)
 {
  case 24:
   pMediaType->SetSubtype(&MEDIASUBTYPE_RGB24);
   break;
  case 32:
   pMediaType->SetSubtype(&MEDIASUBTYPE_RGB32);
   break;
  case 16:
   pMediaType->SetSubtype(&MEDIASUBTYPE_RGB565);
  default:
   return VFW_S_NO_MORE_ITEMS;
 }
 RECT rcDest = {0};
 VIDEOINFO *pvi = (VIDEOINFO *) pMediaType->AllocFormatBuffer(sizeof(VIDEOINFO));
 ZeroMemory(pvi, sizeof(VIDEOINFO));

 pvi->bmiHeader.biCompression = BI_RGB;
 pvi->bmiHeader.biBitCount    = mbmDes.bmBitsPixel;
 pvi->bmiHeader.biSize       = sizeof(BITMAPINFOHEADER);
 pvi->bmiHeader.biWidth      = mbmDes.bmWidth;
 pvi->bmiHeader.biHeight     = mbmDes.bmHeight;
 pvi->bmiHeader.biPlanes     = 1;

 long llBufferSize = (mbmDes.bmWidth * mbmDes.bmBitsPixel + 31) / 32 * 4;
 llBufferSize *= abs(mbmDes.bmHeight);

 rcDest.right = mbmDes.bmWidth;
 rcDest.bottom = mbmDes.bmHeight;

 pvi->bmiHeader.biSizeImage  = llBufferSize;
 //SetRectEmpty(&(pvi->rcSource));
 memset(&(pvi->rcSource),0,sizeof(RECT));
 pvi->rcSource.right = mBmpInfo.biWidth;
 pvi->rcSource.bottom= mBmpInfo.biHeight;
 memcpy(&(pvi->rcTarget),&rcDest,sizeof(RECT));
 pMediaType->SetFormatType(&FORMAT_VideoInfo);
 //pmt->SetTemporalCompression(FALSE);
 pMediaType->SetSampleSize(pvi->bmiHeader.biSizeImage);

 return NOERROR;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值