CBaseInputPin.Receive 메서드
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
메서드는 Receive
스트림에서 다음 미디어 샘플을 받습니다. 이 메서드는 IMemInputPin::Receive 메서드를 구현합니다.
구문
HRESULT Receive(
IMediaSample *pSample
);
매개 변수
-
pSample
-
샘플의 IMediaSample 인터페이스에 대한 포인터입니다.
반환 값
HRESULT 값을 반환합니다. 가능한 값에는 다음 표에 나열된 값이 포함됩니다.
반환 코드 | Description |
---|---|
|
성공. |
|
핀이 현재 플러시되고 있습니다. 샘플이 거부되었습니다. |
|
NULL 포인터 인수입니다. |
|
미디어 유형이 잘못되었습니다. |
|
런타임 오류가 발생했습니다. |
|
핀이 중지되었습니다. |
설명
업스트림 출력 핀은 이 메서드를 호출하여 입력 핀에 샘플을 전달합니다. 입력 핀은 다음 중 하나를 수행해야 합니다.
- 반환하기 전에 샘플을 처리합니다.
- 작업자 스레드에서 샘플을 반환하고 처리합니다.
- 샘플을 거부합니다.
핀이 작업자 스레드를 사용하여 샘플을 처리하는 경우 이 메서드 내의 샘플에 참조 횟수를 추가합니다. 메서드가 반환되면 업스트림 핀이 샘플을 해제합니다. 샘플의 참조 수가 0에 도달하면 샘플은 다시 사용하기 위해 할당자로 돌아갑니다.
이 메서드는 동기적이며 차단할 수 있습니다. 메서드가 차단될 수 있는 경우 핀의 CBaseInputPin::ReceiveCanBlock 메서드는 S_OK 반환해야 합니다.
기본 클래스에서 이 메서드는 다음 단계를 수행합니다.
- CBaseInputPin::CheckStreaming 메서드를 호출하여 핀이 지금 샘플을 처리할 수 있는지 확인합니다. 예를 들어 핀이 중지되면 메서드가 실패합니다.
- 샘플 속성을 검색하고 형식이 변경되었는지 확인합니다(아래 참조).
- 형식이 변경된 경우 메서드는 CBasePin::CheckMediaType 메서드를 호출하여 새 형식이 허용되는지 여부를 확인합니다.
- 새 형식이 허용되지 않는 경우 메서드는 CBasePin::EndOfStream 메서드를 호출하고, EC_ERRORABORT 이벤트를 게시하고, 오류 코드를 반환합니다.
- 오류가 없다고 가정하면 메서드는 S_OK 반환합니다.
다음과 같이 형식 변경을 테스트합니다.
- 샘플이 IMediaSample2 인터페이스를 지원하는 경우 AM_SAMPLE2_PROPERTIES 구조체의 dwSampleFlags 멤버를 검사. AM_SAMPLE_TYPECHANGED 플래그가 있으면 형식이 변경됩니다.
- 그렇지 않으면 샘플에서 IMediaSample2를 지원하지 않는 경우 IMediaSample::GetMediaType 메서드를 호출합니다. 메서드가 NULL 이 아닌 값을 반환하면 형식이 변경됩니다.
기본 클래스에서 이 메서드는 샘플을 처리하지 않습니다. 파생 클래스는 처리를 수행하려면 이 메서드를 재정의해야 합니다. (이 작업을 수반하는 것은 전적으로 필터에 따라 달라집니다.) 파생 클래스는 앞에서 설명한 오류를 검사 위해 기본 클래스 메서드를 호출해야 합니다.
요구 사항
요구 사항 | 값 |
---|---|
헤더 |
|
라이브러리 |
|