다음을 통해 공유


DMO 미디어 형식

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 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 애플리케이션 사용을 참조하세요.)

미디어 형식 설정

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

예제 시나리오

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

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

DMO 작성