다음을 통해 공유


CSourceSeeking 클래스

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

csourceseeking 클래스 계층 구조

CSourceSeeking 클래스는 하나의 출력 핀을 사용하여 원본 필터에서 검색을 구현하기 위한 추상 클래스입니다.

이 클래스는 IMediaSeeking 인터페이스를 지원합니다. 모든 IMediaSeeking 메서드에 대한 기본 구현을 제공합니다. 보호된 멤버 변수는 시작 시간, 중지 시간 및 현재 속도를 저장합니다. 기본적으로 클래스에서 지원하는 유일한 시간 형식은 TIME_FORMAT_MEDIA_TIME (100나노초 단위)입니다. 자세한 내용은 설명 부분을 참조하십시오.

보호된 멤버 변수 Description
m_rtDuration 스트림의 기간입니다.
m_rtStart 시작 시간
m_rtStop 중지 시간.
m_dRateSeeking 재생 속도.
m_dwSeekingCaps 기능을 검색합니다.
m_pLock 잠금을 위한 중요한 섹션 개체에 대한 포인터입니다.
Protected 메서드 Description
CSourceSeeking 생성자 메서드입니다.
순수 가상 메서드 Description
ChangeRate 재생 속도가 변경되면 호출됩니다.
ChangeStart 시작 위치가 변경되면 호출합니다.
ChangeStop 중지 위치가 변경되면 호출합니다.
IMediaSeeking 메서드 Description
IsFormatSupported 지정된 시간 형식이 지원되는지 여부를 결정합니다.
QueryPreferredFormat 개체의 기본 설정 시간 형식을 검색합니다.
SetTimeFormat 시간 형식을 설정합니다.
IsUsingTimeFormat 지정된 시간 형식이 현재 사용 중인 형식인지 여부를 확인합니다.
GetTimeFormat 현재 시간 형식을 검색합니다.
GetDuration 스트림의 기간을 검색합니다.
GetStopPosition 스트림의 지속 시간을 기준으로 재생이 중지되는 시간을 검색합니다.
GetCurrentPosition 스트림의 총 기간을 기준으로 현재 위치를 검색합니다.
GetCapabilities 스트림의 모든 검색 기능을 검색합니다.
CheckCapabilities 스트림이 검색 기능을 지정했는지 여부를 쿼리합니다.
ConvertTimeFormat 한 시간 형식에서 다른 형식으로 변환합니다.
SetPositions 현재 위치와 중지 위치를 설정합니다.
GetPositions 현재 위치와 중지 위치를 검색합니다.
GetAvailable 검색이 효율적인 시간 범위를 검색합니다.
SetRate 재생 속도를 설정합니다.
GetRate 재생 속도를 검색합니다.
GetPreroll 사전 등록 시간을 검색합니다.

설명

시작 위치, 중지 위치 또는 재생 속도가 변경 될 때마다 CSourceSeeking 개체는 해당 순수 가상 메서드를 호출합니다.

파생 클래스는 이러한 메서드를 구현해야 합니다. 검색 작업 후에 필터는 다음을 수행해야 합니다.

  1. 다운스트림 입력 핀에서 IPin::BeginFlush 메서드를 호출합니다.
  2. 데이터를 배달하는 작업자 스레드를 중지합니다.
  3. 입력 핀에서 IPin::EndFlush 메서드를 호출합니다.
  4. 작업자 스레드를 다시 시작합니다.
  5. 입력 핀에서 IPin::NewSegment 메서드를 호출합니다.
  6. 첫 번째 샘플에서 불연속성 속성을 설정합니다. IMediaSample::SetDiscontinuity 메서드를 호출합니다.

BeginFlush에 대한 호출은 샘플을 배달하기 위해 스레드가 차단된 경우 작업자 스레드를 해제합니다.

2단계에서 스레드가 데이터 전송을 중지했는지 확인합니다. 구현에 따라 스레드가 종료될 때까지 기다리거나 스레드가 특정 종류의 응답을 신호로 보낼 때까지 기다려야 할 수 있습니다. 필터가 CSourceStream 클래스를 사용하는 경우 CSourceStream::Stop 메서드는 작업자 스레드가 응답할 때까지 차단됩니다.

이상적으로 새 세그먼트(5단계)는 작업자 스레드에서 전달되어야 합니다. 필터가 샘플을 사용하여 직렬화하는 한 CSourceSeeking 개체에서 수행할 수도 있습니다.

다음 예제에서는 가능한 구현을 보여 주세요. 원본 필터의 출력 핀이 CSourceSeeking 및 CSourceStream 에서 파생되었다고 가정 합니다. 이 예제에서는 1 4단계를 수행하는 도우미 메서드 UpdateFromSeek을 정의합니다. CSourceStream::OnThreadStartPlay 메서드는 새 세그먼트를 보내고 불연속성을 나타내는 플래그를 설정하기 위해 재정의됩니다. 작업자 스레드는 이 플래그를 선택하고 IMediaSample::SetDiscontinuity 메서드를 호출합니다 .

void CMyStream::UpdateFromSeek()
{
    if (ThreadExists()) 
    {
        DeliverBeginFlush();
        Stop();
        DeliverEndFlush();
        Run();
    }
}

HRESULT CMyStream::OnThreadStartPlay()
{
    m_bDiscontinuity = TRUE;
    return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}

추가 시간 형식 지원

기본적으로 이 클래스는 참조 시간 단위(TIME_FORMAT_MEDIA_TIME)에서만 검색을 지원합니다. 추가 시간 형식을 지원하려면 시간 형식을 처리하는 IMediaSeeking 메서드를 재정의합니다.

또한 나머지 IMediaSeeking 메서드를 재정의하여 시간 형식 간에 필요한 변환을 수행합니다. SetTimeFormat 메서드가 호출된 후 모든 IMediaSeeking 메서드는 들어오는 시간 및 나가는 시간 매개 변수를 새 시간 형식으로 처리해야 합니다. 예를 들어 m_rtDuration 변수가 참조 시간 단위로 기간을 나타내지만 현재 시간 형식이 프레임인 경우 GetDuration 메서드는 프레임으로 변환된 m_rtDuration 값을 반환해야 합니다. 예를 들면 다음과 같습니다.

STDMETHODIMP GetDuration(LONGLONG *pDuration)
{
    HRESULT hr = CSourceSeeking::GetDuration(pDuration);
    if (SUCCEEDED(hr))
    {
        if (m_TimeFormat == TIME_FORMAT_FRAME)
        {
            // Convert from reference time to frames.
            *pDuration = TimeToFrame(*pDuration);  // Private method.
        }
    }
    return hr
} 

또한 IMediaSeeking::SetPositions 메서드에서 AM_SEEKING_ReturnTime 플래그에 대해 검사 합니다. 이 플래그가 있는 경우 호출자에게 반환할 때 위치 값을 참조 시간으로 변환합니다.

요구 사항

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

추가 정보

원본 필터에서 검색 지원