하드웨어 MFT

참고

이 항목은 Windows 7 이상에 적용됩니다.

 

이 항목에서는 하드웨어 인코더, 디코더 또는 DSP(디지털 신호 프로세서)에 대한 프록시 역할을 하는 MFT(Media Foundation 변환)를 작성하는 방법을 설명합니다.

중요

하드웨어 코덱이 AVStream 멀티미디어 클래스 드라이버를 사용하는 경우 사용자 지정 MFT가 필요하지 않습니다. Media Foundation은 이 목적을 위해 AVStream 프록시를 제공합니다. 이 항목의 정보는 하드웨어 코덱이 AVStream을 사용하지 않는 특수한 경우에만 적용됩니다. 자세한 내용은 AVStream의 하드웨어 코덱 지원을 참조하세요.

 

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

소개

AVStream을 기반으로 하지 않는 하드웨어 코덱은 드라이버의 프록시 역할을 하려면 자체 MFT를 제공해야 합니다. 하드웨어 코덱은 다음과 같은 몇 가지 고유한 기능 블록을 통합할 수 있습니다.

  • 인코더
  • Decoder
  • 프레임 크기 조정/형식 변환

이러한 각 함수는 별도의 MFT에서 관리해야 합니다. 하드웨어 MFT는 다목적 "트랜스코더" 역할을 해서는 안 됩니다. 대신 인코더 MFT에 인코딩 함수를 넣고 디코더 MFT에 함수를 디코딩합니다. 하드웨어에서 프레임 크기 조정 및 형식 변환을 제공하는 경우 해당 함수를 MFT_CATEGORY_VIDEO_PROCESSOR 범주에 등록된 별도의 비디오 프로세서에 배치합니다. 하드웨어가 프레임 크기 조정 또는 형식 변환을 지원하지 않는 경우 Media Foundation은 소프트웨어 비디오 프로세서를 제공합니다.

하드웨어 MFT에는 다음과 같은 일반적인 요구 사항이 있습니다.

  • 하드웨어 MFT는 비동기 MFT에 설명된 대로 새 비동기 처리 모델을 사용해야 합니다.
  • 하드웨어 MFT는 동적 형식 변경에 설명된 대로 동적 형식 변경을 지원해야 합니다.

하드웨어 MFT 특성

하드웨어 MFT는 특성과 관련된 다음 메서드를 구현해야 합니다.

MFT가 처음 만들어지면 고유한 전역 특성 저장소(즉, GetAttributes에서 반환된 특성 저장소)에서 다음 특성을 설정해야 합니다.

attribute Description
MF_TRANSFORM_ASYNC TRUE로 설정해야 합니다. MFT가 비동기 처리를 수행했음을 나타냅니다.
MFT_ENUM_HARDWARE_URL_Attribute 하드웨어 디바이스에 대한 기호 링크를 포함합니다.
토폴로지 로더는 이 특성의 존재를 사용하여 MFT가 하드웨어 디바이스를 나타내는지 여부를 테스트합니다.
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE TRUE로 설정해야 합니다. MFT가 동적 형식 변경을 지원한다는 것을 나타냅니다.

 

하드웨어 핸드셰이크 시퀀스

두 MFT가 동일한 물리적 디바이스를 나타내는 경우 하드웨어 내에서 데이터를 교환할 수 있습니다(예: 하드웨어 버스를 통해). 데이터를 시스템 메모리에 복사한 다음 디바이스로 다시 복사할 필요가 없습니다.

다음 다이어그램에서 "A" 및 "B"라는 레이블이 지정된 MFT는 동일한 하드웨어 내의 기능 블록을 나타냅니다. 예를 들어 코드 변환 시나리오에서 "A"는 하드웨어 디코더를 나타내고 "B"는 하드웨어 인코더를 나타낼 수 있습니다. "A"와 "B" 사이의 데이터 흐름은 하드웨어 내에서 발생합니다. "C"라는 레이블이 지정된 MFT는 소프트웨어 MFT입니다. "B"에서 "C"로의 데이터 흐름은 시스템 메모리를 사용합니다.

를 통해 c로 레이블이 지정된 상자와 하드웨어 코덱을 보여 주는 다이어그램: 는 b를 가리키고 코덱은 b를 가리키고 b는 c를 가리킵니다.

하드웨어 연결을 설정하려면 두 하드웨어 MFT가 프라이빗 통신 채널을 사용해야 합니다. 이 연결은 형식 협상 중, 미디어 형식이 설정되기 전 및 ProcessInput에 대한 첫 번째 호출 전에 설정됩니다. 연결 프로세스는 다음과 같이 작동합니다.

  1. 토폴로지 로더는 두 MFT에서 MFT_ENUM_HARDWARE_URL_Attribute 특성이 있는지 확인합니다. 이 특성의 값은 검사하지 않습니다.

  2. 두 MFT에 MFT_ENUM_HARDWARE_URL_Attribute 있으면 토폴로지 로더는 다음을 수행합니다.

    1. 토폴로지 로더는 업스트림 MFT(A)에서 IMFTransform::GetOutputStreamAttributes를 호출합니다. 이 메서드는 IMFAttributes 포인터를 반환합니다 . 이 포인터를 pUpstream으로 표시합니다.
    2. 토폴로지 로더는 다운스트림 MFT(B)에서 IMFTransform::GetInputStreamAttributes 를 호출합니다. 이 호출은 IMFAttributes 포인터도 반환합니다. 이 포인터를 pDownstream으로 표시합니다.
    3. 토폴로지 로더는 IMFAttributes::SetUnknown을 호출하여 pDownstream에서 MFT_CONNECTED_STREAM_ATTRIBUTE 특성을 설정합니다. 특성 값은 pUpstream 포인터입니다.
    4. 토폴로지 로더는 pDownstreampUpstream 모두에서 MFT_CONNECTED_TO_HW_STREAM 특성을 TRUE로 설정합니다.
  3. 이 시점에서 다운스트림 MFT에는 다음 다이어그램과 같이 업스트림 MFT의 특성 저장소에 대한 포인터가 있습니다.

    각 mfts가 스트림을 가리키고, 각 스트림이 해당 저장소를 가리키고, 출력 저장소에 파선이 있는 입력 저장소가 있는 다이어그램

    참고

    명확성을 위해 이 다이어그램은 스트림과 특성이 고유한 개체로 저장하지만 구현에 필요하지는 않음을 보여 줍니다.

     

  4. 다운스트림 MFT는 IMFAttributes 포인터를 사용하여 업스트림 MFT와 프라이빗 통신 채널을 설정합니다. 채널은 비공개이므로 정확한 메커니즘은 구현에 의해 정의됩니다. 예를 들어 MFT는 프라이빗 COM 인터페이스를 쿼리할 수 있습니다.

