24,854
社区成员
发帖
与我相关
我的任务
分享
……
class CSampleGrabberCB : public ISampleGrabberCB
{
public:
STDMETHODIMP_(ULONG) AddRef() { return 2; }
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
{
if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown )
{
*ppv = (void *) static_cast<ISampleGrabberCB*> ( this );
return NOERROR;
}
return E_NOINTERFACE;
}
STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample )
{
return 0;
}
STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )
{
memcpy(g_capDate, pBuffer, lBufferSize);
return 0;
}
};
……
// create a sample grabber
m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );
CMediaType VideoType;
VideoType.SetType( &MEDIATYPE_Video );
VideoType.SetSubtype( &MEDIASUBTYPE_RGB24 );
m_pGrabber->SetMediaType( &VideoType );
m_pGraph->AddFilter( pGrabBase, L"Grabber" );
// find the two pins and connect them
IPin * pCapOut = GetOutPin( pCap, 0 );
IPin * pGrabIn = GetInPin( pGrabBase, 0 );
m_pGraph->Connect( pCapOut, pGrabIn );
// ask for the connection media type so we know how big
// it is, so we can write out bitmaps
AM_MEDIA_TYPE mt;
m_pGrabber->GetConnectedMediaType( &mt );
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
m_Width = vih->bmiHeader.biWidth;
m_Height = vih->bmiHeader.biHeight;
g_dateLen = m_Height*m_Width*3;
……
理论上一个IP包最大可能有65535字。而UDP是基于IP的,去掉IP头(至少20字节),UDP头(8字节),这样理论上一个UDP包最多就只能发送65507个字节。但在TCP/IP协议栈实际的实现中,很少有达到这个数目的。而且考虑到网络的MTU大小(一般的以太网为1500字节),IP会将大的数据包分段。这样如果数据包过大,将会被分成许多段,这许多段只要有一个在传输过程中出了问题,整个UDP包就会丢失。因此,建议在使用UDP协议时,每次发送的数据量不宜太大,通常以不超过本地的MTU为宜。( MTU is Maxium Transmission Unit. )