DirectShow DirectShow 레퍼런스 DirectShow base class base class 레퍼런스 CSourceSeeking [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
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 개체는, 시작 위치, 정지 위치, 재생 속도가 변경될 때마다, 다음과 같이 대응하는 순수 가상 메서드를 호출한다.
상속 클래스는, 이러한 메서드를 처리 해야 한다. 시크 처리 후, 필터는 다음 일을 실시할 필요가 있다.
워커 thread가 블록 되어 샘플 출력의 대기 상태가 되어 있는 경우는,BeginFlush 를 호출해 워커 thread를 릴리즈 한다.
스텝 2 로, thread에 의한 데이터의 송신이 정지한 것을 확인한다. 처리에 따라서는, thread가 종료하는 것을 기다리는지, 또는 thread가 어떠한 응답을 나타낼 때까지 기다릴 필요가 있다. 필터로 CSourceStream 클래스를 사용하고 있는 경우,CSourceStream::Stop 메서드는, 워커 thread가 응답할 때까지 대기 상태가 된다.
이상적이게는, 새로운 세그먼트(segment) (스텝 5)가 워커 thread로부터 제공되는 것이 바람직하다. 이것은, 필터가 샘플을 사용해 계속해 처리하는 한,CSourceSeeking 개체에 의해도 실행할 수 있다.
다음 예는 가능한 처리을 나타내고 있다. 여기에서는, 소스 필터의 출력 핀이 CSourceSeeking 와 CSourceStream 로부터 파생하는 것을 상정하고 있다. 이 예에서는, 스텝 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 플래그를 확인할 필요가 있다. 이 플래그가 있는 경우는, 호출 바탕으로 돌려줄 때 위치값을 기준 타임으로 변환한다.