DirectShow DirectShow 레퍼런스 DirectShow base class base class 레퍼런스 CSourceSeeking   [목차열람] [주소복사] [슬롯비우기]
CSourceSeeking 클래스
 
Microsoft DirectX 9.0

CSourceSeeking 클래스

CSourceSeeking 클래스의 계층

CSourceSeeking 클래스는, 1 개의 출력 핀을 가지는 소스 필터로, 시크를 처리 하는 추상 클래스이다.

이 클래스는,IMediaSeeking 인터페이스를 지원 한다. 이 클래스는, 모든 IMediaSeeking 메서드에 디폴트의 처리을 제공한다. 프로텍트 멤버 변수는, 시작 타임, 종료 타임, 및 현재의 속도를 저장 한다. 디폴트에서는, 이 클래스에 의해 지원 되는 유일한 타임 포맷은, TIME_FORMAT_MEDIA_TIME (100 나노초단위)이다. 자세한 것은, 주의를 참조할것.

요건

헤더 : Ctlutil.h 내에서 선언해, Streams.h 를 인클루드 한다.

라이브러리 : Strmbase.lib (리테일 빌드) 또는 Strmbasd.lib (디버그 빌드)를 사용한다.

프로텍트 멤버 변수  
m_rtDuration 스트림의 시간폭.
m_rtStart 시작 타임.
m_rtStop 종료 타임.
m_dRateSeeking 재생 속도.
m_dwSeekingCaps 시크 능력.
m_pLock 락을 위한 크리티컬 섹션 개체의 포인터.
프로텍트 메서드  
CSourceSeeking 생성자 메서드.
순수 가상 메서드  
ChangeRate 재생 속도가 변경되었을 때 호출된다.
ChangeStart 시작 위치가 변경되었을 때 호출된다.
ChangeStop 정지 위치가 변경되었을 때 호출된다.
IMediaSeeking 메서드  
IsFormatSupported 지정한 타임 포맷이 지원 되고 있는지를 조사한다.
QueryPreferredFormat 개체의 우선 타임 포맷을 얻어온다.
SetTimeFormat 타임 포맷을 설정한다.
IsUsingTimeFormat 지정한 타임 포맷이 현재 사용되고 있는 포맷화 제발을 조사한다.
GetTimeFormat 현재의 타임 포맷을 얻어온다.
GetDuration 스트림의 시간폭을 얻어온다.
GetStopPosition 스트림의 시간폭을 기준으로서 재생이 정지하는 타임을 얻어온다.
GetCurrentPosition 스트림의 합계 시간폭을 기준으로 하는, 현재의 위치를 얻어온다.
GetCapabilities 스트림의 모든 시크 능력을 얻어온다.
CheckCapabilities 지정한 시크 능력을 스트림이 가지고 있을지 어떨지를 조회한다.
ConvertTimeFormat 1 개의 타임 포맷화등별의 타임 포맷으로 변환한다.
SetPositions 현재 위치와 정지 위치를 설정한다.
GetPositions 현재 위치와 정지 위치를 얻어온다.
GetAvailable 시크가 유효한 타임의 범위를 얻어온다.
SetRate 재생 속도를 설정한다.
GetRate 재생 속도를 얻어온다.
GetPreroll 프리롤타임을 얻어온다.

주의

CSourceSeeking 개체는, 시작 위치, 정지 위치, 재생 속도가 변경될 때마다, 다음과 같이 대응하는 순수 가상 메서드를 호출한다.

상속 클래스는, 이러한 메서드를 처리 해야 한다. 시크 처리 후, 필터는 다음 일을 실시할 필요가 있다.

  1. 다운 스트림의 입력 핀으로 IPin::BeginFlush 메서드를 호출한다.
  2. 데이터를 제공하는 워커 thread를 정지한다.
  3. 입력 핀으로 IPin::EndFlush 메서드를 호출한다.
  4. 워커 thread를 재부팅 한다.
  5. 입력 핀으로 IPin::NewSegment 메서드를 호출한다.
  6. 최초의 샘플로 비계속 프로퍼티를 설정한다. IMediaSample::SetDiscontinuity 메서드를 호출한다.

워커 thread가 블록 되어 샘플 출력의 대기 상태가 되어 있는 경우는,BeginFlush 를 호출해 워커 thread를 릴리즈 한다.

스텝 2 로, thread에 의한 데이터의 송신이 정지한 것을 확인한다. 처리에 따라서는, thread가 종료하는 것을 기다리는지, 또는 thread가 어떠한 응답을 나타낼 때까지 기다릴 필요가 있다. 필터로 CSourceStream 클래스를 사용하고 있는 경우,CSourceStream::Stop 메서드는, 워커 thread가 응답할 때까지 대기 상태가 된다.

이상적이게는, 새로운 세그먼트(segment) (스텝 5)가 워커 thread로부터 제공되는 것이 바람직하다. 이것은, 필터가 샘플을 사용해 계속해 처리하는 한,CSourceSeeking 개체에 의해도 실행할 수 있다.

다음 예는 가능한 처리을 나타내고 있다. 여기에서는, 소스 필터의 출력 핀이 CSourceSeekingCSourceStream 로부터 파생하는 것을 상정하고 있다. 이 예에서는, 스텝 1 ~ 4 를 실행하는 헬퍼-메서드 UpdateFromSeek 를 정의하고 있다. CSourceStream::OnThreadStartPlay 메서드는 오버라이드(override) 되어 새로운 세그먼트(segment)를 보냄과 동시에, 비연속을 나타내는 플래그를 설정한다. 워커 thread는 이 플래그를 픽업 해,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 메서드를 오버라이드(override) 한다.

또, 나머지의 IMediaSeeking 메서드를 오버라이드(override) 해, 타임 포맷간에 필요한 변환을 실행한다. 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)
        {
            // 기준 타임부터 프레임에의 변환.
            *pDuration = TimeToFrame(*pDuration);  // Private 메서드.
        }
    }
    return hr
} 

또,IMediaSeeking::SetPositions 메서드의 AM_SEEKING_ReturnTime 플래그를 확인할 필요가 있다. 이 플래그가 있는 경우는, 호출 바탕으로 돌려줄 때 위치값을 기준 타임으로 변환한다.

↑TOP