DirectShow DirectShow 의 사용법 DirectShow 의 기본 태스크 필터 그래프의 시크 시크 커멘드의 타임 포맷   [목차열람] [주소복사] [슬롯비우기]
시크 커멘드의 타임 포맷
 
Microsoft DirectX 9.0

시크 커멘드의 타임 포맷

IMediaSeeking 인터페이스가 많은 메서드는 현재 위치, 정지 위치 등, 위치의 값을 나타내는 파라미터를 취한다. 디폴트에서는, 이러한 파라미터는 100 나노초단위로 나타낸다. 이 단위는 "기준 타임" 이라고 부른다. 시크 가능한 필터는, 기준 타임에 의한 시크를 지원 해야 한다. 일부의 필터에서는, 특정의 프레임 번호에의 시크, 스트림내의 특정의 바이트 오프셋(offset)에의 시크 등, 다른 시간 단위를 사용해도 시크 할 수 있다. 각각의 시간 단위는 "타임 포맷" 이라고 불러, 글로벌 일의 식별자 (GUID)로 정의한다. DirectShow 로 정의되는 타임 포맷의 일람에 대해서는, 「타임 포맷 GUID 」를 참조할것. 써드파티도 커스텀 타임 포맷의 GUID 를 정의할 수 있다.

현재 필터 그래프에 있는 필터가 특정의 타임 포맷을 지원 하고 있을지 어떨지를 조사하려면 ,IMediaSeeking::IsFormatSupported 메서드를 호출한다. 포맷이 지원 되고 있는 경우, 메서드는 S_OK 를 돌려준다. 그 이외의 경우, 메서드는 S_FALSE 또는 에러 코드를 돌려준다. 포맷이 지원 되고 있는 경우,IMediaSeeking::SetTimeFormat 메서드를 호출하면, 그 포맷으로 전환할 수 있다. SetTimeFormat 메서드가 성공하면 후속의 시크 커멘드는 새로운 타임 포맷을 사용해 나타낸다.

다음 예는 그래프가 프레임 번호에 의한 시크를 지원 하고 있을지 어떨지를 체크한다. 지원 하고 있는 경우, 프레임 번호 20 에 시크 한다.

hr = pSeek->IsFormatSupported(&TIME_FORMAT_FRAME);
if (hr == S_OK)
{
    hr = pSeek->SetTimeFormat(&TIME_FORMAT_FRAME);
    if (SUCCEEDED(hr))
    {
        // 프레임 번호 20 에 시크 한다.
        LONGLONG rtNow = 20;
        hr = pSeek->SetPositions(
            &rtNow, AM_SEEKING_AbsolutePositioning, 
            0, AM_SEEKING_NoPositioning);
    }
}

타임 포맷은 시크 커멘드에만 적용되는 점에 주의 해야 한다. 그래프 재생 등, 다른 처리에는 영향을 주지 않는다.

↑TOP