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

CBaseInputPin::Receive

Receive 메서드는, 스트림내의 다음의 미디어 샘플을 받는다. 이 메서드는 IMemInputPin::Receive 메서드를 처리 한다.

구문

HRESULT Receive(
    IMediaSample *pSample
);

파라미터

pSample

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

반환값

HRESULT 값을 돌려준다. 다음의 몇개의 값을 돌려준다.

설명
S_OK 성공.
S_FALSE 핀은 현재 플래시중이다. 샘플은 거부되었다.
E_POINTER NULL 포인터 인수.
VFW_E_INVALIDMEDIATYPE 무효인 미디어 타입.
VFW_E_RUNTIME_ERROR 실행시 에러가 발생했다.
VFW_E_WRONG_STATE 핀은 정지하고 있다.

주의

업 스트림의 출력 핀은 이 메서드를 호출해, 입력 핀에 샘플을 출력한다. 입력 핀은 다음의 몇개의 처리를 실행할 필요가 있다.

핀이 워커 thread를 사용해 샘플을 처리하는 경우는, 이 메서드내의 샘플에의 참조 카운트를 추가한다. 이 메서드가 돌아온 다음에, 업 스트림의 핀은 샘플을 릴리즈 한다. 샘플의 참조 카운트가 제로가 되면 샘플은 재사용을 위해서(때문에) 할당자에 되돌려진다.

이 메서드는 동기이며, 블록 할 수 있다. 메서드가 블록 했을 경우는, 핀의 CBaseInputPin::ReceiveCanBlock 메서드가 S_OK 를 돌려준다.

base class에서는, 이 메서드는 다음의 스텝을 실행한다.

  1. CBaseInputPin::CheckStreaming 메서드를 호출해, 핀이 샘플을 지금 처리할 수 있는 것을 검증한다. 처리할 수 없는 경우 (예를 들어 핀이 정지중), 메서드는 실패한다.
  2. 샘플 프로퍼티를 취득해, 포맷이 변경되었는지 어떠했는지를 체크한다 (다음을 참조).
  3. 포맷이 변경되고 있는 경우, 메서드는 CBasePin::CheckMediaType 메서드를 호출해, 새로운 포맷이 받아들이고 가능한가 어떤가를 조사한다.
  4. 새로운 포맷이 받아들이고 가능하지 않은 경우, 메서드는 CBasePin::EndOfStream 메서드를 호출해, EC_ERRORABORT 이벤트를 송신해, 에러 코드를 돌려준다.
  5. 에러가 없으면, 메서드는 S_OK 를 돌려준다.

포맷 변경에 대한 테스트는 다음과 같이 실시한다.

base class에서는, 이 메서드는 샘플을 처리하지 않는다. 상속 클래스로 이 메서드를 오버라이드(override) 해 처리를 실행할 필요가 있다. 처리의 내용은 필터에 완전하게 의존한다. 상속 클래스로 base class의 메서드를 호출해, 전술의 에러의 유무를 체크할 필요가 있다.

참조

↑TOP