DirectShow DirectShow 의 사용법 DirectShow 필터의 개발 필터의 접속 커스텀 할당자의 제공   [목차열람] [주소복사] [슬롯비우기]
커스텀 할당자의 제공
 
Microsoft DirectX 9.0

커스텀 할당자의 제공

여기에서는, 필터의 커스텀 할당자를 제공하는 방법에 대해 설명한다. IMemInputPin 접속에 대한 보고 설명하지만,IAsyncReader 접속의 순서도 마찬가지이다.

최초로, 할당자의 C++ 클래스를 정의한다. 할당자는 표준 할당자 클래스 CBaseAllocator 또는 CMemAllocator 의 어느 쪽인지 한편으로부터 파생할 수 있다. 또, 완전히 새로운 할당자 클래스를 생성 할 수도 있다. 새로운 클래스를 생성 하는 경우,IMemAllocator 인터페이스를 공개할 필요가 있다.

나머지의 순서는, 할당자가 필터의 입력 핀과 출력 핀의 어느 쪽에 속할까에 따라서 다르다. 입력 핀은 할당자의 조정 시기에 출력 핀과는 다른 역할을 연기한다. 이것은, 최종적으로는 출력 핀이 할당자를 선택하기 위해(때문에)이다.

입력 핀용의 커스텀 할당자의 제공

입력 핀용의 할당자를 제공하려면 , 입력 핀의 CBaseInputPin::GetAllocator 메서드를 오버라이드(override) 한다. 이 메서드내에서,m_pAllocator 멤버 변수를 조사한다. 이 변수가 NULL 가 아닌 경우, 이 접속용의 할당자는 이미 선택되고 있는 것을 의미한다. 따라서,GetAllocator 메서드는 그 할당자의 포인터를 돌려줄 필요가 있다. m_pAllocator 가 NULL 인 경우, 할당자는 선택되지 않은 것을 의미한다. 따라서,GetAllocator 메서드는 입력 핀의 우선 할당자의 포인터를 돌려줄 필요가 있다. 그 경우, 커스텀 할당자의 인스턴스를 생성 해, 그 IMemAllocator 포인터를 돌려준다. 다음 코드는 GetAllocator 메서드를 처리 하는 방법을 나타내고 있다.

STDMETHODIMP CMyInputPin::GetAllocator(IMemAllocator **ppAllocator)
{
    CheckPointer(ppAllocator, E_POINTER);
    if (m_pAllocator)  
    {
        // 이미 할당자가 있기 (위해)때문에, 그 할당자를 돌려준다.
        *ppAllocator = m_pAllocator;
        (*ppAllocator) ->AddRef();
        return S_OK;
    }
    // 할당자가 없기 때문에, 커스텀 할당자를 제시한다. 여기서의 코드의 세부는,
    // 커스텀 할당자의 클래스 정의에 따라서 다르다.
    HRESULT hr = S_OK;
    CMyAllocator *pAlloc = new CMyAllocator(&hr);
    if (! pAlloc)
    {
        return E_OUTOFMEMORY;
    }
    if (FAILED(hr))
    {
        delete pAlloc;
        return hr;
    }
    // 호출 바탕으로 IMemAllocator 인터페이스를 돌려준다.
    return pAlloc->QueryInterface(IID_IMemAllocator, (void**) ppAllocator);
}

업 스트림 필터가 할당자를 선택 할 때는, 입력 핀의 IMemInputPin::NotifyAllocator 메서드를 호출한다. CBaseInputPin::NotifyAllocator 메서드를 오버라이드(override) 해, 할당자 프로퍼티를 조사한다. 경우에 따라서는, 할당자가 커스텀 할당자가 아니면 입력 핀은 할당자를 거부하는 일이 있다. 다만 그 경우, 핀 접속 전체가 실패할 가능성이 있다.

출력 핀용의 커스텀 할당자의 제공

출력 핀용의 할당자를 제공하려면 ,CBaseOutputPin::InitAllocator 를 오버라이드(override) 해 할당자의 인스턴스를 생성 한다.

HRESULT MyOutputPin::InitAllocator(IMemAllocator **ppAlloc)
{
    HRESULT hr = S_OK;
    CMyAllocator *pAlloc = new CMyAllocator(&hr);
    if (! pAlloc)
    {
        return E_OUTOFMEMORY;
    }
    if (FAILED(hr))
    {
        delete pAlloc;
        return hr;
    }
    // IMemAllocator 인터페이스를 돌려준다.
    return pAlloc->QueryInterface(IID_IMemAllocator, void**) ppAllocator);}
}

디폴트에서는,CBaseOutputPin 클래스는 최초로 입력 핀으로부터 할당자를 요구한다. 그 할당자가 적절하지 않는 경우, 출력 핀은 독자적인 할당자를 생성 한다. 접속으로 커스텀 할당자를 강제적으로 사용하도록(듯이) 하려면 ,CBaseOutputPin::DecideAllocator 메서드를 오버라이드(override) 한다. 그러나, 그 경우, 출력 핀이 일부의 필터에 접속하지 않게 될 가능성이 있는 점에 주의 해야 한다. 다른 필터도 독자적인 커스텀 할당자를 필요로 하는 일이 있기 때문에 있다.

참조

↑TOP