다음을 통해 공유


3단계: 미디어 형식 협상 지원

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

변환 필터 작성 자습서의 3단계입니다.

두 핀이 연결되면 연결에 대한 미디어 유형에 동의해야 합니다. 미디어 형식은 데이터의 형식을 설명합니다. 미디어 형식이 없으면 필터가 한 종류의 데이터를 제공할 수 있으며 다른 필터가 다른 데이터로 처리되도록 할 수 있습니다.

미디어 형식을 협상하기 위한 기본 메커니즘은 IPin::ReceiveConnection 메서드입니다. 출력 핀은 제안된 미디어 형식을 사용하여 입력 핀에서 이 메서드를 호출합니다. 입력 핀은 연결을 수락하거나 거부합니다. 연결을 거부하는 경우 출력 핀은 다른 미디어 형식을 시도할 수 있습니다. 적합한 형식이 없으면 연결이 실패합니다. 필요에 따라 입력 핀은 IPin::EnumMediaTypes 메서드를 통해 선호하는 형식 목록을 보급할 수 있습니다. 출력 핀은 미디어 형식을 제안할 때 이 목록을 사용할 수 있습니다.

CTransformFilter 클래스는 다음과 같이 이 프로세스에 대한 일반 프레임워크를 구현합니다.

  • 입력 핀에는 기본 미디어 유형이 없습니다. 미디어 형식을 제안하기 위해 업스트림 필터에 전적으로 의존합니다. 비디오 데이터의 경우 미디어 형식에 이미지 크기 및 프레임 속도가 포함되므로 이는 의미가 있습니다. 일반적으로 해당 정보는 업스트림 원본 필터 또는 파서 필터에서 제공해야 합니다. 오디오 데이터의 경우 가능한 형식 집합이 더 작으므로 입력 핀이 몇 가지 기본 형식을 제공하는 것이 실용적일 수 있습니다. 이 경우 입력 핀에서 CBasePin::GetMediaType 을 재정의합니다.
  • 업스트림 필터가 미디어 형식을 제안하면 입력 핀은 형식을 수락하거나 거부하는 CTransformFilter::CheckInputType 메서드를 호출합니다.
  • 입력 핀이 먼저 연결되지 않으면 출력 핀이 연결되지 않습니다. 이 동작은 변환 필터에 일반적입니다. 대부분의 경우 필터는 출력 형식을 설정하기 전에 입력 형식을 결정해야 합니다.
  • 출력 핀이 연결되면 다운스트림 필터에 제안하는 미디어 유형 목록이 있습니다. CTransformFilter::GetMediaType 메서드를 호출하여 이 목록을 생성합니다. 출력 핀은 다운스트림 필터에서 제안하는 모든 미디어 형식도 시도합니다.
  • 특정 출력 형식이 입력 형식과 호환되는지 여부를 검사 위해 출력 핀은 CTransformFilter::CheckTransform 메서드를 호출합니다.

이전에 나열된 세 가지 CTransformFilter 메서드는 순수 가상 메서드이므로 파생 클래스에서 구현해야 합니다. 이러한 메서드는 COM 인터페이스에 속하지 않습니다. 기본 클래스에서 제공하는 구현의 일부일 뿐입니다.

다음 섹션에서는 각 메서드에 대해 자세히 설명합니다.

필터 연결 방법

DirectShow 필터 작성