Share via


MFT 정보

MFT(Media Foundation 변환)는 미디어 데이터를 처리하기 위한 제네릭 모델을 제공합니다. MFT는 디코더, 인코더 및 DSP(디지털 신호 프로세서)에 사용됩니다. 즉, 미디어 원본과 미디어 싱크 사이의 미디어 파이프라인에 있는 모든 항목은 MFT입니다.

대부분의 애플리케이션에서 MFT 데이터 처리의 세부 정보는 Media Foundation 아키텍처의 상위 계층에 의해 숨겨집니다. 많은 Media Foundation 애플리케이션은 MFT를 직접 호출하지 않습니다. 그러나 애플리케이션에서 직접 MFT를 호스트할 수 있습니다.

MFT는 DMO(DirectX Media Objects)를 사용하여 처음 도입된 변환 모델의 진화입니다. 실제로 두 모델을 모두 지원하는 변환을 만드는 것은 비교적 쉽습니다. DMO에 비해 MFT의 필수 동작이 더 명확하게 지정되어 올바른 구현을 쉽게 작성할 수 있습니다. 또한 MFT는 하드웨어 가속 비디오 처리를 지원할 수 있습니다.

이 항목에서는 특정 메서드 호출이 아닌 전체 디자인에 중점을 두고 MFT 처리 모델에 대한 간략한 개요를 제공합니다. 자세한 단계별 설명은 기본 MFT 처리 모델을 참조하세요.

스트림

MFT에는 입력 스트림 및 출력 스트림이 있습니다. 입력 스트림은 데이터를 수신하고 출력 스트림은 데이터를 생성합니다. 예를 들어 디코더에는 인코딩된 데이터를 수신하는 하나의 입력 스트림과 디코딩된 데이터를 생성하는 하나의 출력 스트림이 있습니다.

MFT의 스트림은 고유한 COM 개체로 표시되지 않습니다. 대신 각 스트림에는 지정된 스트림 식별자가 있으며 IMFTransform 인터페이스의 메서드는 스트림 식별자를 입력 매개 변수로 사용합니다.

일부 MFT에는 고정된 개수의 스트림이 있습니다. 예를 들어 디코더와 인코더는 일반적으로 정확히 하나의 입력과 하나의 출력을 갖습니다. 다른 MFT에는 동적 개수의 스트림이 있습니다. MFT가 동적 스트림을 지원하는 경우 클라이언트는 새 입력 스트림을 추가할 수 있습니다. 클라이언트는 출력 스트림을 추가할 수 없지만 MFT는 처리 중에 출력 스트림을 추가하거나 제거할 수 있습니다. 예를 들어 멀티플렉서는 일반적으로 클라이언트가 입력 스트림을 추가하고 멀티플렉싱된 스트림에 대해 하나의 출력을 가질 수 있도록 허용합니다. Demultiplexers는 입력 스트림의 내용에 따라 하나의 입력이 있지만 동적 수의 출력 스트림이 있는 역방향입니다. 다음 그림에서는 멀티플렉서와 demultiplexer의 차이점을 보여 줍니다.

인코더/디코더(입력 1개, 출력 1개), 멀티플렉서(입력 2개, 출력 1개) 및 demultiplexer(입력 1개, 출력 2개)를 보여 주는 다이어그램

미디어 형식

MFT를 처음 만들 때 설정된 형식이 있는 스트림은 없습니다. MFT가 데이터를 처리하려면 먼저 클라이언트가 스트림의 형식을 설정해야 합니다. 예를 들어 디코더를 사용하는 경우 입력 형식은 원래 원본 파일에 사용되는 압축 형식이며 출력 형식은 PCM 오디오 또는 RGB 비디오와 같은 압축되지 않은 형식입니다. 스트림 형식은 미디어 형식을 사용하여 설명합니다.

