CBaseStreamControl.CheckStreamState 메서드
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
메서드는 CheckStreamState
미디어 샘플을 배달할지 아니면 삭제해야 하는지를 결정합니다.
구문
enum CheckStreamState(
IMediaSample *pSample
);
매개 변수
-
pSample
-
샘플의 IMediaSample 인터페이스에 대한 포인터입니다.
반환 값
다음 값 중 하나를 반환합니다.
반환 코드 | 설명 |
---|---|
|
이 샘플을 삭제합니다. |
|
이 샘플을 제공합니다. |
설명
핀이 샘플을 받으면 이 메서드를 호출합니다. 반환 값이 STREAM_FLOWING 경우에만 샘플을 제공합니다. 반환 값이 STREAM_DISCARDING 경우 샘플을 삭제합니다.
핀이 샘플을 삭제하는 경우 IMediaSample::SetDiscontinuity 메서드를 호출하여 제공하는 다음 샘플을 불연속성으로 표시해야 합니다.
필터가 IAMDroppedFrames 인터페이스를 구현하여 삭제되는 프레임 수를 계산하는 경우 삭제된 프레임을 삭제된 프레임으로 계산하지 마세요.
반환 값이 STREAM_DISCARDING 경우 메서드는 참조 시간이 샘플의 시작 시간에 도달할 때까지 차단합니다. 이렇게 하면 핀이 샘플을 너무 빨리 삭제할 수 없습니다. 필터가 일시 중지되면 필터가 실행, 중지 또는 데이터를 플러시할 때까지 대기 시간이 무한합니다. (필터 상태 변경 및 스트리밍은 별도의 스레드에서 발생하므로 교착 상태가 발생하지 않습니다.)
CBaseStreamControl::StreamControlState 열거형은 다음과 같이 정의됩니다.
enum StreamControlState{
STREAM_FLOWING = 0x1000,
STREAM_DISCARDING
};
예제
다음 예제에서는 핀이 m_fLastSampleDiscarded 라는 멤버 변수를 사용하여 불연속성을 추적한다고 가정합니다.
CMyPin::Receive(IMediaSample *pSample)
{
if (!pSample) return E_POINTER;
int iStreamState = CheckStreamState(pSample);
if (iStreamState == STREAM_FLOWING)
{
if (m_fLastSampleDiscarded)
pSample->SetDiscontinuity(TRUE);
m_fLastSampleDiscarded = FALSE;
/* Deliver the sample. */
}
else
{
m_fLastSampleDiscarded = TRUE;
// Discard this sample. Do not deliver it.
}
}
요구 사항
요구 사항 | 값 |
---|---|
헤더 |
|
라이브러리 |
|