필터 중심 처리

필터에서 필터 중심 처리를 사용하는 경우 기본적으로 AVStream은 각 핀 instance 사용할 수 있는 데이터 프레임이 있을 때 미니드라이버 제공 AVStrMiniFilterProcess 콜백 루틴을 호출합니다. 미니드라이버에서는 KSPIN_DESCRIPTOR_EX 구조체의 Flags 멤버를 설정하여 이 기본 동작을 수정할 수 있습니다.

필터 중심 처리를 구현하려면 KSFILTER_DISPATCH 구조체의 프로세스 멤버에서 미니드라이버 제공 AVStrMiniFilterProcess 콜백 루틴에 대한 포인터를 제공합니다. KSPIN_DISPATCHProcess 멤버를 NULL로 설정합니다.

AVStream은 다음 조건이 모두 충족되는 경우에만 AVStrMiniFilterProcess 를 호출합니다.

  • 프레임은 처리를 위해 프레임이 필요한 핀에서 사용할 수 있습니다. 미니드라이버에서는 KSPIN_DESCRIPTOR_EXFlags 멤버에서 플래그를 설정하여 처리 동작을 수정할 수 있습니다. 상호 배타적인 플래그 KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 및 KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 조합에 특히 주의하세요. 미니 드라이버는 KsPinAttachAndGate 또는 KsPinAttachOrGate 루틴을 사용하여 프레임이 필요한 핀 집합을 수정할 수도 있습니다.

  • 핀 인스턴스 수는 KSPIN_DESCRIPTOR_EX 구조체의 InstancesNecessary 멤버와 같거나 큽니다. KSPIN 구조의 ClientState 멤버는 핀이 현재 설정된 특정 KSSTATE 열거자를 지정합니다. InstancesNecessary가 충족되면 KSSTATE_STOP 상태의 추가 핀이 필터 처리를 방지하지 않습니다.

  • 필요한 핀 인스턴스 수가 충족됩니다(KSPIN_DESCRIPTOR_EX 구조체의 InstancesNecessary 멤버가 지정한 대로).

  • 미니드라이버가 KSGATEXxx 함수를 사용하여 필터의 프로세스 제어 게이트를 닫지 않았습니다.

AVStrMiniFilterProcess 콜백 루틴에서 미니드라이버가 KSPROCESSPIN_INDEXENTRY 구조체 배열에 대한 포인터를 받습니다. AVStream은 핀 ID를 기준으로 KSPROCESSPIN_INDEXENTRY 구조체의 배열을 정렬합니다.

다음 코드 예제에서는 프로세스 핀 구조를 사용하는 방법을 보여 줍니다. 이 코드는 AVStream Filter-Centric Avssamp(Simulated Capture Driver) 샘플에서 가져온 것으로, 필터 중심 캡처 드라이버를 작성하는 방법을 보여 줍니다. 소스 코드 및 이 샘플에 대한 설명은 Windows 드라이버 키트 샘플 다운로드에 포함되어 있습니다.

미니 드라이버는 필터 프로세스 디스패치에서 KSPROCESSPIN_INDEXENTRY 구조의 배열을 받습니다. 이 예제에서 미니 드라이버는 인덱스 VIDEO_PIN_ID KSPROCESSPIN_INDEXENTRY 구조에서 첫 번째 KSPROCESSPIN 구조를 추출합니다.

NTSTATUS
CCaptureFilter::
Process (
    IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
    )
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}

미니 드라이버는 ProcessPinsIndex [n]을 참조해서는 안 됩니다. ProcessPinsIndex [n]의 Count 멤버가 하나 이상이거나Pin [0] 내에 포함된 KSPIN_DESCRIPTOR_EX 구조체의 InstancesNecessary 멤버가 하나 이상인지 확인하기 전에 [0]을 고정합니다. (후자가 true이면 핀이 존재하도록 보장됩니다.)

그런 다음, 프레임을 캡처할 핀을 지정하기 위해 AVStrMiniFilterProcess 콜백 루틴은 KSPROCESSPIN 구조체에 대한 포인터를 공급업체에서 제공하는 캡처 루틴인 CaptureFrame에 전달합니다.

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

그런 다음 캡처 루틴을 KSPROCESSPIN 구조의 데이터 멤버로 복사하거나 KSPROCESSPIN 구조체에서 복사할 수 있습니다. 다음 예제와 같이 이 구조체의 BytesUsedTerminate 멤버를 업데이트할 수도 있습니다.

RtlCopyMemory ( ProcessPin -> Data,
                m_SynthesisBuffer,
                m_VideoInfoHeader -> bmiHeader.biSizeImage
               );
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;

미니 드라이버는 현재 스트림 포인터 및 핀에 해당하는 스트림 헤더 구조에 액세스할 수도 있습니다.

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

필터 중심 처리를 사용하는 대부분의 미니드라이버에서는 스트림 헤더 액세스에 대해서만 스트림 포인터를 사용합니다. 필터 중심 모델에서 AVStream은 스트림 포인터를 내부적으로 조작합니다. 따라서 미니드라이버가 필터 중심 드라이버에서 스트림 포인터를 조작하는 경우 주의해서 진행해야 합니다.