DirectShow DirectShow 에 대해 DirectShow 의 타임과 클럭 라이브 소스   [목차열람] [주소복사] [슬롯비우기]
라이브 소스
 
Microsoft DirectX 9.0

라이브 소스

"푸쉬 소스" 라고도 불리는 라이브 소스는, 데이터를 리얼타임에 받는다. 예를 들어, 비디오 캡춰나 네트워크 브로드캐스트등이 예로서 들고 있다. 일반적으로, 라이브 소스는 데이터가 도착하는 레이트를 제어할 수 없다.

다음의 어느 쪽인가에 해당하는 경우, 필터는 라이브 소스이다고 보여진다.

라이브 소스 필터가 클럭을 제공하는 경우, 필터 그래프 매니저는, 그래프의 기준 클럭을 선택할 경우에 그 클럭을 우선한다. 더 자세한 정보는, 「기준 클럭」을 참조할것.

지연 시간

필터의지연 시간 이란, 필터가 샘플을 처리하는데 필요로 하는 시간이다. 라이브 소스의 경우, 지연 시간은 샘플을 보관 유지하기 위한 버퍼의 사이즈에 의해 정해진다. 예를 들어, 필터 그래프가 비디오 소스를 렌더링 할 때에 33 밀리 세컨드 (ms)의 지연 시간이 있어, 오디오 소스를 렌더링 할 때에 500 ms 의 지연 시간이 있다고 한다. 이 경우, 각 비디오 프레임은, 대응하는 오디오 샘플이 오디오 렌더러에 도착하는 약 470 ms 전에 비디오 렌더러에 도착한다. 이 차이를 그래프로 보정하지 않으면 오디오와 비디오는 동기 하지 않는다.

라이브 소스는,IAMPushSource 인터페이스에 의해 동기 할 수 있다. 애플리케이션이 IAMGraphStreams::SyncUsingStreamOffset 메서드를 호출해 동기를 유효하게 하지 않는 한, 필터 그래프 매니저는 라이브 소스를 동기 하지 않는다. 동기가 유효하게 되었을 경우, 필터 그래프 매니저는 각각의 소스 필터에 대해서 IAMPushSource 를 조회한다. 필터가 IAMPushSource 를 지원 하고 있는 경우, 필터 그래프 매니저는 IAMLatency::GetLatency 를 호출해 필터의 예측 지연 시간을 얻어온다. IAMPushSource 인터페이스는 IAMLatency 를 계승한다. 짜 합쳐진 지연 시간의 값으로부터, 필터 그래프 매니저는 그래프내의 최대 예측 지연 시간을 결정한다. 다음에, 필터 그래프 매니저는 IAMPushSource::SetStreamOffset 를 호출해 각 소스 필터에 스트림 오프셋(offset)를 준다. 필터는, 이 스트림 오프셋(offset)를 생성하는 타임 스탬프에 가세한다.

이 방법은, 주로 라이브 프리뷰에서의 사용을 목적으로 하고 있다. 다만, 라이브 캡춰 장치 (카메라등)의 프리뷰 핀은 제공하는 샘플에 타임 스탬프를 설정하지 않는 것에, 주의할 필요가 있다. 따라서, 라이브 캡춰 장치로 이 방법을 사용하려면 , 캡춰 핀으로부터 프리뷰 할 필요가 있다. 더 자세한 정보는, 「DirectShow 의 비디오 캡춰 필터」를 참조할것.

현시점에서는,VFW 캡춰 필터와 Audio Capture 필터가,IAMPushSource 인터페이스를 지원 하고 있다.

레이트 매칭

렌더링 필터가 1 개의 기준 클럭을 사용해 샘플을 스케줄 하는 한편으로, 소스 필터가 다른 클럭을 사용해 샘플을 생성했을 경우, 재생시에 이상이 발생하는 일이 있다. 렌더러가 소스보다 고속으로 실행 하면, 데이터에 갭이 생긴다. 렌더러가 소스보다 저속에 실행 하면, 어떤 시점에 그래프가 샘플을 드롭 할 때까지, 샘플이 "산적" 이 된다. 보통, 라이브 소스는 그 프로덕션 레이트를 제어할 수가 없기 때문에, 렌더러측에서 소스와 레이트를 일치시킨다.

오디오 재생에 있어서의 이상은 비디오에 있어서의 그것보다 현저하기 때문에, 현재, 오디오 렌더러만이 레이트 매칭을 실행한다. 레이트 매칭을 실행하기 위해서, 오디오 렌더러는 레이트를 일치시키는 대상을 선택할 필요가 있다. 오디오 렌더러는 다음과 같은 알고리즘을 사용한다.

마지막 케이스의 이유는 다음과 같다. 오디오 렌더러가 기준 클럭이며, 소스 필터가 같은 클럭을 사용해 타임 스탬프를 생성하는 경우, 오디오 렌더러는 타임 스탬프와 레이트를 일치시킬 수가 없다. 이 레이트를 일치시키면 결과적으로, 렌더러는 자기 자신과 레이트를 일치시키게 되어, 클럭의 차이가 발생한다. 따라서, 이러한 경우, 렌더러는 수신 오디오 데이터와 레이트를 일치시킨다.

↑TOP