다음을 통해 공유


DMO 미디어 형식

[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, Media Foundation 오디오/비디오 캡처대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngineAudio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

미디어 형식은 미디어 데이터 스트림과 연결된 형식을 설명합니다. 이 문서에서는 DMO가 미디어 형식을 처리하는 방법을 설명합니다. 주로 고유한 사용자 지정 DMO를 작성하는 개발자를 위한 것입니다.

미디어 형식은 DMO_MEDIA_TYPE 구조를 사용하여 정의됩니다. 이 구조에는 다음 정보가 포함됩니다.

  • 주요 형식 오디오 또는 비디오와 같은 광범위한 범주를 정의하는 GUID(Globally Unique Identifier)입니다.
  • 하위 형식 형식의 보다 구체적인 측면을 정의하는 GUID입니다. 예를 들어 비디오 내에서 하위 유형에는 16비트 RGB, 24비트 RGB, UYVY, DV로 인코딩된 비디오 등이 포함됩니다.
  • 서식 블록 형식을 완전히 지정하는 보조 구조체입니다. 형식 블록의 레이아웃은 데이터 형식에 따라 달라집니다. 예를 들어 PCM 오디오는 WAVEFORMATEX 구조를 사용합니다. 비디오는 VIDEOINFOHEADER VIDEOINFOHEADER2 포함하여 다양한 다른 구조를 사용합니다. 서식 블록의 레이아웃은 형식 형식 GUID로 식별됩니다. 예를 들어 FORMAT_WaveFormatEx WAVEFORMATEX 구조를 지정합니다.

DMO를 처음 만들 때 스트림에는 미디어 형식이 없습니다. DMO가 데이터를 처리하려면 먼저 클라이언트가 각 스트림에 대한 미디어 형식을 설정해야 합니다. 이 프로세스는 DMO 미디어 형식을 설정하는클라이언트의 관점에서 설명합니다.

레지스트리 미디어 형식

DMO는 DMORegister 함수를 호출하여 레지스트리에 지원하는 미디어 형식 목록을 추가할 수 있습니다. 애플리케이션은 이 정보를 사용하여 특정 형식과 일치하는 DMO를 검색할 수 있습니다. 레지스트리의 정보는 포괄적이지 않습니다. 일반적으로 DMO에서 지원하는 기본 형식만 포함합니다. 레지스트리 항목에는 입력 및 출력 형식에 대한 별도의 키가 있지만 개별 스트림을 구분하지는 않습니다.

DMORegister 함수는 DMO_PARTIAL_MEDIATYPE 구조를 사용하여 미디어 형식을 설명합니다. 이 구조체에는 DMO_MEDIA_TYPE 구조체에 있는 정보의 하위 집합, 즉 주 형식 및 하위 형식이 포함됩니다. 서식 블록에는 일반적으로 비디오 이미지의 높이 및 너비와 같이 레지스트리에 포함하기에는 너무 세분화된 정보가 포함되어 있으므로 서식 블록은 포함되지 않습니다.

기본 미디어 형식

애플리케이션이 DMO를 만든 후 DMO에서 지원하는 미디어 형식에 대해 쿼리할 수 있습니다. 각 스트림에 대해 DMO는 기본 설정 순서로 순위가 지정된 미디어 유형(비어 있을 수 있음) 목록을 만듭니다. IMediaObject::GetInputTypeIMediaObject::GetOutputType 메서드는 기본 설정 형식을 열거합니다. 애플리케이션이 다른 스트림에서 미디어 형식을 설정하면 스트림의 기본 설정 형식이 동적으로 변경됩니다. 예를 들어 기본 출력 형식 목록은 입력 형식이 설정된 후 변경되거나 그 반대의 경우도 마찬가지입니다. 그러나 DMO는 기본 설정 형식을 동적으로 업데이트할 필요가 없습니다. 애플리케이션은 수신하는 모든 형식이 유효하다고 가정할 수 없습니다. 이러한 이유로 IMediaObject::SetInputTypeIMediaObject::SetOutputType 메서드는 특정 형식을 테스트하기 위한 플래그를 지원합니다.

GetInputTypeGetOutputType 메서드는 모두 DMO_MEDIA_TYPE 구조를 반환합니다. DMO는 형식 범위를 나타내기 위해 이 구조의 일부 정보를 비워 둘 수 있습니다. 주 형식 또는 하위 형식은 GUID_NULL 수 있으며 형식 블록은 비어 있을 수 있습니다(0바이트). 서식 블록이 비어 있으면 형식 형식을 GUID_NULL 합니다.

애플리케이션이 모든 DMO의 입력 형식을 설정한 후 DMO는 일반적으로 각 출력 스트림에 대해 하나 이상의 전체 형식을 반환해야 합니다. 완전한 출력 형식은 테스트를 용이하게 하며 애플리케이션은 이를 적절한 기본값으로 사용할 수 있습니다. DMO 테스트 애플리케이션은 이 동작을 사용합니다. (DMOTest 애플리케이션 사용하는참조하세요.)

미디어 형식 설정

애플리케이션은 setInputType 사용하고 SetOutputType 메서드를 지정된 스트림에서 형식을 테스트, 설정 또는 지웁니다. 애플리케이션은 형식을 완전히 지정해야 합니다. DMO는 제안된 형식을 수락할 수 있는지 여부를 확인합니다. 대답은 다른 스트림에 설정된 형식에 따라 달라질 수 있습니다. DMO_SET_TYPEF_CLEAR 플래그는 스트림의 형식을 지우므로 애플리케이션이 "백아웃"하고 다른 조합을 시도할 수 있습니다.

예제 시나리오

다음 예제에서는 이전 섹션에서 만든 점을 설명하기 위해 몇 가지 일반적인 시나리오를 설명합니다.

  • 비디오 디코더. 일반적인 비디오 디코더에서 입력 형식은 출력 형식을 부분적으로 결정합니다. 예를 들어 일반적으로 두 스트림 모두 프레임 속도와 이미지 크기가 같아야 합니다. 한 가지 옵션은 입력 형식이 설정될 때까지 기본 출력 형식을 정의하지 않는 것입니다. 또 다른 옵션은 불완전한 형식 집합을 열거하고 형식 블록을 생략하는 것입니다. 하위 형식을 사용하여 지원되는 압축되지 않은 형식(예: 16비트 RGB, 24비트 RGB 등)을 나타냅니다. 또한 비디오 디코더에서는 일반적으로 입력 형식 이전의 출력 형식 설정을 지원하지 않습니다. 일반적인 시나리오는 알려진 입력 형식에서 디코딩하는 것이므로 이 제한이 적절합니다.
  • 오디오 디코더. 오디오 디코더는 제한된 고정 출력 형식 집합을 지원할 수 있습니다. 이 경우 입력 형식이 알려지기 전에 기본 출력 형식 목록을 만들 수 있습니다.
  • 압축기. 대부분의 경우 비디오 압축기는 애플리케이션이 입력 형식을 설정할 때까지 기본 출력 형식을 완전히 지정할 수 없으며 그 반대의 경우도 마찬가지입니다. 대신 DMO는 형식 블록이 없는 불완전한 형식을 반환해야 합니다. 오디오 및 비디오 압축의 경우 애플리케이션은 일반적으로 비트 전송률과 같은 다양한 출력 매개 변수를 설정해야 합니다. 그러나 입력 형식을 설정한 후에는 이전에 언급한 이유로 압축기에서 하나 이상의 전체 출력 형식을 반환해야 합니다.

DMO 작성