2013-03-11 47 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

相關問題