DirectShow DirectShow 에 대해 필터 그래프와 그 구성 요소 미디어 타입에 대해   [목차열람] [주소복사] [슬롯비우기]
미디어 타입에 대해
 
Microsoft DirectX 9.0

미디어 타입에 대해

DirectShow 는 모듈화되고 있으므로, 필터 그래프내의 각 포인트로 데이터의 포맷을 기술할 방법이 필요하다. 예를 들어, AVI 의 재생을 생각해 본다. 데이터는 RIFF 체크의 스트림으로서 그래프에 입력된다. 이 스트림은 비디오 스트림과 오디오 스트림에 해석된다. 비디오 스트림은 비디오 프레임으로 구성되어 보통은 압축되고 있다. 디코드 후, 비디오 스트림은 일련의 비압축 비트 맵이 된다. 오디오 스트림에 대해서도 같은 처리를 한다.

미디어 타입 :DirectShow 에 의한 포맷의 표현 방법

"미디어 타입" 은, 디지털 미디어 포맷을 기술하기 위한 범용적이어 확장성의 높은 방법이다. 2 개의 필터가 접속했을 때, 필터는 미디어 타입에 대해 합의한다. 미디어 타입은, 업 스트림 필터가 다운 스트림 필터에 보내는 데이터의 종류, 및 데이터의 물리적인 레이아웃을 식별한다. 2 개 필터가 미디어 타입에 대해 합의할 수 없는 경우, 접속은 할 수 없다.

일부의 애플리케이션에서는, 미디어 타입에 대해 의식할 필요는 없다. 예를 들어, 파일의 재생에서는, DirectShow 가 모든 처리를 실시한다. 어떤 종류의 애플리케이션에서는, 직접 미디어 타입을 처리해야 하는 경우도 있다.

미디어 타입은,AM_MEDIA_TYPE 구조체를 사용해 정의한다. 이 구조체에는 다음의 정보가 포함된다.

포맷 블록에 정보가 저장 되고 있는 경우, 메이저 타입과 서브 타입에는 장황한 정보가 포함되어 있게 된다. 그러나, 메이저 타입과 서브 타입은, 상세한 포맷 블록을 사용하지 않고 , 포맷을 식별할 경우에 편리하다. 예를 들어, 이미지 사이즈나 frame rate 등,VIDEOINFOHEADER 구조체로 필요한 모든 정보를 몰라도, 일반적인 24 비트 RGB 포맷 (MEDIASUBTYPE_RGB24)을 지정할 수 있다.

예를 들어, 필터에서는 다음 코드를 사용해, 미디어 타입을 체크할 수 있다.

HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
    if (pmt == NULL) return E_POINTER;

    // 메이저 타입을 체크한다.  여기에서는, 비디오를 검색하고 있다.
    if (pmt->majortype != MEDIATYPE_Video)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // 서브 타입을 체크한다.  여기에서는, 24 비트 RGB 를 검색하고 있다.
    if (pmt->subtype != MEDIASUBTYPE_RGB24)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // 포맷 타입 및 포맷 블록의 사이즈를 체크한다.
    if ((pmt->formattype == FORMAT_VideoInfo) &&
         (pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&
         (pmt->pbFormat != NULL))
    {
        // 이것으로, 포맷 블록 포인터를, 포맷 타입 GUID 로 정의되었다
        // 올바른 구조체에 강제해도 안전하다.
        VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*) pmt->pbFormat;
    
        // pVIH (생략 되고 있다)를 조사한다.  문제가 없는 경우는, S_OK 를 돌려준다.
        return S_OK;
    }

    return VFW_E_INVALIDMEDIATYPE;
}

AM_MEDIA_TYPE 구조체에는, 몇개의 옵션필드도 저장 된다. 이러한 필드를 사용해 추가 정보를 제공할 수 있지만, 필터로 이러한 필드를 사용할 필요는 없다.

↑TOP