我在我的媒體會話中使用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