我在我的媒体会话中使用Sample Grabber Sink使用msdn示例中的大部分代码。Sample Grabber Sink release()问题
在OnProcessSample方法中,我将memcpy数据添加到媒体缓冲区,将其附加到MFSample并将其放入主进程指针。问题是,我要么得到内存泄漏或崩溃ntdll.dll中
ntdll.dll中@ RtlpLowFragHeapFree @ 8()未知
SampleGrabberSink:
在主线程OnProcessSample(...)
{
MFCreateMemoryBuffer(dwSampleSize,&tmpBuff);
tmpBuff->Lock(&data,NULL,NULL);
memcpy(data,pSampleBuffer,dwSampleSize); tmpBuff->Unlock();
MFCreateSample(&tmpSample);
tmpSample->AddBuffer(tmpBuff);
while(!(*Free) && (*pSample)!=NULL)
{
Sleep(1);
}
(*Free)=false;
(*pSample)=tmpSample;
(*Free)=true;
SafeRelease(&tmpBuff);
}
ReadSample()
{
if(pSample==NULL)
return;
while(!Free)
Sleep(1);
Free=false;
//process sample into dx surface//
SafeRelease(&pSample);
Free=true;
}
//小时检查省略// 有了这个鳕鱼e我在播放几个vids后得到ntdll.dll错误。 我也尝试推送样品,所以OnProcess不必等待,但视频结束后,一些内存还没有空闲。 (即使现在practicaly不等待,会话速率为1,主要工艺能够比60fps的读更多)
编辑:这是线程同步问题。通过使用critical section解决方法感谢罗马R.
好点。我会尝试。起初,我甚至没有免费的变种。我对这方面的知识还不太了解,但我们将在统一学习IPC这个术语。 – LeonidasCZ 2013-03-11 17:33:14
首先将所有与'pSample'相关的代码都包含在临界区中,以避免2个线程同时访问它。 – 2013-03-11 17:41:27
是的。我已经在你的答案之后尝试了关键部分,它似乎就是这样。现在运行时间没有崩溃和记忆似乎也没有问题。我不知道我怎么能不想同步。傻我:-)谢谢 – LeonidasCZ 2013-03-11 19:43:01