DirectShow吐血大送分!!!
noho 2001-05-29 03:18:00
HRESULT CMovieWindow::InitMultiMedia()
{
ASSERT(m_pDD3);
ASSERT(m_pMMStream==NULL);
ASSERT(m_pEvent==NULL);
IGraphBuilder * pGB=NULL;
HRESULT hr=S_OK;
//Create the AMMultiMediaStream object
hr =CoCreateInstance(__uuidof(AMMultiMediaStream),
NULL, CLSCTX_INPROC_SERVER,
__uuidof(IAMMultiMediaStream), (void **)&m_pMMStream);
if(FAILED(hr))
return hr;
//Initialize stream
hr = m_pMMStream->Initialize(STREAMTYPE_READ, 0, NULL);
if(FAILED(hr))
{
m_pMMStream->Release();
m_pMMStream=NULL;
return hr;
}
//Add primary video stream
hr = m_pMMStream->AddMediaStream(m_pDD3, &MSPID_PrimaryVideo, 0, NULL);
if(FAILED(hr))
{
m_pMMStream->Release();
m_pMMStream=NULL;
return hr;
}
//Add primary audio stream
hr = m_pMMStream->AddMediaStream(NULL, &MSPID_PrimaryAudio,
AMMSF_ADDDEFAULTRENDERER, NULL);
if(FAILED(hr))
{
m_pMMStream->Release();
return hr;
m_pMMStream=NULL;
}
hr=m_pMMStream->GetFilterGraph(&pGB);
if(FAILED(hr))
{
m_pMMStream->Release();
m_pMMStream=NULL;
return hr;
}
hr=pGB->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent);
pGB->Release();
if(m_pEvent)
{
m_pEvent->SetNotifyFlags(0 );
// m_pEvent->CancelDefaultHandling(EC_REPAINT);
}
return hr;
}
HANDLE CMovieWindow::GetMultiMediaEvent()
{
HANDLE hEvent=NULL;
if(m_pEvent)
{
m_pEvent->GetEventHandle((OAEVENT*) &hEvent);
}
return hEvent;
}
m_hCopyEvent=GetMultiMediaEvent();
while(::WaitForSingleObjectEx(m_hCopyEvent, 40, TRUE)!=WAIT_OBJECT_0)
{
if(m_bExit)
break;
}
if(m_bExit)
break;
if(SUCCEEDED(m_pEvent->GetEvent(&evCode, ¶m1, ¶m2, 0)))
{
TRACE(_T("Event: 0x%X\n"), evCode);
if ((EC_COMPLETE == evCode) || (EC_USERABORT == evCode))
{
StopCopyAndDraw();
}
else if (EC_REPAINT == evCode)
{
Copy();
::SetEvent(m_hDrawEvent);
}
m_pEvent->FreeEventParams(evCode, param1, param2);
}
WaitForSingleObjectEx 总是返回 WAIT_TIMEOUT.
请问为什么?
And how to get notification when a new frame in the movie need to be draw?