할당자 협상
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
두 핀이 연결되면 미디어 데이터를 교환하는 메커니즘이 필요합니다. 이 메커니즘을 전송이라고 합니다. 일반적으로 DirectShow 아키텍처는 전송에 대해 중립적입니다. 두 필터는 둘 다 지원하는 모든 전송을 사용하여 연결에 동의할 수 있습니다.
가장 일반적인 전송은 미디어 데이터가 기본 메모리에 있는 로컬 메모리 전송입니다. 로컬 메모리 전송의 두 가지 버전, 즉 푸시 모델 과 끌어오기 모델이 있습니다. 푸시 모델에서 원본 필터는 다운스트림 필터의 입력 핀에 있는 IMemInputPin 인터페이스를 사용하여 데이터를 다운스트림 필터로 푸시합니다. 끌어오기 모델에서 다운스트림 필터는 원본 필터의 출력 핀에서 IAsyncReader 인터페이스를 사용하여 원본 필터에서 데이터를 요청합니다. 이러한 두 데이터 흐름 모델에 대한 자세한 내용은 필터 그래프의 Data Flow 참조하세요.
로컬 메모리 전송에서 메모리 버퍼 할당을 담당하는 개체를 할당자라고 합니다. 할당자는 IMemAllocator 인터페이스를 지원합니다. 두 핀 모두 단일 할당자를 공유합니다. 두 핀 모두 할당자를 제공할 수 있지만 출력 핀은 사용할 할당자를 선택합니다.
출력 핀은 할당자에 의해 생성되는 버퍼 수, 각 버퍼의 크기 및 메모리 맞춤을 결정하는 할당자 속성도 설정합니다. 출력 핀은 버퍼 요구 사항에 대한 입력 핀으로 연기될 수 있습니다.
IMemInputPin 연결에서 할당자 협상은 다음과 같이 작동합니다.
- 필요에 따라 출력 핀은 IMemInputPin::GetAllocatorRequirements를 호출합니다. 이 메서드는 입력 핀의 버퍼 요구 사항(예: 메모리 맞춤)을 검색합니다. 일반적으로 출력 핀은 적절한 이유가 없는 한 입력 핀의 요청을 준수해야 합니다.
- 필요에 따라 출력 핀은 IMemInputPin::GetAllocator를 호출합니다. 이 메서드는 입력 핀에서 할당자를 요청합니다. 입력 핀은 하나를 제공하거나 오류 코드를 반환합니다.
- 출력 핀은 할당자를 선택합니다. 입력 핀에서 제공하는 핀을 사용하거나 자체적으로 만들 수 있습니다.
- 출력 핀은 IMemAllocator::SetProperties 를 호출하여 할당자 속성을 설정합니다. 그러나 할당자는 요청된 속성을 적용하지 않을 수 있습니다. (예를 들어 입력 핀이 할당자를 제공하는 경우 발생할 수 있습니다.) 할당자는 SetProperties 메서드에서 실제 속성을 출력 매개 변수로 반환합니다.
- 아웃핀은 IMemInputPin::NotifyAllocator 를 호출하여 선택 영역의 입력 핀을 알립니다.
- 입력 핀은 IMemAllocator::GetProperties 를 호출하여 할당자 속성이 허용되는지 여부를 확인해야 합니다.
- 출력 핀은 할당자 커밋 및 커밋 해제를 담당합니다. 이는 스트리밍이 시작되고 중지되면 발생합니다.
IAsyncReader 연결에서 할당자 협상은 다음과 같이 작동합니다.
- 입력 핀은 출력 핀 에서 IAsyncReader::RequestAllocator 를 호출합니다. 입력 핀은 버퍼 요구 사항을 지정하고 필요에 따라 할당자를 제공합니다.
- 출력 핀은 할당자를 선택합니다. 입력 핀에서 제공하는 핀(있는 경우)을 사용하거나 자체적으로 만들 수 있습니다.
- 출력 핀은 RequestAllocator 메서드에서 할당자를 나가는 매개 변수로 반환합니다. 입력 핀은 할당자 속성을 검사 합니다.
- 입력 핀은 할당자 커밋 및 커밋 해제를 담당합니다.
- 할당자 협상 프로세스 중에 언제든지 두 핀이 연결에 실패할 수 있습니다.
- 출력 핀이 입력 핀의 할당자를 사용하는 경우 해당 할당자를 사용하여 해당 입력 핀에 샘플을 전달할 수 있습니다. 소유 필터는 할당자를 사용하여 샘플을 다른 핀에 전달해서는 안 됩니다.
관련 항목