seeking问题
我在source filter的pin上继承了CSourceSeeking,可以正常播放,现在想实现seeking的功能。
ChangeStart(),ChangeStop(),UpdateFromSeek()等函数都参照msdn上ball的方法实现。
因为我在video transform filter中有个bufferlist,所以需要在BegainFlush中进行flush操作。由于receive()和Flush函数都会对bufferlist进行操作,所以尝试使用Transform Filter基类中的 CCritSec m_csReceive 来进行lock。但是发现在flush()函数中只要一加这把锁,程序在seeking时就会死在那边。我也尝试过使用自定义的CCritSec object,但是还是会死掉。从基类上看,如果我在flush中使用m_csReceive来进行lock,那么receive和flush就应该是串行了,应该不会有问题,奇怪了。
HRESULT DecoderFilter::flush()
{
HRESULT hr = S_OK;
ra_buffer * pTemp = NULL;
CAutoLock lck(&m_csReceive);
/*Flush the framebuffer list*/
while(framebuffer.pOutBufList)
{
/*flush this buffer list*/
}
DEBUGMSG(1,(TEXT("flush()! \r\n")));
return hr;
}
HRESULT DecodeFilter::BeginFlush(void)
{
HRESULT hr = NOERROR;
if (m_pOutput != NULL)
{
// block receives -- done by caller (CBaseInputPin::BeginFlush)
// discard queued data -- we have no queued data
hr = flush();
if(FAILED(hr))
{
return hr;
}
// free anyone blocked on receive - not possible in this filter
// call downstream
hr = m_pOutput->DeliverBeginFlush();
}
return hr;
}
还有就是如果不加锁的话,flush的同时receive并不能被block住。
高手帮忙看看一下,谢谢了!