DirectShow DirectShow 레퍼런스 DirectShow base class base class 레퍼런스 CBaseOutputPin Deliver   [목차열람] [주소복사] [슬롯비우기]
CBaseOutputPin::Deliver
 
Microsoft DirectX 9.0

CBaseOutputPin::Deliver

Deliver 메서드는, 접속되고 있는 입력 핀에 미디어 샘플을 출력한다.

구문

virtual HRESULT Deliver(
    IMediaSample *pSample
);

파라미터

pSample

샘플의 IMediaSample 인터페이스의 포인터.

반환값

HRESULT 값을 돌려준다. 가능한 값은 다음의 일람대로이다.

설명
S_OK 성공.
VFW_E_NOT_CONNECTED 핀이 접속되지 않다.

주의

이 메서드는 입력 핀의 IMemInputPin::Receive 메서드를 호출한다. IMemInputPin::ReceiveCanBlock 메서드가 S_OK 를 돌려준다면,Receive 는 블록 할 가능성이 있다.

이 메서드를 호출한 다음에, 샘플을 릴리즈 하는 것. 입력 핀은 샘플의 참조 카운트를 가진 채로이므로, 샘플을 재사용해서는 안 된다. 반드시 CBaseOutputPin::GetDeliveryBuffer 메서드를 호출해, 새로운 샘플을 얻어온다.

이 메서드를 호출하기 전에 필터의 크리티컬 섹션을 보관 유지해 두는 것. 그렇게 하지 않으면 그 핀은 메서드 호출중에 접속 해제될 가능성이 있다. 필터가 워커 thread를 사용해 샘플을 출력하는 경우는, 필터가 샘플을 출력 가능하게 되었을 때에 크리티컬 섹션을 보관 유지하도록(듯이) 하는 것. 그렇게 하지 않는 경우는, 필터의 IMemInputPin::Receive 메서드로 크리티컬 섹션을 보관 유지할 수가 있다. 필터는 이 메서드로 샘플을 처리한다.

워커 thread에 의해 데드 록이 발생할 가능성이 있다. thread가 크리티컬 섹션을 보관 유지 할 때 필터 상태 처리을 기다리는 경우가 있다. 동시에, 상태 처리은 thread가 완료하는 것을 기다리고 있을 가능성이 있다. 이것을 피하기 위해서(때문에), 상태 처리 코드에서는 thread를 끝내는 이벤트를 통지해, 다음에 thread가 완료를 통지할 때까지 기다리는 것.

참조

↑TOP