2010-08-13 5 views
1

누구도 사용중인 모든 샘플을 제외하고 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 오디오 + 비디오 디코더가 대신 사용되어 문제가 사라진 것처럼 보입니다. 교훈은 기존 필터에 자동으로 의존하지 말라는 것입니다.

답변

1

주어진 정보에서 디버깅 할 수 있는지 확실하지 않습니다. 로그 파일을 만들 수 있습니까 (빈 파일 c : \ gmfbridge.txt를 만들고 중단 될 때까지 실행 한 다음 파일을 압축하여 전자 메일로 보낼 수 있습니까). 또한 심볼을 _NT_SYMBOL_PATH로 설정하면 스택 추적을보고 quartz.dll의 다양한 스레드가있는 위치를 확인할 수 있습니다.

g

+0

xx, 시도해보십시오. – wimh

+0

추가 조사 결과 어딘가에 메모리 누수가 있음을 보여줍니다. GetBuffer가 중단되는 이유를 설명합니다. 먼저 신청서를 확인하러 갈 것입니다. memoryleak이 GMFBridge에 의한 것이라고 생각하면 연락 드리겠습니다. 여기에 회신 해 주셔서 감사합니다. – wimh

+0

PC에 설치된 다른 소프트웨어의 DirectShow 필터가 메모리 누수를 일으킨 것 같습니다. 따라서 GMFBridge와 완전히 관련이 없습니다. 방금 문제가 나타났습니다. – wimh

관련 문제