DirectX Media Object DMO 의 생성 DMO 클래스 템플릿의 사용법   [목차열람] [주소복사] [슬롯비우기]
DMO 클래스 템플릿의 사용법
 
Microsoft DirectX 9.0

DMO 클래스 템플릿의 사용법

DirectX SDK 에는, DMO 의 처리용으로,IMediaObjectImpl 라는 이름의 클래스 템플릿이 포함되어 있다. 템플릿에서는, 입력 파라미터의 확인이라고 하는 "정평" 처리가 많게를 하고 있다. 템플릿을 사용하면, 그 DMO 고유의 기능에만 전념할 수 있다. 게다가 템플릿은 견뢰한 처리을 생성 하는 도움으로도 된다. 템플릿은, SDK 의 Include 디렉토리에 있는 헤더 파일 Dmoimpl.h 중(안)에서 정의되고 있다.

IMediaObjectImpl 템플릿은,IMediaObject 인터페이스를 계승하고 있다. 이 템플릿을 사용해 DMO 를 생성 하려면 ,IMediaObjectImpl 로부터 파생하는 새로운 클래스를 정의한다. 템플릿에서는,IMediaObject 의 모든 메서드가 처리 되고 있다. 많은 경우, 템플릿은 상속 클래스에 대해 대응하는 Private 메서드를 호출한다. 템플릿은 이하의 기능을 제공한다.

IUnknown 인터페이스는 템플릿으로부터 제공되지 않기 때문에, 상속 클래스로 처리 해야 한다. IUnknown 는, ATL (Active Template Library)를 사용해 처리 할 수 있지만, 다른 처리을 제공해도 괜찮다. 또, 템플릿에는 잠금 메카니즘이 처리 되지 않는다. 상속 클래스는,Lock 메서드와 Unlock 메서드를 처리 할 필요가 있다. ATL 를 사용해 클래스를 생성 하는 경우는, ATL 의 디폴트의 처리을 사용할 수 있다.

상속 클래스의 선언

IMediaObjectImpl 클래스 템플릿은, 다음과 같이 선언되고 있다.

template <class _DERIVED_, int NUMBEROFINPUTS, int NUMBEROFOUTPUTS>
class IMediaObjectImpl : public ImediaObject

_DERIVED_, NUMBEROFINPUTS, NUMBEROFOUTPUTS 의 3 개는, 템플릿 파라미터이다. _DERIVED_ 에는, 클래스의 이름을 설정한다. 다른 2 개의 파라미터는, DMO 의 입력 스트림과 출력 스트림의 수를 정의한다. 예를 들어, 1 개의 입력 스트림과 2 개의 출력 스트림을 지원 하는 CMyDmo 라는 이름의 DMO 클래스를 생성 하려면 , 다음과 같이 선언한다.

class CMyDmo : public IMediaObjectImpl<CMyDmo, 1, 2>

다음에,IMediaObject 의 다양한 메서드가 템플릿으로 어떻게 처리 되고 있는지를 설명한다.

미디어 타입 설정용의 메서드

이하의 메서드는, DMO 의 미디어 타입을 설정 또는 얻어온다.

정보 메서드

이하의 메서드는, DMO 에 대한 정보를 제공한다.

리소스 할당용의 메서드

DMO 의 클라이언트는 이러한 메서드를 호출할 필요는 없지만, 템플릿은, 스트리밍이 시작 하기 전에 AllocateStreamingResources 를 자동적으로 호출한다. 따라서, DMO 는,ProcessInput 가 불려 간 시점에서는, 리소스를 올바르게 할당할 수 있는 것과 상정해 상관없다. DMO 는, 소멸자 중(안)에서 FreeStreamingResources 를 호출해야 한다.

또, 템플릿은,InternalAllocateStreamingResources 를 호출하면 내부 플래그를 설정해,InternalFreeStreamingResources 를 호출할 때까지는 InternalAllocateStreamingResources 를 다시 호출하지 않게 한다. 이것에 의해, 메모리 누수의 원인이 되는 리소스의 재할인 맞히고가, 잘못해 행해지지 않게 된다.

