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

IMediaSeeking::SetRate

SetRate 메서드는, 재생 레이트를 설정한다.

구문

HRESULT SetRate(
  double dRate
);

파라미터

dRate

[in] 재생 레이트. 제로여서는 안 된다.

반환값

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

설명
S_OK 성공.
E_INVALIDARG 지정한 레이트는, 0 또는 부의 값이었다. 「주의」를 참조.
E_NOTIMPL 처리되지 않다.
E_POINTER NULL 포인터 인수.
VFW_E_UNSUPPORTED_AUDIO 오디오 장치 혹은 필터가 이 레이트를 지원 하고 있지 않다.

주의

재생 레이트는, 보통 속도와의 비율로 표현된다. 따라서, 1.0 은 보통의 재생 속도, 0.5 는 반의 속도, 2.0 은 2 배의 속도를 나타낸다. 오디오 스트림에 대해서는, 레이트를 바꾸면 그 피치도 바뀐다.

부의 값은 역방향의 재생을 나타낸다. 대부분의 필터는 역재생을 지원 하지 않고, 대신에 dRate 인수가 부의 경우는 에러 코드를 돌려준다.

애플리케이션이 이 메서드를 필터 그래프 매니저로 호출하면, 필터 그래프 매니저는 이하를 실시한다.

  1. IMediaSeeking::GetCurrentPosition 메서드를 호출한다. 이 호출에 의해 필터 그래프 매니저가 계산한 현재 위치를 돌려준다.
  2. (그래프가 포즈 혹은 실행중의 경우) 필터 그래프를 정지한다.
  3. 현재 위치를 시작 타임으로서 필터로 IMediaSeeking::SetPositions 메서드를 호출한다. 이것은 스트림 타임을 제로에 리셋 하는 결과가 된다.
  4. 새로운 레이트로, 필터의 SetRate 메서드를 호출한다.
  5. 포즈 혹은 실행중이었던 경우, 필터 그래프를 재개한다.

스텝 4 로 에러가 일어나면 필터 그래프 매니저는 이전의 레이트를 다시 사용하려고 한다.

필터는 이하와 같이 레이트 변경에 대응할 필요가 있다.

파서 필터와 소스 필터 : 타임 스탬프를 발생시키고 있는 필터는 SetRate 호출에 대응해야 한다. 보통 이것은 AVI 스플리터 필터와 같은 파서 필터이지만, 소스 필터의 경우도 있다. 시크나 레이트 변경의 뒤, 필터는 IPin::NewSegment 메서드를 새로운 설정으로 호출할 필요가 있다. 레이트 변경의 뒤, 그 타임 스탬프를 필요에 따라서 조정해야 한다. 레이트 변경은 시크에 우선하므로, 타임 스탬프는 제로로부터 재스타트가 된다. 따라서, 필터는 그 레이트로 나눈 새로운 타임 스탬프를 계산할 수 있다.

디코더 필터 :디코더는 SetRate 호출에 대해서, 그것들을 업 스트림에 건네주는 이외를 가서는 안 된다. 대신에, 디코더는 업 스트림 파서가 발행하는 NewSegment 호출에 대응해야 한다. 디코더 필터가 새로운 세그먼트(segment) 정보를 받을 때, 그 필터는 그 값을 보존해,NewSegment 호출을 다운 스트림에 건네준다. 일부의 디코더는 그 입력을 보간 하는 것에 의해 추가 타임 스탬프를 생성할 필요가 있다. 그 경우, 레이트 변경을 고려할 필요가 있다.

렌더러 : 수신 프레임은 이미 올바른 타임 스탬프를 가지고 있으므로, 비디오 렌더러는 보통 레이트 변경을 무시할 수 있다. 오디오 디코더는 보통 레이트 변환을 실시하지 않기 때문에, 오디오 렌더러가 그 재생 레이트를 변경할 필요가 있다.

참조

↑TOP