2017-03-28 8 views
1

CaptureGraphBuilder를 사용하여 렌더링되는 자체 소스 필터로 구성된 DirectShow 그래프가 있습니다. 미리보기 모드에서 그래프의 결과는 [소스] -> [스마트 티] - (미리보기) -> [디코더] -> [렌더러]입니다. 자체 필터에는 맞춤 할당자가 있으며 SmartTee에이를 알립니다. 지금 종료하면 모든 오브젝트가 해제됩니다.사용자 지정 원본과 SmartTee 누수 사이에 필터 삽입 COM 개체

이제 우리는 우리 자신의 소스 필터와 SmartTee 필터 사이에 필터를 삽입하려고합니다. 새롭게 작성된 필터를 소스 필터에 접속하면, 소스 필터에 새로운 할당자가 작성됩니다. SmartTee 필터에 새로운 필터 (출력 핀 자체에 맞춤 할당기를 제안 할 것임)를 연결할 때 SmartTee는 소스와 SmartTee 간의 첫 번째 연결에서 생성 된 할당자를 제안합니다. 그러나 SmartTee는 BreakConnect 때문에이 할당자를 제거해야합니다. 이제 응용 프로그램을 종료하면 첫 번째 연결에서 작성된 할당자인 하나의 나머지 소스 할당 자 객체가 생성됩니다.

삽입 된 필터와 함께 삽입 필터에는 출력 핀에 할당자를 제안하는 InitAllocator 함수가 있습니다.

답변

0

CBaseOutputPin 클래스에서 DecideAllocator 함수의 소스를 확인할 수 있습니다. 출력 핀은 할당자를 선택합니다. https://msdn.microsoft.com/en-us/library/windows/desktop/dd390924(v=vs.85).aspx CBaseOutputPin은, 입력 핀의 GetAllocator를 호출 해, 입력이 자신의 할당자를 제공하고 있을지 어떨지를 판정한다. 출력 핀에 할당자를 제공하려면, CBaseOutputPin :: InitAllocator 메서드를 오버라이드 (override) 해, 할당 자의 인스턴스를 생성한다. https://msdn.microsoft.com/en-us/library/windows/desktop/dd377477(v=vs.85).aspx 이 시점에서 할당자가 사용되어야하고, 출력 핀은 IMemInputPin :: NotifyAllocator를 호출하여 선택. NotifyAllocator가 에러를 돌려주는 경우, 할당자는 해방됩니다. 출력 핀을 CBaseOutputPin에 기반을두고 DecideAllocator 메서드를 대체 했습니까?

+0

내가 해봤지만, 비디오 렌더러가 제안한 할당자를 재정의하지 않으면 작동한다. (이 할당 자 협상은 사용자 정의 기본 클래스에서 수행된다.) 하지만 슬프게도 이것은 미리보기 모드에서만 작동합니다. 캡처 및 미리보기의 경우 누수가 제거되지 않습니다. –

+0

할당 자 내부에 누수가있을 수 있습니다. – VuVirt

+0

물론, ref 카운트가 0에 도달 할 때 할당자가 해제되지 않기 때문에 물론. –