다음을 통해 공유


CBaseStreamControl.CheckStreamState 메서드

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

메서드는 CheckStreamState 미디어 샘플을 배달할지 아니면 삭제해야 하는지를 결정합니다.

구문

enum CheckStreamState(
   IMediaSample *pSample
);

매개 변수

pSample

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

반환 값

다음 값 중 하나를 반환합니다.

반환 코드 설명
STREAM_DISCARDING
이 샘플을 삭제합니다.
STREAM_FLOWING
이 샘플을 제공합니다.

설명

핀이 샘플을 받으면 이 메서드를 호출합니다. 반환 값이 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.
    }
}

요구 사항

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

추가 정보

CBaseStreamControl 클래스