DirectShow DirectShow 레퍼런스 인터페이스 IMediaSeeking SetPositions   [목차열람] [주소복사] [슬롯비우기]
IMediaSeeking::SetPositions
 
Microsoft DirectX 9.0

IMediaSeeking::SetPositions

SetPositions 메서드는, 현재 위치와 정지 위치를 설정한다.

구문

HRESULT SetPositions(
  LONGLONG *pCurrent,
  DWORD dwCurrentFlags,
  LONGLONG *pStop,
  DWORD dwStopFlags
);

파라미터

pCurrent

[in, out] 현재의 타임을 지정하는 변수의 포인터 (현재의 타임 포맷의 단위).

dwCurrentFlags

[in] 플래그의 비트마다 편성. 「주의」를 참조.

pStop

[in, out] 종료 타임을 지정하는 변수의 포인터 (현재의 타임 포맷의 단위).

dwStopFlags

[in] 플래그의 비트마다 편성. 「주의」를 참조.

반환값

HRESULT 값을 돌려준다. 가능한 값은 다음과 같다.

설명
S_FALSE 위치 변경은 없다 (양쪽 모두의 플래그가 시크 하지 않으면 지정).
S_OK 성공.
E_INVALIDARG 무효인 인수.
E_NOTIMPL 메서드는 지원하지 않는다.
E_POINTER NULL 포인터 인수.

주의

dwCurrentFlags 인수와 dwStopFlags 인수에는, 시크 타입을 정의한다. 다음의 플래그가 정의되고 있다.

위치 플래그 설명
AM_SEEKING_NoPositioning 위치 변경은 없다. 타임 인수는, NULL 로 할 수도 있다.
AM_SEEKING_AbsolutePositioning 지정한 위치는 절대치이다.
AM_SEEKING_RelativePositioning 지정한 위치는 이전의 값으로부터의 상대값이다.
AM_SEEKING_IncrementalPositioning 정지 위치 (pStop)는 현재 위치 (pCurrent)로부터의 상대값이다.
수식 플래그 설명
AM_SEEKING_SeekToKeyFrame 가장 가까운 키 프레임을 시크 한다. 이것은 고속이지만, 정밀도는 떨어진다.
AM_SEEKING_ReturnTime 동일한 기준 타임을 돌려준다.
AM_SEEKING_Segment 세그먼트(segment) 시크를 사용한다.
AM_SEEKING_NoFlush 플래시 하지 않는다.

각 인수에 대해서, 1 개의 위치 플래그를 사용한다. 1 개 또는 복수의 수식자 플래그를 포함할 수도 있다.

AM_SEEKING_ReturnTime 플래그가 지정되면 메서드는 그 위치의 값을 기준 타임으로 변환해,pCurrent 변수 또는 pStop 변수로 돌려준다. 프레임과 같은 다른 타임 포맷을 사용하고 있을 때, 이 플래그는 유용하다.

AM_SEEKING_Segment 플래그와 AM_SEEKING_NoFlush 플래그는, 심리스 루프를 지원 한다.

루프를 실행하기 위해서는, 그래프는 IMediaSeeking::GetCapabilities 메서드의 AM_SEEKING_CanDoSegments 를 보고해야 한다. 현재, 이 기능을 지원 하고 있는 것은 WAVE 파서 필터 뿐이다.

pCurrentpStop 가 수신하는 값은 현재의 타임 포맷으로 나타낸다. 디폴트의 타임 포맷은,REFERENCE_TIME 단위 (100 나노초)이다. 타임 포맷을 변경하려면 ,IMediaSeeking::SetTimeFormat 메서드를 사용한다. AM_SEEKING_ReturnTime 플래그가 존재하는 경우, 메서드는 송신하는 값을 REFERENCE_TIME 단위로 변환한다.

필터 개발자의 주의점

이 메서드를 처리 하면, 현재의 위치 또는 정지 위치에서의 변경을 호출해 원이 요구하고 있을지 어떨지를 확인할 수 있다. 수식자 플래그를 마스크 아웃 하기 위한(해), AM_SEEKING_PositioningBitsMask 라고 하는 값을 사용해 확인한다. 예를 들어, 다음과 같이 기술한다.

DWORD dwCurrentPos = dwCurrentFlags & AM_SEEKING_PositioningBitsMask
if (dwCurrentPos == AM_SEEKING_AbsolutePositioning)
{ 
    // 새로운 위치를 pCurrent 로 설정한다.
    m_rtStart = *pCurrent;
}
else if (dwCurrentPos == AM_SEEKING_RelativePositioning)
{
    // pCurrent 만 현재의 위치를 인크리먼트(increment) 한다.
    m_rtStart += *pCurrent;
}

더 자세한 정보는, base class 라이브러리의 CSourceSeeking::SetPositions 메서드의 소스 코드를 참조할것.

참조

↑TOP