2,554
社区成员
发帖
与我相关
我的任务
分享
hr = m_pGraph.CoCreateInstance( CLSID_FilterGraph );
hr = m_pGraph->AddFilter( pCap, L"Cap" );
hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
hr = m_pGrabber->SetMediaType( &VideoType ); // shouldn't fail
hr = m_pGraph->AddFilter( pGrabBase, L"Grabber" );
CComPtr<ICaptureGraphBuilder2> pCGB2;
hr = pCGB2.CoCreateInstance (CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC);
hr = pCGB2->SetFiltergraph( m_pGraph );
IAMStreamConfig *pVSC; // for video cap
hr = pCGB2->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Interleaved,
pCap, IID_IAMStreamConfig, (void **)&pVSC);
if(hr != NOERROR)
{
hr = pCGB2->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video, pCap,
IID_IAMStreamConfig, (void **)&pVSC);
}
AM_MEDIA_TYPE *pmt;
hr = pVSC->GetFormat(&pmt);
// DV capture does not use a VIDEOINFOHEADER
if(hr == NOERROR)
{
if(pmt->formattype == FORMAT_VideoInfo)
{
VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *)pmt->pbFormat;
if(m_nVideoQualityMode)
pvi->AvgTimePerFrame = (LONGLONG)(10000000 / m_nVideFrameRate);
...
hr = pVSC->SetFormat(pmt);
}
DeleteMediaType(pmt);
}
hr = pCGB2->RenderStream(
&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Interleaved,
pCap,
pGrabBase,
pRenderer);
if (FAILED (hr))
{
// try to render preview pin
hr = pCGB2->RenderStream(
&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video,
pCap,
pGrabBase,
pRenderer);
// try to render capture pin
if( FAILED( hr ) )
{
hr = pCGB2->RenderStream(
&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video,
pCap,
pGrabBase,
pRenderer);
}
}
AM_MEDIA_TYPE mt;
hr = m_pGrabber->GetConnectedMediaType( &mt );
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
vih->bmiHeader.biSize=m_BmpU->bmiHeader.biSize;
vih->bmiHeader.biWidth=m_BmpU->bmiHeader.biWidth;
vih->bmiHeader.biHeight=m_BmpU->bmiHeader.biHeight;
vih->bmiHeader.biPlanes=m_BmpU->bmiHeader.biPlanes;
vih->bmiHeader.biBitCount=m_BmpU->bmiHeader.biBitCount;
vih->bmiHeader.biSizeImage=m_BmpU->bmiHeader.biSizeImage;
m_pGrabber->SetMediaType(&mt);
mCB.pOwner = this;
mCB.lWidth = vih->bmiHeader.biWidth;
mCB.lHeight = vih->bmiHeader.biHeight;
FreeMediaType( mt );
hr = m_pGrabber->SetBufferSamples( FALSE );
hr = m_pGrabber->SetOneShot( FALSE );
hr = m_pGrabber->SetCallback( &mCB, 1 );
CComQIPtr< IVideoWindow, &IID_IVideoWindow > pWindow = m_pGraph;
hr = pWindow->put_Owner( (OAHWND) m_VideoWnd );
..
CComQIPtr< IMediaControl, &IID_IMediaControl > pControl = m_pGraph;
hr = pControl->Run( );
.