누구도 사용중인 모든 샘플을 제외하고 IMemAllocator:GetBuffer (Directshow)이 멈춘 이유를 아십니까?IMemAllocator : GetBuffer hang
나는 GMFBridge by Geraint Davies을 사용하여 두 개의 그래프를 연결하는 DirectShow 응용 프로그램을 가지고 있습니다. GMFBridge는 입력을 전환 할 수 있도록 사용되지만이 상황에서는 전환하지 않습니다. 응용 프로그램은 오디오 및 비디오를 캡처하고 그 일을 중단하지 않아야합니다. 그러나 약 10 시간 후에 그것은 멈춘다. 나는 두 오디오를 발견하고 비디오자는 IMemAllocator의 호출에 붙어있어 : GetBuffer : 모든 샘플이 사용중인 경우
/* _COM_SMARTPTR_TYPEDEF(IMemAllocator, IID_IMemAllocator); */
/* IMemAllocatorPtr m_pCopyAllocator; */
hr = m_pCopyAllocator->GetBuffer(&pOut, NULL, NULL, 0);
,이 기능을 차단할 수 있습니다, 그러나 나는 이러한 경우가 꽤 확신합니다. 이 함수를 호출하는 두 개의 스레드가 있습니다. 하나는 비디오 용이고 다른 하나는 오디오 샘플 용입니다. 오디오 스레드가 먼저 차단되고 GetBuffer가 거의 60 개의 비디오 샘플에 대한 버퍼를 반환 한 후에도 비디오 스레드가 차단됩니다. (약 2 초 후)
거의 8 시간이 지나면 두 스레드가 작은 시간 동안 계속됩니다. 첫 번째 오디오 스레드와 오디오 샘플의 45 버퍼가 반환 된 후에도 비디오 스레드는 차단 해제됩니다.
두 스레드가 동시에 차단하지 않기 때문에 모든 샘플이 사용 중인데 문제가없는 것으로 보입니다.
stacktrace는 그 순간에 quartz.dll이 호출되는 함수를 보여줍니다.
UPDATE
그것은 이미 PC에 설치된 디코더 필터에 의한 memoryleak 있었다처럼 보인다. 그래프는 mpeg의 디코딩, 예를 들어 오디오 디코딩은 사이버 링크 디코더를 사용했습니다. ffdshow를 설치 한 후 ffdshow 오디오 + 비디오 디코더가 대신 사용되어 문제가 사라진 것처럼 보입니다. 교훈은 기존 필터에 자동으로 의존하지 말라는 것입니다.
xx, 시도해보십시오. – wimh
추가 조사 결과 어딘가에 메모리 누수가 있음을 보여줍니다. GetBuffer가 중단되는 이유를 설명합니다. 먼저 신청서를 확인하러 갈 것입니다. memoryleak이 GMFBridge에 의한 것이라고 생각하면 연락 드리겠습니다. 여기에 회신 해 주셔서 감사합니다. – wimh
PC에 설치된 다른 소프트웨어의 DirectShow 필터가 메모리 누수를 일으킨 것 같습니다. 따라서 GMFBridge와 완전히 관련이 없습니다. 방금 문제가 나타났습니다. – wimh