msdn サンプルのほとんどのコードを使用して、メディア セッションで Sample Grabber Sink を使用しています。
OnProcessSample メソッドでは、データをメディア バッファーに memcpy し、MFSample にアタッチして、これをメイン プロセス ポインターに配置します。問題は、ntdll.dll でメモリ リークまたはクラッシュが発生することです。
ntdll.dll!@RtlpLowFragHeapFree@8() 不明
サンプルグラバーシンク:
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 のおかげでクリティカル セクションを使用して解決しました。