AVStream 분할기
AVStream 미니드라이버에서는 AVStream 클래스 드라이버 기능을 사용하여 스트림이 지정된 핀을 통과할 때 데이터 스트림을 여러 복사본으로 분할할 수 있습니다. 이 분할 프로세스는 드라이버가 입력 스트림을 복사하여 두 개의 동일한 출력 스트림을 생성해야 하는 경우에 유용할 수 있습니다.
이렇게 하려면 핀의 KSPIN_DESCRIPTOR_EX 구조체의 Flags 멤버에서 KSPIN_FLAG_SPLITTER 설정합니다. 이 플래그가 핀에 설정되면 핀이 자동 분할기 역할을 합니다. AVStream은 스트림을 분할하는 데 필요한 모든 데이터를 자동으로 복사합니다.
DirectX8.0 이후 릴리스에서 KSPIN_FLAG_SPLITTER 플래그는 필터 중심 필터와 핀 중심 필터 모두에서 핀에 대해 작동합니다. 이전 릴리스는 필터 중심 필터의 핀에 대해서만 이 플래그를 지원합니다.
다음 다이어그램은 입력 핀이 스트림을 두 개의 출력 핀으로 분할하는 필터의 구성을 보여 줍니다. 이 출력 핀의 다운스트림 필터는 데이터를 변경합니다.
프레임은 입력 핀에 도착하여 입력 큐에 배치됩니다. 미니 드라이버는 원래 핀의 입력 큐 및 출력 큐와만 상호 작용합니다. AVStream은 첫 번째 핀의 큐에서 두 번째 핀의 큐로 데이터를 자동으로 복사합니다.
간단히 하기 위해 이 다이어그램은 출력 핀에 프레임을 제공하는 방법을 표시하지 않습니다. 출력 핀에 프레임을 제공하려면 instance 요청자와 각 큐와 연결되고 이 파이프 섹션에 속하는 할당자가 있을 수 있습니다. 또는 프레임은 다운스트림 필터에서 올 수 있습니다.
KSFILTER_DISPATCH 구조에서 미니드라이버가 공급업체에서 제공하는 AVStrMiniFilterProcess 콜백 루틴에 대한 포인터를 지정합니다. 이 콜백 루틴은 미니드라이버가 아래에 표시된 KSPROCESSPIN 구조체의 배열을 포함하는 KSPROCESSPIN_INDEXENTRY 구조체에 대한 포인터를 수신하는 위치입니다.
이 다이어그램은 미니드라이버가 프로세스 핀 목록의 두 출력 핀을 구분하는 방법을 보여 줍니다.
이 다이어그램에서 DB는 KSPROCESSPIN 구조체의 DelegateBranch 멤버를 참조하고 CS는 CopySource 멤버를 참조합니다. 입력 핀과 첫 번째 출력 핀의 DelegateBranch 및 CopySource 멤버는 모두 NULL입니다. 이는 미니드라이버가 이러한 핀의 프레임 처리를 담당하고 있음을 나타냅니다.
그러나 두 번째 출력 핀에는 첫 번째 출력 핀을 가리키는 CopySource 가 있습니다. 이는 두 번째 출력 핀이 첫 번째 출력 핀과 별도의 파이프에 있고 AVStream이 첫 번째 출력 핀의 큐에 배치된 모든 데이터를 두 번째 출력 핀의 큐에 자동으로 복사한다는 것을 나타냅니다.
두 개의 출력 핀이 동일한 파이프에 기본 제공될 때 더 복잡한 분할자 사례가 발생할 수 있습니다. 예를 들어 다운스트림 필터가 이러한 핀에서 보낸 데이터를 변경하지 않는 한 미니드라이버에는 동일한 파이프에 두 개의 분할기 기반 출력 핀이 포함될 수 있습니다. 데이터가 수정되지 않으므로 출력 핀은 읽기 전용으로 간주됩니다. 두 다운스트림 필터는 모두 동일한 버퍼를 받습니다.
분할기 핀에 자동으로 연결되는 일부 다운스트림 필터는 데이터를 변경하지만 다른 필터는 변경되지 않을 수도 있습니다.
이 경우 필터 레이아웃은 분할 출력 핀의 세 인스턴스를 포함하는 필터를 보여 주는 다음 다이어그램과 유사할 수 있습니다.
핀 A와 B는 다운스트림 필터가 데이터를 변경하지 않으므로 동일한 파이프에 할당됩니다. A 및 B의 필터 다운스트림은 동일한 버퍼 포인터를 받습니다.
미니 드라이버는 입력 큐 및 단일 출력 큐와만 상호 작용합니다. AVStream은 A/B 큐 및 C 큐에서 자동으로 복사합니다. 또한 핀 A 및 핀 B를 통해 동일한 데이터 프레임을 보내는 분할자 개체를 만듭니다(스트림 헤더가 다릅니다).
KSPROCESSPIN 구조체의 배열은 다음과 같습니다.
미니드라이버가 정상적인 상황에서 상호 작용해야 하는 유일한 핀은 핀 A입니다.
위의 다이어그램을 단순화하기 위해 요청자와 할당자는 다이어그램에서 생략되었습니다. 다이어그램은 프레임 분할 프로세스만 보여 줍니다.