您的位置:首页 > 其它

DirectShow H264 Source Filter中 PushPin的MediaType设置

2011-06-15 16:58 991 查看
在连接Source Filter和H264 decoder时,decoder会检查source filter的media type,若匹配,则连接成功。下面的设置经过测试可以正常连接,并且解码器能解出图像。decoder使用DivX H264 Decoder。

HRESULT CPushPinRTP::GetMediaType(CMediaType *pmt)
{
CheckPointer(pmt,E_POINTER);
CAutoLock cAutoLock(m_pFilter->pStateLock());
VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
if (NULL == pvi)
return(E_OUTOFMEMORY);
ZeroMemory(pvi, sizeof(VIDEOINFOHEADER));
pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
//pvi->bmiHeader.biCompression = 0x31435641; //AVC1
pvi->bmiHeader.biCompression = 0x34363248; //H264
pvi->bmiHeader.biBitCount = 24;
pvi->bmiHeader.biPlanes = 1;
pvi->bmiHeader.biWidth = 1024;
pvi->bmiHeader.biHeight = 720;
pvi->AvgTimePerFrame = (UNITS/MILLISECONDS)*(LONGLONG)(UNITS/FPS_30);
SetRectEmpty(&(pvi->rcSource)); // we want the whole image area rendered.
SetRectEmpty(&(pvi->rcTarget)); // no particular destination rectangle
pmt->SetType(&MEDIATYPE_Video);
pmt->SetFormatType(&FORMAT_VideoInfo);
pmt->SetTemporalCompression(TRUE);
//pmt->SetSubtype(&MEDIASUBTYPE_AVC1);
pmt->SetSubtype(&MEDIASUBTYPE_H264);
pmt->SetVariableSize();
return NOERROR;
} // GetMediaType


其中pvi->bmiHeader.biCompression = 0x31435641; //AVC1表示source filter传给解码器的是没有加start code即0x00 0x00 0x00 0x01的NALU数据,此时subtype要选MEDIASUBTYPE_AVC1;pvi->bmiHeader.biCompression = 0x34363248; //H264表示传给解码器的是有start code的NALU,subtype要选MEDIASUBTYPE_H264。

MEDIASUBTYPE_AVC1和MEDIASUBTYPE_H264的GUID值定义如下:

// 31435641-0000-0010-8000-00AA00389B71

DEFINE_GUID(MEDIASUBTYPE_AVC1,

0x31435641, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);

// 34363248-0000-0010-8000-00aa00389b71

DEFINE_GUID(MEDIASUBTYPE_H264,

0x34363248, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: