2013-03-11 116 views
0

我在我的媒体会话中使用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.

回答

1

这是不容易看到是从代码段,但我想你正在燃烧一个流线程上的循环(你有你的回调调用),直到一个全局/共享变量是NULL,然后你在那里复制一个媒体样本。

您需要查看同步API并序列化对共享变量的访问。你不这样做,并最终要么访问释放的内存或COM对象的引用计数。

当您准备接受来自回调的新缓冲区时,您需要一个外部事件集,然后回调看到事件,进入关键部分(或读写器锁定),在那里执行魔法,退出关键部分并设置指示缓冲区可用性的另一事件。

+0

好点。我会尝试。起初,我甚至没有免费的变种。我对这方面的知识还不太了解,但我们将在统一学习IPC这个术语。 – LeonidasCZ 2013-03-11 17:33:14

+0

首先将所有与'pSa​​mple'相关的代码都包含在临界区中,以避免2个线程同时访问它。 – 2013-03-11 17:41:27

+0

是的。我已经在你的答案之后尝试了关键部分,它似乎就是这样。现在运行时间没有崩溃和记忆似乎也没有问题。我不知道我怎么能不想同步。傻我:-)谢谢 – LeonidasCZ 2013-03-11 19:43:01

相关问题