CBaseInputPin.Receive 메서드

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

메서드는 Receive 스트림에서 다음 미디어 샘플을 받습니다. 이 메서드는 IMemInputPin::Receive 메서드를 구현합니다.

구문

HRESULT Receive(
   IMediaSample *pSample
);

매개 변수

pSample

샘플의 IMediaSample 인터페이스에 대한 포인터입니다.

반환 값

HRESULT 값을 반환합니다. 가능한 값에는 다음 표에 나열된 값이 포함됩니다.

반환 코드 Description
S_OK
성공.
S_FALSE
핀이 현재 플러시되고 있습니다. 샘플이 거부되었습니다.
E_POINTER
NULL 포인터 인수입니다.
VFW_E_INVALIDMEDIATYPE
미디어 유형이 잘못되었습니다.
VFW_E_RUNTIME_ERROR
런타임 오류가 발생했습니다.
VFW_E_WRONG_STATE
핀이 중지되었습니다.

설명

업스트림 출력 핀은 이 메서드를 호출하여 입력 핀에 샘플을 전달합니다. 입력 핀은 다음 중 하나를 수행해야 합니다.

  • 반환하기 전에 샘플을 처리합니다.
  • 작업자 스레드에서 샘플을 반환하고 처리합니다.
  • 샘플을 거부합니다.

핀이 작업자 스레드를 사용하여 샘플을 처리하는 경우 이 메서드 내의 샘플에 참조 횟수를 추가합니다. 메서드가 반환되면 업스트림 핀이 샘플을 해제합니다. 샘플의 참조 수가 0에 도달하면 샘플은 다시 사용하기 위해 할당자로 돌아갑니다.

이 메서드는 동기적이며 차단할 수 있습니다. 메서드가 차단될 수 있는 경우 핀의 CBaseInputPin::ReceiveCanBlock 메서드는 S_OK 반환해야 합니다.

기본 클래스에서 이 메서드는 다음 단계를 수행합니다.

  1. CBaseInputPin::CheckStreaming 메서드를 호출하여 핀이 지금 샘플을 처리할 수 있는지 확인합니다. 예를 들어 핀이 중지되면 메서드가 실패합니다.
  2. 샘플 속성을 검색하고 형식이 변경되었는지 확인합니다(아래 참조).
  3. 형식이 변경된 경우 메서드는 CBasePin::CheckMediaType 메서드를 호출하여 새 형식이 허용되는지 여부를 확인합니다.
  4. 새 형식이 허용되지 않는 경우 메서드는 CBasePin::EndOfStream 메서드를 호출하고, EC_ERRORABORT 이벤트를 게시하고, 오류 코드를 반환합니다.
  5. 오류가 없다고 가정하면 메서드는 S_OK 반환합니다.

다음과 같이 형식 변경을 테스트합니다.

  • 샘플이 IMediaSample2 인터페이스를 지원하는 경우 AM_SAMPLE2_PROPERTIES 구조체의 dwSampleFlags 멤버를 검사. AM_SAMPLE_TYPECHANGED 플래그가 있으면 형식이 변경됩니다.
  • 그렇지 않으면 샘플에서 IMediaSample2를 지원하지 않는 경우 IMediaSample::GetMediaType 메서드를 호출합니다. 메서드가 NULL 이 아닌 값을 반환하면 형식이 변경됩니다.

기본 클래스에서 이 메서드는 샘플을 처리하지 않습니다. 파생 클래스는 처리를 수행하려면 이 메서드를 재정의해야 합니다. (이 작업을 수반하는 것은 전적으로 필터에 따라 달라집니다.) 파생 클래스는 앞에서 설명한 오류를 검사 위해 기본 클래스 메서드를 호출해야 합니다.

요구 사항

요구 사항
헤더
Amfilter.h(Streams.h 포함)
라이브러리
Strmbase.lib(소매 빌드);
Strmbasd.lib(디버그 빌드)

추가 정보

CBaseInputPin 클래스