스트리밍용의 메서드

이하의 메서드는, 데이터를 스트리밍 하기 위해서 사용된다.

템플릿에서는,IMediaObjectInPlace 인터페이스의 직접적인 지원은 제공되지 않다.

락용의 메서드

락은, multi-thread 환경에 있어 DMO 상태를 보호하기 위해서 사용된다. ATL 프로젝트에서는,IMediaObject::Lock 메서드를 사용하면 ATL 의 Lock 메서드와의 사이에 이름의 경합이 발생한다. 이 경합을 해결하기 위해서, 템플릿에서는 IMediaObject 의 메서드의 이름이 DMOLock 로 변경되고 있다. 상속 클래스를 컴파일 할 때는, Dmo.h 헤더 파일을 인클루드 하기 전에 FIX_LOCK_NAME 를 정의할 필요가 있다.

#define FIX_LOCK_NAME
#include <dmo.h>

이 유사 명령이 있으면 프리프로세서는,IMediaObject 인터페이스의 선언에 있는 LockDMOLock 에 옮겨놓는다. 다만, vtable 순서는 변함없기 때문에, 애플리케이션에서는 Lock 라는 이름을 사용해 메서드를 기동할 수 있다. DMOLock 메서드는, 상속 클래스의 LockUnlock 를 호출한다. ATL 를 사용해 상속 클래스를 처리 하고 있는 경우는, ATL 가 이러한 메서드를 이미 정의하고 있기 (위해)때문에, 코드를 추가할 필요는 없다. ATL 를 사용하지 않은 경우는, 상속 클래스 중(안)에서 Lock 메서드와 Unlock 메서드를 제공할 필요가 있다.

템플릿은,IMediaObject 의 각 메서드 중(안)에서 DMO 를 자동적으로 잠근다. 상속 클래스에서는, 처리 하고 있는 다른 퍼블릭 메서드 (IMediaObjectInPlace 를 지원 하고 있는 경우등) 중(안)에서, DMO 를 잠그는 것이 필요한 경우가 있다. 클래스 템플릿은, 내부 헬퍼-클래스 IMediaObjectImpl::LockIt 도 제공하고 있다. 이 클래스는, DMO 를 잠금 및 잠금 해제할 때에 도움이 된다.

통계

이하의 IMediaObject 메서드에 대해, 템플릿은, 상속 클래스상에서 같은 서명의 대응하는 메서드를 호출한다. 상속 클래스에서는, 2 번째의 열로 나타나고 있는 각 메서드를 처리 할 필요가 있다.

IMediaObject 의 메서드 상속 클래스의 메서드
AllocateStreamingResources InternalAllocateStreamingResources
Discontinuity InternalDiscontinuity
Flush InternalFlush
FreeStreamingResources InternalFreeStreamingResources
GetInputMaxLatency InternalGetInputMaxLatency
GetInputSizeInfo InternalGetInputSizeInfo
GetInputStreamInfo InternalGetInputStreamInfo
GetInputType InternalGetInputType
GetOutputSizeInfo InternalGetOutputSizeInfo
GetOutputStreamInfo InternalGetOutputStreamInfo
GetOutputType InternalGetOutputType
ProcessInput InternalProcessInput
ProcessOutput InternalProcessOutput
SetInputMaxLatency InternalSetInputMaxLatency

IMediaObject 의 나머지의 메서드에 대해서는, 템플릿의 메서드와 상속 클래스의 메서드가 1 대 1 에 대응하고 있지 않다. 다음의 일람은, 템플릿으로 완전하게 처리 되는 메서드와 상속 클래스의 다른 메서드를 호출하는 메서드를 집계한 것이다.

IMediaObject 의 메서드 상속 클래스의 메서드
GetInputCurrentType 완전하게 처리 되고 있다.
GetOutputCurrentType 완전하게 처리 되고 있다.
GetStreamCount 완전하게 처리 되고 있다.
GetInputStatus InternalAcceptingInput
Lock (DMOLock 로서 처리 된다) Lock ,Unlock
SetInputType InternalCheckInputType
SetOutputType InternalCheckOutputType

참조

↑TOP