我使用来自 msdn 示例的大部分代码在我的媒体会话中使用 Sample Grabber Sink。
在 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;
}
//hr 检查省略// 使用这段代码,我在播放几个视频后得到了 ntdll.dll 错误。我还尝试在队列中推送样本,这样 OnProcess 就不必等待,但是在视频结束后一些内存还没有释放。(即使现在它实际上也不等待,会话速率为 1,主进程可以读取超过 60fps)
编辑:这是线程同步问题。多亏了 Roman R ,通过使用临界区来解决。