4단계 동안 다운스트림 MFT는 두 MFT가 동일한 물리적 디바이스를 공유하는지 확인해야 합니다. 그렇지 않은 경우 데이터 전송에 시스템 메모리를 사용하도록 대체해야 합니다. 이렇게 하면 MFT가 소프트웨어 MFT 및 기타 하드웨어 디바이스에서 올바르게 작동할 수 있습니다.

핸드셰이크가 성공하고 두 MFT가 프라이빗 데이터 채널을 공유하는 경우 연결 지점에서 표준 데이터 처리 모델(다음 섹션에 설명됨)을 사용하지 않습니다. 특히 다운스트림 MFT는 METransformNeedInput 이벤트를 보내지 않습니다. 자세한 내용은 이 항목의 다음 섹션을 참조하세요.

데이터 처리

하드웨어 MFT가 데이터 전송에 시스템 메모리를 사용하는 경우 프로세스는 다음과 같이 작동합니다.

  1. 더 많은 입력을 요청하기 위해 MFT는 METransformNeedInput 이벤트를 보냅니다.
  2. METransformNeedInput 이벤트는 파이프라인이 IMFTransform::P rocessInput을 호출하도록 합니다.
  3. MFT에 출력 데이터가 있는 경우 MFT는 METransformHaveOutput 이벤트를 보냅니다.
  4. METransformHaveOutput 이벤트는 파이프라인이 IMFTransform::P rocessOutput을 호출하도록 합니다.

자세한 내용은 비동기 MFT를 참조하세요.

그러나 MFT에서 하드웨어 채널을 사용하는 경우 모든 데이터 전송이 하드웨어 내에서 내부적으로 발생하기 때문에 하드웨어 연결 지점에서 이러한 이벤트를 보내지 않습니다. 따라서 파이프라인은 연결 지점에서 ProcessInput 또는 ProcessOutput 을 호출하지 않습니다.

예를 들어 이 항목의 첫 번째 다이어그램을 생각해 보세요. 이 구성을 고려할 때 데이터 처리는 다음과 같이 발생합니다.

  1. "A"는 METransformNeedInput을 전송하여 데이터를 요청합니다.
  2. 파이프라인은 "A" 에서 ProcessInput 을 호출합니다.
  3. "A" 및 "B"는 하드웨어에서 데이터를 처리합니다.
  4. 처리가 완료되면 "B"는 METransformHaveOutput 이벤트를 보냅니다.
  5. 파이프라인은 "B"에서 ProcessOutput 을 호출합니다.

쌍을 이루는 디코더/인코더

디코더와 인코더가 동일한 하드웨어 칩에 있는 경우 코드 변환 시 함께 사용하는 것이 좋습니다. 즉, 하나를 선택하면 코드 변환 파이프라인에서 다른 를 선택해야 합니다. 일치하는 하드웨어 코덱을 선택하려면 두 코덱 MFT 모두 사용자 지정 미디어 형식을 제공해야 합니다. 사용자 지정 미디어 형식을 만들려면 다음을 수행합니다.

  • MF_MT_MAJOR_TYPE 특성을 적절하게 MFMediaType_Audio 또는 MFMediaType_Video 설정합니다.
  • MF_MT_SUBTYPE 특성을 사용자 지정 GUID 값으로 설정합니다.

다른 형식 특성은 선택 사항입니다. 디코더는 IMFTransform::GetOutputAvailableType에서 사용자 지정 형식을 반환하고 인코더는 해당 IMFTransform::GetInputAvailableType 메서드에서 사용자 지정 형식을 반환합니다. 두 경우 모두 사용자 지정 형식이 목록의 첫 번째 항목이어야 합니다(dwTypeIndex = 0).

소프트웨어 코덱을 사용하려면 코덱이 비디오용 NV12와 같은 표준 형식을 하나 이상 반환해야 합니다. 표준 형식은 사용자 지정 형식(dwTypeIndex> 0) 다음에 표시됩니다. 두 코덱을 항상 페어링하고 소프트웨어 코덱과 상호 운용할 수 없는 경우 MFT는 사용자 지정 형식만 반환하고 표준 형식을 반환하지 않아야 합니다.

참고

디코더가 표준 형식을 반환하지 않으면 고급 비디오 렌더러를 사용하여 재생에 사용할 수 없습니다. 이 경우 코드 전용 디코더로 등록해야 합니다. 코드 변환 전용 디코더를 참조하세요.

 

사용자 지정 MFT 작성

코덱 MFT 구현

Media Foundation 변환