스트림 변경 처리

이 항목에서는 스트리밍 중에 MFT(Media Foundation 변환)가 형식 변경을 처리하는 방법에 대해 설명합니다.

중요

이 항목은 인코더에는 적용되지 않습니다. 인코더는 이 항목에 설명된 대로 형식 변경 내용을 전파해서는 안 됩니다. 인코더는 현재 구성된 출력 형식과 일치하는 입력 형식만 허용해야 합니다.

 

서식 변경 개요

일반적으로 스트리밍 중에 형식을 변경할 수 있는 두 가지 이유가 있습니다.

  • 클라이언트는 새 형식의 스트림으로 전환할 수 있습니다. 예를 들어 디지털 TV에서는 채널 변경으로 인해 이 문제가 발생할 수 있습니다.
  • H.264와 같은 일부 비디오 형식에서 비트스트림은 형식 변경을 알릴 수 있습니다. 이러한 변경 내용에는 필드 우위, 비디오 해상도 또는 픽셀 가로 세로 비율의 변경이 포함될 수 있습니다.

인코딩 형식이 변경되면 클라이언트는 파이프라인에서 MFT를 제거하고 다른 MFT로 바꿔야 할 수 있습니다. (예를 들어 클라이언트는 새 디코더에서 교환해야 할 수 있습니다.) 이 항목에서는 해당 상황을 다루지 않습니다. 이 항목에서는 현재 MFT가 새 형식을 처리할 수 있는 경우에만 설명합니다.

형식이 변경되면 MFT에 새 입력 형식, 새 출력 형식 또는 둘 다 필요할 수 있습니다.

  • 입력 형식에 대한 변경 내용은 클라이언트에서 시작됩니다. MFT는 자체 입력 형식을 변경하지 않습니다.
  • 출력 형식에 대한 변경 내용은 MFT에서 시작됩니다. MFT는 새 출력 형식이 필요하다는 신호를 표시하고 클라이언트는 MFT를 사용하여 새 출력 형식을 협상합니다.

따라서 다음과 같은 세 가지 개별 사례가 가능합니다.

  • 클라이언트는 새 입력 형식을 설정합니다. MFT는 출력 형식을 변경하지 않고 새 형식을 사용합니다.
  • 클라이언트는 새 입력 형식을 설정하고 출력 형식의 변경을 트리거합니다.
  • 입력 형식은 변경되지 않지만 MFT는 새 출력 형식이 필요한 비트스트림의 형식 변경을 검색합니다.

형식 변경 구현

이 항목의 나머지 부분에서는 클라이언트가 형식 변경을 처리하는 방법과 MFT에서 형식 변경을 구현하는 방법에 대해 설명합니다.

출력 형식

모든 MFT는 다음과 같이 출력 형식에 대한 변경을 시작할 수 있습니다.

  1. 클라이언트는 IMFTransform::P rocessOutput을 호출합니다. MFT는 다음과 같이 응답합니다.
    1. MFT는 ProcessOutput에서 출력 샘플을 생성하지 않습니다.
    2. MFT는 MFT_OUTPUT_DATA_BUFFER 구조체의 dwStatus 멤버에서 MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE 플래그를 설정합니다.
    3. ProcessOutput 메서드는 오류 코드 MF_E_TRANSFORM_STREAM_CHANGE 반환합니다.
  2. 클라이언트는 IMFTransform::GetOutputAvailableType을 호출합니다. 이 메서드는 업데이트된 출력 형식 집합을 반환합니다.
  3. 클라이언트는 SetOutputType 을 호출하여 새 출력 형식을 설정합니다.
  4. 클라이언트가 ProcessInput ProcessOutput/ 호출을 다시 시작합니다.

입력 형식

입력 형식에 대한 변경 내용은 MFT에서 시작하지 않는 클라이언트에서 시작됩니다. 입력 형식이 변경되면 출력 형식 변경이 트리거될 수 있습니다.

이벤트의 정확한 시퀀스는 MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE 특성의 값에 따라 달라집니다.

Description
FALSE 클라이언트가 새 입력 형식을 설정하기 전에 MFT를 드레이닝해야 합니다.
TRUE 클라이언트는 MFT를 드레이닝하지 않고 새 입력 형식을 설정할 수 있습니다.

 

MFT는 IMFTransform::GetAttributes 메서드를 통해 이 특성을 노출합니다. 이 특성의 기본값은 FALSE입니다 . MFT가 특성을 설정하지 않으면 값을 FALSE로 처리합니다.

MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE FALSE입니다.

  1. 클라이언트는 MFT_MESSAGE_COMMAND_DRAIN 메시지를 보냅니다.
  2. 클라이언트는 ProcessOutputMF_E_TRANSFORM_NEED_MORE_INPUT 반환할 때까지 IMFTransform::P rocessOutput을 호출하여 MFT를 드레이닝합니다.
  3. 클라이언트는 IMFTransform::SetInputType 을 호출하여 새 입력 형식을 설정합니다.
  4. MFT는 입력 형식의 유효성을 검사합니다. 형식이 잘못된 경우 SetInputTypeMF_E_INVALIDMEDIATYPE 또는 다른 오류 코드를 반환합니다. 그렇지 않으면 SetInputType 은 S_OK 반환합니다.
  5. 입력 형식이 유효하다고 가정하면 MFT는 출력 형식도 변경되는지 여부를 평가합니다. 그렇지 않은 경우 스트리밍이 계속되며 추가 작업이 필요하지 않습니다.
  6. 출력 형식이 변경되면 다음을 수행합니다.
    1. MFT는 현재 출력 미디어 형식을 무효화하고 사용 가능한 출력 미디어 형식 목록을 업데이트합니다.
    2. ProcessOutput에 대한 다음 호출은 이전 섹션에서 설명한 대로 MF_E_TRANSFORM_STREAM_CHANGE 반환합니다.
    3. 클라이언트는 IMFTransform::GetOutputAvailableType 을 호출하여 업데이트된 출력 형식 목록을 가져옵니다.
    4. 클라이언트는 SetOutputType을 호출합니다.

MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE TRUE입니다.

  1. 클라이언트는 IMFTransform::SetInputType 을 호출하여 새 입력 형식을 설정합니다.
  2. MFT는 입력 형식의 유효성을 검사합니다. 형식이 잘못된 경우 SetInputTypeMF_E_INVALIDMEDIATYPE 또는 다른 오류 코드를 반환합니다. 그렇지 않으면 SetInputType 은 S_OK 반환합니다.
  3. 입력 형식이 유효하다고 가정하면 MFT는 출력 형식도 변경되는지 여부를 평가합니다. 그렇지 않은 경우 스트리밍이 계속되며 추가 작업이 필요하지 않습니다.
  4. 출력 형식이 변경되기 전에 MFT는 다음과 같이 캐시된 입력 샘플을 처리해야 합니다.
    1. MFT는 현재 출력 형식을 무효화하지 않습니다.
    2. MFT는 캐시된 입력 샘플에서 가능한 한 많은 출력을 생성합니다.
    3. MFT가 캐시된 샘플을 처리하는 동안 새 입력 샘플을 허용하는지 여부는 선택 사항입니다. 이 경우 새 입력 샘플은 새 입력 형식을 사용하므로 MFT는 형식이 변경된 시점을 추적해야 합니다.
  5. MFT가 입력 형식이 변경되기 전에 받은 모든 샘플을 처리한 후 IMFTransform::P rocessOutputMF_E_TRANSFORM_STREAM_CHANGE 반환합니다.
  6. MFT는 현재 출력 형식을 무효화하고 사용 가능한 출력 미디어 형식 목록을 업데이트합니다.
  7. 클라이언트는 앞에서 설명한 대로 새 출력 형식을 협상합니다.

비동기 MFT는MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE 특성에 대한 TRUE 값을 반환해야 합니다. 비동기 MFT를 사용하는 경우 클라이언트는 MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE 특성이 TRUE로 설정되어 있다고 가정할 수 있습니다.

MFT_SUPPORT_DYNAMIC_FORMAT_CHANGETRUE인 경우 기본 차이점은 클라이언트가 새 입력 형식을 설정하기 전에 MFT를 드레이닝할 필요가 없다는 것입니다. 따라서 MFT가 입력 샘플을 보유하는 동안 입력 형식이 변경될 수 있습니다. MFT가 이러한 샘플을 단순히 삭제하지 않는 것이 중요합니다. 또한 MFT가 캐시된 모든 데이터를 처리할 때까지 출력 형식을 변경할 수 없습니다.

이전 단락은 특히 비디오 디코더에 적용되며, 이는 임시 순서에서 상호 코딩된 프레임을 수신할 수 있으므로 캐시해야 합니다. MFT가 입력 샘플을 캐시하지 않는 경우 드레이닝은 기본적으로 no-op입니다. 이 경우 MFT는 MFT_SUPPORT_DYNAMIC_FORMAT_CHANGEFALSE 로 설정하거나 특성을 설정하지 않은 상태로 둘 수 있습니다.

또한 모든 MFT는 드레이닝 후 형식 변경을 올바르게 처리해야 합니다. MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE 특성은 MFT가 드레이닝 없이 형식 변경을 지원하는지 여부를 나타냅니다.

인터레이스 모드에서 변경

비디오 인터레이스 모드의 변경 내용은 현재 미디어 형식을 무효화하지 않기 때문에 특별한 경우입니다. 대신 미디어 샘플에서 특성을 설정하여 각 비디오 프레임에 대해 인터레이스 모드를 지정합니다. 비디오 MFT는 이러한 플래그의 존재에 대한 각 입력 샘플을 검사 합니다.

인터레이스 모드는 필드 우위가 위쪽 필드에서 아래쪽 필드로 전환되거나 비디오가 점진적 그림과 인터레이스된 그림 간에 전환될 때 변경될 수 있습니다.

자세한 내용은 샘플의 인터레이스 플래그를 참조하세요.

사용자 지정 MFT 작성