MFT의 내부 상태에 따라 각 스트림에 대해 가능한 미디어 유형 목록을 제공할 수 있습니다. 미디어 유형을 설정할 때 이 목록을 힌트로 사용할 수 있습니다. 한 스트림에서 미디어 형식을 설정하면 다른 스트림의 가능한 형식 목록이 변경됩니다. 예를 들어 디코더는 일반적으로 클라이언트가 입력 형식을 설정할 때까지 출력 형식을 제공할 수 없습니다. 입력 형식에는 디코더가 가능한 출력 형식 목록을 반환하는 데 필요한 정보가 포함되어 있습니다.

스트림에서 미디어 형식을 설정하려면 IMFTransform::SetInputType 또는 IMFTransform::SetOutputType을 호출합니다. 스트림에 대해 가능한 미디어 형식 목록을 얻으려면 IMFTransform::GetInputAvailableType 또는 IMFTransform::GetOutputAvailableType을 호출합니다.

데이터 처리

클라이언트가 스트림에서 미디어 형식을 설정하면 MFT는 데이터를 처리할 준비가 됩니다. 이를 위해 클라이언트는 MFT에 입력 데이터를 제공하고 MFT에서 출력 데이터를 가져오는 것을 대체합니다.

ProcessInput 메서드는 클라이언트에서 할당한 미디어 샘플에 대한 포인터를 사용합니다. 미디어 샘플에는 하나 이상의 버퍼가 포함되어 있으며 각 버퍼에는 처리할 MFT에 대한 입력 데이터가 포함됩니다.

ProcessOutput 메서드는 MFT가 출력 버퍼를 할당하거나 클라이언트가 출력 버퍼를 할당하는 두 가지 할당 모델을 지원합니다. 일부 MFT는 두 할당 모델을 모두 지원하지만 MFT가 둘 다 지원할 필요는 없습니다. 예를 들어 MFT는 클라이언트가 출력 버퍼를 할당하도록 요구할 수 있습니다. IMFTransform::GetOutputStreamInfo 메서드는 MFT가 지원하는 할당 모델을 포함하여 출력 스트림에 대한 정보를 반환합니다.

MFT는 파이프라인의 대기 시간을 최소화하기 위해 가능한 한 적은 데이터를 버퍼링하도록 설계되었습니다. 따라서 지정된 시간에 MFT는 다음 조건 중 하나에 신호를 보낼 수 있습니다.

  • MFT에는 더 많은 입력 데이터가 필요합니다. 이 상태에서 MFT는 클라이언트가 ProcessInput 을 한 번 이상 호출할 때까지 출력을 생성할 수 없습니다.
  • MFT는 클라이언트가 ProcessOutput 을 한 번 이상 호출할 때까지 더 이상 입력을 허용하지 않습니다.

예를 들어 비디오 디코더를 사용하여 키 프레임과 델타 프레임이 혼합된 비디오 스트림을 디코딩한다고 가정합니다. 처음에 MFT는 프레임을 디코딩하기 전에 몇 가지 입력이 필요합니다. 클라이언트는 ProcessInput 을 호출하여 첫 번째 프레임을 제공합니다. 첫 번째 프레임이 델타 프레임이라고 가정합니다(다음 다이어그램에 예측된 프레임의 경우 'P'로 표시됨). 디코더는 이 프레임을 유지하지만 다음 키 프레임을 가져올 때까지 출력을 생성할 수 없습니다.

예측된 프레임을 가리키는 입력이 필요한 mft를 보여 주는 다이어그램

클라이언트는 ProcessInput 을 계속 호출하고 결국 다음 키 프레임에 도달합니다(코드 내 프레임의 경우 다음 다이어그램에 'I'로 표시됨). 이제 디코더에 디코딩을 시작하기에 충분한 프레임이 있습니다. 이 시점에서 입력 수락을 중지하고 클라이언트는 ProcessOutput 을 호출하여 디코딩된 프레임을 가져와야 합니다.

입력을 허용하지 않는 mft를 보여 주는 다이어그램으로, 코드 내 프레임 1개와 예측 프레임 3개를 가리킵니다.

클라이언트에 대한 가장 간단한 방법은 단순히 ProcessInputProcessOutput에 대한 대체 호출입니다. 보다 정교한 알고리즘은 기본 MFT 처리 모델 항목에 설명되어 있습니다.

Media Foundation 변환